Project

General

Profile

1
package eu.dnetlib.openaire.usermanagement;
2

    
3
import com.google.gson.Gson;
4
import org.apache.commons.io.IOUtils;
5
import org.apache.http.HttpHeaders;
6
import org.apache.http.HttpResponse;
7
import org.apache.http.client.methods.HttpDelete;
8
import org.apache.http.client.methods.HttpGet;
9
import org.apache.http.impl.client.CloseableHttpClient;
10
import org.apache.http.impl.client.HttpClients;
11
import org.apache.log4j.Logger;
12
import org.mitre.openid.connect.client.service.impl.StaticClientConfigurationService;
13
import org.mitre.openid.connect.model.OIDCAuthenticationToken;
14
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.beans.factory.annotation.Value;
16
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
import java.nio.charset.StandardCharsets;
26
import java.util.ArrayList;
27
import java.util.List;
28

    
29
public class PersonalTokenServlet extends HttpServlet {
30

    
31
    @Value("${oidc.secret}")
32
    private String secret;
33

    
34
    @Value("${oidc.id}")
35
    private String id;
36

    
37
    @Value("${oidc.issuer}")
38
    private String issuer;
39

    
40
    @Autowired
41
    private StaticClientConfigurationService staticClientConfigurationService;
42

    
43
    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
    public void doGet(HttpServletRequest request, HttpServletResponse response)
52
            throws ServletException, IOException {
53
        response.setContentType("text/html");
54
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
55
        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
        request.getSession().setAttribute("accessToken", authentication.getAccessTokenValue());
59
        request.getSession().setAttribute("refreshToken", authentication.getRefreshTokenValue());
60
        request.getRequestDispatcher("./personal.jsp").include(request, response);
61
    }
62

    
63
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
64
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
65
        String refreshToken = authentication.getRefreshTokenValue();
66
        List<String> oldRefreshTokens = null;
67

    
68
        try {
69
            oldRefreshTokens = getOldRefreshTokens(authentication.getRefreshTokenValue(), authentication.getAccessTokenValue());
70
            deleteOldRefreshTokens(oldRefreshTokens, authentication.getAccessTokenValue());
71

    
72
        } catch (IOException e) {
73
            logger.error("Error deleting old refresh tokens.", e);
74
            //TODO should I let user know?
75
        }
76
        request.getSession().setAttribute("showRefreshToken", true);
77
        response.sendRedirect("./personalToken");
78
    }
79

    
80
    private void deleteOldRefreshTokens(List<String> oldRefreshTokens, String accessToken) throws IOException {
81
        HttpDelete httpDelete;
82
        CloseableHttpClient httpclient = HttpClients.createDefault();
83

    
84
        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
                //System.out.println("Could not delete old refresh tokens." + response.getStatusLine().getStatusCode());//TODO should I throw exception?
91
            }
92
        }
93
    }
94

    
95
    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

    
99
        CloseableHttpClient httpclient = HttpClients.createDefault();
100
        String jsonResponse = IOUtils.toString(httpclient.execute(httpGet).getEntity().getContent(), StandardCharsets.UTF_8.name());
101
        Gson gson = new Gson();
102

    
103
        List<String> oldRefreshTokens = null;
104
        for(RefreshToken refreshToken:gson.fromJson(jsonResponse, RefreshToken[].class)){
105
            if (oldRefreshTokens == null) {
106
                oldRefreshTokens = new ArrayList<>();
107
            }
108

    
109
            if (!refreshToken.getValue().equals(currentRefreshToken)) {
110
                oldRefreshTokens.add(refreshToken.getId()+"");
111
            }
112
        }
113

    
114
        return oldRefreshTokens;
115
    }
116
}
(6-6/18)