diff --git a/doc/release-notes/12194-ignore-exclude-email-setting-for-collections.md b/doc/release-notes/12194-ignore-exclude-email-setting-for-collections.md new file mode 100644 index 00000000000..def993ae624 --- /dev/null +++ b/doc/release-notes/12194-ignore-exclude-email-setting-for-collections.md @@ -0,0 +1,2 @@ +A new query parameter (`ignoreSettingExcludeEmailFromExport`) has been added to the ["View a Dataverse Collection"](https://guides.dataverse.org/en/latest/api/native-api.html#view-a-dataverse-collection) API (`/api/dataverses/{collectionId}`). +This query parameter prevents the contact emails from being excluded when the setting `ExcludeEmailFromExport` is set to true and the user has EditDataverse permissions. \ No newline at end of file diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 2befaa56b0c..0e6940defd0 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -185,6 +185,13 @@ Usage example: curl "https://demo.dataverse.org/api/dataverses/root?returnChildCount=true" +If a user with EditDataverse permissions wants to ignore the setting ``ExcludeEmailFromExport`` in order to see the contact emails, they must include the ``ignoreSettingExcludeEmailFromExport`` query parameter. + +Usage example: + +.. code-block:: bash + + curl "https://demo.dataverse.org/api/dataverses/root?ignoreSettingExcludeEmailFromExport=true" To view an unpublished Dataverse collection: diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java index caf778be675..7b0b3bfa144 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -717,10 +717,22 @@ private Dataset parseDataset(String datasetJson) throws WrappedResponse { @GET @AuthRequired @Path("{identifier}") - public Response getDataverse(@Context ContainerRequestContext crc, @PathParam("identifier") String idtf, @QueryParam("returnOwners") boolean returnOwners, @QueryParam("returnChildCount") boolean returnChildCount) { + public Response getDataverse(@Context ContainerRequestContext crc, + @PathParam("identifier") String idtf, + @QueryParam("returnOwners") boolean returnOwners, + @QueryParam("returnChildCount") boolean returnChildCount, + @QueryParam("ignoreSettingExcludeEmailFromExport") Boolean ignoreSettingToExcludeEmailFromExport) { return response(req -> { Dataverse dataverse = execCommand(new GetDataverseCommand(req, findDataverseOrDie(idtf))); + boolean hideEmail = settingsService.isTrueForKey(SettingsServiceBean.Key.ExcludeEmailFromExport, false); + + // Check to see if the caller wants to ignore the ExcludeEmailFromExport setting and that they have permission to do so + boolean ignoreSettingExcludeEmailFromExport = ignoreSettingToExcludeEmailFromExport != null ? ignoreSettingToExcludeEmailFromExport : false; + if (hideEmail && ignoreSettingExcludeEmailFromExport && permissionService.userOn(getRequestUser(crc), dataverse).has(Permission.EditDataverse)) { + hideEmail = false; + } + return ok(json(dataverse, hideEmail, returnOwners, false, returnChildCount ? dataverseService.getChildCount(dataverse) : null)); }, getRequestUser(crc)); } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index 632ac39eb4e..2d22f90ec7a 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -328,6 +328,25 @@ public void testReturnEmail() throws FileNotFoundException { List dataverseEmailNotAllowed = with(exportDataverseAsJson.body().asString()) .getJsonObject("data.dataverseContacts"); assertNull(dataverseEmailNotAllowed); + + Response getDataverseWithIgnoreExcludeEmail = UtilIT.getDataverseWithIgnoreExcludeEmail(dataverseAlias, apiToken, true); + getDataverseWithIgnoreExcludeEmail.prettyPrint(); + getDataverseWithIgnoreExcludeEmail.then().assertThat() + .statusCode(OK.getStatusCode()); + + getDataverseWithIgnoreExcludeEmail.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.alias", equalTo(dataverseAlias)) + .body("data.name", equalTo(dataverseAlias)) + .body("data.dataverseContacts[0].displayOrder", equalTo(0)) + .body("data.dataverseContacts[0].contactEmail", equalTo(emailAddressOfFirstDataverseContact)) + .body("data.permissionRoot", equalTo(true)) + .body("data.dataverseType", equalTo("UNCATEGORIZED")); + + RestAssured.unregisterParser("text/plain"); + List dataverseEmailAllowed = with(getDataverseWithIgnoreExcludeEmail.body().asString()) + .getJsonObject("data.dataverseContacts"); + assertNotNull(dataverseEmailAllowed); Response removeExcludeEmail = UtilIT.deleteSetting(SettingsServiceBean.Key.ExcludeEmailFromExport); removeExcludeEmail.then().assertThat() @@ -347,9 +366,9 @@ public void testReturnEmail() throws FileNotFoundException { .body("data.dataverseType", equalTo("UNCATEGORIZED")); RestAssured.unregisterParser("text/plain"); - List dataverseEmailAllowed = with(exportDataverseAsJson2.body().asString()) + List dataverseEmailAllowed2 = with(exportDataverseAsJson2.body().asString()) .getJsonObject("data.dataverseContacts"); - assertNotNull(dataverseEmailAllowed); + assertNotNull(dataverseEmailAllowed2); Response deleteDataverse2 = UtilIT.deleteDataverse(dataverseAlias, apiToken); deleteDataverse2.prettyPrint(); 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 24ab8b56eff..fa18989cbd5 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -1886,6 +1886,14 @@ static Response getDataverseWithChildCount(String alias, String apiToken, boole + (returnChildCount ? "/?returnChildCount=true" : "")); } + static Response getDataverseWithIgnoreExcludeEmail(String alias, String apiToken, boolean ignoreSettingExcludeEmailFromExport) { + return given() + .header(API_TOKEN_HTTP_HEADER, apiToken) + .get("/api/dataverses/" + + alias + + (ignoreSettingExcludeEmailFromExport ? "/?ignoreSettingExcludeEmailFromExport=true" : "")); + } + static Response getMetadataBlockFromDatasetVersion(String persistentId, String versionNumber, String metadataBlock, String apiToken) { return given() .header(API_TOKEN_HTTP_HEADER, apiToken)