77 *
88 * SPDX-License-Identifier: EPL-2.0
99 ********************************************************************************/
10- package org .eclipse .openvsx .security ;
10+ package org .eclipse .openvsx .eclipse ;
1111
1212import com .fasterxml .jackson .core .JsonProcessingException ;
1313import com .fasterxml .jackson .databind .ObjectMapper ;
1616import org .eclipse .openvsx .entities .UserData ;
1717import org .slf4j .Logger ;
1818import org .slf4j .LoggerFactory ;
19+ import org .springframework .beans .factory .annotation .Autowired ;
1920import org .springframework .data .util .Pair ;
2021import org .springframework .http .HttpEntity ;
2122import org .springframework .http .HttpHeaders ;
2829import org .springframework .transaction .support .TransactionTemplate ;
2930import org .springframework .web .client .RestClientException ;
3031import org .springframework .web .client .RestTemplate ;
31- import org .springframework .beans .factory .annotation .Autowired ;
3232
3333import java .time .Instant ;
34- import java .util .Arrays ;
34+ import java .util .List ;
35+ import java .util .Optional ;
3536
3637@ Component
3738public class TokenService {
@@ -52,105 +53,51 @@ public TokenService(
5253 this .clientRegistrationRepository = clientRegistrationRepository ;
5354 }
5455
55- private boolean isEnabled () {
56- return clientRegistrationRepository != null ;
57- }
58-
59- public AuthToken updateTokens (long userId , String registrationId , OAuth2AccessToken accessToken ,
60- OAuth2RefreshToken refreshToken ) {
61- var userData = isEnabled () ? entityManager .find (UserData .class , userId ) : null ;
62- if (userData == null ) {
63- return null ;
64- }
65-
66- switch (registrationId ) {
67- case "github" : {
68- if (accessToken == null ) {
69- return updateGitHubToken (userData , null );
70- }
71-
72- var token = new AuthToken (
73- accessToken .getTokenValue (),
74- accessToken .getIssuedAt (),
75- accessToken .getExpiresAt (),
76- accessToken .getScopes (),
77- null ,
78- null
79- );
80- return updateGitHubToken (userData , token );
81- }
82-
83- case "eclipse" : {
84- if (accessToken == null ) {
85- return updateEclipseToken (userData , null );
86- }
87-
88- String refresh = null ;
89- Instant refreshExpiresAt = null ;
90- if (refreshToken != null ) {
91- refresh = refreshToken .getTokenValue ();
92- refreshExpiresAt = refreshToken .getExpiresAt ();
93- }
94-
95- var token = new AuthToken (
96- accessToken .getTokenValue (),
97- accessToken .getIssuedAt (),
98- accessToken .getExpiresAt (),
99- accessToken .getScopes (),
100- refresh ,
101- refreshExpiresAt
102- );
103-
104- return updateEclipseToken (userData , token );
105- }
106- }
107- return null ;
108- }
109-
110- private AuthToken updateGitHubToken (UserData userData , AuthToken token ) {
111- return transactions .execute (status -> {
112- userData .setGithubToken (token );
113- entityManager .merge (userData );
114- return token ;
115- });
116- }
117-
118- private AuthToken updateEclipseToken (UserData userData , AuthToken token ) {
56+ public AuthToken updateEclipseToken (long userId , OAuth2AccessToken accessToken , OAuth2RefreshToken refreshToken ) {
57+ var token = toAuthToken (accessToken , refreshToken );
11958 return transactions .execute (status -> {
59+ var userData = entityManager .find (UserData .class , userId );
12060 userData .setEclipseToken (token );
121- entityManager .merge (userData );
12261 return token ;
12362 });
12463 }
12564
126- public AuthToken getActiveToken ( UserData userData , String registrationId ) {
127- if (! isEnabled () ) {
65+ private AuthToken toAuthToken ( OAuth2AccessToken accessToken , OAuth2RefreshToken refreshToken ) {
66+ if (accessToken == null ) {
12867 return null ;
12968 }
13069
131- switch (registrationId ) {
132- case "github" : {
133- return userData .getGithubToken ();
134- }
70+ String refresh = null ;
71+ Instant refreshExpiresAt = null ;
72+ if (refreshToken != null ) {
73+ refresh = refreshToken .getTokenValue ();
74+ refreshExpiresAt = refreshToken .getExpiresAt ();
75+ }
76+
77+ return new AuthToken (
78+ accessToken .getTokenValue (),
79+ accessToken .getIssuedAt (),
80+ accessToken .getExpiresAt (),
81+ accessToken .getScopes (),
82+ refresh ,
83+ refreshExpiresAt
84+ );
85+ }
13586
136- case "eclipse" : {
137- var token = userData .getEclipseToken ();
138- if (token != null && isExpired (token .expiresAt ())) {
139- OAuth2AccessToken newAccessToken = null ;
140- OAuth2RefreshToken newRefreshToken = null ;
141- var newTokens = refreshEclipseToken (token );
142- if (newTokens != null ) {
143- newAccessToken = newTokens .getFirst ();
144- newRefreshToken = newTokens .getSecond ();
145- }
146-
147- return updateTokens (userData .getId (), "eclipse" , newAccessToken , newRefreshToken );
148- }
149- return token ;
87+ public AuthToken getActiveEclipseToken (UserData userData ) {
88+ var token = userData .getEclipseToken ();
89+ if (token != null && isExpired (token .expiresAt ())) {
90+ OAuth2AccessToken newAccessToken = null ;
91+ OAuth2RefreshToken newRefreshToken = null ;
92+ var newTokens = refreshEclipseToken (token );
93+ if (newTokens != null ) {
94+ newAccessToken = newTokens .getFirst ();
95+ newRefreshToken = newTokens .getSecond ();
15096 }
151- }
15297
153- return null ;
98+ return updateEclipseToken (userData .getId (), newAccessToken , newRefreshToken );
99+ }
100+ return token ;
154101 }
155102
156103 private boolean isExpired (Instant instant ) {
@@ -162,12 +109,17 @@ private Pair<OAuth2AccessToken, OAuth2RefreshToken> refreshEclipseToken(AuthToke
162109 return null ;
163110 }
164111
165- var reg = clientRegistrationRepository .findByRegistrationId ("eclipse" );
112+ var reg = Optional .ofNullable (clientRegistrationRepository ).map (repo -> repo .findByRegistrationId ("eclipse" )).orElse (null );
113+ if (reg == null ) {
114+ logger .error ("Eclipse client not registered" );
115+ return null ;
116+ }
117+
166118 var tokenUri = reg .getProviderDetails ().getTokenUri ();
167119
168120 var headers = new HttpHeaders ();
169121 headers .setContentType (MediaType .APPLICATION_JSON );
170- headers .setAccept (Arrays . asList (MediaType .APPLICATION_JSON ));
122+ headers .setAccept (List . of (MediaType .APPLICATION_JSON ));
171123
172124 var objectMapper = new ObjectMapper ();
173125 var data = objectMapper .createObjectNode ()
@@ -192,9 +144,9 @@ private Pair<OAuth2AccessToken, OAuth2RefreshToken> refreshEclipseToken(AuthToke
192144 var newRefreshToken = new OAuth2RefreshToken (newRefreshTokenValue , issuedAt );
193145 return Pair .of (newToken , newRefreshToken );
194146 } catch (RestClientException exc ) {
195- logger .error ("Post request failed with URL: " + tokenUri , exc );
147+ logger .error ("Post request failed with URL: {}" , tokenUri , exc );
196148 } catch (JsonProcessingException exc ) {
197- logger .error ("Invalid JSON data received from URL: " + tokenUri , exc );
149+ logger .error ("Invalid JSON data received from URL: {}" , tokenUri , exc );
198150 }
199151 return null ;
200152 }
0 commit comments