Project

General

Profile

1 59495 katerina.i
package eu.dnetlib.openaire.usermanagement;
2
3
import com.google.gson.Gson;
4 59615 katerina.i
import com.google.gson.GsonBuilder;
5 59647 katerina.i
import com.google.gson.JsonParseException;
6 59517 katerina.i
import eu.dnetlib.openaire.user.pojos.RegisteredService;
7
import eu.dnetlib.openaire.usermanagement.utils.RegisteredServicesUtils;
8 59508 katerina.i
import eu.dnetlib.openaire.usermanagement.utils.TokenUtils;
9 59615 katerina.i
import org.apache.commons.validator.routines.UrlValidator;
10 59733 katerina.i
import org.apache.http.HttpResponse;
11 59517 katerina.i
import org.apache.log4j.Logger;
12 59495 katerina.i
import org.mitre.openid.connect.model.OIDCAuthenticationToken;
13 59517 katerina.i
import org.springframework.beans.factory.annotation.Autowired;
14 59821 k.triantaf
import org.springframework.security.access.method.P;
15 59495 katerina.i
import org.springframework.security.core.context.SecurityContextHolder;
16 59517 katerina.i
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
17 59495 katerina.i
18 59517 katerina.i
import javax.servlet.ServletConfig;
19 59495 katerina.i
import javax.servlet.ServletException;
20
import javax.servlet.http.HttpServlet;
21
import javax.servlet.http.HttpServletRequest;
22
import javax.servlet.http.HttpServletResponse;
23
import java.io.IOException;
24 59517 katerina.i
import java.sql.SQLException;
25 59495 katerina.i
26 59517 katerina.i
27 59495 katerina.i
public class RegisterServiceServlet extends HttpServlet {
28
29 59517 katerina.i
    private Logger logger = Logger.getLogger(RegisterServiceServlet.class);
30 59495 katerina.i
31 59517 katerina.i
    public void init(ServletConfig config) throws ServletException {
32
        super.init(config);
33
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
34
                config.getServletContext());
35
    }
36
37
    @Autowired
38
    private RegisteredServicesUtils registeredServicesUtils;
39
40 59714 katerina.i
    @Autowired
41
    private TokenUtils tokenUtils;
42
43 59495 katerina.i
    public void doGet(HttpServletRequest request, HttpServletResponse response)
44
            throws ServletException, IOException {
45 59638 katerina.i
46
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
47
                getContext().getAuthentication();
48 59714 katerina.i
        String userid = authentication.getSub();
49 59638 katerina.i
50 59654 k.triantaf
        StringBuilder name = new StringBuilder().append(authentication.getUserInfo().getGivenName().charAt(0));
51
        name.append(authentication.getUserInfo().getFamilyName().charAt(0));
52
        request.getSession().setAttribute("name", name.toString());
53 59714 katerina.i
54
        String idParam = request.getParameter("id");
55
56
        if (idParam != null && !idParam.isEmpty()) { // EDIT CASE
57
            System.out.println("In edit");
58
            try {
59
                int id = Integer.parseInt(idParam);
60
                RegisteredService registeredService = registeredServicesUtils.getRegisteredServiceDao().fetchRegisteredServiceById(id);
61
62
                if (registeredService != null && registeredServicesUtils.isAuthorized(userid, id)) {
63 59806 k.triantaf
                    ServiceResponse serviceResponse = tokenUtils.getRegisteredService(registeredService.getClientId(), registeredService.getRegistrationAccessToken());
64 59714 katerina.i
65 59821 k.triantaf
                    updateFormFields(request, registeredService.getName(), registeredService.getKeyType(), serviceResponse);
66 59714 katerina.i
67
                } else {
68
                    if (registeredService == null) {
69
                        System.out.println("No service found!");
70
                        request.getSession().setAttribute("message", "Not valid registered service with given id " + id + ".");
71
                        response.sendRedirect("./registeredServices");
72
                        logger.warn("Not valid registered service with " + id + "id.");
73
74
                    } else {
75
                        System.out.println("Not authorized");
76 59733 katerina.i
                        request.getSession().setAttribute("message", "Not authorized to edit the registered service with id " + id + ".");
77 59714 katerina.i
                        response.sendRedirect("./registeredServices");
78
                        logger.warn("Not authorized to edit the service with " + id + "id.");
79
                    }
80
                }
81
82 59821 k.triantaf
            } catch (NumberFormatException nfe) {
83 59714 katerina.i
                System.out.println("WRONG FORMAT");
84
                request.getSession().setAttribute("message", "Invalid service id.");
85
                response.sendRedirect("./registeredServices");
86
                logger.error("Invalid service id.", nfe);
87
88 59821 k.triantaf
            } catch (SQLException sqle) {
89 59714 katerina.i
                System.out.println("SQL PROBLEM");
90
                request.getSession().setAttribute("message", "Could not fetch registered service.");
91
                response.sendRedirect("./registeredServices");
92
                logger.error("Could not fetch registered service.", sqle);
93
            }
94
95
        } else {// NEW SERVICE CASE
96
            //Careful! Redirects in method
97 59821 k.triantaf
            request.getSession().setAttribute("first_name", null);
98
            request.getSession().setAttribute("key_type", null);
99
            request.getSession().setAttribute("jwksUri", null);
100
            request.getSession().setAttribute("value", null);
101 59714 katerina.i
            checkNumberOfRegisteredServices(request, response, authentication);
102
        }
103
104
        response.setContentType("text/html");
105 59495 katerina.i
        request.getRequestDispatcher("./registerService.jsp").include(request, response);
106
    }
