Project

General

Profile

1 59492 katerina.i
package eu.dnetlib.openaire.usermanagement;
2
3 59621 katerina.i
import com.google.gson.Gson;
4 59601 katerina.i
import org.apache.commons.io.IOUtils;
5
import org.apache.http.HttpHeaders;
6
import org.apache.http.HttpResponse;
7 59621 katerina.i
import org.apache.http.client.methods.HttpDelete;
8
import org.apache.http.client.methods.HttpGet;
9 59601 katerina.i
import org.apache.http.impl.client.CloseableHttpClient;
10
import org.apache.http.impl.client.HttpClients;
11
import org.apache.log4j.Logger;
12 59615 katerina.i
import org.mitre.openid.connect.client.service.impl.StaticClientConfigurationService;
13 59492 katerina.i
import org.mitre.openid.connect.model.OIDCAuthenticationToken;
14 59615 katerina.i
import org.springframework.beans.factory.annotation.Autowired;
15 59601 katerina.i
import org.springframework.beans.factory.annotation.Value;
16 59492 katerina.i
import org.springframework.security.core.context.SecurityContextHolder;
17
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
18
19
import javax.servlet.ServletConfig;
20
import javax.servlet.ServletException;
21
import javax.servlet.http.HttpServlet;
22
import javax.servlet.http.HttpServletRequest;
23
import javax.servlet.http.HttpServletResponse;
24
import java.io.IOException;
25 59601 katerina.i
import java.nio.charset.StandardCharsets;
26 59641 katerina.i
import java.util.ArrayList;
27
import java.util.List;
28 59492 katerina.i
29
public class PersonalTokenServlet extends HttpServlet {
30
31 59601 katerina.i
    @Value("${oidc.secret}")
32
    private String secret;
33
34
    @Value("${oidc.id}")
35
    private String id;
36
37 59621 katerina.i
    @Value("${oidc.issuer}")
38
    private String issuer;
39
40 59615 katerina.i
    @Autowired
41
    private StaticClientConfigurationService staticClientConfigurationService;
42
43 59601 katerina.i
    private Logger logger = Logger.getLogger(PersonalTokenServlet.class);
44
45
    public void init(ServletConfig config) throws ServletException {
46
        super.init(config);
47
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
48
                config.getServletContext());
49
    }
50
51 59492 katerina.i
    public void doGet(HttpServletRequest request, HttpServletResponse response)
52
            throws ServletException, IOException {
53
        response.setContentType("text/html");
54
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
55 59646 k.triantaf
        StringBuilder name = new StringBuilder().append(authentication.getUserInfo().getGivenName().charAt(0));
56
        name.append(authentication.getUserInfo().getFamilyName().charAt(0));
57
        request.getSession().setAttribute("name", name.toString());
58 59492 katerina.i
        request.getSession().setAttribute("accessToken", authentication.getAccessTokenValue());
59
        request.getSession().setAttribute("refreshToken", authentication.getRefreshTokenValue());
60
        request.getRequestDispatcher("./personal.jsp").include(request, response);
61
    }
62 59601 katerina.i
63 59646 k.triantaf
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
64 59601 katerina.i
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
65 59621 katerina.i
        String refreshToken = authentication.getRefreshTokenValue();
66
        List<String> oldRefreshTokens = null;
67 59601 katerina.i
68
        try {
69 59621 katerina.i
            oldRefreshTokens = getOldRefreshTokens(authentication.getRefreshTokenValue(), authentication.getAccessTokenValue());
70
            deleteOldRefreshTokens(oldRefreshTokens, authentication.getAccessTokenValue());
71 59601 katerina.i
72 59621 katerina.i
        } catch (IOException e) {
73
            logger.error("Error deleting old refresh tokens.", e);
74
            //TODO should I let user know?
75
        }
76 59646 k.triantaf
        request.getSession().setAttribute("showRefreshToken", true);
77 59621 katerina.i
        response.sendRedirect("./personalToken");
78
    }
79 59601 katerina.i
80 59621 katerina.i
    private void deleteOldRefreshTokens(List<String> oldRefreshTokens, String accessToken) throws IOException {
81
        HttpDelete httpDelete;
82
        CloseableHttpClient httpclient = HttpClients.createDefault();
83 59601 katerina.i
84 59621 katerina.i
        for (String refreshTokenId:oldRefreshTokens) {
85
            httpDelete = new HttpDelete(issuer + "/api/tokens/refresh/" + refreshTokenId);
86
            httpDelete.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
87
            HttpResponse response = httpclient.execute(httpDelete);
88
            if (response.getStatusLine().getStatusCode()!=200) {
89
                logger.warn("Could not delete old refresh tokens." + response.getStatusLine().getStatusCode());
90 60085 katerina.i
                //System.out.println("Could not delete old refresh tokens." + response.getStatusLine().getStatusCode());//TODO should I throw exception?
91 59621 katerina.i
            }
92
        }
93
    }
94 59601 katerina.i
95 59621 katerina.i
    private List<String> getOldRefreshTokens(String currentRefreshToken, String accessToken) throws IOException {
96
        HttpGet httpGet = new HttpGet(issuer + "/api/tokens/refresh");
97
        httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
98 59601 katerina.i
99 59621 katerina.i
        CloseableHttpClient httpclient = HttpClients.createDefault();
100
        String jsonResponse = IOUtils.toString(httpclient.execute(httpGet).getEntity().getContent(), StandardCharsets.UTF_8.name());
101
        Gson gson = new Gson();
102 59601 katerina.i
103 59621 katerina.i
        List<String> oldRefreshTokens = null;
104
        for(RefreshToken refreshToken:gson.fromJson(jsonResponse, RefreshToken[].class)){
105
            if (oldRefreshTokens == null) {
106
                oldRefreshTokens = new ArrayList<>();
107
            }
108 59601 katerina.i
109 59621 katerina.i
            if (!refreshToken.getValue().equals(currentRefreshToken)) {
110
                oldRefreshTokens.add(refreshToken.getId()+"");
111
            }
112
        }
113 59601 katerina.i
114 59621 katerina.i
        return oldRefreshTokens;
115 59601 katerina.i
    }
116
}