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.http.HttpResponse;
11
import org.apache.log4j.Logger;
12
import org.mitre.openid.connect.model.OIDCAuthenticationToken;
13
import org.springframework.beans.factory.annotation.Autowired;
14
import org.springframework.security.access.method.P;
15
import org.springframework.security.core.context.SecurityContextHolder;
16
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
17

    
18
import javax.servlet.ServletConfig;
19
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
import java.sql.SQLException;
25

    
26

    
27
public class RegisterServiceServlet extends HttpServlet {
28

    
29
    private Logger logger = Logger.getLogger(RegisterServiceServlet.class);
30

    
31
    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
    @Autowired
41
    private TokenUtils tokenUtils;
42

    
43
    public void doGet(HttpServletRequest request, HttpServletResponse response)
44
            throws ServletException, IOException {
45

    
46
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
47
                getContext().getAuthentication();
48
        String userid = authentication.getSub();
49

    
50
        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

    
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
                    ServiceResponse serviceResponse = tokenUtils.getRegisteredService(registeredService.getClientId(), registeredService.getRegistrationAccessToken());
64

    
65
                    updateFormFields(request, registeredService.getName(), registeredService.getKeyType(), serviceResponse);
66

    
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
                        request.getSession().setAttribute("message", "Not authorized to edit the registered service with id " + id + ".");
77
                        response.sendRedirect("./registeredServices");
78
                        logger.warn("Not authorized to edit the service with " + id + "id.");
79
                    }
80
                }
81

    
82
            } catch (NumberFormatException nfe) {
83
                //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
            } catch (SQLException sqle) {
89
                //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
            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
            checkNumberOfRegisteredServices(request, response, authentication);
102
        }
103

    
104
        response.setContentType("text/html");
105
        request.getRequestDispatcher("./registerService.jsp").include(request, response);
106
    }
107

    
108
    private void updateFormFields(HttpServletRequest request, String serviceName, String keyType, ServiceResponse serviceResponse) {
109
        //System.out.println("UPDATING FORM");
110
        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
                request.getSession().setAttribute("jwksUri", serviceResponse.getJwksUri());
116
            } else {
117
                Key key;
118
                if (serviceResponse.getJwks() != null) {
119
                    key = serviceResponse.getJwks().keys[0];
120
                } else {
121
                    key = new Key();
122
                }
123
                //System.out.println("Service response keys " + serviceResponse.getJwksUri());
124
                Gson gson = new GsonBuilder().setPrettyPrinting().create();
125
                request.getSession().setAttribute("value", gson.toJson(key));
126
            }
127
        }
128
    }
129

    
130
    public void doPost(HttpServletRequest request, HttpServletResponse response)
131
            throws ServletException, IOException {
132

    
133
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
134
                getContext().getAuthentication();
135

    
136
        response.setContentType("text/html");
137
        boolean canProceed = true;
138

    
139
        String mode = request.getParameter("mode").trim();
140
        //System.out.println("Mode was " + mode);
141
        checkmode(mode);
142
        //System.out.println("Mode is " + mode);
143

    
144
        String serviceId = request.getParameter("id");
145

    
146
        String name = request.getParameter("first_name").trim();
147
        if (name.isEmpty()) {
148
            request.getSession().setAttribute("first_name_error", true);
149
            canProceed = false;
150
        }
151
        String keyType = request.getParameter("key_type");
152
        String jwksUri = null;
153
        String jwksString = null;
154
        Jwks jwks = null;
155
        if(keyType != null) {
156
            keyType = keyType.trim();
157
            if (keyType.equals("uri")) {
158
                jwksUri = request.getParameter("uri");
159
                request.getSession().setAttribute("jwksUri", jwksUri);
160

    
161
                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

    
175
                    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

    
181

    
182
                } catch (JsonParseException jpe) {
183
                    request.getSession().setAttribute("value_error", true);
184
                    canProceed = false;
185
                }
186
            }
187
        }
188
        String userid = authentication.getSub();
189
        String email = authentication.getUserInfo().getEmail();
190
        ServiceResponse serviceResponse = null;