107
108 59806 k.triantaf
    private void updateFormFields(HttpServletRequest request, String serviceName, String keyType, ServiceResponse serviceResponse) {
109 59745 katerina.i
        System.out.println("UPDATING FORM");
110 59821 k.triantaf
        request.getSession().setAttribute("first_name", serviceName);
111
        System.out.println("Service response URI " + serviceResponse.getJwksUri());
112
        request.getSession().setAttribute("key_type", keyType);
113
        if (keyType != null) {
114
            if (keyType.equals("uri")) {
115 59733 katerina.i
                request.getSession().setAttribute("jwksUri", serviceResponse.getJwksUri());
116 59714 katerina.i
            } else {
117 59756 katerina.i
                Key key;
118 59821 k.triantaf
                if (serviceResponse.getJwks() != null) {
119 59756 katerina.i
                    key = serviceResponse.getJwks().keys[0];
120
                } else {
121
                    key = new Key();
122
                }
123 59733 katerina.i
                System.out.println("Service response keys " + serviceResponse.getJwksUri());
124 59714 katerina.i
                Gson gson = new GsonBuilder().setPrettyPrinting().create();
125
                request.getSession().setAttribute("value", gson.toJson(key));
126
            }
127
        }
128
    }
129
130 59495 katerina.i
    public void doPost(HttpServletRequest request, HttpServletResponse response)
