diff --git a/.github/workflows/deploy_beta_testing.yml b/.github/workflows/deploy_beta_testing.yml index f0afb01dd18..7a236a316fb 100644 --- a/.github/workflows/deploy_beta_testing.yml +++ b/.github/workflows/deploy_beta_testing.yml @@ -50,7 +50,7 @@ jobs: - uses: actions/checkout@v4 - name: Download war artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: built-app path: ./ diff --git a/.github/workflows/maven_unit_test.yml b/.github/workflows/maven_unit_test.yml index efefdaee02a..f0cf461d8e6 100644 --- a/.github/workflows/maven_unit_test.yml +++ b/.github/workflows/maven_unit_test.yml @@ -112,7 +112,7 @@ jobs: cache: maven # Get the build output from the unit test job - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: java-artifacts - run: | @@ -145,7 +145,7 @@ jobs: cache: maven # Get the build output from the integration test job - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: name: java-reportdir - run: tar -xvf java-reportdir.tar diff --git a/conf/keycloak/Dockerfile b/conf/keycloak/Dockerfile index 76088f402c7..6fbaad787b3 100644 --- a/conf/keycloak/Dockerfile +++ b/conf/keycloak/Dockerfile @@ -14,10 +14,10 @@ RUN mvn clean package # ------------------------------------------ # Stage 2: Build Keycloak Image # ------------------------------------------ -FROM quay.io/keycloak/keycloak:26.1.4 +FROM quay.io/keycloak/keycloak:26.3.2 # Add the Oracle JDBC jars -ARG ORACLE_JDBC_VERSION=23.7.0.25.01 +ARG ORACLE_JDBC_VERSION=23.8.0.25.04 ADD --chown=keycloak:keycloak https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc11/${ORACLE_JDBC_VERSION}/ojdbc11-${ORACLE_JDBC_VERSION}.jar /opt/keycloak/providers/ojdbc11.jar ADD --chown=keycloak:keycloak https://repo1.maven.org/maven2/com/oracle/database/nls/orai18n/${ORACLE_JDBC_VERSION}/orai18n-${ORACLE_JDBC_VERSION}.jar /opt/keycloak/providers/orai18n.jar diff --git a/conf/keycloak/builtin-users-spi/pom.xml b/conf/keycloak/builtin-users-spi/pom.xml index afb3495c2be..36cf6548d01 100644 --- a/conf/keycloak/builtin-users-spi/pom.xml +++ b/conf/keycloak/builtin-users-spi/pom.xml @@ -100,7 +100,7 @@ - 26.1.4 + 26.3.2 17 3.2.0 0.4 diff --git a/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/services/DataverseUserService.java b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/services/DataverseUserService.java index c8fab3d0b7b..5256d5df683 100644 --- a/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/services/DataverseUserService.java +++ b/conf/keycloak/builtin-users-spi/src/main/java/edu/harvard/iq/keycloak/auth/spi/services/DataverseUserService.java @@ -27,11 +27,16 @@ public DataverseUser getUserById(String id) { DataverseBuiltinUser builtinUser = em.find(DataverseBuiltinUser.class, persistenceId); if (builtinUser == null) { - logger.debugf("User not found for external ID: %s", persistenceId); + logger.debugf("Builtin user not found for external ID: %s", persistenceId); return null; } - DataverseAuthenticatedUser authenticatedUser = getAuthenticatedUserByUsername(builtinUser.getUsername()); + String username = builtinUser.getUsername(); + DataverseAuthenticatedUser authenticatedUser = getAuthenticatedUserByUsername(username); + if (authenticatedUser == null) { + logger.debugf("Authenticated user not found by username: %s", username); + return null; + } return new DataverseUser(authenticatedUser, builtinUser); } @@ -43,11 +48,15 @@ public DataverseUser getUserByUsername(String username) { .getResultList(); if (users.isEmpty()) { - logger.debugf("User not found by username: %s", username); + logger.debugf("Builtin user not found by username: %s", username); return null; } DataverseAuthenticatedUser authenticatedUser = getAuthenticatedUserByUsername(username); + if (authenticatedUser == null) { + logger.debugf("Authenticated user not found by username: %s", username); + return null; + } return new DataverseUser(authenticatedUser, users.get(0)); } @@ -59,7 +68,7 @@ public DataverseUser getUserByEmail(String email) { .getResultList(); if (authUsers.isEmpty()) { - logger.debugf("User not found by email: %s", email); + logger.debugf("Authenticated user not found by email: %s", email); return null; } @@ -68,6 +77,11 @@ public DataverseUser getUserByEmail(String email) { .setParameter("username", username) .getResultList(); + if (builtinUsers.isEmpty()) { + logger.debugf("Builtin user not found by username: %s", username); + return null; + } + return new DataverseUser(authUsers.get(0), builtinUsers.get(0)); } diff --git a/conf/keycloak/docker-compose.yml b/conf/keycloak/docker-compose.yml index 272d8ace363..4b5cf80daca 100644 --- a/conf/keycloak/docker-compose.yml +++ b/conf/keycloak/docker-compose.yml @@ -3,7 +3,7 @@ version: "3.9" services: keycloak: - image: 'quay.io/keycloak/keycloak:26.1.4' + image: 'quay.io/keycloak/keycloak:26.3.2' command: - "start-dev" - "--import-realm" diff --git a/conf/keycloak/run-keycloak.sh b/conf/keycloak/run-keycloak.sh index 9f851a558c7..9ea34a99416 100755 --- a/conf/keycloak/run-keycloak.sh +++ b/conf/keycloak/run-keycloak.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -DOCKER_IMAGE="quay.io/keycloak/keycloak:26.1.4" +DOCKER_IMAGE="quay.io/keycloak/keycloak:26.3.2" KEYCLOAK_USER="kcadmin" KEYCLOAK_PASSWORD="kcpassword" KEYCLOAK_PORT=8090 diff --git a/conf/solr/schema.xml b/conf/solr/schema.xml index 5517175d443..34f888acec4 100644 --- a/conf/solr/schema.xml +++ b/conf/solr/schema.xml @@ -242,6 +242,7 @@ + - 6.7 + 6.7.1 17 UTF-8 @@ -159,7 +159,7 @@ 1.7.35 2.19.0 1.2 - 3.12.0 + 3.18.0 1.26.0 4.5.13 4.4.14 @@ -454,8 +454,8 @@ Once the release has been made (tag created), change this back to "${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion}" (These properties are provided by the build-helper plugin below.) --> - - ${revision} + ${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion} + ${base.image.version} diff --git a/scripts/api/data/metadatablocks/astrophysics.tsv b/scripts/api/data/metadatablocks/astrophysics.tsv index 92792d404c9..1de2d0278f2 100644 --- a/scripts/api/data/metadatablocks/astrophysics.tsv +++ b/scripts/api/data/metadatablocks/astrophysics.tsv @@ -24,7 +24,7 @@ coverage.Polarization Polarization The polarization coverage text 20 FALSE FALSE FALSE FALSE FALSE FALSE astrophysics redshiftType RedshiftType RedshiftType string C "Redshift"; or "Optical" or "Radio" definitions of Doppler velocity used in the data object. text 21 FALSE FALSE FALSE FALSE FALSE FALSE astrophysics resolution.Redshift Redshift Resolution The resolution in redshift (unitless) or Doppler velocity (km/s) in the data object. Enter a floating-point number. float 22 FALSE FALSE FALSE FALSE FALSE FALSE astrophysics - coverage.RedshiftValue Redshift Value The value of the redshift (unitless) or Doppler velocity (km/s in the data object. Enter a floating-point number. float 23 FALSE FALSE TRUE FALSE FALSE FALSE astrophysics + coverage.RedshiftValue Redshift Value The value of the redshift (unitless) or Doppler velocity (km/s in the data object. Enter a floating-point number. none 23 FALSE FALSE TRUE FALSE FALSE FALSE astrophysics coverage.Redshift.MinimumValue Minimum The minimum value of the redshift (unitless) or Doppler velocity (km/s in the data object. Enter a floating-point number. float 24 FALSE FALSE FALSE FALSE FALSE FALSE coverage.RedshiftValue astrophysics coverage.Redshift.MaximumValue Maximum The maximum value of the redshift (unitless) or Doppler velocity (km/s in the data object. Enter a floating-point number. float 25 FALSE FALSE FALSE FALSE FALSE FALSE coverage.RedshiftValue astrophysics #controlledVocabulary DatasetField Value identifier displayOrder @@ -51,4 +51,4 @@ astroType Object 20 astroType Value 21 astroType ValuePair 22 - astroType Survey 23 \ No newline at end of file + astroType Survey 23 diff --git a/scripts/api/data/metadatablocks/citation.tsv b/scripts/api/data/metadatablocks/citation.tsv index dea23aa9a73..b6bed2b9c5b 100644 --- a/scripts/api/data/metadatablocks/citation.tsv +++ b/scripts/api/data/metadatablocks/citation.tsv @@ -4085,8 +4085,8 @@ language Magoma gmx 3943 gmx language Magori zgr 3944 zgr language Maguindanaon mdh 3945 mdh - language Magɨ (Madang Province) gkd 3946 gkd - language Magɨyi gmg 3947 gmg + language Magi (Madang Province) gkd 3946 gkd + language Magiyi gmg 3947 gmg language Mahali mjx 3948 mjx language Mahasu Pahari bfz 3949 bfz language Mahican mjy 3950 mjy diff --git a/scripts/api/data/role-curator.json b/scripts/api/data/role-curator.json index 91cb7ec43e2..86f18b2ea6a 100644 --- a/scripts/api/data/role-curator.json +++ b/scripts/api/data/role-curator.json @@ -1,13 +1,14 @@ { "alias":"curator", "name":"Curator", - "description":"For datasets, a person who can edit License + Terms, edit Permissions, and publish datasets.", + "description":"For datasets, a person who can edit License + Terms, edit Permissions, and publish and link datasets.", "permissions":[ "ViewUnpublishedDataset", "EditDataset", "DownloadFile", "DeleteDatasetDraft", "PublishDataset", + "LinkDataset", "ManageDatasetPermissions", "ManageFilePermissions", "AddDataverse", diff --git a/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java b/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java index 9dd524127d7..cd0534f4c77 100644 --- a/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java +++ b/src/main/java/edu/harvard/iq/dataverse/CustomizationFilesServlet.java @@ -14,6 +14,8 @@ import java.io.PrintWriter; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.logging.Logger; + import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; @@ -22,6 +24,7 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import jakarta.ejb.EJB; import org.apache.commons.io.IOUtils; +import org.apache.tika.Tika; /** * @@ -29,7 +32,8 @@ */ @WebServlet(name = "CustomizationFilesServlet", urlPatterns = {"/CustomizationFilesServlet"}) public class CustomizationFilesServlet extends HttpServlet { - + private static final Logger logger = Logger.getLogger(CustomizationFilesServlet.class.getCanonicalName()); + @EJB SettingsServiceBean settingsService; @@ -45,7 +49,7 @@ public class CustomizationFilesServlet extends HttpServlet { */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - response.setContentType("text/html;charset=UTF-8"); + response.setContentType(request.getContentType()); String customFileType = request.getParameter("customFileType"); String filePath = getFilePath(customFileType); @@ -56,6 +60,13 @@ protected void processRequest(HttpServletRequest request, HttpServletResponse re try { File fileIn = physicalPath.toFile(); if (fileIn != null) { + Tika tika = new Tika(); + try { + String mimeType = tika.detect(fileIn); + response.setContentType(mimeType); + } catch (Exception e) { + logger.info("Error getting MIME Type for " + filePath + " : " + e.getMessage()); + } inputStream = new FileInputStream(fileIn); in = new BufferedReader(new InputStreamReader(inputStream)); diff --git a/src/main/java/edu/harvard/iq/dataverse/DataCitation.java b/src/main/java/edu/harvard/iq/dataverse/DataCitation.java index 589fb5fea9c..30d9928f59a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataCitation.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataCitation.java @@ -749,7 +749,7 @@ public JsonObject getCSLJsonFormat() { if (seriesTitles != null) { itemBuilder.containerTitle(formatString(seriesTitles.get(0), true)); } - itemBuilder.version(version).DOI(persistentId.asString()); + itemBuilder.version(version).DOI(persistentId.asRawIdentifier()); if (keywords != null) { itemBuilder .categories(keywords.stream().map(keyword -> formatString(keyword, true)).toArray(String[]::new)); diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index fd2cfc00ad0..a09d42477fc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -331,7 +331,6 @@ public enum DisplayMode { private List linkingDVSelectItems; private Dataverse linkingDataverse; private Dataverse selectedHostDataverse; - private boolean hasDataversesToChoose; public Dataverse getSelectedHostDataverse() { return selectedHostDataverse; @@ -1773,11 +1772,6 @@ public void setDataverseTemplates(List