Commit f63b310a authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Removed Spring dependency to gms-client-lib (used built-in...

Removed Spring dependency to gms-client-lib (used built-in java.net.HttpClient); used access token instead of BasicAuth; Added missing endpoints in GMS JWT web service controller
parent 67337ee0
Loading
Loading
Loading
Loading
+2 −13
Original line number Original line Diff line number Diff line
@@ -7,21 +7,10 @@
    <packaging>jar</packaging>
    <packaging>jar</packaging>
    <properties>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.source>12</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.target>12</maven.compiler.target>
        <spring.version>5.1.8.RELEASE</spring.version>
    </properties>
    </properties>
    <dependencies>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>
        <dependency>
        <dependency>
            <groupId>junit</groupId>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <artifactId>junit</artifactId>
+34 −99
Original line number Original line Diff line number Diff line
package it.inaf.ia2.gms.client;
package it.inaf.ia2.gms.client;


import it.inaf.ia2.gms.client.model.Group;
import it.inaf.ia2.gms.client.call.HttpClientWrapper;
import it.inaf.ia2.gms.client.model.Member;
import it.inaf.ia2.gms.client.call.AddMemberCall;
import it.inaf.ia2.gms.client.call.AddPermissionCall;
import it.inaf.ia2.gms.client.call.CreateGroupCall;
import it.inaf.ia2.gms.client.call.DeleteGroupCall;
import it.inaf.ia2.gms.client.call.GetUserGroupsCall;
import it.inaf.ia2.gms.client.call.ListGroupsCall;
import it.inaf.ia2.gms.client.call.RemoveMemberCall;
import it.inaf.ia2.gms.client.call.RemovePermissionCall;
import it.inaf.ia2.gms.client.model.Permission;
import it.inaf.ia2.gms.client.model.Permission;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;


public class GmsClient {
public class GmsClient {


    private final String baseUrl;
    HttpClientWrapper httpClientWrapper;
    private final String authHeader;
    private RestTemplate restTemplate;


    public GmsClient(String baseUrl, String clientId, String clientSecret) {
    public GmsClient(String baseUrl) {


        if (!baseUrl.endsWith("/")) {
        if (!baseUrl.endsWith("/")) {
            baseUrl += "/";
            baseUrl += "/";
        }
        }
        baseUrl += "ws/basic";
        baseUrl += "ws/jwt";


        this.baseUrl = baseUrl;
        httpClientWrapper = new HttpClientWrapper(baseUrl);

        String auth = clientId + ":" + clientSecret;
        byte[] encodedAuth = Base64.getEncoder().encode(
                auth.getBytes(StandardCharsets.UTF_8));
        authHeader = "Basic " + new String(encodedAuth);

        restTemplate = new RestTemplate();
    }
    }


    /**
    public GmsClient setAccessToken(String accessToken) {
     * For testing purpose.
        httpClientWrapper.setAccessToken(accessToken);
     */
        return this;
    protected void setRestTemplate(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
    }


    public Group addGroup(List<String> names) {
    public List<String> getMyGroups(String prefix) {

        return new GetUserGroupsCall(httpClientWrapper).getUserGroups(prefix);
        String url = UriComponentsBuilder.fromHttpUrl(baseUrl)
                .pathSegment("group")
                .toUriString();

        HttpEntity<List<String>> httpEntity = getEntity(names);

        return restTemplate.exchange(url, HttpMethod.POST, httpEntity, Group.class).getBody();
    }
    }


    public void removeGroup(List<String> names) {
    public List<String> listGroups(String prefix) {

        return new ListGroupsCall(httpClientWrapper).listGroups(prefix);
        String url = UriComponentsBuilder.fromHttpUrl(baseUrl)
                .pathSegment("group")
                .queryParam("names", names.toArray())
                .toUriString();

        restTemplate.exchange(url, HttpMethod.DELETE, getEntity(), Void.class);
    }
    }


    public Member addMember(List<String> names, String userId) {
    public List<String> getUserGroups(String userId, String prefix) {

        return new GetUserGroupsCall(httpClientWrapper).getUserGroups(userId, prefix);
        String url = UriComponentsBuilder.fromHttpUrl(baseUrl)
                .pathSegment("member")
                .toUriString();

        Map<String, Object> params = new HashMap<>();
        params.put("names", names);
        params.put("userId", userId);
        HttpEntity<Map<String, Object>> httpEntity = getEntity(params);

        return restTemplate.exchange(url, HttpMethod.POST, httpEntity, Member.class).getBody();
    }
    }


    public void removeMember(List<String> names, String userId) {
    public void createGroup(String completeGroupName, boolean leaf) {

        new CreateGroupCall(httpClientWrapper).createGroup(completeGroupName, leaf);
        String url = UriComponentsBuilder.fromHttpUrl(baseUrl)
                .pathSegment("member")
                .queryParam("names", names.toArray())
                .queryParam("userId", userId)
                .toUriString();

        restTemplate.exchange(url, HttpMethod.DELETE, getEntity(), Void.class);
    }
    }


    public Permission addPermission(List<String> names, String userId, String permission) {
    public void deleteGroup(String completeGroupName) {

        new DeleteGroupCall(httpClientWrapper).deleteGroup(completeGroupName);
        String url = UriComponentsBuilder.fromHttpUrl(baseUrl)
                .pathSegment("permission")
                .toUriString();

        Map<String, Object> params = new HashMap<>();
        params.put("names", names);
        params.put("userId", userId);
        params.put("permission", permission);
        HttpEntity<Map<String, Object>> httpEntity = getEntity(params);

        return restTemplate.exchange(url, HttpMethod.POST, httpEntity, Permission.class).getBody();
    }
    }


    public void removePermission(List<String> names, String userId) {
    public void addMember(String completeGroupName, String userId) {

        new AddMemberCall(httpClientWrapper).addMember(completeGroupName, userId);
        String url = UriComponentsBuilder.fromHttpUrl(baseUrl)
                .pathSegment("permission")
                .queryParam("names", names.toArray())
                .queryParam("userId", userId)
                .toUriString();

        restTemplate.exchange(url, HttpMethod.DELETE, getEntity(), Void.class);
    }
    }


    private HttpEntity<?> getEntity() {
    public void removeMember(String completeGroupName, String userId) {
        return new HttpEntity<>(getHeaders());
        new RemoveMemberCall(httpClientWrapper).removeMember(completeGroupName, userId);
    }
    }


    private <T> HttpEntity<T> getEntity(T body) {
    public void addPermission(String completeGroupName, String userId, Permission permission) {
        return new HttpEntity<>(body, getHeaders());
        new AddPermissionCall(httpClientWrapper).addPermission(completeGroupName, userId, permission);
    }
    }


    private HttpHeaders getHeaders() {
    public void removePermission(String completeGroupName, String userId) {
        return new HttpHeaders() {
        new RemovePermissionCall(httpClientWrapper).removePermission(completeGroupName, userId);
            {
                set("Authorization", authHeader);
            }
        };
    }
    }
}
}
+34 −0
Original line number Original line Diff line number Diff line
package it.inaf.ia2.gms.client.call;

import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;

public class AddMemberCall extends BaseGmsCall {

    public AddMemberCall(HttpClientWrapper clientWrapper) {
        super(clientWrapper);
    }

    public boolean addMember(String completeGroupName, String userId) {

        String endpoint = "membership";
        if (completeGroupName != null && !completeGroupName.isBlank()) {
            endpoint += "/" + completeGroupName;
        }

        HttpRequest groupsRequest = newHttpRequest(endpoint)
                .header("Accept", "text/plain")
                .POST(BodyPublishers.ofString("user_id=" + userId))
                .build();

        return getClient().sendAsync(groupsRequest, HttpResponse.BodyHandlers.ofInputStream())
                .thenApply(response -> {
                    if (response.statusCode() == 200) {
                        return true;
                    }
                    logServerErrorInputStream(groupsRequest, response);
                    throw new IllegalStateException("Unable to add member to group");
                }).join();
    }
}
+39 −0
Original line number Original line Diff line number Diff line
package it.inaf.ia2.gms.client.call;

import it.inaf.ia2.gms.client.model.Permission;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublisher;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;

public class AddPermissionCall extends BaseGmsCall {

    public AddPermissionCall(HttpClientWrapper clientWrapper) {
        super(clientWrapper);
    }

    public boolean addPermission(String completeGroupName, String userId, Permission permission) {

        String endpoint = "permission";
        if (completeGroupName != null && !completeGroupName.isBlank()) {
            endpoint += "/" + completeGroupName;
        }

        BodyPublisher requestBody = BodyPublishers.ofString(
                "user_id=" + userId + "&permission=" + permission);

        HttpRequest groupsRequest = newHttpRequest(endpoint)
                .header("Accept", "text/plain")
                .POST(requestBody)
                .build();

        return getClient().sendAsync(groupsRequest, HttpResponse.BodyHandlers.ofInputStream())
                .thenApply(response -> {
                    if (response.statusCode() == 200) {
                        return true;
                    }
                    logServerErrorInputStream(groupsRequest, response);
                    throw new IllegalStateException("Unable to add permission");
                }).join();
    }
}
+45 −0
Original line number Original line Diff line number Diff line
package it.inaf.ia2.gms.client.call;

import java.io.InputStream;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.Builder;
import java.net.http.HttpResponse;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public abstract class BaseGmsCall {

    private static final Logger LOGGER = Logger.getLogger(BaseGmsCall.class.getName());

    protected final HttpClientWrapper clientWrapper;

    public BaseGmsCall(HttpClientWrapper clientWrapper) {
        this.clientWrapper = clientWrapper;
    }

    protected HttpClient getClient() {
        return clientWrapper.getClient();
    }

    protected Builder newHttpRequest(String endpoint) {
        return clientWrapper.newHttpRequest(endpoint);
    }

    protected void logServerError(HttpRequest request, HttpResponse<String> response) {
        LOGGER.log(Level.SEVERE, () -> "Error while reading " + request.uri()
                + "\nServer response status code is " + response.statusCode()
                + "\nAServer response text is " + response.body());
    }

    protected void logServerErrorInputStream(HttpRequest request, HttpResponse<InputStream> response) {
        LOGGER.log(Level.SEVERE, () -> {
            Scanner s = new Scanner(response.body()).useDelimiter("\\A");
            String responseBody = s.hasNext() ? s.next() : "";
            return "Error while reading " + request.uri()
                    + "\nServer response status code is " + response.statusCode()
                    + "\nServer response text is " + responseBody;
        });
    }
}
Loading