Skip to content

Commit 7899f50

Browse files
mackdkmcalmer
authored andcommitted
Ensure each public method in the HubManager enforce authorization
1 parent 52dfaae commit 7899f50

File tree

8 files changed

+521
-180
lines changed

8 files changed

+521
-180
lines changed

java/code/src/com/suse/manager/hub/HubManager.java

Lines changed: 170 additions & 95 deletions
Large diffs are not rendered by default.

java/code/src/com/suse/manager/hub/IssSparkHelper.java

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import com.suse.manager.model.hub.IssRole;
2323
import com.suse.manager.webui.utils.gson.ResultJson;
2424
import com.suse.manager.webui.utils.token.Token;
25-
import com.suse.manager.webui.utils.token.TokenParser;
2625
import com.suse.manager.webui.utils.token.TokenParsingException;
2726

2827
import com.google.gson.reflect.TypeToken;
@@ -62,21 +61,26 @@ public static Route usingTokenAuthentication(RouteWithIssToken route) {
6261
}
6362

6463
String serializedToken = authorization.substring(7);
65-
Token token = parseToken(serializedToken);
6664
IssAccessToken issuedToken = HUB_FACTORY.lookupIssuedToken(serializedToken);
6765

68-
if (issuedToken == null || token == null || issuedToken.isExpired() || !issuedToken.isValid()) {
66+
if (issuedToken == null || issuedToken.isExpired() || !issuedToken.isValid()) {
6967
response.status(HttpServletResponse.SC_UNAUTHORIZED);
7068
return json(response, ResultJson.error("Invalid token provided"), new TypeToken<>() { });
7169
}
7270

7371
try {
72+
Token token = issuedToken.getParsedToken();
7473
String fqdn = token.getClaim("fqdn", String.class);
75-
return route.handle(request, response, token, fqdn);
74+
if (fqdn == null || !fqdn.equals(issuedToken.getServerFqdn())) {
75+
response.status(HttpServletResponse.SC_UNAUTHORIZED);
76+
return json(response, ResultJson.error("Invalid token provided"), new TypeToken<>() { });
77+
}
78+
79+
return route.handle(request, response, issuedToken);
7680
}
7781
catch (TokenParsingException ex) {
78-
response.status(HttpServletResponse.SC_BAD_REQUEST);
79-
return json(response, ResultJson.error("Invalid token provided: missing claim"), new TypeToken<>() { });
82+
response.status(HttpServletResponse.SC_UNAUTHORIZED);
83+
return json(response, ResultJson.error("Invalid token provided"), new TypeToken<>() { });
8084
}
8185
finally {
8286
var authenticationService = AuthenticationServiceFactory.getInstance().getAuthenticationService();
@@ -113,7 +117,8 @@ public static RouteWithIssToken allowingOnlyUnregistered(RouteWithIssToken route
113117
}
114118

115119
private static RouteWithIssToken allowingOnly(List<IssRole> allowedRoles, RouteWithIssToken route) {
116-
return (request, response, token, fqdn) -> {
120+
return (request, response, issAccessToken) -> {
121+
String fqdn = issAccessToken.getServerFqdn();
117122
Optional<IssHub> issHub = HUB_FACTORY.lookupIssHubByFqdn(fqdn);
118123
Optional<IssPeripheral> issPeripheral = HUB_FACTORY.lookupIssPeripheralByFqdn(fqdn);
119124

@@ -124,7 +129,7 @@ private static RouteWithIssToken allowingOnly(List<IssRole> allowedRoles, RouteW
124129

125130
}
126131

127-
return route.handle(request, response, token, fqdn);
132+
return route.handle(request, response, issAccessToken);
128133
};
129134
}
130135

@@ -146,18 +151,4 @@ private static boolean isRouteForbidden(List<IssRole> allowedRoles, boolean isHu
146151

147152
return false;
148153
}
149-
150-
private static Token parseToken(String serializedToken) {
151-
try {
152-
return new TokenParser()
153-
.usingServerSecret()
154-
.verifyingNotBefore()
155-
.verifyingExpiration()
156-
.parse(serializedToken);
157-
}
158-
catch (TokenParsingException ex) {
159-
LOGGER.debug("Unable to parse token {}. Request will be rejected.", serializedToken, ex);
160-
return null;
161-
}
162-
}
163154
}

java/code/src/com/suse/manager/hub/RouteWithIssToken.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*/
1111
package com.suse.manager.hub;
1212

13-
import com.suse.manager.webui.utils.token.Token;
13+
import com.suse.manager.model.hub.IssAccessToken;
1414

1515
import spark.Request;
1616
import spark.Response;
@@ -26,9 +26,8 @@ public interface RouteWithIssToken {
2626
*
2727
* @param request the request object
2828
* @param response the response object
29-
* @param token the token with this request
30-
* @param serverFqdn the FQDN of the remote server
29+
* @param token the access token granting access and identifying the caller
3130
* @return the content to be set in the response
3231
*/
33-
Object handle(Request request, Response response, Token token, String serverFqdn);
32+
Object handle(Request request, Response response, IssAccessToken token);
3433
}

java/code/src/com/suse/manager/hub/SyncController.java

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,11 @@
2323

2424
import com.redhat.rhn.domain.credentials.HubSCCCredentials;
2525

26-
import com.suse.manager.model.hub.IssHub;
27-
import com.suse.manager.model.hub.IssPeripheral;
26+
import com.suse.manager.model.hub.IssAccessToken;
2827
import com.suse.manager.model.hub.IssRole;
2928
import com.suse.manager.model.hub.RegisterJson;
3029
import com.suse.manager.model.hub.SCCCredentialsJson;
3130
import com.suse.manager.webui.controllers.ECMAScriptDateAdapter;
32-
import com.suse.manager.webui.utils.token.Token;
3331
import com.suse.manager.webui.utils.token.TokenParsingException;
3432

3533
import com.google.gson.Gson;
@@ -82,52 +80,53 @@ public void initRoutes() {
8280
}
8381

8482
// Basic ping to check if the system is up
85-
private String ping(Request request, Response response, Token token, String fqdn) {
86-
return message(response, "Pinged from %s".formatted(fqdn));
83+
private String ping(Request request, Response response, IssAccessToken token) {
84+
return message(response, "Pinged from %s".formatted(token.getServerFqdn()));
8785
}
8886

89-
private String register(Request request, Response response, Token token, String fqdn) {
87+
private String register(Request request, Response response, IssAccessToken token) {
9088
RegisterJson registerRequest = GSON.fromJson(request.body(), RegisterJson.class);
9189

9290
String tokenToStore = registerRequest.getToken();
9391
if (StringUtils.isEmpty(tokenToStore)) {
94-
LOGGER.error("No token received in the request for server {}", fqdn);
92+
LOGGER.error("No token received in the request for server {}", token.getServerFqdn());
9593
return badRequest(response, "Required token is missing");
9694
}
9795

9896
try {
99-
hubManager.storeAccessToken(fqdn, tokenToStore);
100-
hubManager.saveNewServer(registerRequest.getRole(), fqdn, registerRequest.getRootCA());
97+
hubManager.storeAccessToken(token, tokenToStore);
98+
hubManager.saveNewServer(token, registerRequest.getRole(), registerRequest.getRootCA());
10199

102100
return success(response);
103101
}
104102
catch (TokenParsingException ex) {
105-
LOGGER.error("Unable to parse the received token for server {}", fqdn);
103+
LOGGER.error("Unable to parse the received token for server {}", token.getServerFqdn());
106104
return badRequest(response, "The specified token is not parseable");
107105
}
108106
}
109107

110-
private String generateCredentials(Request request, Response response, Token token, String fqdn) {
111-
IssPeripheral peripheral = (IssPeripheral) hubManager.findServer(IssRole.PERIPHERAL, fqdn);
112-
if (peripheral == null) {
113-
// This should never happen, fqdn guaranteed be a hub after calling allowingOnlyHub() on route init.
108+
private String generateCredentials(Request request, Response response, IssAccessToken token) {
109+
try {
110+
HubSCCCredentials credentials = hubManager.generateSCCCredentials(token);
111+
return success(response, new SCCCredentialsJson(credentials.getUsername(), credentials.getPassword()));
112+
}
113+
catch (IllegalArgumentException ex) {
114+
// This should never happen, fqdn guaranteed be a peripheral after calling allowingOnlyPeripheral() when
115+
// initializing the route.
114116
return badRequest(response, "Specified FQDN is not a known peripheral");
115117
}
116-
117-
HubSCCCredentials credentials = hubManager.generateSCCCredentials(peripheral);
118-
return success(response, new SCCCredentialsJson(credentials.getUsername(), credentials.getPassword()));
119118
}
120119

121-
private String storeCredentials(Request request, Response response, Token token, String fqdn) {
120+
private String storeCredentials(Request request, Response response, IssAccessToken token) {
122121
SCCCredentialsJson storeRequest = GSON.fromJson(request.body(), SCCCredentialsJson.class);
123122

124-
IssHub hub = (IssHub) hubManager.findServer(IssRole.HUB, fqdn);
125-
if (hub == null) {
123+
try {
124+
hubManager.storeSCCCredentials(token, storeRequest.getUsername(), storeRequest.getPassword());
125+
return success(response);
126+
}
127+
catch (IllegalArgumentException ex) {
126128
// This should never happen, fqdn guaranteed be a hub after calling allowingOnlyHub() on route init.
127129
return badRequest(response, "Specified FQDN is not a known hub");
128130
}
129-
130-
hubManager.storeSCCCredentials(hub, storeRequest.getUsername(), storeRequest.getPassword());
131-
return success(response);
132131
}
133132
}

0 commit comments

Comments
 (0)