From 9de47ade1ea45a236bf508a2b58dc511ada27096 Mon Sep 17 00:00:00 2001 From: Luigi Marini Date: Mon, 13 Nov 2023 09:43:15 -0600 Subject: [PATCH 1/7] Ranaming `master` branch to `main`. --- .github/workflows/ci.yml | 10 +++++----- .github/workflows/docker.yml | 12 ++++++------ .github/workflows/swagger.yml | 4 ++-- CONTRIBUTING.md | 2 +- INSTALL.md | 2 +- doc/src/sphinx/_static/logo_full.png | Bin 18068 -> 0 bytes doc/src/sphinx/develop/previewers.rst | 2 +- doc/src/sphinx/index.rst | 2 +- project/Build.scala | 2 +- public/swagger.yml | 2 +- release.sh | 4 ++-- 11 files changed, 21 insertions(+), 21 deletions(-) delete mode 100644 doc/src/sphinx/_static/logo_full.png diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a77d911b5..9eb79da03 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ on: push: branches: - - master + - main - develop pull_request: @@ -39,7 +39,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV @@ -94,7 +94,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV @@ -139,7 +139,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV @@ -216,7 +216,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 7702ae180..e8823d464 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -5,7 +5,7 @@ name: Docker # and would not set the right version flags. # This will run when: -# - when new code is pushed to master/develop to push the tags +# - when new code is pushed to main/develop to push the tags # latest and develop # - when a pull request is created and updated to make sure the # Dockerfile is still valid. @@ -16,14 +16,14 @@ name: Docker on: push: branches: - - master + - main - develop pull_request: -# Certain actions will only run when this is the master repo. +# Certain actions will only run when this is the main repo. env: - MASTER_REPO: clowder-framework/clowder + main_REPO: clowder-framework/clowder DOCKERHUB_ORG: clowder jobs: @@ -77,7 +77,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then version="$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" tags="latest" oldversion="" @@ -198,7 +198,7 @@ jobs: # update README at DockerHub - name: Docker Hub Description - if: env.dockerhub != '' && matrix.README != '' && github.event_name == 'push' && github.repository == env.MASTER_REPO && env.BRANCH == 'master' + if: env.dockerhub != '' && matrix.README != '' && github.event_name == 'push' && github.repository == env.main_REPO && env.BRANCH == 'main' uses: peter-evans/dockerhub-description@v2 env: DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} diff --git a/.github/workflows/swagger.yml b/.github/workflows/swagger.yml index b55dfb26f..dd3f0715f 100644 --- a/.github/workflows/swagger.yml +++ b/.github/workflows/swagger.yml @@ -1,14 +1,14 @@ name: swagger # This will run when: -# - when new code is pushed to master/develop to make sure the +# - when new code is pushed to main/develop to make sure the # code does compile. # - when a pull request is created and updated to make sure the # code does compile. on: push: branches: - - master + - main - develop pull_request: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3a2fd3f99..0187dc6d2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ below. By participating in this project, you agree to abide by the [code of cond Before your code can be accepted, you will have to sign a [CLA](https://clowderframework.org/pdf/Clowder-CLA.pdf) and mail it to lmarini@illinois.edu. -Most of the core development happens on [NCSA Bitbucket][bitbucket]. The `master` and `develop` branches are pushed to +Most of the core development happens on [NCSA Bitbucket][bitbucket]. The `` and `develop` branches are pushed to [GitHub][github] nightly. We encourage contributors to create an account on [NCSA Bitbucket][bitbucket] and make pull requests there. We also accept diff --git a/INSTALL.md b/INSTALL.md index ae9c8ba33..dc1c5e0ab 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -85,7 +85,7 @@ Next we install the script that will install or update clowder. cat > /home/browndog/update-clowder.sh << EOF #!/bin/bash -# CATS-WWW (master) is the main branch for this server +# CATS-WWW () is the main branch for this server # CATS-WWW1 (develop) if you want the latest version clowder_BRANCH=${clowder_BRANCH:-"CATS-WWW1"} diff --git a/doc/src/sphinx/_static/logo_full.png b/doc/src/sphinx/_static/logo_full.png deleted file mode 100644 index 0ecf1c8413f241bed62d96ae0e43d02f0bb446ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18068 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 diff --git a/doc/src/sphinx/develop/previewers.rst b/doc/src/sphinx/develop/previewers.rst index b9dc3da31..71da64895 100644 --- a/doc/src/sphinx/develop/previewers.rst +++ b/doc/src/sphinx/develop/previewers.rst @@ -12,4 +12,4 @@ Previewer can work together with extractors and external services. Here is a list of previewer embedded with the core -`source `_. +`source `_. diff --git a/doc/src/sphinx/index.rst b/doc/src/sphinx/index.rst index 25dc21225..7b067518f 100644 --- a/doc/src/sphinx/index.rst +++ b/doc/src/sphinx/index.rst @@ -25,7 +25,7 @@ be customized and deployed on your own cloud. `NCSA Opensource `_. A copy of the source code can also be found on `GitHub `_. - * We are always looking for `contributions `_. + * We are always looking for `contributions `_. ******** Contents diff --git a/project/Build.scala b/project/Build.scala index 585a8137b..ce954ab85 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -18,7 +18,7 @@ object ApplicationBuild extends Build { def appVersion: String = { gitBranchName match { - case "master" => getVersion + case "" => getVersion case _ => s"${getVersion}-develop" } } diff --git a/public/swagger.yml b/public/swagger.yml index 221e16ff2..f9338cd80 100644 --- a/public/swagger.yml +++ b/public/swagger.yml @@ -16,7 +16,7 @@ info: url: https://clowder.ncsa.illinois.edu/clowder/email license: name: The University of Illinois/NCSA Open Source License (NCSA) - url: https://github.com/clowder-framework/clowder/blob/master/LICENSE + url: https://github.com/clowder-framework/clowder/blob//LICENSE ################################################################################ # Servers # diff --git a/release.sh b/release.sh index ec6c83ba8..e80f404dc 100755 --- a/release.sh +++ b/release.sh @@ -4,7 +4,7 @@ set -e # can use the following to push to isda-registry for testing: -# BRANCH="master" SERVER=isda-registry.ncsa.illinois.edu/ ./release.sh +# BRANCH="" SERVER=isda-registry.ncsa.illinois.edu/ ./release.sh # use DEBUG=echo ./release.sh to print all commands DEBUG=${DEBUG:-""} @@ -19,7 +19,7 @@ BRANCH=${BRANCH:-"$(git rev-parse --abbrev-ref HEAD)"} BRANCH=${BRANCH} VERSION=${TMPVERSION} DEBUG=${DEBUG} $(dirname $0)/docker.sh # find out the version -if [ "${BRANCH}" = "master" ]; then +if [ "${BRANCH}" = "" ]; then VERSION=${VERSION:-""} if [ "${VERSION}" = "" ]; then TMPVERSION=$(awk '/version = / { print $4 }' $(dirname $0)/project/Build.scala | sed 's/"//g') From 2b31119e31c7be312d31099a6d16cf05848674fd Mon Sep 17 00:00:00 2001 From: Rob Kooper Date: Mon, 28 Jul 2025 11:14:43 -0500 Subject: [PATCH 2/7] Update GitHub actions (#461) * Ranaming `master` branch to `main`. * Update GitHub Actions to latest versions Upgraded various GitHub Actions in ci.yml, docker.yml, and swagger.yml to their latest major versions for improved security and maintenance. Also updated environment variable naming and DockerHub description action usage in docker.yml for consistency and compatibility. * fix resolvers small tweak to dockerfile to remove warning * second reference to as in dockerfile * another location where typesafe has wrong url * Remove iRods integration: delete iRods storage service, plugin, config, and docs. Update changelog. Users must use another storage backend (filesystem, MongoDB GridFS, or AWS S3). * remove typesafe references from jar file * Fix upload artifact * more version bumps * fix python version --------- Co-authored-by: Luigi Marini --- .github/workflows/ci.yml | 40 ++-- .github/workflows/docker.yml | 40 ++-- .github/workflows/swagger.yml | 6 +- CHANGELOG.md | 8 + CONTRIBUTING.md | 2 +- Dockerfile | 4 +- INSTALL.md | 2 +- .../irods/IRODSByteStorageService.scala | 198 ------------------ app/services/irods/IRODSPlugin.scala | 93 -------- conf/application.conf | 24 --- doc/src/sphinx/_static/logo_full.png | Bin 18068 -> 0 bytes doc/src/sphinx/develop/architecture.rst | 2 +- doc/src/sphinx/develop/previewers.rst | 2 +- doc/src/sphinx/index.rst | 2 +- project/Build.scala | 20 +- project/plugins.sbt | 2 +- public/swagger.yml | 2 +- release.sh | 4 +- sbt-launch.jar | Bin 1208385 -> 1208393 bytes 19 files changed, 73 insertions(+), 378 deletions(-) delete mode 100644 app/services/irods/IRODSByteStorageService.scala delete mode 100644 app/services/irods/IRODSPlugin.scala delete mode 100644 doc/src/sphinx/_static/logo_full.png diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a77d911b5..0f3f876d7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ on: push: branches: - - master + - main - develop pull_request: @@ -30,7 +30,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: github branch run: | if [ "${{ github.event.release.target_commitish }}" != "" ]; then @@ -39,7 +39,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV @@ -51,12 +51,12 @@ jobs: distribution: 'zulu' java-version: 8 - name: Cache SBT ivy cache - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.ivy2/cache key: ${{ runner.os }}-sbt-ivy-cache-${{ hashFiles('project/Build.scala') }} - name: Cache SBT - uses: actions/cache@v1 + uses: actions/cache@v3 with: path: ~/.sbt key: ${{ runner.os }}-sbt-${{ hashFiles('project/Build.scala') }} @@ -85,7 +85,7 @@ jobs: ports: - 27017:27017 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: github branch run: | if [ "${{ github.event.release.target_commitish }}" != "" ]; then @@ -94,7 +94,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV @@ -130,7 +130,7 @@ jobs: runs-on: ubuntu-latest needs: build steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: github branch run: | if [ "${{ github.event.release.target_commitish }}" != "" ]; then @@ -139,7 +139,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV @@ -177,13 +177,13 @@ jobs: done rm ${ZIPFILE} zip -r ${ZIPFILE} ${DIR} - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: clowder.zip path: target/universal/clowder-*.zip - name: Upload files to a GitHub release if: github.event_name == 'release' && github.event.action == 'created' - uses: svenstaro/upload-release-action@1.1.0 + uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} tag: ${{ github.ref }} @@ -207,7 +207,7 @@ jobs: runs-on: ubuntu-latest needs: build steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: github branch run: | if [ "${{ github.event.release.target_commitish }}" != "" ]; then @@ -216,7 +216,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi echo "GITHUB_BRANCH=${BRANCH}" >> $GITHUB_ENV - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then echo "CLOWDER_VERSION=$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" >> $GITHUB_ENV elif [ "$BRANCH" == "develop" ]; then echo "CLOWDER_VERSION=develop" >> $GITHUB_ENV @@ -237,10 +237,10 @@ jobs: with: path: ~/.sbt key: ${{ runner.os }}-sbt-${{ hashFiles('project/Build.scala') }} - - name: Set up Python 3.7 - uses: actions/setup-python@v1 + - name: Set up Python 3.11 + uses: actions/setup-python@v5 with: - python-version: 3.7 + python-version: 3.11 - name: sbt doc run: ./sbt doc env: @@ -248,7 +248,7 @@ jobs: VERSION: ${{ env.CLOWDER_VERSION }} BUILDNUMBER: ${{ github.run_number }} GITSHA1: ${{ github.sha }} - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: ScalaDoc path: target/scala-*/api/ @@ -266,7 +266,7 @@ jobs: cd doc/src/sphinx/ python -m pip install -r requirements.txt make html epub - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: HTML Documentation path: doc/src/sphinx/_build/html @@ -279,13 +279,13 @@ jobs: key: ${{ secrets.SCP_KEY }} files: "doc/src/sphinx/_build/html/*" target: "CATS/${{ env.CLOWDER_VERSION }}/documentation/sphinx" - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: EPUB Documentation path: doc/src/sphinx/_build/epub/Clowder.epub - name: Upload files to a GitHub release if: github.event_name == 'release' && github.event.action == 'created' - uses: svenstaro/upload-release-action@1.1.0 + uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} tag: ${{ github.ref }} diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 7702ae180..5e1053543 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -5,7 +5,7 @@ name: Docker # and would not set the right version flags. # This will run when: -# - when new code is pushed to master/develop to push the tags +# - when new code is pushed to main/develop to push the tags # latest and develop # - when a pull request is created and updated to make sure the # Dockerfile is still valid. @@ -16,14 +16,14 @@ name: Docker on: push: branches: - - master + - main - develop pull_request: -# Certain actions will only run when this is the master repo. +# Certain actions will only run when this is the main repo. env: - MASTER_REPO: clowder-framework/clowder + MAIN_REPO: clowder-framework/clowder DOCKERHUB_ORG: clowder jobs: @@ -64,7 +64,7 @@ jobs: PLATFORM: "linux/amd64" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # calculate some variables that are used later - name: variable setup @@ -77,7 +77,7 @@ jobs: BRANCH=${GITHUB_REF##*/} fi - if [ "$BRANCH" == "master" ]; then + if [ "$BRANCH" == "main" ]; then version="$(awk '/version = / { print $4 }' project/Build.scala | sed 's/"//g')" tags="latest" oldversion="" @@ -115,11 +115,11 @@ jobs: # setup docker build - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Inspect Builder run: | @@ -132,13 +132,13 @@ jobs: # login to registries - name: Login to DockerHub if: env.dockerhub != '' - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} @@ -147,7 +147,7 @@ jobs: # build the clowder docker images - name: Build and push ${{ matrix.IMAGE }}-build if: matrix.IMAGE == 'clowder' - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v6 with: push: true context: ${{ matrix.FOLDER }} @@ -164,7 +164,7 @@ jobs: - name: Build and push ${{ matrix.IMAGE }}-runtime if: matrix.IMAGE == 'clowder' - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v6 with: push: true context: ${{ matrix.FOLDER }} @@ -182,7 +182,7 @@ jobs: # build the other docker images - name: Build and push ${{ matrix.IMAGE }} if: matrix.IMAGE != 'clowder' - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v6 with: push: true context: ${{ matrix.FOLDER }} @@ -198,10 +198,10 @@ jobs: # update README at DockerHub - name: Docker Hub Description - if: env.dockerhub != '' && matrix.README != '' && github.event_name == 'push' && github.repository == env.MASTER_REPO && env.BRANCH == 'master' - uses: peter-evans/dockerhub-description@v2 - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} - DOCKERHUB_REPOSITORY: ${{ env.DOCKERHUB_ORG }}/${{ matrix.IMAGE }} - README_FILEPATH: ${{ matrix.README }} + if: env.dockerhub != '' && matrix.README != '' && github.event_name == 'push' && github.repository == env.MAIN_REPO && env.BRANCH == 'main' + uses: peter-evans/dockerhub-description@v4 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + repository: ${{ env.DOCKERHUB_ORG }}/${{ matrix.IMAGE }} + readme-filepath : ${{ matrix.README }} diff --git a/.github/workflows/swagger.yml b/.github/workflows/swagger.yml index b55dfb26f..ad68e05e5 100644 --- a/.github/workflows/swagger.yml +++ b/.github/workflows/swagger.yml @@ -1,14 +1,14 @@ name: swagger # This will run when: -# - when new code is pushed to master/develop to make sure the +# - when new code is pushed to main/develop to make sure the # code does compile. # - when a pull request is created and updated to make sure the # code does compile. on: push: branches: - - master + - main - develop pull_request: @@ -20,7 +20,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: openapi-lint uses: mbowman100/swagger-validator-action@master diff --git a/CHANGELOG.md b/CHANGELOG.md index 37eb95678..e5b170fca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [Unreleased] + +### Fixed +- Removed refrences to repo.typesafe.com from sbt-launch.jar and build.scala + +### Removed +- Removed iRods integration and dependencies. The iRods file storage service and plugin have been completely removed from the codebase. Users who were using iRods for file storage will need to configure an alternative storage backend (filesystem, MongoDB GridFS, or AWS S3). + ## 1.22.1 - 2023-11-10 ### Fixed diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3a2fd3f99..0187dc6d2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ below. By participating in this project, you agree to abide by the [code of cond Before your code can be accepted, you will have to sign a [CLA](https://clowderframework.org/pdf/Clowder-CLA.pdf) and mail it to lmarini@illinois.edu. -Most of the core development happens on [NCSA Bitbucket][bitbucket]. The `master` and `develop` branches are pushed to +Most of the core development happens on [NCSA Bitbucket][bitbucket]. The `` and `develop` branches are pushed to [GitHub][github] nightly. We encourage contributors to create an account on [NCSA Bitbucket][bitbucket] and make pull requests there. We also accept diff --git a/Dockerfile b/Dockerfile index 3ef75036b..4e03e13dc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # ---------------------------------------------------------------------- # BUILD CLOWDER DIST # ---------------------------------------------------------------------- -FROM openjdk:8-jdk-bullseye as clowder-build +FROM openjdk:8-jdk-bullseye AS clowder-build ARG BRANCH="unknown" ARG VERSION="unknown" @@ -40,7 +40,7 @@ RUN rm -rf target/universal/clowder-*.zip clowder clowder-* \ # ---------------------------------------------------------------------- # BUILD CLOWDER # ---------------------------------------------------------------------- -FROM openjdk:8-jre-bullseye as clowder-runtime +FROM openjdk:8-jre-bullseye AS clowder-runtime # environemnt variables ARG BRANCH="unknown" diff --git a/INSTALL.md b/INSTALL.md index ae9c8ba33..dc1c5e0ab 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -85,7 +85,7 @@ Next we install the script that will install or update clowder. cat > /home/browndog/update-clowder.sh << EOF #!/bin/bash -# CATS-WWW (master) is the main branch for this server +# CATS-WWW () is the main branch for this server # CATS-WWW1 (develop) if you want the latest version clowder_BRANCH=${clowder_BRANCH:-"CATS-WWW1"} diff --git a/app/services/irods/IRODSByteStorageService.scala b/app/services/irods/IRODSByteStorageService.scala deleted file mode 100644 index e36952a86..000000000 --- a/app/services/irods/IRODSByteStorageService.scala +++ /dev/null @@ -1,198 +0,0 @@ -package services.irods - -import java.io._ -import java.security.{DigestInputStream, MessageDigest} - -import models.UUID -import org.apache.commons.codec.binary.Hex -import org.apache.commons.io.input.CountingInputStream -import org.irods.jargon.core.exception.JargonException -import org.irods.jargon.core.pub.io.IRODSFile -import play.api.{Logger, Play} -import play.api.Play._ -import services.ByteStorageService - -/** - * Helper to store data on disk. - * - */ -class IRODSByteStorageService extends ByteStorageService { - /** - * Save the bytes to IRODS - */ - def save(inputStream: InputStream, prefix: String, length: Long): Option[(String, Long)] = { - current.plugin[IRODSPlugin] match { - case None => { - Logger.error("No IRODSPlugin") - None - } - case Some(ipg) => { - var depth = Play.current.configuration.getInt("irods.depth").getOrElse(2) - - var relativePath = "" - var idstr = UUID.generate().stringify - // id seems to be same at the start but more variable at the end - while (depth > 0 && idstr.length > 4) { - depth -= 1 - if (relativePath == "") { - relativePath = idstr.takeRight(2) - } else { - relativePath += java.io.File.separatorChar + idstr.takeRight(2) - } - idstr = idstr.dropRight(2) - } - - // need to use whole id again, to make sure it is unique - relativePath += java.io.File.separatorChar + idstr - - // combine all pieces - val filePath = makePath(ipg.userhome, prefix, relativePath) - - // make sure the connection is open - if (!ipg.conn) { - ipg.openIRODSConnection() - } - - try { - // create folder structure - val file = ipg.getFileFactory().instanceIRODSFile(filePath) - if (!file.getParentFile.isDirectory && !file.getParentFile.mkdirs()) { - return None - } - - // fill a buffer Array - val cis = new CountingInputStream(inputStream) - val fos = ipg.getFileFactory().instanceIRODSFileOutputStream(file) - val buffer = new Array[Byte](16384) - var count: Int = -1 - while ( { - count = cis.read(buffer); count > 0 - }) { - fos.write(buffer, 0, count) - } - fos.close() - - val length = cis.getByteCount - - // finished - Some(relativePath, length) - } catch { - case e: JargonException => { - Logger.error("Could not save file " + filePath) - None - } - case e: IOException => { - Logger.error("Could not save file " + filePath) - None - } - } finally { - ipg.closeIRODSConnection() - } - } - } - } - - /** - * Get the bytes from IRODS - */ - def load(id: String, prefix: String): Option[InputStream] = { - current.plugin[IRODSPlugin] match { - case None => { - Logger.error("No IRODSPlugin") - None - } - case Some(ipg) => { - // combine all pieces - val filePath = makePath(ipg.userhome, prefix, id) - - // find actual file and delete it - if (!ipg.conn) { - ipg.openIRODSConnection() - } - try { - val file = ipg.getFileFactory().instanceIRODSFile(filePath) - val is = ipg.getFileFactory().instanceIRODSFileInputStream(file) - - // HACK with an intermediary buffer - works, no errors - // I could not pass the InputStream is directly to Some(InputStream, String, String, Long) because, - // I think the is.close does not propagate from File > downloads > Enumerator through the chain - // to the IRODSFileInputStream. Closing the stream here works. - val buffer = new ByteArrayOutputStream() - var count: Int = -1 - val data = new Array[Byte](16384) - - while ({count = is.read(data, 0, data.length); count > 0}) { - buffer.write(data, 0, count) - } - is.close() - - Some(new ByteArrayInputStream(buffer.toByteArray)) - } catch { - case e: JargonException => { - Logger.error("Could not retrieve file " + filePath) - None - } - case e: IOException => { - Logger.error("Could not retrieve file " + filePath) - None - } - } finally { - ipg.closeIRODSConnection() - } - } - } - } - - /** - * Delete actual bytes from IRODS - */ - def delete(id: String, prefix: String): Boolean = { - current.plugin[IRODSPlugin] match { - case None => { - Logger.error("No IRODSPlugin") - false - } - case Some(ipg) => { - // combine all pieces - val filePath = makePath(ipg.userhome, prefix, id) - - // find actual file and delete it - if (!ipg.conn) { - ipg.openIRODSConnection() - } - try { - val file = ipg.getFileFactory().instanceIRODSFile(filePath) - if (file.exists()) file.deleteWithForceOption() else true - } catch { - case e: JargonException => { - Logger.error("Could not delete file " + filePath) - false - } - case e: IOException => { - Logger.error("Could not delete file " + filePath) - false - } - } finally { - ipg.closeIRODSConnection() - } - } - } - } - - def makePath(root: String, prefix: String, relativePath: String) = { - // create absolute path - var filePath = if (root.last != IRODSFile.PATH_SEPARATOR_CHAR) { - root + IRODSFile.PATH_SEPARATOR - } else { - root - } - - // add the prefix - if (prefix != "") { - filePath += prefix + IRODSFile.PATH_SEPARATOR - } - - // finally create full path - filePath + relativePath - } -} diff --git a/app/services/irods/IRODSPlugin.scala b/app/services/irods/IRODSPlugin.scala deleted file mode 100644 index 4a4921009..000000000 --- a/app/services/irods/IRODSPlugin.scala +++ /dev/null @@ -1,93 +0,0 @@ -package services.irods - -import play.api.{ Play, Plugin, Logger, Application } -import org.irods.jargon.core.connection.IRODSAccount -import org.irods.jargon.core.pub.IRODSFileSystem -import org.irods.jargon.core.pub.io.IRODSFileFactory -import org.irods.jargon.core.exception.JargonException - -/** - * A concrete storage based on the iRODS file storage system. There are 7 - * required parameters to establish a connection to iRODS including a - * host, port, username, password, user home, zone, and default storage resource - * name. - * - * Setup iRODS connection using Jargon. - * - * @date 2014-08-18 - * - */ -class IRODSPlugin(app: Application) extends Plugin { - - var userhome: String = _ - - var account: IRODSAccount = _ - var irodsFileSystem: IRODSFileSystem = _ - var irodsFileFactory: IRODSFileFactory = _ - private var _conn: Boolean = false - - override def onStart() { - Logger.info("Starting iRODS Plugin.") - openIRODSConnection() - Logger.info("irods: Connected. " + conn) - } - - override def onStop() { - // close connection - closeIRODSConnection() - Logger.info("iRODSPlugin has stopped.") - } - - //Is the plugin enabled? - override def enabled = true - - - def openIRODSConnection() = { - lazy val configuration = Play.current.configuration - // you can now access the application.conf settings - - // seven required fields (similar to .irodsEnv file used in icommands client) - val host = configuration.getString("irods.host").getOrElse("") - val port = configuration.getInt("irods.port").getOrElse(0) - val username = configuration.getString("irods.username").getOrElse("") - val password = configuration.getString("irods.password").getOrElse("") - val zone = configuration.getString("irods.zone").getOrElse("") - val defaultStorageResource = configuration.getString("irods.defaultStorageResource").getOrElse("") - userhome = configuration.getString("irods.userhome").getOrElse("") - - val usercurrent = configuration.getString("irods.usercurrent").getOrElse("") - - try { - account = IRODSAccount.instance(host, port, username, password, userhome, zone, defaultStorageResource) - irodsFileSystem = IRODSFileSystem.instance() // RODSFileSystem shared object, initialized - Logger.debug("irods: Connecting to " + account.toString()) - - // the actual connection, For a given account creates an IRODSFileFactory that can return iRODS file objects for this particular connection. - irodsFileFactory = irodsFileSystem.getIRODSFileFactory(account) - - _conn = true - } catch { - case je: org.irods.jargon.core.exception.JargonException => Logger.error("irods: Error connecting to iRODS server. " + je.toString); _conn = false - case t: Throwable => Logger.error("irods: Unknown error connecting to iRODS server: " + t.toString); _conn = false - } - } - - def closeIRODSConnection() = { - Logger.info("irods: Closing connection.") - irodsFileSystem.closeAndEatExceptions() - _conn = false - } - - // Close the session that is connected to the particular iRODS server with the given account. - def closeIRODSAccountConnection() = { - Logger.info("irods: Closing account connection.") - irodsFileSystem.closeAndEatExceptions(account) - _conn = false - } - - //getters - def getFileFactory(): IRODSFileFactory = { return irodsFileFactory } - def conn = _conn - // setter - def conn_= (value:Boolean):Unit = _conn = value -} \ No newline at end of file diff --git a/conf/application.conf b/conf/application.conf index 2aad1f5df..c63dc009d 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -324,30 +324,6 @@ filesystem.sourcepaths=[ "/home/globus", ] -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# IRODSPlugin Plugin -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# To use the IRODS filesystem uncomment the following line -#service.byteStorage=services.irods.IRODSByteStorageService -# -# iRODS server host name -irods.host=localhost -# iRODS server port number -irods.port=1247 -# Account name -irods.username=anonymous -# Account password -## if irods.username=anonymous use "" for password (irods.password="") -irods.password="" -# Default storage resource name -irods.defaultStorageResource= demoResc -# iRODS zone -irods.zone=tempZone -# Home directory in iRODS -irods.userhome=/tempZone/home/public -# Current directory in iRODS -irods.usercurrent=/tempZone/home/public - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Elasticsearch # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/src/sphinx/_static/logo_full.png b/doc/src/sphinx/_static/logo_full.png deleted file mode 100644 index 0ecf1c8413f241bed62d96ae0e43d02f0bb446ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18068 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 diff --git a/doc/src/sphinx/develop/architecture.rst b/doc/src/sphinx/develop/architecture.rst index 3e36c8cc2..cb856f5b6 100644 --- a/doc/src/sphinx/develop/architecture.rst +++ b/doc/src/sphinx/develop/architecture.rst @@ -9,7 +9,7 @@ provided for external clients to communicate with the system. These clients can cases as well as headless scripts for system to system communication. A service layer abstracts backend services so that individual deployments can be customized based on available resources. -For example a user might want to store raw files on the file system, MongoDB GridFS, iRods or AWS S3 buckets. +For example a user might want to store raw files on the file system, MongoDB GridFS, or AWS S3 buckets. When new data is added to the system, whether it is via the web interface or through the RESTful API, preprocessing is off-loaded to extraction services in charge of extracting appropriate data and metadata. The extraction services attempt diff --git a/doc/src/sphinx/develop/previewers.rst b/doc/src/sphinx/develop/previewers.rst index b9dc3da31..71da64895 100644 --- a/doc/src/sphinx/develop/previewers.rst +++ b/doc/src/sphinx/develop/previewers.rst @@ -12,4 +12,4 @@ Previewer can work together with extractors and external services. Here is a list of previewer embedded with the core -`source `_. +`source `_. diff --git a/doc/src/sphinx/index.rst b/doc/src/sphinx/index.rst index 25dc21225..7b067518f 100644 --- a/doc/src/sphinx/index.rst +++ b/doc/src/sphinx/index.rst @@ -25,7 +25,7 @@ be customized and deployed on your own cloud. `NCSA Opensource `_. A copy of the source code can also be found on `GitHub `_. - * We are always looking for `contributions `_. + * We are always looking for `contributions `_. ******** Contents diff --git a/project/Build.scala b/project/Build.scala index 585a8137b..05d5ae99c 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -18,7 +18,7 @@ object ApplicationBuild extends Build { def appVersion: String = { gitBranchName match { - case "master" => getVersion + case "" => getVersion case _ => s"${getVersion}-develop" } } @@ -118,9 +118,6 @@ object ApplicationBuild extends Build { // Testing framework "org.scalatestplus" % "play_2.10" % "1.0.0" % "test", - // iRods filestorage - "org.irods.jargon" % "jargon-core" % "3.3.3-beta1", - // jsonp return from /api "org.julienrf" %% "play-jsonp-filter" % "1.1", @@ -153,13 +150,18 @@ object ApplicationBuild extends Build { routesImport += "models._", routesImport += "Binders._", templatesImport += "org.bson.types.ObjectId", - resolvers += Resolver.url("sbt-plugin-releases", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns), - resolvers += Resolver.url("sbt-plugin-snapshots", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots/"))(Resolver.ivyStylePatterns), + resolvers := Seq( + "Typesafe Releases Repository" at "https://repo.lightbend.com/typesafe/releases/", + "Typesafe repository" at "https://repo.lightbend.com/typesafe/releases/" + ) ++ resolvers.value.filterNot(r => r.name == "Typesafe Releases Repository" || r.name == "Typesafe repository"), + resolvers += Resolver.url("sbt-plugin-releases", url("https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns), + resolvers += Resolver.url("sbt-plugin-snapshots", url("https://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots/"))(Resolver.ivyStylePatterns), resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots", - resolvers += "Aduna" at "http://maven-us.nuxeo.org/nexus/content/repositories/public/", + resolvers += "Aduna" at "https://maven-us.nuxeo.org/nexus/content/repositories/public/", //resolvers += "Forth" at "http://139.91.183.63/repository", - resolvers += "NCSA" at "https://opensource.ncsa.illinois.edu/nexus/content/repositories/thirdparty", - resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releases/", + //resolvers += "NCSA" at "https://opensource.ncsa.illinois.edu/nexus/content/repositories/thirdparty", + resolvers += "Maven Central" at "https://repo1.maven.org/maven2/", + // add custom folder to the classpath, use this to add/modify clowder: // custom/public/stylesheets/themes - for custom themes diff --git a/project/plugins.sbt b/project/plugins.sbt index 92dfe0fd5..b178cd7a7 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,7 +2,7 @@ logLevel := Level.Warn // The Typesafe repository -resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releases/" +resolvers += "Typesafe repository" at "https://repo.lightbend.com/typesafe/releases/" // Use the Play sbt plugin for Play projects addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.6") diff --git a/public/swagger.yml b/public/swagger.yml index 221e16ff2..f9338cd80 100644 --- a/public/swagger.yml +++ b/public/swagger.yml @@ -16,7 +16,7 @@ info: url: https://clowder.ncsa.illinois.edu/clowder/email license: name: The University of Illinois/NCSA Open Source License (NCSA) - url: https://github.com/clowder-framework/clowder/blob/master/LICENSE + url: https://github.com/clowder-framework/clowder/blob//LICENSE ################################################################################ # Servers # diff --git a/release.sh b/release.sh index ec6c83ba8..e80f404dc 100755 --- a/release.sh +++ b/release.sh @@ -4,7 +4,7 @@ set -e # can use the following to push to isda-registry for testing: -# BRANCH="master" SERVER=isda-registry.ncsa.illinois.edu/ ./release.sh +# BRANCH="" SERVER=isda-registry.ncsa.illinois.edu/ ./release.sh # use DEBUG=echo ./release.sh to print all commands DEBUG=${DEBUG:-""} @@ -19,7 +19,7 @@ BRANCH=${BRANCH:-"$(git rev-parse --abbrev-ref HEAD)"} BRANCH=${BRANCH} VERSION=${TMPVERSION} DEBUG=${DEBUG} $(dirname $0)/docker.sh # find out the version -if [ "${BRANCH}" = "master" ]; then +if [ "${BRANCH}" = "" ]; then VERSION=${VERSION:-""} if [ "${VERSION}" = "" ]; then TMPVERSION=$(awk '/version = / { print $4 }' $(dirname $0)/project/Build.scala | sed 's/"//g') diff --git a/sbt-launch.jar b/sbt-launch.jar index 0d9dd94c57e48c8b08c90e44ad9379fc0ebcde2c..8779d859b89ef61224bc4ede2eabfc1697234b3a 100644 GIT binary patch delta 49727 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 delta 48771 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 sd5@9C!;#+lhUQd`o$_+ Date: Mon, 28 Jul 2025 11:17:00 -0500 Subject: [PATCH 3/7] Fix/escape space name description (#459) * Ranaming `master` branch to `main`. * Escape space name and description to avoid xss. * Comment out irods dependency as it is not available anymore. * Upgrade actions/cache from v1 to v3 --- app/controllers/Spaces.scala | 3 ++- app/views/spaces/listItem.scala.html | 2 +- app/views/spaces/newEditTemplate.scala.html | 2 +- app/views/spaces/space.scala.html | 2 +- app/views/spaces/tile.scala.html | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/controllers/Spaces.scala b/app/controllers/Spaces.scala index 1c197060a..9cb2fd4b8 100644 --- a/app/controllers/Spaces.scala +++ b/app/controllers/Spaces.scala @@ -7,6 +7,7 @@ import org.joda.time.DateTime import play.api.data.Forms._ import play.api.data.{Form, Forms} import play.api.i18n.Messages +import play.api.templates.HtmlFormat import play.api.{Logger, Play} import securesocial.core.providers.{Token, UsernamePasswordProvider} import services._ @@ -411,7 +412,7 @@ class Spaces @Inject() (spaces: SpaceService, users: UserService, events: EventS formData => { if (Permission.checkPermission(user, Permission.CreateSpace)) { Logger.debug("Creating space " + formData.name) - val newSpace = ProjectSpace(name = formData.name, description = formData.description, + val newSpace = ProjectSpace(name = HtmlFormat.escape(formData.name).toString(), description = HtmlFormat.escape(formData.description).toString(), created = new Date, creator = userId, homePage = formData.homePage, logoURL = formData.logoURL, bannerURL = formData.bannerURL, collectionCount = 0, datasetCount = 0, fileCount = 0, userCount = 0, spaceBytes = 0, metadata = List.empty, diff --git a/app/views/spaces/listItem.scala.html b/app/views/spaces/listItem.scala.html index fd96c1a53..474fe6fb2 100644 --- a/app/views/spaces/listItem.scala.html +++ b/app/views/spaces/listItem.scala.html @@ -22,7 +22,7 @@