131
            throws ServletException, IOException {
132 59615 katerina.i
133 59638 katerina.i
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
134
                getContext().getAuthentication();
135 59615 katerina.i
136 59745 katerina.i
        response.setContentType("text/html");
137 59638 katerina.i
        boolean canProceed = true;
138 59644 katerina.i
139 59733 katerina.i
        String mode = request.getParameter("mode").trim();
140
        System.out.println("Mode was " + mode);
141
        checkmode(mode);
142
        System.out.println("Mode is " + mode);
143 59495 katerina.i
144 59745 katerina.i
        String serviceId = request.getParameter("id");
145
146 59495 katerina.i
        String name = request.getParameter("first_name").trim();
147 59807 k.triantaf
        if (name.isEmpty()) {
148 59745 katerina.i
            request.getSession().setAttribute("first_name_error", true);
149
            canProceed = false;
150
        }
151 59821 k.triantaf
        String keyType = request.getParameter("key_type");
152 59638 katerina.i
        String jwksUri = null;
153
        String jwksString = null;
154
        Jwks jwks = null;
155 59821 k.triantaf
        if(keyType != null) {
156
            keyType = keyType.trim();
157
            if (keyType.equals("uri")) {
158
                jwksUri = request.getParameter("uri");
159
                request.getSession().setAttribute("jwksUri", jwksUri);
160 59638 katerina.i
161 59821 k.triantaf
                String[] schemes = {"https"};
162
                UrlValidator urlValidator = new UrlValidator(schemes);
163
                if (!urlValidator.isValid(jwksUri)) {
164
                    request.getSession().setAttribute("uri_error", true);
165
                    canProceed = false;
166
                }
167
            } else {
168
                jwksString = request.getParameter("value");
169
                try {
170
                    Gson gson = new GsonBuilder().registerTypeAdapter(Jwks.class, new JwksDeserializer()).create();
171
                    String jwksSet = String.format("{\"keys\":[%s]}", jwksString);
172
                    jwks = gson.fromJson(jwksSet, Jwks.class);
173
                    request.getSession().setAttribute("value", jwksString);
174 59745 katerina.i
175 59821 k.triantaf
                    if (jwks.getKeys() == null || jwks.getKeys().length == 0) {
176
                        System.out.println("Something wrong with the keys.");
177
                        request.getSession().setAttribute("value_error", true);
178
                        canProceed = false;
179
                    }
180 59745 katerina.i
181 59821 k.triantaf
182
                } catch (JsonParseException jpe) {
183 59657 k.triantaf
                    request.getSession().setAttribute("value_error", true);
184 59647 katerina.i
                    canProceed = false;
185
                }
186 59638 katerina.i
            }
187 59615 katerina.i
        }
188 59508 katerina.i
        String userid = authentication.getSub();
189
        String email = authentication.getUserInfo().getEmail();
190 59517 katerina.i
        ServiceResponse serviceResponse = null;
191
192 59638 katerina.i
        if (nameIsValid(name) && userInfoIsValid(userid, email) && keyIsValid(keyType, jwksUri, jwksString) && canProceed) {
193 59745 katerina.i
194 59638 katerina.i
            String serverMessage;
195
196 59821 k.triantaf
            if (mode.equals("create")) {
197 59733 katerina.i
                //Careful! Redirects in method
198
                checkNumberOfRegisteredServices(request, response, authentication);
199 59821 k.triantaf
                String serverRequestJSON = null;
200
                if(keyType == null) {
201
                    serverRequestJSON = createServiceJson(null, name, email);
202
                } else if (keyType.equals("uri")) {
203 59807 k.triantaf
                    serverRequestJSON = createServiceJson(null, name, email, jwksUri);
204 59821 k.triantaf
                } else if (keyType.equals("value")){
205 59807 k.triantaf
                    serverRequestJSON = createServiceJson(null, name, email, jwks);
206
                }
207 59821 k.triantaf
                if(serverRequestJSON != null) {
208
                    System.out.println("SERVER JSON " + serverRequestJSON);
209
                    serverMessage = tokenUtils.registerService(serverRequestJSON);
210
                    logger.debug(serverMessage);
211
                    if (serverMessage == null) {
212
                        request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
213
                        response.sendRedirect("./registeredServices");
214
                        return;
215
                    }
216
                    serviceResponse = new Gson().fromJson(serverMessage, ServiceResponse.class);
217
                    String client_id = serviceResponse.getClientId();
218 59733 katerina.i
219 59821 k.triantaf
                    RegisteredService registeredService = new RegisteredService(client_id, userid, name, serviceResponse.getRegistrationAccessToken(), keyType);
220 59733 katerina.i
221 59821 k.triantaf
                    try {
222
                        registeredServicesUtils.addRegistedService(registeredService);
223
                        if(registeredService.getKeyType() != null) {
224
                            request.getSession().setAttribute("success",
225
                                    "Your service has been successfully registered!<br>" +
226
                                            "<b>Client ID<b>: " + serviceResponse.getClientId());
227
                        } else {
228
                            request.getSession().setAttribute("success",
229
                                    "Your service has been successfully registered!<br>" +
230
                                          "<b>Client ID</b>: " + serviceResponse.getClientId() +
231
                                          "<br><span style=\"word-wrap: break-word\"><b>Client Secret</b>: " + serviceResponse.getClientSecret() + "</span>");
232
                        }
233 59733 katerina.i
234 59821 k.triantaf
                    } catch (SQLException sqle) {
235
                        logger.error("Fail to save service.", sqle);
236
                        request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
237
                        response.sendRedirect("./registeredServices");
238
                        return;
239
                    }
240
                } else {
241
                    logger.error("Service request JSON is null");
242 59733 katerina.i
                    request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
243
                    response.sendRedirect("./registeredServices");
244
                    return;
245
                }
246 59638 katerina.i
            } else {
247 59807 k.triantaf
                int serviceIdInt = 0;
248 59733 katerina.i
                if (serviceId == null || serviceId.isEmpty()) { //TODO WRONG MESSAGE
249
                    request.getSession().setAttribute("message", "Service with id " + serviceId + " does not exist.");
250
                    response.sendRedirect("./registeredServices");
251 59644 katerina.i
252 59733 katerina.i
                } else {
253
                    System.out.println("In edit...");
254
                    try {
255
                        serviceIdInt = Integer.parseInt(serviceId);
256
                        if (!registeredServicesUtils.isAuthorized(authentication.getSub(), serviceIdInt)) {
257
                            request.getSession().setAttribute("message", "You have no permission to edit the service.");
258
                            response.sendRedirect("./registeredServices");
259
                        }
260 59517 katerina.i
261 59807 k.triantaf
                        RegisteredService registeredService = registeredServicesUtils.getRegisteredServiceDao().fetchRegisteredServiceById(serviceIdInt);
262 59806 k.triantaf
                        if (registeredService != null && registeredService.getClientId() != null) {
263 59821 k.triantaf
                            String serverRequestJSON = null;
264
                            if (keyType == null) {
265
                                serverRequestJSON = createServiceJson(registeredService.getClientId(), name, email);
266
                            } else if (keyType.equals("uri")) {
267 59807 k.triantaf
                                serverRequestJSON = createServiceJson(registeredService.getClientId(), name, email, jwksUri);
268 59821 k.triantaf
                            } else if (keyType.equals("value")) {
269 59807 k.triantaf
                                serverRequestJSON = createServiceJson(registeredService.getClientId(), name, email, jwks);
270
                            }
271 59821 k.triantaf
                            if (serverRequestJSON != null) {
272
                                System.out.println("SERVER JSON " + serverRequestJSON);
273
                                HttpResponse resp = tokenUtils.updateService(registeredService.getClientId(), serverRequestJSON, registeredService.getRegistrationAccessToken());
274
                                if (resp.getStatusLine().getStatusCode() == 200) {
275
                                    System.out.println("NAME >>>>" + name);
276
                                    registeredService.setName(name);
277 59733 katerina.i
278 59821 k.triantaf
                                    System.out.println("Client Id " + registeredService.getClientId());
279
                                    try {
280
                                        registeredServicesUtils.getRegisteredServiceDao().update(registeredService);
281
                                    } catch (SQLException sqle) {
282
                                        logger.error("Unable to contact db.", sqle);
283
                                        request.getSession().setAttribute("message", "Fail to delete the service. Please try again later.");
284
                                        response.setContentType("text/html");
285
                                        request.getRequestDispatcher("./registeredServices.jsp").include(request, response);
286
                                        return;
287
                                    }
288
                                    request.getSession().setAttribute("success",
289
                                            "Your service has been successfully updated!<br>" +
290
                                                  "<b>Client ID</b>: " + registeredService.getClientId());
291 59733 katerina.i
                                }
292
293 59821 k.triantaf
                            } else {
294
                                request.getSession().setAttribute("message", "Service with id " + serviceId + " does not exist.");
295
                                response.sendRedirect("./registeredServices");
296
                                return;
297 59733 katerina.i
                            }
298
                        } else {
299 59821 k.triantaf
                            logger.error("Service request JSON is null");
300
                            request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
301 59733 katerina.i
                            response.sendRedirect("./registeredServices");
302
                            return;
303
                        }
304 59821 k.triantaf
                        } catch(SQLException sqle){
305
                            logger.error("Unable to access service with id " + serviceId, sqle);
306
                            request.getSession().setAttribute("message", "There was an error accessing your service.");
307
                            response.sendRedirect("./registeredServices");
308 59733 katerina.i
309 59821 k.triantaf
                        } catch(NumberFormatException nfe){
310
                            logger.error("Unable to access service with id " + serviceId, nfe);
311
                            request.getSession().setAttribute("message", "Service with id " + serviceId + " does not exist.");
312
                            response.sendRedirect("./registeredServices");
313
                        }
314 59733 katerina.i
                }
315 59638 katerina.i
            }
316
317
        } else {
318
            //something is wrong with the form and the error messages will appear
319 59645 katerina.i
            request.getSession().setAttribute("first_name", name);
320 59821 k.triantaf
            request.getSession().setAttribute("key_type", keyType);
321
            request.getSession().setAttribute("uri", jwksUri);
322
            request.getSession().setAttribute("value", jwksString);
323 59647 katerina.i
324 59821 k.triantaf
            if (serviceId != null && !serviceId.isEmpty()) {
325
                request.getRequestDispatcher("./registerService.jsp?id=" + serviceId).forward(request, response);
326 59745 katerina.i
327
            } else {
328
                request.getRequestDispatcher("./registerService.jsp").include(request, response);
329
330
            }
331 59644 katerina.i
            return;
332 59495 katerina.i
        }
333
334 59638 katerina.i
        response.sendRedirect("./registeredServices");
335
    }
