Skip to content

Commit 6cbc8b6

Browse files
authored
JCL-355: Add reset method to session interface (#475)
1 parent 9677e36 commit 6cbc8b6

File tree

7 files changed

+97
-1
lines changed

7 files changed

+97
-1
lines changed

access-grant/src/main/java/com/inrupt/client/accessgrant/AccessGrantSession.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ public String getId() {
104104
return id;
105105
}
106106

107+
@Override
108+
public void reset() {
109+
session.reset();
110+
tokenCache.invalidateAll();
111+
}
112+
107113
@Override
108114
public Optional<URI> getPrincipal() {
109115
return session.getPrincipal();

access-grant/src/test/java/com/inrupt/client/accessgrant/AccessGrantSessionTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@
2424
import static org.junit.jupiter.api.Assertions.*;
2525

2626
import com.inrupt.client.Request;
27+
import com.inrupt.client.auth.Authenticator;
28+
import com.inrupt.client.auth.Challenge;
2729
import com.inrupt.client.auth.Credential;
2830
import com.inrupt.client.auth.Session;
31+
import com.inrupt.client.openid.OpenIdAuthenticationProvider;
2932
import com.inrupt.client.openid.OpenIdSession;
3033
import com.inrupt.client.util.URIBuilder;
3134

@@ -106,6 +109,32 @@ void testAccessGrantSession() throws IOException {
106109
}
107110
}
108111

112+
@Test
113+
void testProtectedResource() throws IOException {
114+
final Map<String, Object> claims = new HashMap<>();
115+
claims.put("webid", WEBID);
116+
claims.put("sub", SUB);
117+
claims.put("iss", ISS);
118+
claims.put("azp", AZP);
119+
120+
final String token = AccessGrantTestUtils.generateIdToken(claims);
121+
122+
try (final InputStream resource = AccessGrantTest.class.getResourceAsStream("/access_grant3.json")) {
123+
final AccessGrant grant = AccessGrant.ofAccessGrant(resource);
124+
final Session session = AccessGrantSession.ofAccessGrant(OpenIdSession.ofIdToken(token), grant);
125+
final Request req = Request.newBuilder(URI.create("https://storage.example/protected-resource")).build();
126+
final Authenticator auth = new OpenIdAuthenticationProvider().getAuthenticator(Challenge.of("Bearer"));
127+
128+
final Optional<Credential> credential = session.authenticate(auth, req, Collections.emptySet())
129+
.toCompletableFuture().join();
130+
131+
assertTrue(credential.isPresent());
132+
assertTrue(session.fromCache(req).isPresent());
133+
session.reset();
134+
assertFalse(session.fromCache(req).isPresent());
135+
}
136+
}
137+
109138
@ParameterizedTest
110139
@MethodSource
111140
void ancestors(final URI parent, final URI resource, final boolean expected) {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"@context": ["https://www.w3.org/2018/credentials/v1"],
3+
"type": ["VerifiablePresentation"],
4+
"verifiableCredential": [{
5+
"@context":[
6+
"https://www.w3.org/2018/credentials/v1",
7+
"https://w3id.org/security/suites/ed25519-2020/v1",
8+
"https://w3id.org/vc-revocation-list-2020/v1",
9+
"https://schema.inrupt.com/credentials/v1.jsonld"],
10+
"id":"https://accessgrant.example/credential/5c6060ad-2f16-4bc1-b022-dffb46bff626",
11+
"type":["VerifiableCredential","SolidAccessGrant"],
12+
"issuer":"https://accessgrant.example",
13+
"expirationDate":"2022-08-27T12:00:00Z",
14+
"issuanceDate":"2022-08-25T20:34:05.153Z",
15+
"credentialSubject":{
16+
"id":"https://id.example/grantor",
17+
"providedConsent":{
18+
"mode":["Read"],
19+
"hasStatus":"https://w3id.org/GConsent#ConsentStatusExplicitlyGiven",
20+
"isProvidedToPerson":"https://id.example/grantee",
21+
"forPurpose":["https://purpose.example/Purpose1"],
22+
"forPersonalData":["https://storage.example/protected-resource"]}},
23+
"proof":{
24+
"created":"2022-08-25T20:34:05.236Z",
25+
"proofPurpose":"assertionMethod",
26+
"proofValue":"nIeQF44XVik7onnAbdkbp8xxJ2C8JoTw6-VtCkAzxuWYRFsSfYpft5MuAJaivyeKDmaK82Lj_YsME2xgL2WIBQ",
27+
"type":"Ed25519Signature2020",
28+
"verificationMethod":"https://accessgrant.example/key/1e332728-4af5-46e4-a5db-4f7b89e3f378"}
29+
}]
30+
}
31+

api/src/main/java/com/inrupt/client/auth/Session.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ public interface Session {
9393
*/
9494
Optional<String> selectThumbprint(Collection<String> algorithms);
9595

96+
/**
97+
* Reset the session state, clearing any internal caches.
98+
*/
99+
void reset();
100+
96101
/**
97102
* Fetch an authentication token from session values.
98103
*
@@ -159,6 +164,11 @@ public Optional<String> selectThumbprint(final Collection<String> algorithms) {
159164
return Optional.empty();
160165
}
161166

167+
@Override
168+
public void reset() {
169+
// no-op
170+
}
171+
162172
@Override
163173
public CompletionStage<Optional<Credential>> authenticate(final Authenticator authenticator,
164174
final Request request, final Set<String> algorithms) {

openid/src/main/java/com/inrupt/client/openid/OpenIdSession.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,12 @@ public Optional<Credential> fromCache(final Request request) {
230230
return Optional.empty();
231231
}
232232

233+
@Override
234+
public void reset() {
235+
credential.set(null);
236+
requestCache.invalidateAll();
237+
}
238+
233239
@Override
234240
public CompletionStage<Optional<Credential>> authenticate(final Authenticator auth,
235241
final Request request, final Set<String> algorithms) {

openid/src/test/java/com/inrupt/client/openid/OpenIdSessionTest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import com.inrupt.client.Request;
3030
import com.inrupt.client.auth.Authenticator;
31+
import com.inrupt.client.auth.Challenge;
3132
import com.inrupt.client.auth.Credential;
3233
import com.inrupt.client.auth.DPoP;
3334
import com.inrupt.client.auth.Session;
@@ -158,9 +159,14 @@ void testClientCredentials() {
158159
final Optional<URI> principal = session.getPrincipal();
159160
assertEquals(Optional.of(URI.create(WEBID)), principal);
160161
assertFalse(session.fromCache(null).isPresent());
161-
final Optional<Credential> credential = session.authenticate(null, Collections.emptySet())
162+
final Authenticator auth = new OpenIdAuthenticationProvider().getAuthenticator(Challenge.of("Bearer"));
163+
final Request req = Request.newBuilder(URI.create("https://storage.example")).build();
164+
final Optional<Credential> credential = session.authenticate(auth, req, Collections.emptySet())
162165
.toCompletableFuture().join();
163166
assertEquals(Optional.of(URI.create(WEBID)), credential.flatMap(Credential::getPrincipal));
167+
assertTrue(session.fromCache(req).isPresent());
168+
session.reset();
169+
assertFalse(session.fromCache(req).isPresent());
164170
}
165171

166172
@Test

uma/src/main/java/com/inrupt/client/uma/UmaSession.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,14 @@ public String getId() {
8181
return id;
8282
}
8383

84+
@Override
85+
public void reset() {
86+
for (final Session session : internalSessions) {
87+
session.reset();
88+
}
89+
tokenCache.invalidateAll();
90+
}
91+
8492
@Override
8593
public Optional<URI> getPrincipal() {
8694
for (final Session session : internalSessions) {

0 commit comments

Comments
 (0)