Project

General

Profile

1
package eu.dnetlib.openaire.usermanagement;
2

    
3
import com.google.gson.Gson;
4
import com.google.gson.GsonBuilder;
5
import com.google.gson.JsonParseException;
6
import eu.dnetlib.openaire.user.pojos.RegisteredService;
7
import eu.dnetlib.openaire.usermanagement.utils.RegisteredServicesUtils;
8
import eu.dnetlib.openaire.usermanagement.utils.TokenUtils;
9
import org.apache.commons.validator.routines.UrlValidator;
10
import org.apache.log4j.Logger;
11
import org.mitre.openid.connect.model.OIDCAuthenticationToken;
12
import org.springframework.beans.factory.annotation.Autowired;
13
import org.springframework.security.core.context.SecurityContextHolder;
14
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
15

    
16
import javax.servlet.ServletConfig;
17
import javax.servlet.ServletException;
18
import javax.servlet.http.HttpServlet;
19
import javax.servlet.http.HttpServletRequest;
20
import javax.servlet.http.HttpServletResponse;
21
import java.io.IOException;
22
import java.sql.SQLException;
23

    
24

    
25
public class RegisterServiceServlet extends HttpServlet {
26

    
27
    private Logger logger = Logger.getLogger(RegisterServiceServlet.class);
28

    
29
    public void init(ServletConfig config) throws ServletException {
30
        super.init(config);
31
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
32
                config.getServletContext());
33
    }
34

    
35
    @Autowired
36
    private RegisteredServicesUtils registeredServicesUtils;
37

    
38
    public void doGet(HttpServletRequest request, HttpServletResponse response)
39
            throws ServletException, IOException {
40

    
41
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
42
                getContext().getAuthentication();
43

    
44
        //Careful! Redirects in method
45
        checkNumberOfRegisteredServices(request, response, authentication);
46

    
47
        response.setContentType("text/html");
48
        StringBuilder name = new StringBuilder().append(authentication.getUserInfo().getGivenName().charAt(0));
49
        name.append(authentication.getUserInfo().getFamilyName().charAt(0));
50
        request.getSession().setAttribute("name", name.toString());
51
        request.getRequestDispatcher("./registerService.jsp").include(request, response);
52
    }
53

    
54
    public void doPost(HttpServletRequest request, HttpServletResponse response)
55
            throws ServletException, IOException {
56

    
57
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
58
                getContext().getAuthentication();
59

    
60
        boolean canProceed = true;
61

    
62
        //Careful! Redirects in method
63
        checkNumberOfRegisteredServices(request, response, authentication);
64

    
65
        String name = request.getParameter("first_name").trim();
66
        String description = request.getParameter("description").trim();
67
        String keyType = request.getParameter("key_radio").trim();
68

    
69
        String jwksUri = null;
70
        String jwksString = null;
71
        Jwks jwks = null;
72

    
73
        if (keyType.equals("uri")) {
74
            jwksUri = request.getParameter("uri");
75
            String[] schemes = {"https"};
76
            UrlValidator urlValidator = new UrlValidator(schemes);
77
            if (!urlValidator.isValid(jwksUri)){
78
                System.out.println("Not valid? " + jwksUri);
79
                request.getSession().setAttribute("msg_key_uri_error_display", "display:block");
80
                canProceed = false;
81
            }
82
        } else {
83
            jwksString = request.getParameter("value");
84
            try {
85
                Gson gson = new GsonBuilder().registerTypeAdapter(Jwks.class, new JwksDeserializer()).create();
86
                jwks = gson.fromJson(jwksString, Jwks.class);
87
                if (jwks.getKeys() == null || jwks.getKeys().length == 0) {
88
                    System.out.println("Something wrong with the keys.");
89
                    request.getSession().setAttribute("msg_key_value_error_display", "display:block");
90
                    canProceed = false;
91
                }
92
            } catch (JsonParseException jpe) {
93
                request.getSession().setAttribute("msg_key_value_error_display", "display:block");
94
                canProceed = false;
95
            }
96
        }
97

    
98
        String userid = authentication.getSub();
99
        String email = authentication.getUserInfo().getEmail();
100
        String accessToken = authentication.getAccessTokenValue();
101

    
102
        ServiceResponse serviceResponse = null;
103

    
104
        if (nameIsValid(name) && userInfoIsValid(userid, email) && keyIsValid(keyType, jwksUri, jwksString) && canProceed) {
105
            String serverRequestJSON;
106
            String serverMessage;
107

    
108
            if (keyType.equals("uri")){
109
                serverRequestJSON = createServiceJson(name, description, email, jwksUri);
110
            } else {
111
                serverRequestJSON = createServiceJson(name, description, email, jwks);
112
            }
113

    
114
            serverMessage = TokenUtils.registerService(serverRequestJSON, accessToken);
115

    
116
            if (serverMessage == null) {
117
                request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
118
                response.sendRedirect("./registeredServices");
119
            }
120
            serviceResponse = new Gson().fromJson(serverMessage, ServiceResponse.class);
121
            String aai_id = serviceResponse.getId();
122
            String owner = userid;
123

    
124
            RegisteredService registeredService = new RegisteredService(aai_id, owner, name);
125

    
126
            try {
127
                registeredServicesUtils.addRegistedService(registeredService);
128
                request.getSession().setAttribute("success", "Your service has been successfully registered!");
129

    
130
            } catch (SQLException sqle) {
131
                logger.error("Fail to save service.", sqle);
132
                request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
133
                response.sendRedirect("./registeredServices");
134
                return;
135
            }
136

    
137
        } else {
138
            //something is wrong with the form and the error messages will appear
139
            request.getSession().setAttribute("first_name", name);
140
            request.getSession().setAttribute("description", description);
141
            request.getSession().setAttribute("key_radio",  keyType);
142
            request.getSession().setAttribute("uri",  jwksUri);
143
            request.getSession().setAttribute("value",  jwksString);
144

    
145
            response.sendRedirect("./registerService");
146
            return;
147
        }
148

    
149
        response.sendRedirect("./registeredServices");
150
    }
