Project

General

Profile

1
package eu.dnetlib.openaire.usermanagement;
2

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

    
15
import javax.servlet.ServletConfig;
16
import javax.servlet.ServletException;
17
import javax.servlet.http.HttpServlet;
18
import javax.servlet.http.HttpServletRequest;
19
import javax.servlet.http.HttpServletResponse;
20
import java.io.IOException;
21
import java.sql.SQLException;
22
import java.util.HashMap;
23
import java.util.List;
24
import java.util.Map;
25

    
26
public class RegisteredServicesServlet extends HttpServlet {
27

    
28
    private Logger logger = Logger.getLogger(RegisteredServicesServlet.class);
29

    
30
    @Autowired
31
    private RegisteredServicesUtils registeredServicesUtils;
32

    
33
    public void init(ServletConfig config) throws ServletException {
34
        super.init(config);
35
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
36
                config.getServletContext());
37
    }
38

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

    
42
        request.getSession().setAttribute("authenticated",
43
                !SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString()
44
                        .equals("anonymousUser"));
45

    
46
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
47
                getContext().getAuthentication();
48

    
49
        String userId = authentication.getSub();
50

    
51
        List<RegisteredService> registeredServices = null;
52
        try {
53
            registeredServices = registeredServicesUtils.
54
                    getRegisteredServiceDao().fetchAllRegisteredServicesByOwner(userId);
55
            System.out.println("LOAD REGISTERED SERVICES. " + registeredServices.size());
56

    
57

    
58
        } catch (SQLException sqle) {
59
            logger.error("Error fetching registered services for user " + userId , sqle);
60
            request.getSession().setAttribute("message", "Error fetching registered services. " +
61
                    "Please try again later.");
62
            request.getSession().setAttribute("showEmptyList", false);
63
            request.getRequestDispatcher("./registeredServices.jsp").include(request, response);
64
        }
65

    
66
        Map<String, ServiceResponse> serviceResponses = new HashMap<>();
67
        Map<String, String> serviceKey = new HashMap<>();
68

    
69
        for (RegisteredService registeredService:registeredServices) {
70
            ServiceResponse serviceResponse = TokenUtils.getRegisteredService(registeredService.getAai_id(),authentication.getAccessTokenValue());
71
            serviceResponses.put(registeredService.getId(), serviceResponse);
72
            serviceKey.put(registeredService.getId(), extractPublicKeySet(serviceResponse));
73
        }
74

    
75
        boolean reachedLimit = reachedMaximumNumberOfServices(registeredServices);
76
        StringBuilder name = new StringBuilder().append(authentication.getUserInfo().getGivenName().charAt(0));
77
        name.append(authentication.getUserInfo().getFamilyName().charAt(0));
78
        request.getSession().setAttribute("name", name.toString());
79
        request.getSession().setAttribute("reachedLimit", reachedLimit);
80
        request.getSession().setAttribute("test", "TEST");
81
        System.out.println("REACHED LIMIT??? " + reachedLimit);
82

    
83

    
84
        request.getSession().setAttribute("services", serviceResponses);
85
        request.getSession().setAttribute("keys", serviceKey);
86
        request.getSession().setAttribute("registeredServices", registeredServices);
87
        response.setContentType("text/html");
88
        request.getRequestDispatcher("./registeredServices.jsp").include(request, response);
89
    }
90

    
91
    private String extractPublicKeySet(ServiceResponse serviceResponse) {
92
        if (serviceResponse.getJwksUri()!=null && !serviceResponse.getJwksUri().isEmpty())
93
            return serviceResponse.getJwksUri();
94

    
95
        return extractJSONJwk(serviceResponse.getJwks());
96
    }
97

    
98
    private String extractJSONJwk(Jwks jwks) {
99
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
100
        System.out.println(gson.toJson(jwks));
101
        return gson.toJson(jwks);
102
    }
103

    
104
    @Override
105
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
106
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.
107
                getContext().getAuthentication();
108
        String id = request.getParameter("id");
109

    
110
        System.out.println("POST " +id);
111

    
112
        if (id!=null && !id.isEmpty()) {
113
            try {
114
                RegisteredService registeredService = registeredServicesUtils.getRegisteredServiceDao().fetchRegisteredServiceById(Integer.parseInt(id));
115

    
116
                if (!registeredService.getOwner().equals(authentication.getSub())) {
117
                    request.getSession().setAttribute("message", "You are not allowed to delete the service.");
118
                    System.out.println("BLOCKED " + registeredService.getOwner() + " >> " + authentication.getSub());
119
                    response.sendRedirect("./registeredServices");
120
                    return;
121
                }
122

    
123
                String aai_id = registeredService.getAai_id();
124
                HttpResponse resp = TokenUtils.deleteService(aai_id, authentication.getAccessTokenValue());
125

    
126
                int statusCode = resp.getStatusLine().getStatusCode();
127
                System.out.println("STATUS CODE " + statusCode);
128

    
129
                if (statusCode != 200) {
130
                    logger.error("Unable to delete the service. Status code was " + statusCode);
131
                    request.getSession().setAttribute("message", "Fail to delete the service. Status " + statusCode);
132
                    System.out.println("AAI blocked");
133
                    response.sendRedirect("./registeredServices");
134
                    return;
135
                } else {
136
                    registeredServicesUtils.getRegisteredServiceDao().delete(Integer.parseInt(id));
137
                    request.getSession().setAttribute("success", "The service was successfully deleted.");
138
                    System.out.println("HERE HERE");
139
                }
140

    
141
            } catch (SQLException sqle) {
142
                logger.error("Unable to contact db.", sqle);
143
                request.getSession().setAttribute("message", "Fail to delete the service. Please try again later.");
144
            }
145

    
146
        } else {
147
            request.getSession().setAttribute("message", "Error selecting service to delete. Please try again.");
148
        }
149

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

    
153
    private boolean reachedMaximumNumberOfServices(List<RegisteredService> registeredServices) {
154
        if (registeredServices.size() == 5) {
155
            return true;
156
        }
157
        return false;
158
    }
159
}
(11-11/19)