From ec019e19055d2ae8fe3d3a7d8dd5221361b8e341 Mon Sep 17 00:00:00 2001 From: Stephen Kraffmiller Date: Wed, 16 Oct 2019 17:20:59 -0400 Subject: [PATCH 1/7] #6266 preliminary checkin to add endpoints --- .../harvard/iq/dataverse/ApiTokenPage.java | 12 +--- .../iq/dataverse/api/BuiltinUsers.java | 10 +-- .../edu/harvard/iq/dataverse/api/Users.java | 71 +++++++++++++++++++ .../edu/harvard/iq/dataverse/api/UsersIT.java | 11 +++ 4 files changed, 85 insertions(+), 19 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/ApiTokenPage.java b/src/main/java/edu/harvard/iq/dataverse/ApiTokenPage.java index b2ee4299c2a..05923b9e13a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ApiTokenPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/ApiTokenPage.java @@ -69,16 +69,8 @@ public void generate() { if (apiToken != null) { authSvc.removeApiToken(au); } - /** - * @todo DRY! Stolen from BuiltinUsers API page - */ - ApiToken newToken = new ApiToken(); - newToken.setTokenString(java.util.UUID.randomUUID().toString()); - newToken.setAuthenticatedUser(au); - Calendar c = Calendar.getInstance(); - newToken.setCreateTime(new Timestamp(c.getTimeInMillis())); - c.roll(Calendar.YEAR, 1); - newToken.setExpireTime(new Timestamp(c.getTimeInMillis())); + + ApiToken newToken = authSvc.generateApiTokenForUser(au); authSvc.save(newToken); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java b/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java index 515184e50b8..0477c1030b8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java @@ -155,15 +155,7 @@ private Response internalSave(BuiltinUser user, String password, String key) { UserNotification.Type.CREATEACC, null); } - ApiToken token = new ApiToken(); - - token.setTokenString(java.util.UUID.randomUUID().toString()); - token.setAuthenticatedUser(au); - - Calendar c = Calendar.getInstance(); - token.setCreateTime(new Timestamp(c.getTimeInMillis())); - c.roll(Calendar.YEAR, 1); - token.setExpireTime(new Timestamp(c.getTimeInMillis())); + ApiToken token = authSvc.generateApiTokenForUser(au); authSvc.save(token); JsonObjectBuilder resp = Json.createObjectBuilder(); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Users.java b/src/main/java/edu/harvard/iq/dataverse/api/Users.java index dbce8004925..9c8a2b531af 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Users.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Users.java @@ -6,12 +6,16 @@ package edu.harvard.iq.dataverse.api; import static edu.harvard.iq.dataverse.api.AbstractApiBean.error; +import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; +import edu.harvard.iq.dataverse.authorization.users.ApiToken; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.engine.command.impl.ChangeUserIdentifierCommand; import edu.harvard.iq.dataverse.engine.command.impl.MergeInAccountCommand; import java.util.logging.Logger; import javax.ejb.Stateless; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; @@ -98,4 +102,71 @@ public Response changeAuthenticatedUserIdentifier(@PathParam("identifier") Strin return ok("UserIdentifier changed from " + oldIdentifier + " to " + newIdentifier); } + @Path("token") + @DELETE + public Response deleteToken() { + User u; + + try { + u = findUserOrDie(); + } catch (WrappedResponse ex) { + return ex.getResponse(); + } + AuthenticatedUser au = authSvc.getAuthenticatedUserWithProvider(u.getIdentifier()); + if (au == null) { + return notFound("Token for " + u.getIdentifier() + " not found."); + } + authSvc.removeApiToken(au); + return ok("Token for " + au.getUserIdentifier() + " deleted."); + + } + + @Path("token") + @GET + public Response getTokenExpirationDate() { + User u; + + try { + u = findUserOrDie(); + } catch (WrappedResponse ex) { + return ex.getResponse(); + } + AuthenticatedUser au = authSvc.getAuthenticatedUserWithProvider(u.getIdentifier()); + if (au == null) { + return notFound("Token for " + u.getIdentifier() + " not found."); + } + + ApiToken token = authSvc.findApiToken(getRequestApiKey()); + + return ok("Token for " + au.getUserIdentifier() + " expires on " + token.getExpireTime()); + + } + + @Path("token/recreate") + @POST + public Response recreateToken() { + User u; + + try { + u = findUserOrDie(); + } catch (WrappedResponse ex) { + return ex.getResponse(); + } + AuthenticatedUser au = authSvc.getAuthenticatedUserWithProvider(u.getIdentifier()); + if (au == null) { + return notFound("Token for " + u.getIdentifier() + " not found."); + } + + ApiToken apiToken = authSvc.findApiTokenByUser(au); + if (apiToken != null) { + authSvc.removeApiToken(au); + } + + ApiToken newToken = authSvc.generateApiTokenForUser(au); + authSvc.save(newToken); + + return ok("New token for " + au.getUserIdentifier() + " is " + newToken.getTokenString()); + + } + } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java index c17a1c689a6..81528f193de 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java @@ -352,6 +352,17 @@ public void testUsernameCaseSensitivity() { .body("message", equalTo("username '" + uppercaseUsername + "' already exists")); ; } + + @Test + public void testAPITokenEndpoints(){ + + Response createUser = UtilIT.createRandomUser(); + createUser.prettyPrint(); + assertEquals(200, createUser.getStatusCode()); + String usernameOfUser = UtilIT.getUsernameFromResponse(createUser); + String userApiToken = UtilIT.getApiTokenFromResponse(createUser); + + } private Response convertUserFromBcryptToSha1(long idOfBcryptUserToConvert, String password) { JsonObjectBuilder data = Json.createObjectBuilder(); From 835cb7b55b35c4f2a692c001fe37abf6101544aa Mon Sep 17 00:00:00 2001 From: Stephen Kraffmiller Date: Thu, 17 Oct 2019 14:30:17 -0400 Subject: [PATCH 2/7] #6266 add IT tests --- .../edu/harvard/iq/dataverse/api/Users.java | 37 ++++++++++---- .../AuthenticationServiceBean.java | 6 +++ .../edu/harvard/iq/dataverse/api/UsersIT.java | 51 ++++++++++++++++--- .../edu/harvard/iq/dataverse/api/UtilIT.java | 21 ++++++++ 4 files changed, 98 insertions(+), 17 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Users.java b/src/main/java/edu/harvard/iq/dataverse/api/Users.java index 9c8a2b531af..4575104d0e1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Users.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Users.java @@ -112,10 +112,19 @@ public Response deleteToken() { } catch (WrappedResponse ex) { return ex.getResponse(); } - AuthenticatedUser au = authSvc.getAuthenticatedUserWithProvider(u.getIdentifier()); + AuthenticatedUser au; + + try{ + au = (AuthenticatedUser) u; + } catch (ClassCastException e){ + //if we have a non-authentivated user we stop here. + return notFound("Token for " + u.getIdentifier() + " not found."); + } + if (au == null) { return notFound("Token for " + u.getIdentifier() + " not found."); } + authSvc.removeApiToken(au); return ok("Token for " + au.getUserIdentifier() + " deleted."); @@ -130,15 +139,15 @@ public Response getTokenExpirationDate() { u = findUserOrDie(); } catch (WrappedResponse ex) { return ex.getResponse(); - } - AuthenticatedUser au = authSvc.getAuthenticatedUserWithProvider(u.getIdentifier()); - if (au == null) { - return notFound("Token for " + u.getIdentifier() + " not found."); - } + } ApiToken token = authSvc.findApiToken(getRequestApiKey()); - return ok("Token for " + au.getUserIdentifier() + " expires on " + token.getExpireTime()); + if (token == null) { + return notFound("Token " + getRequestApiKey() + " not found."); + } + + return ok("Token " + getRequestApiKey() + " expires on " + token.getExpireTime()); } @@ -152,14 +161,22 @@ public Response recreateToken() { } catch (WrappedResponse ex) { return ex.getResponse(); } - AuthenticatedUser au = authSvc.getAuthenticatedUserWithProvider(u.getIdentifier()); + + AuthenticatedUser au; + try{ + au = (AuthenticatedUser) u; + } catch (ClassCastException e){ + //if we have a non-authentivated user we stop here. + return notFound("Token for " + u.getIdentifier() + " not found."); + } + if (au == null) { return notFound("Token for " + u.getIdentifier() + " not found."); } - ApiToken apiToken = authSvc.findApiTokenByUser(au); + ApiToken apiToken = authSvc.findApiToken(getRequestApiKey()); if (apiToken != null) { - authSvc.removeApiToken(au); + authSvc.removeApiToken(apiToken); } ApiToken newToken = authSvc.generateApiTokenForUser(au); diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java index 70e8c092df3..01ccb0b24ac 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java @@ -240,6 +240,12 @@ public void removeApiToken(AuthenticatedUser user){ } } + public void removeApiToken(ApiToken token) { + + em.remove(token); + + } + public boolean isOrcidEnabled() { return oAuth2authenticationProviders.values().stream().anyMatch( s -> s.getId().toLowerCase().contains("orcid") ); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java index 81528f193de..8584116502c 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java @@ -5,15 +5,10 @@ import com.jayway.restassured.http.ContentType; import com.jayway.restassured.path.json.JsonPath; import com.jayway.restassured.response.Response; -import static edu.harvard.iq.dataverse.api.AccessIT.apiToken; -import static edu.harvard.iq.dataverse.api.AccessIT.datasetId; -import static edu.harvard.iq.dataverse.api.AccessIT.tabFile3NameRestricted; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.json.Json; import javax.json.JsonObjectBuilder; import static javax.ws.rs.core.Response.Status.BAD_REQUEST; @@ -22,6 +17,7 @@ import static javax.ws.rs.core.Response.Status.OK; import static javax.ws.rs.core.Response.Status.UNAUTHORIZED; import static junit.framework.Assert.assertEquals; +import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertTrue; import org.junit.BeforeClass; @@ -354,13 +350,54 @@ public void testUsernameCaseSensitivity() { } @Test - public void testAPITokenEndpoints(){ - + public void testAPITokenEndpoints() { + Response createUser = UtilIT.createRandomUser(); createUser.prettyPrint(); assertEquals(200, createUser.getStatusCode()); String usernameOfUser = UtilIT.getUsernameFromResponse(createUser); String userApiToken = UtilIT.getApiTokenFromResponse(createUser); + + Response getExpiration = UtilIT.getTokenExpiration("BAD-TOKEN-692134794"); + getExpiration.prettyPrint(); + getExpiration.then().assertThat() + .statusCode(UNAUTHORIZED.getStatusCode()); + + getExpiration = UtilIT.getTokenExpiration(userApiToken); + getExpiration.prettyPrint(); + getExpiration.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.message", containsString(userApiToken)) + .body("data.message", containsString("expires on")); + + Response recreateToken = UtilIT.recreateToken("BAD-Token-blah-89234"); + recreateToken.prettyPrint(); + recreateToken.then().assertThat() + .statusCode(UNAUTHORIZED.getStatusCode()); + + recreateToken = UtilIT.recreateToken(userApiToken); + recreateToken.prettyPrint(); + recreateToken.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.message", containsString("New token for")); + + createUser = UtilIT.createRandomUser(); + createUser.prettyPrint(); + assertEquals(200, createUser.getStatusCode()); + + String userApiTokenForDelete = UtilIT.getApiTokenFromResponse(createUser); + + Response deleteToken = UtilIT.deleteToken(userApiTokenForDelete); + deleteToken.prettyPrint(); + deleteToken.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.message", containsString(" deleted.")); + + //Make sure it's deleted + getExpiration = UtilIT.getTokenExpiration(userApiTokenForDelete); + getExpiration.prettyPrint(); + getExpiration.then().assertThat() + .statusCode(UNAUTHORIZED.getStatusCode()); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 338ae2fe3a0..9c9f0a3defd 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -1985,6 +1985,27 @@ static Response sitemapDownload() { return given() .get("/sitemap.xml"); } + + static Response deleteToken( String apiToken) { + Response response = given() + .header(API_TOKEN_HTTP_HEADER, apiToken) + .delete("api/users/token"); + return response; + } + + static Response getTokenExpiration( String apiToken) { + Response response = given() + .header(API_TOKEN_HTTP_HEADER, apiToken) + .get("api/users/token"); + return response; + } + + static Response recreateToken( String apiToken) { + Response response = given() + .header(API_TOKEN_HTTP_HEADER, apiToken) + .post("api/users/token/recreate"); + return response; + } @Test public void testGetFileIdFromSwordStatementWithNoFiles() { From 44fc4a7140afc75ac17acb1d936466e94adfa0ad Mon Sep 17 00:00:00 2001 From: Stephen Kraffmiller Date: Thu, 17 Oct 2019 16:01:05 -0400 Subject: [PATCH 3/7] #6266 add api token management documentation --- doc/sphinx-guides/source/api/native-api.rst | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 51285de2f44..5aae0977c28 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -1033,6 +1033,34 @@ Starting the release 4.10 the size of the saved original file (for an ingested t Note the optional "limit" parameter. Without it, the API will attempt to populate the sizes for all the saved originals that don't have them in the database yet. Otherwise it will do so for the first N such datafiles. +Users Token Management +---------------------- + +The following endpoints will allow users to manage their API tokens. + +Find a Token's Expiration Date +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In order to obtain the expiration date of a token use:: + + curl -H X-Dataverse-key:$API_TOKEN -X GET $SERVER_URL/api/users/token + +Recreate a Token +~~~~~~~~~~~~~~~~ + +In order to obtain a new token use:: + + curl -H X-Dataverse-key:$API_TOKEN -X POST $SERVER_URL/api/users/token/recreate + +Delete a Token +~~~~~~~~~~~~~~~~ + +In order to delete a token use:: + + curl -H X-Dataverse-key:$API_TOKEN -X DELETE $SERVER_URL/api/users/token + + + Builtin Users ------------- From e7704f17f1e51e06607973c153e5ca28172013fd Mon Sep 17 00:00:00 2001 From: Stephen Kraffmiller Date: Fri, 18 Oct 2019 11:05:48 -0400 Subject: [PATCH 4/7] #6266 code cleanup --- src/main/java/edu/harvard/iq/dataverse/api/Users.java | 6 ++++-- src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Users.java b/src/main/java/edu/harvard/iq/dataverse/api/Users.java index 4575104d0e1..31a623aa522 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Users.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Users.java @@ -168,13 +168,15 @@ public Response recreateToken() { } catch (ClassCastException e){ //if we have a non-authentivated user we stop here. return notFound("Token for " + u.getIdentifier() + " not found."); - } - + } + + /* this null check is probably overkill*/ if (au == null) { return notFound("Token for " + u.getIdentifier() + " not found."); } ApiToken apiToken = authSvc.findApiToken(getRequestApiKey()); + if (apiToken != null) { authSvc.removeApiToken(apiToken); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java index 8584116502c..032156f1cc1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java @@ -355,7 +355,7 @@ public void testAPITokenEndpoints() { Response createUser = UtilIT.createRandomUser(); createUser.prettyPrint(); assertEquals(200, createUser.getStatusCode()); - String usernameOfUser = UtilIT.getUsernameFromResponse(createUser); + String userApiToken = UtilIT.getApiTokenFromResponse(createUser); Response getExpiration = UtilIT.getTokenExpiration("BAD-TOKEN-692134794"); From 212b579268bab747ff63b55cbf1a47f615ccff17 Mon Sep 17 00:00:00 2001 From: Stephen Kraffmiller Date: Fri, 18 Oct 2019 11:35:15 -0400 Subject: [PATCH 5/7] #6266 more code cleanup --- src/main/java/edu/harvard/iq/dataverse/api/Users.java | 7 +------ .../dataverse/authorization/AuthenticationServiceBean.java | 6 ------ 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Users.java b/src/main/java/edu/harvard/iq/dataverse/api/Users.java index 31a623aa522..454715cf2a0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Users.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Users.java @@ -6,7 +6,6 @@ package edu.harvard.iq.dataverse.api; import static edu.harvard.iq.dataverse.api.AbstractApiBean.error; -import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.authorization.users.ApiToken; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; @@ -175,11 +174,7 @@ public Response recreateToken() { return notFound("Token for " + u.getIdentifier() + " not found."); } - ApiToken apiToken = authSvc.findApiToken(getRequestApiKey()); - - if (apiToken != null) { - authSvc.removeApiToken(apiToken); - } + authSvc.removeApiToken(au); ApiToken newToken = authSvc.generateApiTokenForUser(au); authSvc.save(newToken); diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java index 01ccb0b24ac..70e8c092df3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java @@ -240,12 +240,6 @@ public void removeApiToken(AuthenticatedUser user){ } } - public void removeApiToken(ApiToken token) { - - em.remove(token); - - } - public boolean isOrcidEnabled() { return oAuth2authenticationProviders.values().stream().anyMatch( s -> s.getId().toLowerCase().contains("orcid") ); } From 6a49aed1c4e9df769c2b361aaef8f586b608c0ef Mon Sep 17 00:00:00 2001 From: Danny Brooke Date: Fri, 18 Oct 2019 12:07:04 -0400 Subject: [PATCH 6/7] typo --- src/main/java/edu/harvard/iq/dataverse/api/Users.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Users.java b/src/main/java/edu/harvard/iq/dataverse/api/Users.java index 454715cf2a0..b0d882da85c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Users.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Users.java @@ -116,7 +116,7 @@ public Response deleteToken() { try{ au = (AuthenticatedUser) u; } catch (ClassCastException e){ - //if we have a non-authentivated user we stop here. + //if we have a non-authenticated user we stop here. return notFound("Token for " + u.getIdentifier() + " not found."); } From 8cef2b6bd7a9db1e52289552d33e4617f2db7479 Mon Sep 17 00:00:00 2001 From: Stephen Kraffmiller Date: Fri, 18 Oct 2019 14:59:13 -0400 Subject: [PATCH 7/7] #6266 still more code cleanup and private url test --- .../edu/harvard/iq/dataverse/api/Users.java | 16 +++------ .../edu/harvard/iq/dataverse/api/UsersIT.java | 33 ++++++++++++++++++- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Users.java b/src/main/java/edu/harvard/iq/dataverse/api/Users.java index b0d882da85c..1ffdb441ca9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Users.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Users.java @@ -117,13 +117,9 @@ public Response deleteToken() { au = (AuthenticatedUser) u; } catch (ClassCastException e){ //if we have a non-authenticated user we stop here. - return notFound("Token for " + u.getIdentifier() + " not found."); + return notFound("Token for " + u.getIdentifier() + " not eligible for deletion."); } - if (au == null) { - return notFound("Token for " + u.getIdentifier() + " not found."); - } - authSvc.removeApiToken(au); return ok("Token for " + au.getUserIdentifier() + " deleted."); @@ -133,7 +129,7 @@ public Response deleteToken() { @GET public Response getTokenExpirationDate() { User u; - + try { u = findUserOrDie(); } catch (WrappedResponse ex) { @@ -165,14 +161,10 @@ public Response recreateToken() { try{ au = (AuthenticatedUser) u; } catch (ClassCastException e){ - //if we have a non-authentivated user we stop here. - return notFound("Token for " + u.getIdentifier() + " not found."); + //if we have a non-authenticated user we stop here. + return notFound("Token for " + u.getIdentifier() + " is not eligible for recreation."); } - /* this null check is probably overkill*/ - if (au == null) { - return notFound("Token for " + u.getIdentifier() + " not found."); - } authSvc.removeApiToken(au); diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java index 032156f1cc1..35799add309 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UsersIT.java @@ -362,7 +362,7 @@ public void testAPITokenEndpoints() { getExpiration.prettyPrint(); getExpiration.then().assertThat() .statusCode(UNAUTHORIZED.getStatusCode()); - + getExpiration = UtilIT.getTokenExpiration(userApiToken); getExpiration.prettyPrint(); getExpiration.then().assertThat() @@ -386,6 +386,37 @@ public void testAPITokenEndpoints() { assertEquals(200, createUser.getStatusCode()); String userApiTokenForDelete = UtilIT.getApiTokenFromResponse(createUser); + + /* + Add tests for Private URL + */ + + createUser = UtilIT.createRandomUser(); + String username = UtilIT.getUsernameFromResponse(createUser); + String apiToken = UtilIT.getApiTokenFromResponse(createUser); + Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken); + createDataverseResponse.prettyPrint(); + String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse); + + Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken); + createDatasetResponse.prettyPrint(); + Integer datasetId = JsonPath.from(createDatasetResponse.body().asString()).getInt("data.id"); + + Response createPrivateUrl = UtilIT.privateUrlCreate(datasetId, apiToken); + createPrivateUrl.prettyPrint(); + assertEquals(OK.getStatusCode(), createPrivateUrl.getStatusCode()); + + Response shouldExist = UtilIT.privateUrlGet(datasetId, apiToken); + shouldExist.prettyPrint(); + assertEquals(OK.getStatusCode(), shouldExist.getStatusCode()); + + String tokenForPrivateUrlUser = JsonPath.from(shouldExist.body().asString()).getString("data.token"); + + getExpiration = UtilIT.getTokenExpiration(tokenForPrivateUrlUser); + getExpiration.prettyPrint(); + getExpiration.then().assertThat() + .statusCode(NOT_FOUND.getStatusCode()); + Response deleteToken = UtilIT.deleteToken(userApiTokenForDelete); deleteToken.prettyPrint();