151

    
152
    private boolean keyIsValid(String keyType, String jwksUri, String jwksString) {
153
        return (keyType.equals("uri") && jwksUri != null && !jwksUri.isEmpty()) ||
154
                keyType.equals("value") && jwksString != null && !jwksString.isEmpty();
155
    }
156

    
157
    private boolean userInfoIsValid(String userid, String email) {
158
        return userid != null && !userid.isEmpty() &&
159
                email != null && !email.isEmpty();
160
    }
161

    
162
    private boolean nameIsValid(String name) {
163
        return name != null && !name.isEmpty();
164
    }
165

    
166
    private void checkNumberOfRegisteredServices(HttpServletRequest request, HttpServletResponse response, OIDCAuthenticationToken authentication) throws IOException {
167
        try {
168
            long numberOfRegisteredServices =
169
                    registeredServicesUtils.getRegisteredServiceDao().countRegisteredServices(authentication.getSub());
170

    
171
            if (numberOfRegisteredServices >= 5) {
172
                response.sendRedirect("./registeredServices"); // The message there already exists.
173
            }
174

    
175
        } catch (SQLException sqle) {
176
            logger.error("Unable to count registered services.", sqle);
177
            request.getSession().setAttribute("message", "Unable to contact DB. Please try again later.");
178
            response.sendRedirect("./registeredServices");
179
            return;
180
        }
181
    }
182

    
183
    private static String createServiceJson(String name, String description, String email, String jwksURI) {
184
        ServiceRequest serviceJSON = new ServiceRequest();
185
        serviceJSON.setClientName(name);
186
        serviceJSON.setClientDescription(description);
187
        serviceJSON.setContacts(new String[]{email});
188
        serviceJSON.setJwksUri(jwksURI);
189

    
190
        GsonBuilder builder = new GsonBuilder();
191
        builder.serializeNulls();
192
        Gson gson = builder.create();
193
        System.out.println("Created json " +serviceJSON);
194
        return gson.toJson(serviceJSON);
195
    }
196

    
197
    private static String createServiceJson(String name, String description, String email, Jwks jwks) {
198
        ServiceRequest serviceJSON = new ServiceRequest();
199
        serviceJSON.setClientName(name);
200
        serviceJSON.setClientDescription(description);
201
        serviceJSON.setContacts(new String[]{email});
202
        serviceJSON.setJwksType("VAL");
203
        serviceJSON.setJwks(jwks);
204

    
205
        GsonBuilder builder = new GsonBuilder();
206
        builder.serializeNulls();
207
        Gson gson = builder.create();
208
        System.out.println("Created json " +serviceJSON);
209
        return gson.toJson(serviceJSON);
210
    }
211

    
212
}
(9-9/19)