336 59517 katerina.i
337 59733 katerina.i
    private void checkmode(String mode) {
338 59821 k.triantaf
        if (mode != null && !mode.isEmpty()) {
339
            if (!mode.equals("edit") || mode.equals("create")) {
340 59733 katerina.i
                mode = "create";
341
            }
342
        } else {
343
            mode = "create";
344
        }
345
    }
346
347 59638 katerina.i
    private boolean keyIsValid(String keyType, String jwksUri, String jwksString) {
348 59821 k.triantaf
        return keyType == null || (keyType.equals("uri") && jwksUri != null && !jwksUri.isEmpty()) ||
349 59638 katerina.i
                keyType.equals("value") && jwksString != null && !jwksString.isEmpty();
350
    }
351 59517 katerina.i
352 59638 katerina.i
    private boolean userInfoIsValid(String userid, String email) {
353
        return userid != null && !userid.isEmpty() &&
354
                email != null && !email.isEmpty();
355
    }
356
357
    private boolean nameIsValid(String name) {
358
        return name != null && !name.isEmpty();
359
    }
360
361
    private void checkNumberOfRegisteredServices(HttpServletRequest request, HttpServletResponse response, OIDCAuthenticationToken authentication) throws IOException {
362 59517 katerina.i
        try {
363 59638 katerina.i
            long numberOfRegisteredServices =
364
                    registeredServicesUtils.getRegisteredServiceDao().countRegisteredServices(authentication.getSub());
365 59517 katerina.i
366 59638 katerina.i
            if (numberOfRegisteredServices >= 5) {
367
                response.sendRedirect("./registeredServices"); // The message there already exists.
368
            }
369 59644 katerina.i
370 59517 katerina.i
        } catch (SQLException sqle) {
371 59638 katerina.i
            logger.error("Unable to count registered services.", sqle);
372
            request.getSession().setAttribute("message", "Unable to contact DB. Please try again later.");
373 59601 katerina.i
            response.sendRedirect("./registeredServices");
374 59644 katerina.i
            return;
375 59517 katerina.i
        }
376 59638 katerina.i
    }