191

    
192
        if (nameIsValid(name) && userInfoIsValid(userid, email) && keyIsValid(keyType, jwksUri, jwksString) && canProceed) {
193

    
194
            String serverMessage;
195

    
196
            if (mode.equals("create")) {
197
                //Careful! Redirects in method
198
                if (!checkNumberOfRegisteredServices(request, response, authentication)) {
199
                    return;
200
                }
201
                String serverRequestJSON = null;
202
                if(keyType == null) {
203
                    serverRequestJSON = createServiceJson(null, name, email);
204
                } else if (keyType.equals("uri")) {
205
                    serverRequestJSON = createServiceJson(null, name, email, jwksUri);
206
                } else if (keyType.equals("value")){
207
                    serverRequestJSON = createServiceJson(null, name, email, jwks);
208
                }
209
                if(serverRequestJSON != null) {
210
                    //System.out.println("SERVER JSON " + serverRequestJSON);
211
                    serverMessage = tokenUtils.registerService(serverRequestJSON);
212
                    logger.debug(serverMessage);
213
                    if (serverMessage == null) {
214
                        request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
215
                        response.sendRedirect("./registeredServices");
216
                        return;
217
                    }
218
                    serviceResponse = new Gson().fromJson(serverMessage, ServiceResponse.class);
219
                    String client_id = serviceResponse.getClientId();
220

    
221
                    RegisteredService registeredService = new RegisteredService(client_id, userid, name, serviceResponse.getRegistrationAccessToken(), keyType);
222

    
223
                    try {
224
                        registeredServicesUtils.addRegistedService(registeredService);
225
                        if(registeredService.getKeyType() != null) {
226
                            request.getSession().setAttribute("success",
227
                                    "Your service has been successfully registered!<br>" +
228
                                            "<b>Client ID</b>: " + serviceResponse.getClientId());
229
                        } else {
230
                            request.getSession().setAttribute("success",
231
                                    "Your service has been successfully registered!<br>" +
232
                                          "<b>Client ID</b>: " + serviceResponse.getClientId() +
233
                                          "<br><span style=\"word-wrap: break-word\"><b>Client Secret</b>:" + serviceResponse.getClientSecret() + "</span>");
234
                        }
235

    
236
                    } catch (SQLException sqle) {
237
                        logger.error("Fail to save service.", sqle);
238
                        request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
239
                        response.sendRedirect("./registeredServices");
240
                        return;
241
                    }
242
                } else {
243
                    logger.error("Service request JSON is null");
244
                    request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
245
                    response.sendRedirect("./registeredServices");
246
                    return;
247
                }
248
            } else {
249
                int serviceIdInt = 0;
250
                if (serviceId == null || serviceId.isEmpty()) { //TODO WRONG MESSAGE
251
                    request.getSession().setAttribute("message", "Service with id " + serviceId + " does not exist.");
252
                    response.sendRedirect("./registeredServices");
253

    
254
                } else {
255
                    //System.out.println("In edit...");
256
                    try {
257
                        serviceIdInt = Integer.parseInt(serviceId);
258
                        if (!registeredServicesUtils.isAuthorized(authentication.getSub(), serviceIdInt)) {
259
                            request.getSession().setAttribute("message", "You have no permission to edit the service.");
260
                            response.sendRedirect("./registeredServices");
261

    
262
                        } else {
263

    
264
                            RegisteredService registeredService = registeredServicesUtils.getRegisteredServiceDao().fetchRegisteredServiceById(serviceIdInt);
265
                            if (registeredService != null && registeredService.getClientId() != null) {
266
                                String serverRequestJSON = null;
267
                                if (keyType == null) {
268
                                    serverRequestJSON = createServiceJson(registeredService.getClientId(), name, email);
269
                                } else if (keyType.equals("uri")) {
270
                                    serverRequestJSON = createServiceJson(registeredService.getClientId(), name, email, jwksUri);
271
                                } else if (keyType.equals("value")) {
272
                                    serverRequestJSON = createServiceJson(registeredService.getClientId(), name, email, jwks);
273
                                }
274
                                if (serverRequestJSON != null) {
275
                                    //System.out.println("SERVER JSON " + serverRequestJSON);
276
                                    HttpResponse resp = tokenUtils.updateService(registeredService.getClientId(), serverRequestJSON, registeredService.getRegistrationAccessToken());
277
                                    if (resp.getStatusLine().getStatusCode() == 200) {
278
                                        //System.out.println("NAME >>>>" + name);
279
                                        registeredService.setName(name);
280

    
281
                                        //System.out.println("Client Id " + registeredService.getClientId());
282
                                        try {
283
                                            registeredServicesUtils.getRegisteredServiceDao().update(registeredService);
284
                                        } catch (SQLException sqle) {
285
                                            logger.error("Unable to contact db.", sqle);
286
                                            request.getSession().setAttribute("message", "Fail to delete the service. Please try again later.");
287
                                            response.setContentType("text/html");
288
                                            request.getRequestDispatcher("./registeredServices.jsp").include(request, response);
289
                                            return;
290
                                        }
291
                                        request.getSession().setAttribute("success",
292
                                                "Your service has been successfully updated!<br>" +
293
                                                        "<b>Client ID</b>: " + registeredService.getClientId());
294
                                    }
295

    
296
                                } else {
297
                                    request.getSession().setAttribute("message", "Service with id " + serviceId + " does not exist.");
298
                                    response.sendRedirect("./registeredServices");
299
                                    return;
300
                                }
301
                            } else {
302
                                logger.error("Service request JSON is null");
303
                                request.getSession().setAttribute("message", "There was an error registering your service. Please try again later.");
304
                                response.sendRedirect("./registeredServices");
305
                                return;
306
                            }
307
                        }
308
                    } catch(SQLException sqle){
309
                        logger.error("Unable to access service with id " + serviceId, sqle);
310
                        request.getSession().setAttribute("message", "There was an error accessing your service.");
311
                        response.sendRedirect("./registeredServices");
312

    
313
                    } catch(NumberFormatException nfe){
314
                        logger.error("Unable to access service with id " + serviceId, nfe);
315
                        request.getSession().setAttribute("message", "Service with id " + serviceId + " does not exist.");
316
                        response.sendRedirect("./registeredServices");
317
                    }
318
                }
319
            }
320

    
321
        } else {
322
            //something is wrong with the form and the error messages will appear
323
            request.getSession().setAttribute("first_name", name);
324
            request.getSession().setAttribute("key_type", keyType);
325
            request.getSession().setAttribute("uri", jwksUri);
326
            request.getSession().setAttribute("value", jwksString);
327

    
328
            if (serviceId != null && !serviceId.isEmpty()) {
329
                request.getRequestDispatcher("./registerService.jsp?id=" + serviceId).forward(request, response);
330

    
331
            } else {
332
                request.getRequestDispatcher("./registerService.jsp").include(request, response);
333

    
334
            }
335
            return;
336
        }