@space.name

-
@Html(space.description.replace("\n","
"))
+
space.description.replace("\n","
")
@space.created.format("MMM dd, yyyy")
@space.datasetCount diff --git a/app/views/spaces/newEditTemplate.scala.html b/app/views/spaces/newEditTemplate.scala.html index 26b4e3507..4bc8cf88d 100644 --- a/app/views/spaces/newEditTemplate.scala.html +++ b/app/views/spaces/newEditTemplate.scala.html @@ -13,7 +13,7 @@
-

@Html(space.description.replace("\n","
"))

+

@space.description.replace("\n","
")

@if(user.isDefined) {
diff --git a/app/views/spaces/tile.scala.html b/app/views/spaces/tile.scala.html index 896c60c58..8b2fd8195 100644 --- a/app/views/spaces/tile.scala.html +++ b/app/views/spaces/tile.scala.html @@ -13,7 +13,7 @@ }

@space.name

-

@Html(space.description.replace("\n","
"))

+

@space.description.replace("\n","
")

From e4514f539391ade5149076701daa9dca5d263d79 Mon Sep 17 00:00:00 2001 From: Rob Kooper Date: Mon, 28 Jul 2025 11:18:28 -0500 Subject: [PATCH 4/7] Fix NoSuchElementException for anonymous users in spaces listing and miniList templates (#460) - Add user existence checks before accessing user properties in app/views/spaces/listSpaces.scala.html and app/views/spaces/miniList.scala.html - Update CHANGELOG.md with details of the fix in Unreleased section Co-authored-by: Luigi Marini --- CHANGELOG.md | 3 ++- app/views/spaces/listSpaces.scala.html | 16 +++++++++------- app/views/spaces/miniList.scala.html | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5b170fca..6ef82d9a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). -## [Unreleased] +## Unreleased ### Fixed +- Fixed `NoSuchElementException` in spaces listing page when user is not defined. The error occurred when calling `user.get.id` on an undefined user in the spaces ownership dropdown. Added proper user existence checks in `listSpaces.scala.html` and `miniList.scala.html` templates. - Removed refrences to repo.typesafe.com from sbt-launch.jar and build.scala ### Removed diff --git a/app/views/spaces/listSpaces.scala.html b/app/views/spaces/listSpaces.scala.html index 9f62efefb..5c3bd3e22 100644 --- a/app/views/spaces/listSpaces.scala.html +++ b/app/views/spaces/listSpaces.scala.html @@ -47,13 +47,15 @@

@title

case (_, _) => {} } } -
- -
+ @if(user.isDefined) { +
+ +
+ }