377 59517 katerina.i
378 59821 k.triantaf
    private static String createServiceJson(String clientId, String name, String email) {
379
        ServiceRequest serviceJSON = new ServiceRequest();
380
        serviceJSON.setClientId(clientId);
381
        serviceJSON.setClientName(name);
382
        serviceJSON.setContacts(new String[]{email});
383
        serviceJSON.setToken_endpoint_auth_method("client_secret_basic");
384
        serviceJSON.setTokenEndpointAuthSigningAlg(null);
385
        GsonBuilder builder = new GsonBuilder();
386
        builder.serializeNulls();
387
        Gson gson = builder.create();
388
        System.out.println("Created json " + serviceJSON);
389
        return gson.toJson(serviceJSON);
390
    }
391
392 59807 k.triantaf
    private static String createServiceJson(String clientId, String name, String email, String jwksURI) {
393 59638 katerina.i
        ServiceRequest serviceJSON = new ServiceRequest();
394 59807 k.triantaf
        serviceJSON.setClientId(clientId);
395 59638 katerina.i
        serviceJSON.setClientName(name);
396
        serviceJSON.setContacts(new String[]{email});
397
        serviceJSON.setJwksUri(jwksURI);
398 59495 katerina.i
399 59638 katerina.i
        GsonBuilder builder = new GsonBuilder();
400
        builder.serializeNulls();
401
        Gson gson = builder.create();
402 59821 k.triantaf
        System.out.println("Created json " + serviceJSON);
403 59638 katerina.i
        return gson.toJson(serviceJSON);
404 59495 katerina.i
    }
405 59638 katerina.i
406 59807 k.triantaf
    private static String createServiceJson(String clientId, String name, String email, Jwks jwks) {
407 59638 katerina.i
        ServiceRequest serviceJSON = new ServiceRequest();
408 59807 k.triantaf
        serviceJSON.setClientId(clientId);
409 59638 katerina.i
        serviceJSON.setClientName(name);
410
        serviceJSON.setContacts(new String[]{email});
411
        serviceJSON.setJwks(jwks);
412
413
        GsonBuilder builder = new GsonBuilder();
414
        builder.serializeNulls();
415
        Gson gson = builder.create();
416 59821 k.triantaf
        System.out.println("Created json " + serviceJSON);
417 59638 katerina.i
        return gson.toJson(serviceJSON);
418
    }
419
420 59495 katerina.i
}