337

    
338
        response.sendRedirect("./registeredServices");
339
    }
340

    
341
    private void checkmode(String mode) {
342
        if (mode != null && !mode.isEmpty()) {
343
            if (!mode.equals("edit") || mode.equals("create")) {
344
                mode = "create";
345
            }
346
        } else {
347
            mode = "create";
348
        }
349
    }
350

    
351
    private boolean keyIsValid(String keyType, String jwksUri, String jwksString) {
352
        return keyType == null || (keyType.equals("uri") && jwksUri != null && !jwksUri.isEmpty()) ||
353
                keyType.equals("value") && jwksString != null && !jwksString.isEmpty();
354
    }
355

    
356
    private boolean userInfoIsValid(String userid, String email) {
357
        return userid != null && !userid.isEmpty() &&
358
                email != null && !email.isEmpty();
359
    }
360

    
361
    private boolean nameIsValid(String name) {
362
        return name != null && !name.isEmpty();
363
    }
364

    
365
    private boolean checkNumberOfRegisteredServices(HttpServletRequest request, HttpServletResponse response, OIDCAuthenticationToken authentication) throws IOException {
366
        try {
367
            long numberOfRegisteredServices =
368
                    registeredServicesUtils.getRegisteredServiceDao().countRegisteredServices(authentication.getSub());
369

    
370
            if (numberOfRegisteredServices >= 5) {
371
                response.sendRedirect("./registeredServices"); // The message there already exists.
372
                return false;
373
            }
374

    
375
        } catch (SQLException sqle) {
376
            logger.error("Unable to count registered services.", sqle);
377
            request.getSession().setAttribute("message", "Unable to contact DB. Please try again later.");
378
            response.sendRedirect("./registeredServices");
379
            return false;
380
        }
381

    
382
        return true;
383
    }
384

    
385
    private static String createServiceJson(String clientId, String name, String email) {
386
        ServiceRequest serviceJSON = new ServiceRequest();
387
        serviceJSON.setClientId(clientId);
388
        serviceJSON.setClientName(name);
389
        serviceJSON.setContacts(new String[]{email});
390
        serviceJSON.setToken_endpoint_auth_method("client_secret_basic");
391
        serviceJSON.setTokenEndpointAuthSigningAlg(null);
392
        GsonBuilder builder = new GsonBuilder();
393
        builder.serializeNulls();
394
        Gson gson = builder.create();
395
        //System.out.println("Created json " + serviceJSON);
396
        return gson.toJson(serviceJSON);
397
    }
398

    
399
    private static String createServiceJson(String clientId, String name, String email, String jwksURI) {
400
        ServiceRequest serviceJSON = new ServiceRequest();
401
        serviceJSON.setClientId(clientId);
402
        serviceJSON.setClientName(name);
403
        serviceJSON.setContacts(new String[]{email});
404
        serviceJSON.setJwksUri(jwksURI);
405

    
406
        GsonBuilder builder = new GsonBuilder();
407
        builder.serializeNulls();
408
        Gson gson = builder.create();
409
        //System.out.println("Created json " + serviceJSON);
410
        return gson.toJson(serviceJSON);
411
    }
412

    
413
    private static String createServiceJson(String clientId, String name, String email, Jwks jwks) {
414
        ServiceRequest serviceJSON = new ServiceRequest();
415
        serviceJSON.setClientId(clientId);
416
        serviceJSON.setClientName(name);
417
        serviceJSON.setContacts(new String[]{email});
418
        serviceJSON.setJwks(jwks);
419

    
420
        GsonBuilder builder = new GsonBuilder();
421
        builder.serializeNulls();
422
        Gson gson = builder.create();
423
        //System.out.println("Created json " + serviceJSON);
424
        return gson.toJson(serviceJSON);
425
    }
426

    
427
}
(8-8/18)