From 49174a4ea9f1b6f6f50b026d0b8345dade068ebd Mon Sep 17 00:00:00 2001 From: liuhy Date: Tue, 31 Mar 2026 19:18:31 +0800 Subject: [PATCH 1/5] goalx: snapshot before shenyu-analysis --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index ed771e556c44..e266500fd74d 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,6 @@ Thumbs.db # Private individual user cursor rules .cursor/rules/_*.mdc + +# local worktrees +.worktrees/ From 0769cc83031dd3359565fad006aecb8a0d7c3215 Mon Sep 17 00:00:00 2001 From: liuhy Date: Wed, 15 Apr 2026 13:06:55 +0800 Subject: [PATCH 2/5] chore(ci): optimize workflow build cache and mvnd parallelism --- .../workflows/integrated-test-k8s-ingress.yml | 80 ++++--------------- .github/workflows/integrated-test.yml | 64 ++++----------- .github/workflows/k8s-examples-http.yml | 51 ++++-------- 3 files changed, 49 insertions(+), 146 deletions(-) diff --git a/.github/workflows/integrated-test-k8s-ingress.yml b/.github/workflows/integrated-test-k8s-ingress.yml index c6aa33c88b55..02b0c8dc0172 100644 --- a/.github/workflows/integrated-test-k8s-ingress.yml +++ b/.github/workflows/integrated-test-k8s-ingress.yml @@ -68,20 +68,14 @@ jobs: sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" - - name: Cache Maven Repos - if: steps.filter.outputs.k8s-ingress == 'true' - uses: actions/cache@v3 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- - - uses: actions/setup-java@v4 if: steps.filter.outputs.k8s-ingress == 'true' with: java-version: 17 distribution: "temurin" + cache: "maven" + cache-dependency-path: | + **/pom.xml - name: Install Go uses: actions/setup-go@v3 @@ -95,41 +89,17 @@ jobs: curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.24.14/bin/linux/amd64/kubectl && sudo install kubectl /usr/local/bin/kubectl kind create cluster --image=kindest/node:v1.21.1 --config=./shenyu-integrated-test/${{ matrix.case }}/deploy/kind-config.yaml - - name: Cache Maven Repos - if: steps.filter.outputs.k8s-ingress == 'true' - uses: actions/cache@v3 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- - - - uses: actions/setup-java@v4 - if: steps.filter.outputs.k8s-ingress == 'true' - with: - java-version: 17 - distribution: "temurin" - - name: Install mvnd if: steps.filter.outputs.k8s-ingress == 'true' shell: bash run: | MVND_VERSION=1.0.2 - if [[ "${{ runner.os }}" == "Windows" ]]; then - curl -sL https://downloads.apache.org/maven/mvnd/${MVND_VERSION}/maven-mvnd-${MVND_VERSION}-windows-amd64.zip -o mvnd.zip - unzip -q mvnd.zip - mkdir -p $HOME/.local - mv maven-mvnd-${MVND_VERSION}-windows-amd64 $HOME/.local/mvnd - echo "$HOME/.local/mvnd/bin" >> $GITHUB_PATH - echo "MVND_HOME=$HOME/.local/mvnd" >> $GITHUB_ENV - else - curl -sL https://downloads.apache.org/maven/mvnd/${MVND_VERSION}/maven-mvnd-${MVND_VERSION}-linux-amd64.zip -o mvnd.zip - unzip -q mvnd.zip - mkdir -p $HOME/.local - mv maven-mvnd-${MVND_VERSION}-linux-amd64 $HOME/.local/mvnd - echo "$HOME/.local/mvnd/bin" >> $GITHUB_PATH - echo "MVND_HOME=$HOME/.local/mvnd" >> $GITHUB_ENV - fi + curl -sL https://downloads.apache.org/maven/mvnd/${MVND_VERSION}/maven-mvnd-${MVND_VERSION}-linux-amd64.zip -o mvnd.zip + unzip -q mvnd.zip + mkdir -p $HOME/.local + mv maven-mvnd-${MVND_VERSION}-linux-amd64 $HOME/.local/mvnd + echo "$HOME/.local/mvnd/bin" >> $GITHUB_PATH + echo "MVND_HOME=$HOME/.local/mvnd" >> $GITHUB_ENV - name: Build with Maven if: steps.filter.outputs.k8s-ingress == 'true' @@ -137,14 +107,10 @@ jobs: run: | if mvnd --version > /dev/null 2>&1; then echo "Using mvnd for build" - mvnd -B clean install -Dmaven.javadoc.skip=true -Dmaven.test.skip=true + mvnd -B -T 1C clean install -Dmaven.javadoc.skip=true -Dmaven.test.skip=true else echo "Falling back to maven wrapper" - if [[ "${{ runner.os }}" == "Windows" ]]; then - ./mvnw.cmd -B clean install -Dmaven.javadoc.skip=true -Dmaven.test.skip=true - else - ./mvnw -B clean install -Dmaven.javadoc.skip=true -Dmaven.test.skip=true - fi + ./mvnw -B -T 1C clean install -Dmaven.javadoc.skip=true -Dmaven.test.skip=true fi - name: Build integrated tests @@ -153,14 +119,10 @@ jobs: run: | if mvnd --version > /dev/null 2>&1; then echo "Using mvnd for build integrated tests" - mvnd -B clean install -Pit -DskipTests -am -f ./shenyu-integrated-test/pom.xml + mvnd -B -T 1C clean install -Pit -DskipTests -am -f ./shenyu-integrated-test/pom.xml else echo "Falling back to maven wrapper for integrated tests" - if [[ "${{ runner.os }}" == "Windows" ]]; then - ./mvnw.cmd -B clean install -Pit -DskipTests -am -f ./shenyu-integrated-test/pom.xml - else - ./mvnw -B clean install -Pit -DskipTests -am -f ./shenyu-integrated-test/pom.xml - fi + ./mvnw -B -T 1C clean install -Pit -DskipTests -am -f ./shenyu-integrated-test/pom.xml fi - name: Build examples @@ -169,14 +131,10 @@ jobs: run: | if mvnd --version > /dev/null 2>&1; then echo "Using mvnd for build examples" - mvnd -B clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -am -f ./shenyu-examples/pom.xml + mvnd -B -T 1C clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -am -f ./shenyu-examples/pom.xml else echo "Falling back to maven wrapper for examples" - if [[ "${{ runner.os }}" == "Windows" ]]; then - ./mvnw.cmd -B clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -am -f ./shenyu-examples/pom.xml - else - ./mvnw -B clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -am -f ./shenyu-examples/pom.xml - fi + ./mvnw -B -T 1C clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -am -f ./shenyu-examples/pom.xml fi - name: Build k8s Cluster @@ -196,14 +154,10 @@ jobs: run: | if mvnd --version > /dev/null 2>&1; then echo "Using mvnd for running tests" - mvnd test -Pit -f ./shenyu-integrated-test/${{ matrix.case }}/pom.xml + mvnd -T 1C test -Pit -f ./shenyu-integrated-test/${{ matrix.case }}/pom.xml else echo "Falling back to maven wrapper for tests" - if [[ "${{ runner.os }}" == "Windows" ]]; then - ./mvnw.cmd test -Pit -f ./shenyu-integrated-test/${{ matrix.case }}/pom.xml - else - ./mvnw test -Pit -f ./shenyu-integrated-test/${{ matrix.case }}/pom.xml - fi + ./mvnw -T 1C test -Pit -f ./shenyu-integrated-test/${{ matrix.case }}/pom.xml fi continue-on-error: true diff --git a/.github/workflows/integrated-test.yml b/.github/workflows/integrated-test.yml index 9afc310f1c2f..dd9fa30a182f 100644 --- a/.github/workflows/integrated-test.yml +++ b/.github/workflows/integrated-test.yml @@ -75,53 +75,35 @@ jobs: - '!NOTICE' - '!.github/ISSUE_TEMPLATE/**' - '!.github/PULL_REQUEST_TEMPLATE' - - name: Restore ShenYu Maven Repos - if: steps.filter.outputs.integration == 'true' - uses: actions/cache/restore@v3 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- - uses: actions/setup-java@v4 if: steps.filter.outputs.integration == 'true' with: java-version: 17 distribution: "temurin" + cache: "maven" + cache-dependency-path: | + **/pom.xml - name: Install mvnd if: steps.filter.outputs.integration == 'true' shell: bash run: | MVND_VERSION=1.0.2 - if [[ "${{ runner.os }}" == "Windows" ]]; then - curl -sL https://downloads.apache.org/maven/mvnd/${MVND_VERSION}/maven-mvnd-${MVND_VERSION}-windows-amd64.zip -o mvnd.zip - unzip -q mvnd.zip - mkdir -p $HOME/.local - mv maven-mvnd-${MVND_VERSION}-windows-amd64 $HOME/.local/mvnd - echo "$HOME/.local/mvnd/bin" >> $GITHUB_PATH - echo "MVND_HOME=$HOME/.local/mvnd" >> $GITHUB_ENV - else - curl -sL https://downloads.apache.org/maven/mvnd/${MVND_VERSION}/maven-mvnd-${MVND_VERSION}-linux-amd64.zip -o mvnd.zip - unzip -q mvnd.zip - mkdir -p $HOME/.local - mv maven-mvnd-${MVND_VERSION}-linux-amd64 $HOME/.local/mvnd - echo "$HOME/.local/mvnd/bin" >> $GITHUB_PATH - echo "MVND_HOME=$HOME/.local/mvnd" >> $GITHUB_ENV - fi + curl -sL https://downloads.apache.org/maven/mvnd/${MVND_VERSION}/maven-mvnd-${MVND_VERSION}-linux-amd64.zip -o mvnd.zip + unzip -q mvnd.zip + mkdir -p $HOME/.local + mv maven-mvnd-${MVND_VERSION}-linux-amd64 $HOME/.local/mvnd + echo "$HOME/.local/mvnd/bin" >> $GITHUB_PATH + echo "MVND_HOME=$HOME/.local/mvnd" >> $GITHUB_ENV - name: Build with Maven if: steps.filter.outputs.integration == 'true' shell: bash run: | if mvnd --version > /dev/null 2>&1; then echo "Using mvnd for build" - mvnd -B clean install -Prelease,docker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true + mvnd -B -T 1C clean install -Prelease,docker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true else echo "Falling back to maven wrapper" - if [[ "${{ runner.os }}" == "Windows" ]]; then - ./mvnw.cmd -B clean install -Prelease,docker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true - else - ./mvnw -B clean install -Prelease,docker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true - fi + ./mvnw -B -T 1C clean install -Prelease,docker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true fi - name: Build examples if: steps.filter.outputs.integration == 'true' @@ -129,14 +111,10 @@ jobs: run: | if mvnd --version > /dev/null 2>&1; then echo "Using mvnd for build examples" - mvnd -B clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -am -f ./shenyu-examples/pom.xml + mvnd -B -T 1C clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -am -f ./shenyu-examples/pom.xml else echo "Falling back to maven wrapper for examples" - if [[ "${{ runner.os }}" == "Windows" ]]; then - ./mvnw.cmd -B clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -am -f ./shenyu-examples/pom.xml - else - ./mvnw -B clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -am -f ./shenyu-examples/pom.xml - fi + ./mvnw -B -T 1C clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -am -f ./shenyu-examples/pom.xml fi - name: Build integrated tests if: steps.filter.outputs.integration == 'true' @@ -144,14 +122,10 @@ jobs: run: | if mvnd --version > /dev/null 2>&1; then echo "Using mvnd for build integrated tests" - mvnd -B clean install -Pit -DskipTests -f ./shenyu-integrated-test/pom.xml + mvnd -B -T 1C clean install -Pit -DskipTests -f ./shenyu-integrated-test/pom.xml else echo "Falling back to maven wrapper for integrated tests" - if [[ "${{ runner.os }}" == "Windows" ]]; then - ./mvnw.cmd -B clean install -Pit -DskipTests -f ./shenyu-integrated-test/pom.xml - else - ./mvnw -B clean install -Pit -DskipTests -f ./shenyu-integrated-test/pom.xml - fi + ./mvnw -B -T 1C clean install -Pit -DskipTests -f ./shenyu-integrated-test/pom.xml fi - name: Start docker compose if: steps.filter.outputs.integration == 'true' @@ -169,14 +143,10 @@ jobs: run: | if mvnd --version > /dev/null 2>&1; then echo "Using mvnd for running tests" - mvnd test -Pit -f ./shenyu-integrated-test/${{ matrix.case }}/pom.xml + mvnd -T 1C test -Pit -f ./shenyu-integrated-test/${{ matrix.case }}/pom.xml else echo "Falling back to maven wrapper for tests" - if [[ "${{ runner.os }}" == "Windows" ]]; then - ./mvnw.cmd test -Pit -f ./shenyu-integrated-test/${{ matrix.case }}/pom.xml - else - ./mvnw test -Pit -f ./shenyu-integrated-test/${{ matrix.case }}/pom.xml - fi + ./mvnw -T 1C test -Pit -f ./shenyu-integrated-test/${{ matrix.case }}/pom.xml fi continue-on-error: true - name: Check test result diff --git a/.github/workflows/k8s-examples-http.yml b/.github/workflows/k8s-examples-http.yml index 7f3cb06de7db..b2b3e4073214 100644 --- a/.github/workflows/k8s-examples-http.yml +++ b/.github/workflows/k8s-examples-http.yml @@ -64,53 +64,36 @@ jobs: cat /etc/rancher/k3s/k3s.yaml mkdir -p ~/.kube cp /etc/rancher/k3s/k3s.yaml ~/.kube/config - - name: Restore ShenYu Maven Repos - if: steps.filter.outputs.k8s-examples == 'true' - uses: actions/cache/restore@v3 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- - - uses: actions/setup-java@v4 + - name: Setup Java and Maven cache if: steps.filter.outputs.k8s-examples == 'true' + uses: actions/setup-java@v4 with: java-version: 17 distribution: "temurin" + cache: "maven" + cache-dependency-path: | + **/pom.xml - name: Install mvnd if: steps.filter.outputs.k8s-examples == 'true' shell: bash run: | MVND_VERSION=1.0.2 - if [[ "${{ runner.os }}" == "Windows" ]]; then - curl -sL https://downloads.apache.org/maven/mvnd/${MVND_VERSION}/maven-mvnd-${MVND_VERSION}-windows-amd64.zip -o mvnd.zip - unzip -q mvnd.zip - mkdir -p $HOME/.local - mv maven-mvnd-${MVND_VERSION}-windows-amd64 $HOME/.local/mvnd - echo "$HOME/.local/mvnd/bin" >> $GITHUB_PATH - echo "MVND_HOME=$HOME/.local/mvnd" >> $GITHUB_ENV - else - curl -sL https://downloads.apache.org/maven/mvnd/${MVND_VERSION}/maven-mvnd-${MVND_VERSION}-linux-amd64.zip -o mvnd.zip - unzip -q mvnd.zip - mkdir -p $HOME/.local - mv maven-mvnd-${MVND_VERSION}-linux-amd64 $HOME/.local/mvnd - echo "$HOME/.local/mvnd/bin" >> $GITHUB_PATH - echo "MVND_HOME=$HOME/.local/mvnd" >> $GITHUB_ENV - fi + curl -sL https://downloads.apache.org/maven/mvnd/${MVND_VERSION}/maven-mvnd-${MVND_VERSION}-linux-amd64.zip -o mvnd.zip + unzip -q mvnd.zip + mkdir -p $HOME/.local + mv maven-mvnd-${MVND_VERSION}-linux-amd64 $HOME/.local/mvnd + echo "$HOME/.local/mvnd/bin" >> $GITHUB_PATH + echo "MVND_HOME=$HOME/.local/mvnd" >> $GITHUB_ENV - name: Build with Maven if: steps.filter.outputs.k8s-examples == 'true' shell: bash run: | if mvnd --version > /dev/null 2>&1; then echo "Using mvnd for build" - mvnd -B clean install -Prelease,docker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true + mvnd -B -T 1C clean install -Prelease,docker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true else echo "Falling back to maven wrapper" - if [[ "${{ runner.os }}" == "Windows" ]]; then - ./mvnw.cmd -B clean install -Prelease,docker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true - else - ./mvnw -B clean install -Prelease,docker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true - fi + ./mvnw -B -T 1C clean install -Prelease,docker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true fi - name: Build examples if: steps.filter.outputs.k8s-examples == 'true' @@ -118,14 +101,10 @@ jobs: run: | if mvnd --version > /dev/null 2>&1; then echo "Using mvnd for build examples" - mvnd -B clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -f ./shenyu-examples/pom.xml + mvnd -B -T 1C clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -f ./shenyu-examples/pom.xml else echo "Falling back to maven wrapper for examples" - if [[ "${{ runner.os }}" == "Windows" ]]; then - ./mvnw.cmd -B clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -f ./shenyu-examples/pom.xml - else - ./mvnw -B clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -f ./shenyu-examples/pom.xml - fi + ./mvnw -B -T 1C clean install -Pexample -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -f ./shenyu-examples/pom.xml fi - name: Build k8s Cluster if: steps.filter.outputs.k8s-examples == 'true' From 8352f89d26f8bbc9d3df585b556328b1ef125b7c Mon Sep 17 00:00:00 2001 From: liuhy Date: Tue, 16 Jun 2026 15:52:47 +0800 Subject: [PATCH 3/5] chore: update LICENSE with new dependencies and versions --- .../src/main/release-docs/LICENSE | 4 +++ .../src/main/release-docs/LICENSE | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/shenyu-dist/shenyu-admin-dist/src/main/release-docs/LICENSE b/shenyu-dist/shenyu-admin-dist/src/main/release-docs/LICENSE index 105113ffd215..f6d016eba8bd 100644 --- a/shenyu-dist/shenyu-admin-dist/src/main/release-docs/LICENSE +++ b/shenyu-dist/shenyu-admin-dist/src/main/release-docs/LICENSE @@ -501,6 +501,8 @@ The text of each license is the standard Apache 2.0 license. javatuples 1.2: https://mvnrepository.com/artifact/org.javatuples/javatuples, Apache 2.0 json-schema-core 1.2.14: https://mvnrepository.com/artifact/com.github.java-json-tools/json-schema-core, Apache 2.0 uri-template 0.10: https://github.com/java-json-tools/uri-template, Apache 2.0 + zookeeper 3.9.5: https://gitbox.apache.org/repos/asf/zookeeper, Apache 2.0 + zookeeper-jute 3.9.5: https://gitbox.apache.org/repos/asf/zookeeper, Apache 2.0 ======================================================================== BSD licenses @@ -577,6 +579,7 @@ The text of each license is also included at licenses/LICENSE-[project].txt. checker-qual 3.33.0: https://checkerframework.org/, MIT jopt-simple 5.0.4: https://github.com/jopt-simple/jopt-simple, MIT oshi-core 6.10.0: https://github.com/oshi/oshi, MIT + oshi-core 6.7.0: https://github.com/oshi/oshi, MIT ======================================================================== MPL licenses @@ -713,6 +716,7 @@ Bouncy Castle licenses bcprov-jdk18on 1.78: https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk18on, Bouncy Castle bcutil-jdk18on 1.72: https://mvnrepository.com/artifact/org.bouncycastle/bcutil-jdk18on, Bouncy Castle bcpkix-jdk18on 1.72: https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk18on, Bouncy Castle + bcprov-jdk18on 1.84: https://github.com/bcgit/bc-java, Bouncy Castle ======================================================================== XPP License diff --git a/shenyu-dist/shenyu-bootstrap-dist/src/main/release-docs/LICENSE b/shenyu-dist/shenyu-bootstrap-dist/src/main/release-docs/LICENSE index aac452052298..eccd4fb18a83 100644 --- a/shenyu-dist/shenyu-bootstrap-dist/src/main/release-docs/LICENSE +++ b/shenyu-dist/shenyu-bootstrap-dist/src/main/release-docs/LICENSE @@ -631,6 +631,31 @@ The text of each license is the standard Apache 2.0 license. javatuples 1.2: https://mvnrepository.com/artifact/org.javatuples/javatuples, Apache 2.0 jna-platform 5.16.0: https://github.com/java-native-access/jna, Apache 2.0 + lz4-java 1.10.1: https://github.com/yawkat/lz4-java, Apache 2.0 + itu 1.14.0: https://github.com/ethlo/itu, Apache 2.0 + jsonschema-generator 4.38.0: https://github.com/victools/jsonschema-generator, The Apache License, Version 2.0 + jsonschema-module-jackson 4.38.0: https://github.com/victools/jsonschema-generator, The Apache License, Version 2.0 + jsonschema-module-swagger-2 4.38.0: https://github.com/victools/jsonschema-generator, The Apache License, Version 2.0 + re2j 1.8: https://github.com/google/re2j, Go License + json-schema-validator 2.0.0: https://github.com/networknt/json-schema-validator, Apache License Version 2.0 + motan-core 1.2.1: https://github.com/weibocom/motan, The Apache License, Version 2.0 + motan-registry-zookeeper 1.2.1: https://github.com/weibocom/motan, The Apache License, Version 2.0 + motan-springsupport 1.2.1: https://github.com/weibocom/motan, The Apache License, Version 2.0 + motan-transport-netty4 1.2.1: https://github.com/weibocom/motan, The Apache License, Version 2.0 + swagger-annotations-jakarta 2.2.38: https://github.com/swagger-api/swagger-core, Apache License 2.0 + dubbo-dependencies-zookeeper 3.2.14: https://www.apache.org/licenses/LICENSE-2.0.txt, Apache 2.0 + kafka-clients 3.9.2: https://kafka.apache.org, The Apache License, Version 2.0 + log4j-1.2-api 2.23.1: https://www.apache.org/licenses/LICENSE-2.0.txt, Apache 2.0 + zookeeper 3.9.5: https://gitbox.apache.org/repos/asf/zookeeper, Apache 2.0 + zookeeper-jute 3.9.5: https://gitbox.apache.org/repos/asf/zookeeper, Apache 2.0 + spring-ai-client-chat 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 + spring-ai-commons 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 + spring-ai-deepseek 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 + spring-ai-mcp 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 + spring-ai-model 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 + spring-ai-openai 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 + spring-ai-retry 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 + spring-ai-template-st 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 ======================================================================== BSD licenses @@ -747,6 +772,12 @@ The text of each license is also included at licenses/LICENSE-[project].txt. dexx-collections 0.2: https://github.com/andrewoma/dexx, MIT checker-qual 3.33.0: https://github.com/typetools/checker-framework/blob/master/checker-qual, MIT oshi-core 6.10.0: https://github.com/oshi/oshi, MIT + oshi-core 6.7.0: https://github.com/oshi/oshi, MIT + mcp 0.17.0: https://github.com/modelcontextprotocol/java-sdk, MIT + mcp-core 0.17.0: https://github.com/modelcontextprotocol/java-sdk, MIT + mcp-json 0.17.0: https://github.com/modelcontextprotocol/java-sdk, MIT + mcp-json-jackson2 0.17.0: https://github.com/modelcontextprotocol/java-sdk, MIT + mcp-spring-webflux 0.17.0: https://github.com/modelcontextprotocol/java-sdk, MIT ======================================================================== MPL licenses @@ -774,6 +805,7 @@ Bouncy Castle licenses bcutil-jdk18on 1.78: https://mvnrepository.com/artifact/org.bouncycastle/bcutil-jdk18on, Bouncy Castle bcpkix-jdk18on 1.78: https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk18on, Bouncy Castle bcprov-ext-jdk18on 1.78: https://mvnrepository.com/artifact/org.bouncycastle/bcprov-ext-jdk18on, Bouncy Castle + bcprov-jdk18on 1.84: https://github.com/bcgit/bc-java, Bouncy Castle ======================================================================== EDL License From a83c05f94dc84f986225ca776ac0e636dfcbbc5c Mon Sep 17 00:00:00 2001 From: liuhy Date: Tue, 16 Jun 2026 17:10:59 +0800 Subject: [PATCH 4/5] [fix] Add missing permission annotations to /appAuth/updateSk and /sandbox/proxyGateway - Add @RequiresPermissions("system:authen:edit") to AppAuthController.updateSk() This endpoint was the only one in the controller without a permission check, allowing any authenticated user to rotate arbitrary appAuth secrets. - Change /appAuth/updateSk from GET to POST to prevent appSecret from appearing in URLs, browser history, and server access logs. - Add @RequiresPermissions("system:authen:list") to SandboxController.proxyGateway() This endpoint generates server-side signed requests using stored appSecrets. Without permission checks, any authenticated user could abuse it to forge signed requests after compromising an appKey via the updateSk vulnerability. These fixes address an authorization bypass where a low-privileged dashboard user could chain updateSk + proxyGateway to impersonate arbitrary application identities and send authenticated requests to allowlisted internal services. Co-Authored-By: Claude --- .../src/http/http-debug-app-auth-controller-api.http | 7 +------ .../apache/shenyu/admin/controller/AppAuthController.java | 3 ++- .../apache/shenyu/admin/controller/SandboxController.java | 2 ++ .../shenyu/admin/controller/AppAuthControllerTest.java | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/shenyu-admin/src/http/http-debug-app-auth-controller-api.http b/shenyu-admin/src/http/http-debug-app-auth-controller-api.http index be9a97abbc01..ce08bd6de275 100644 --- a/shenyu-admin/src/http/http-debug-app-auth-controller-api.http +++ b/shenyu-admin/src/http/http-debug-app-auth-controller-api.http @@ -61,16 +61,11 @@ X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiw } ### updateSk -GET http://localhost:9095/appAuth/updateSk?appKey=123&appSecret=123 +POST http://localhost:9095/appAuth/updateSk?appKey=123&appSecret=123 Accept: application/json Content-Type: application/json X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ4NjUwMDg2fQ.aDeChT_Ey6FwYDdzSkc9ZLBHd5v-LVUZ6BPcYqJCo-Y -{ - "id": 123, - "name": "order" -} - ### app auth list by page GET http://localhost:9095/appAuth/findPageByQuery?currentPage=1&pageSize=10 Accept: application/json diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AppAuthController.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AppAuthController.java index d96d6839c7d0..e7e38a2ae6e8 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AppAuthController.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AppAuthController.java @@ -82,7 +82,8 @@ public ShenyuAdminResult apply(@Valid @RequestBody final AuthApplyDTO authApplyD * @param appSecret the app secret * @return the shenyu result */ - @GetMapping("/updateSk") + @PostMapping("/updateSk") + @RequiresPermissions("system:authen:edit") public ShenyuAdminResult updateSk(@RequestParam("appKey") @Existed(message = "app key not existed", provider = AppKeyProvider.class) final String appKey, diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/SandboxController.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/SandboxController.java index b717df6e6f51..814a6ea9d2e6 100755 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/SandboxController.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/SandboxController.java @@ -20,6 +20,7 @@ import org.apache.shenyu.admin.aspect.annotation.RestApi; import org.apache.shenyu.admin.model.dto.ProxyGatewayDTO; import org.apache.shenyu.admin.service.SandboxService; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -49,6 +50,7 @@ public SandboxController(final SandboxService sandboxService) { * @throws IOException throw io exception */ @PostMapping(path = "/proxyGateway") + @RequiresPermissions("system:authen:list") public void proxyGateway(@RequestBody @Valid final ProxyGatewayDTO proxyGatewayDTO, final HttpServletRequest request, final HttpServletResponse response) throws IOException { diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AppAuthControllerTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AppAuthControllerTest.java index 14244f643b0c..6889bce5838d 100644 --- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AppAuthControllerTest.java +++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AppAuthControllerTest.java @@ -186,7 +186,7 @@ public void testApplyWithAppKey() throws Exception { @Test public void testUpdateSk() throws Exception { - this.mockMvc.perform(MockMvcRequestBuilders.get("/appAuth/updateSk") + this.mockMvc.perform(MockMvcRequestBuilders.post("/appAuth/updateSk") .param("appKey", "testAppKey") .param("appSecret", "updateAppSecret")) .andExpect(status().isOk()) From f26168f6060dac4289d4276516f29a610c42a9c9 Mon Sep 17 00:00:00 2001 From: liuhy Date: Tue, 16 Jun 2026 18:16:57 +0800 Subject: [PATCH 5/5] [fix] Address PR review: use request body for updateSk, fix sandbox permission, revert unrelated LICENSE changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change /appAuth/updateSk to accept UpdateSkDTO as @RequestBody instead of @RequestParam, preventing appSecret from appearing in URLs, browser history, and server access logs (Copilot review comment #1) - Change /sandbox/proxyGateway permission from system:authen:list to system:authen:modify — a write/signing endpoint should not be guarded by a read permission (Copilot review comment #3) - Revert unrelated LICENSE file changes that were accidentally included (Copilot review comment #2 — re2j license issue is pre-existing) Co-Authored-By: Claude --- .../http-debug-app-auth-controller-api.http | 7 +- .../admin/controller/AppAuthController.java | 12 +-- .../admin/controller/SandboxController.java | 2 +- .../shenyu/admin/model/dto/UpdateSkDTO.java | 100 ++++++++++++++++++ .../controller/AppAuthControllerTest.java | 12 ++- .../src/main/release-docs/LICENSE | 4 - .../src/main/release-docs/LICENSE | 32 ------ 7 files changed, 121 insertions(+), 48 deletions(-) create mode 100644 shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/UpdateSkDTO.java diff --git a/shenyu-admin/src/http/http-debug-app-auth-controller-api.http b/shenyu-admin/src/http/http-debug-app-auth-controller-api.http index ce08bd6de275..2de236d9c1be 100644 --- a/shenyu-admin/src/http/http-debug-app-auth-controller-api.http +++ b/shenyu-admin/src/http/http-debug-app-auth-controller-api.http @@ -61,11 +61,16 @@ X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiw } ### updateSk -POST http://localhost:9095/appAuth/updateSk?appKey=123&appSecret=123 +POST http://localhost:9095/appAuth/updateSk Accept: application/json Content-Type: application/json X-Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ4NjUwMDg2fQ.aDeChT_Ey6FwYDdzSkc9ZLBHd5v-LVUZ6BPcYqJCo-Y +{ + "appKey": "123", + "appSecret": "123" +} + ### app auth list by page GET http://localhost:9095/appAuth/findPageByQuery?currentPage=1&pageSize=10 Accept: application/json diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AppAuthController.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AppAuthController.java index e7e38a2ae6e8..ee2ab01cf2b6 100644 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AppAuthController.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AppAuthController.java @@ -26,6 +26,7 @@ import org.apache.shenyu.admin.model.dto.AuthApplyDTO; import org.apache.shenyu.admin.model.dto.AuthPathWarpDTO; import org.apache.shenyu.admin.model.dto.BatchCommonDTO; +import org.apache.shenyu.admin.model.dto.UpdateSkDTO; import org.apache.shenyu.admin.model.page.CommonPager; import org.apache.shenyu.admin.model.page.PageParameter; import org.apache.shenyu.admin.model.query.AppAuthQuery; @@ -33,7 +34,6 @@ import org.apache.shenyu.admin.model.vo.AppAuthVO; import org.apache.shenyu.admin.service.AppAuthService; import org.apache.shenyu.admin.service.PageService; -import org.apache.shenyu.admin.service.provider.AppKeyProvider; import org.apache.shenyu.admin.utils.ShenyuResultMessage; import org.apache.shenyu.admin.validation.annotation.Existed; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -78,17 +78,13 @@ public ShenyuAdminResult apply(@Valid @RequestBody final AuthApplyDTO authApplyD /** * Update sk of App auth. * - * @param appKey the app key - * @param appSecret the app secret + * @param updateSkDTO the update sk dto * @return the shenyu result */ @PostMapping("/updateSk") @RequiresPermissions("system:authen:edit") - public ShenyuAdminResult updateSk(@RequestParam("appKey") - @Existed(message = "app key not existed", - provider = AppKeyProvider.class) final String appKey, - @RequestParam("appSecret") final String appSecret) { - return appAuthService.updateAppSecretByAppKey(appKey, appSecret); + public ShenyuAdminResult updateSk(@Valid @RequestBody final UpdateSkDTO updateSkDTO) { + return appAuthService.updateAppSecretByAppKey(updateSkDTO.getAppKey(), updateSkDTO.getAppSecret()); } /** diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/SandboxController.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/SandboxController.java index 814a6ea9d2e6..a6854eb22ae7 100755 --- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/SandboxController.java +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/SandboxController.java @@ -50,7 +50,7 @@ public SandboxController(final SandboxService sandboxService) { * @throws IOException throw io exception */ @PostMapping(path = "/proxyGateway") - @RequiresPermissions("system:authen:list") + @RequiresPermissions("system:authen:modify") public void proxyGateway(@RequestBody @Valid final ProxyGatewayDTO proxyGatewayDTO, final HttpServletRequest request, final HttpServletResponse response) throws IOException { diff --git a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/UpdateSkDTO.java b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/UpdateSkDTO.java new file mode 100644 index 000000000000..74d84625c6a5 --- /dev/null +++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/UpdateSkDTO.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shenyu.admin.model.dto; + +import org.apache.shenyu.admin.service.provider.AppKeyProvider; +import org.apache.shenyu.admin.validation.annotation.Existed; + +import jakarta.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Objects; + +/** + * this is update app secret dto. + */ +public class UpdateSkDTO implements Serializable { + + private static final long serialVersionUID = -1L; + + /** + * application key. + */ + @NotBlank(message = "app key not null") + @Existed(message = "app key not existed", provider = AppKeyProvider.class) + private String appKey; + + /** + * encryption secret. + */ + @NotBlank(message = "app secret not null") + private String appSecret; + + /** + * Gets the value of appKey. + * + * @return the value of appKey + */ + public String getAppKey() { + return appKey; + } + + /** + * Sets the appKey. + * + * @param appKey appKey + */ + public void setAppKey(final String appKey) { + this.appKey = appKey; + } + + /** + * Gets the value of appSecret. + * + * @return the value of appSecret + */ + public String getAppSecret() { + return appSecret; + } + + /** + * Sets the appSecret. + * + * @param appSecret appSecret + */ + public void setAppSecret(final String appSecret) { + this.appSecret = appSecret; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (!(o instanceof UpdateSkDTO)) { + return false; + } + UpdateSkDTO that = (UpdateSkDTO) o; + return Objects.equals(appKey, that.appKey) + && Objects.equals(appSecret, that.appSecret); + } + + @Override + public int hashCode() { + return Objects.hash(appKey, appSecret); + } +} diff --git a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AppAuthControllerTest.java b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AppAuthControllerTest.java index 6889bce5838d..a793f097a855 100644 --- a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AppAuthControllerTest.java +++ b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AppAuthControllerTest.java @@ -27,6 +27,7 @@ import org.apache.shenyu.admin.model.dto.AuthPathDTO; import org.apache.shenyu.admin.model.dto.AuthPathWarpDTO; import org.apache.shenyu.admin.model.dto.BatchCommonDTO; +import org.apache.shenyu.admin.model.dto.UpdateSkDTO; import org.apache.shenyu.admin.model.page.CommonPager; import org.apache.shenyu.admin.model.page.PageCondition; import org.apache.shenyu.admin.model.page.PageParameter; @@ -36,6 +37,7 @@ import org.apache.shenyu.admin.model.vo.AppAuthVO; import org.apache.shenyu.admin.model.vo.AuthPathVO; import org.apache.shenyu.admin.service.AppAuthService; +import org.apache.shenyu.admin.service.provider.AppKeyProvider; import org.apache.shenyu.admin.spring.SpringBeanUtils; import org.apache.shenyu.admin.utils.ShenyuResultMessage; import org.apache.shenyu.common.constant.AdminConstants; @@ -186,9 +188,15 @@ public void testApplyWithAppKey() throws Exception { @Test public void testUpdateSk() throws Exception { + final UpdateSkDTO updateSkDTO = new UpdateSkDTO(); + updateSkDTO.setAppKey("testAppKey"); + updateSkDTO.setAppSecret("updateAppSecret"); + SpringBeanUtils.getInstance().setApplicationContext(mock(ConfigurableApplicationContext.class)); + when(SpringBeanUtils.getInstance().getBean(AppKeyProvider.class)).thenReturn(mock(AppKeyProvider.class)); + when(SpringBeanUtils.getInstance().getBean(AppKeyProvider.class).existed("testAppKey")).thenReturn(true); this.mockMvc.perform(MockMvcRequestBuilders.post("/appAuth/updateSk") - .param("appKey", "testAppKey") - .param("appSecret", "updateAppSecret")) + .contentType(MediaType.APPLICATION_JSON) + .content(GsonUtils.getInstance().toJson(updateSkDTO))) .andExpect(status().isOk()) .andReturn(); } diff --git a/shenyu-dist/shenyu-admin-dist/src/main/release-docs/LICENSE b/shenyu-dist/shenyu-admin-dist/src/main/release-docs/LICENSE index f6d016eba8bd..105113ffd215 100644 --- a/shenyu-dist/shenyu-admin-dist/src/main/release-docs/LICENSE +++ b/shenyu-dist/shenyu-admin-dist/src/main/release-docs/LICENSE @@ -501,8 +501,6 @@ The text of each license is the standard Apache 2.0 license. javatuples 1.2: https://mvnrepository.com/artifact/org.javatuples/javatuples, Apache 2.0 json-schema-core 1.2.14: https://mvnrepository.com/artifact/com.github.java-json-tools/json-schema-core, Apache 2.0 uri-template 0.10: https://github.com/java-json-tools/uri-template, Apache 2.0 - zookeeper 3.9.5: https://gitbox.apache.org/repos/asf/zookeeper, Apache 2.0 - zookeeper-jute 3.9.5: https://gitbox.apache.org/repos/asf/zookeeper, Apache 2.0 ======================================================================== BSD licenses @@ -579,7 +577,6 @@ The text of each license is also included at licenses/LICENSE-[project].txt. checker-qual 3.33.0: https://checkerframework.org/, MIT jopt-simple 5.0.4: https://github.com/jopt-simple/jopt-simple, MIT oshi-core 6.10.0: https://github.com/oshi/oshi, MIT - oshi-core 6.7.0: https://github.com/oshi/oshi, MIT ======================================================================== MPL licenses @@ -716,7 +713,6 @@ Bouncy Castle licenses bcprov-jdk18on 1.78: https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk18on, Bouncy Castle bcutil-jdk18on 1.72: https://mvnrepository.com/artifact/org.bouncycastle/bcutil-jdk18on, Bouncy Castle bcpkix-jdk18on 1.72: https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk18on, Bouncy Castle - bcprov-jdk18on 1.84: https://github.com/bcgit/bc-java, Bouncy Castle ======================================================================== XPP License diff --git a/shenyu-dist/shenyu-bootstrap-dist/src/main/release-docs/LICENSE b/shenyu-dist/shenyu-bootstrap-dist/src/main/release-docs/LICENSE index eccd4fb18a83..aac452052298 100644 --- a/shenyu-dist/shenyu-bootstrap-dist/src/main/release-docs/LICENSE +++ b/shenyu-dist/shenyu-bootstrap-dist/src/main/release-docs/LICENSE @@ -631,31 +631,6 @@ The text of each license is the standard Apache 2.0 license. javatuples 1.2: https://mvnrepository.com/artifact/org.javatuples/javatuples, Apache 2.0 jna-platform 5.16.0: https://github.com/java-native-access/jna, Apache 2.0 - lz4-java 1.10.1: https://github.com/yawkat/lz4-java, Apache 2.0 - itu 1.14.0: https://github.com/ethlo/itu, Apache 2.0 - jsonschema-generator 4.38.0: https://github.com/victools/jsonschema-generator, The Apache License, Version 2.0 - jsonschema-module-jackson 4.38.0: https://github.com/victools/jsonschema-generator, The Apache License, Version 2.0 - jsonschema-module-swagger-2 4.38.0: https://github.com/victools/jsonschema-generator, The Apache License, Version 2.0 - re2j 1.8: https://github.com/google/re2j, Go License - json-schema-validator 2.0.0: https://github.com/networknt/json-schema-validator, Apache License Version 2.0 - motan-core 1.2.1: https://github.com/weibocom/motan, The Apache License, Version 2.0 - motan-registry-zookeeper 1.2.1: https://github.com/weibocom/motan, The Apache License, Version 2.0 - motan-springsupport 1.2.1: https://github.com/weibocom/motan, The Apache License, Version 2.0 - motan-transport-netty4 1.2.1: https://github.com/weibocom/motan, The Apache License, Version 2.0 - swagger-annotations-jakarta 2.2.38: https://github.com/swagger-api/swagger-core, Apache License 2.0 - dubbo-dependencies-zookeeper 3.2.14: https://www.apache.org/licenses/LICENSE-2.0.txt, Apache 2.0 - kafka-clients 3.9.2: https://kafka.apache.org, The Apache License, Version 2.0 - log4j-1.2-api 2.23.1: https://www.apache.org/licenses/LICENSE-2.0.txt, Apache 2.0 - zookeeper 3.9.5: https://gitbox.apache.org/repos/asf/zookeeper, Apache 2.0 - zookeeper-jute 3.9.5: https://gitbox.apache.org/repos/asf/zookeeper, Apache 2.0 - spring-ai-client-chat 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 - spring-ai-commons 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 - spring-ai-deepseek 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 - spring-ai-mcp 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 - spring-ai-model 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 - spring-ai-openai 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 - spring-ai-retry 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 - spring-ai-template-st 1.1.2: https://github.com/spring-projects/spring-ai, Apache 2.0 ======================================================================== BSD licenses @@ -772,12 +747,6 @@ The text of each license is also included at licenses/LICENSE-[project].txt. dexx-collections 0.2: https://github.com/andrewoma/dexx, MIT checker-qual 3.33.0: https://github.com/typetools/checker-framework/blob/master/checker-qual, MIT oshi-core 6.10.0: https://github.com/oshi/oshi, MIT - oshi-core 6.7.0: https://github.com/oshi/oshi, MIT - mcp 0.17.0: https://github.com/modelcontextprotocol/java-sdk, MIT - mcp-core 0.17.0: https://github.com/modelcontextprotocol/java-sdk, MIT - mcp-json 0.17.0: https://github.com/modelcontextprotocol/java-sdk, MIT - mcp-json-jackson2 0.17.0: https://github.com/modelcontextprotocol/java-sdk, MIT - mcp-spring-webflux 0.17.0: https://github.com/modelcontextprotocol/java-sdk, MIT ======================================================================== MPL licenses @@ -805,7 +774,6 @@ Bouncy Castle licenses bcutil-jdk18on 1.78: https://mvnrepository.com/artifact/org.bouncycastle/bcutil-jdk18on, Bouncy Castle bcpkix-jdk18on 1.78: https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk18on, Bouncy Castle bcprov-ext-jdk18on 1.78: https://mvnrepository.com/artifact/org.bouncycastle/bcprov-ext-jdk18on, Bouncy Castle - bcprov-jdk18on 1.84: https://github.com/bcgit/bc-java, Bouncy Castle ======================================================================== EDL License