From 28a80e02514fe8c13e1826fda5d53f938105d600 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sun, 26 Dec 2021 02:00:24 +0300 Subject: [PATCH] chore: friendship ended with cas, now keycloak is our best friend Note that the login.tvl.fyi WWW configuration is still kind of hanging around until we've settled where Keycloak lives. Change-Id: Iaca4e394a7371cafa3716ca66ef09c4eca5b1520 Reviewed-on: https://cl.tvl.fyi/c/depot/+/4626 Autosubmit: tazjin Tested-by: BuildkiteCI Reviewed-by: lukegb --- ops/machines/whitby/default.nix | 3 +- ops/modules/tvl-sso/default.nix | 28 -- third_party/apereo-cas/default.nix | 63 ---- third_party/apereo-cas/overlay/.dockerignore | 7 - third_party/apereo-cas/overlay/.gitattributes | 6 - .../apereo-cas/overlay/.github/FUNDING.yml | 1 - .../apereo-cas/overlay/.github/renovate.json | 11 - third_party/apereo-cas/overlay/.gitignore | 22 -- third_party/apereo-cas/overlay/.mergify.yml | 32 -- third_party/apereo-cas/overlay/.travis.yml | 62 --- third_party/apereo-cas/overlay/Dockerfile | 40 -- third_party/apereo-cas/overlay/LICENSE.txt | 202 ---------- third_party/apereo-cas/overlay/README.md | 146 -------- third_party/apereo-cas/overlay/build.gradle | 124 ------ .../apereo-cas/overlay/docker-build.sh | 10 - .../apereo-cas/overlay/docker-compose.yml | 7 - third_party/apereo-cas/overlay/docker-push.sh | 12 - third_party/apereo-cas/overlay/docker-run.sh | 7 - .../overlay/etc/cas/config/cas.properties | 39 -- .../overlay/etc/cas/config/log4j2.xml | 84 ----- .../apereo-cas/overlay/etc/cas/saml/.gitkeep | 1 - .../overlay/etc/cas/services/.donotdel | 0 .../overlay/etc/cas/services/samltest-1.json | 8 - .../apereo-cas/overlay/etc/cas/thekeystore | Bin 2266 -> 0 bytes .../apereo-cas/overlay/gradle.properties | 28 -- .../overlay/gradle/dockerjib.gradle | 52 --- .../overlay/gradle/springboot.gradle | 101 ----- .../apereo-cas/overlay/gradle/tasks.gradle | 354 ------------------ .../overlay/gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - third_party/apereo-cas/overlay/gradlew | 185 --------- third_party/apereo-cas/overlay/gradlew.bat | 104 ----- third_party/apereo-cas/overlay/lombok.config | 2 - .../apereo-cas/overlay/settings.gradle | 1 - .../overlay/src/main/jib/docker/entrypoint.sh | 22 -- .../overlay/src/main/webapp/WEB-INF/web.xml | 7 - third_party/overlays/tvl.nix | 10 - 37 files changed, 1 insertion(+), 1785 deletions(-) delete mode 100644 ops/modules/tvl-sso/default.nix delete mode 100644 third_party/apereo-cas/default.nix delete mode 100644 third_party/apereo-cas/overlay/.dockerignore delete mode 100644 third_party/apereo-cas/overlay/.gitattributes delete mode 100644 third_party/apereo-cas/overlay/.github/FUNDING.yml delete mode 100644 third_party/apereo-cas/overlay/.github/renovate.json delete mode 100755 third_party/apereo-cas/overlay/.gitignore delete mode 100644 third_party/apereo-cas/overlay/.mergify.yml delete mode 100644 third_party/apereo-cas/overlay/.travis.yml delete mode 100644 third_party/apereo-cas/overlay/Dockerfile delete mode 100644 third_party/apereo-cas/overlay/LICENSE.txt delete mode 100644 third_party/apereo-cas/overlay/README.md delete mode 100644 third_party/apereo-cas/overlay/build.gradle delete mode 100755 third_party/apereo-cas/overlay/docker-build.sh delete mode 100644 third_party/apereo-cas/overlay/docker-compose.yml delete mode 100755 third_party/apereo-cas/overlay/docker-push.sh delete mode 100755 third_party/apereo-cas/overlay/docker-run.sh delete mode 100644 third_party/apereo-cas/overlay/etc/cas/config/cas.properties delete mode 100644 third_party/apereo-cas/overlay/etc/cas/config/log4j2.xml delete mode 100644 third_party/apereo-cas/overlay/etc/cas/saml/.gitkeep delete mode 100644 third_party/apereo-cas/overlay/etc/cas/services/.donotdel delete mode 100644 third_party/apereo-cas/overlay/etc/cas/services/samltest-1.json delete mode 100644 third_party/apereo-cas/overlay/etc/cas/thekeystore delete mode 100644 third_party/apereo-cas/overlay/gradle.properties delete mode 100644 third_party/apereo-cas/overlay/gradle/dockerjib.gradle delete mode 100644 third_party/apereo-cas/overlay/gradle/springboot.gradle delete mode 100644 third_party/apereo-cas/overlay/gradle/tasks.gradle delete mode 100644 third_party/apereo-cas/overlay/gradle/wrapper/gradle-wrapper.jar delete mode 100644 third_party/apereo-cas/overlay/gradle/wrapper/gradle-wrapper.properties delete mode 100755 third_party/apereo-cas/overlay/gradlew delete mode 100644 third_party/apereo-cas/overlay/gradlew.bat delete mode 100644 third_party/apereo-cas/overlay/lombok.config delete mode 100644 third_party/apereo-cas/overlay/settings.gradle delete mode 100755 third_party/apereo-cas/overlay/src/main/jib/docker/entrypoint.sh delete mode 100644 third_party/apereo-cas/overlay/src/main/webapp/WEB-INF/web.xml diff --git a/ops/machines/whitby/default.nix b/ops/machines/whitby/default.nix index 63d14be19..727859542 100644 --- a/ops/machines/whitby/default.nix +++ b/ops/machines/whitby/default.nix @@ -21,7 +21,6 @@ in { "${depot.path}/ops/modules/sourcegraph.nix" "${depot.path}/ops/modules/tvl-buildkite.nix" "${depot.path}/ops/modules/tvl-slapd/default.nix" - "${depot.path}/ops/modules/tvl-sso/default.nix" "${depot.path}/ops/modules/www/atward.tvl.fyi.nix" "${depot.path}/ops/modules/www/auth.tvl.fyi.nix" "${depot.path}/ops/modules/www/b.tvl.fyi.nix" @@ -31,7 +30,7 @@ in { "${depot.path}/ops/modules/www/cs.tvl.fyi.nix" "${depot.path}/ops/modules/www/deploys.tvl.fyi.nix" "${depot.path}/ops/modules/www/images.tvl.fyi.nix" - "${depot.path}/ops/modules/www/login.tvl.fyi.nix" + # "${depot.path}/ops/modules/www/login.tvl.fyi.nix" "${depot.path}/ops/modules/www/nixery.dev.nix" "${depot.path}/ops/modules/www/static.tvl.fyi.nix" "${depot.path}/ops/modules/www/status.tvl.su.nix" diff --git a/ops/modules/tvl-sso/default.nix b/ops/modules/tvl-sso/default.nix deleted file mode 100644 index 8b413114c..000000000 --- a/ops/modules/tvl-sso/default.nix +++ /dev/null @@ -1,28 +0,0 @@ -# Configures an Apereo CAS instance for TVL SSO -{ depot, ... }: - -let - inherit (depot.third_party) apereo-cas; -in { - config = { - environment.systemPackages = [ apereo-cas ]; - systemd.services.apereo-cas = { - description = "Apereo CAS Single Sign On server"; - wantedBy = [ "multi-user.target" ]; - after = [ "network.target" ]; - environment.JDK_JAVA_OPTIONS = "-Xmx512M -Xms512M"; - serviceConfig = { - User = "apereo-cas"; - Group = "apereo-cas"; - ExecStart = "${apereo-cas}/bin/cas"; - EnvironmentFile = "/etc/cas/secrets"; - Restart = "always"; - }; - }; - users.users.apereo-cas = { - isSystemUser = true; - group = "apereo-cas"; - }; - users.groups.apereo-cas = {}; - }; -} diff --git a/third_party/apereo-cas/default.nix b/third_party/apereo-cas/default.nix deleted file mode 100644 index bda607c07..000000000 --- a/third_party/apereo-cas/default.nix +++ /dev/null @@ -1,63 +0,0 @@ -{ pkgs, lib, ... }: - -let - name = "apereo-cas-${version}"; - version = "6.2.0"; - overlay = ./overlay; - - jdk = pkgs.jdk11; - gradle = pkgs.gradle_6; - - meta = with lib; { - homepage = "https://www.apereo.org/projects/cas"; - description = "CAS provides enterprise single sign-on for the Web"; - platforms = platforms.linux; - licenses = licenses.asl20; - }; - - deps = pkgs.stdenvNoCC.mkDerivation { - inherit meta; - - name = "${name}-deps"; - src = overlay; - nativeBuildInputs = with pkgs; [ gradle perl ]; - - buildPhase = '' - export GRADLE_USER_HOME="$(mktemp -d)" - gradle --no-daemon build -x test downloadShell - ''; - - # perl code mavenizes paths (see pkgs/servers/ma1sd from nixpkgs) - installPhase = '' - find $GRADLE_USER_HOME/caches/modules-2 -type f -regex '.*\.\([wj]ar\|pom\)' \ - | perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# $src = $1; ($x = $2) =~ tr|\.|/|; $dir1 = $3; $dir2 = $4; ($y = $5) =~ s|-jvm||n; "install -Dm444 $src \$out/$x/$dir1/$dir2/$y" #e' \ - | sh - install -m444 build/libs/cas-server-support-shell-* $out/cas-server-shell.jar - ''; - - outputHashAlgo = "sha256"; - outputHashMode = "recursive"; - outputHash = "07wxmgljs8v0pmnryqjz6dr6jl93x3023y8zx3al5314mmqkpaan"; - }; -in -pkgs.stdenvNoCC.mkDerivation { - inherit name version meta; - - src = overlay; - nativeBuildInputs = with pkgs; [ gradle makeWrapper ]; - buildInputs = with pkgs; [ jdk ]; - - buildPhase = '' - export GRADLE_USER_HOME="$(mktemp -d)" - - gradle -PcacheLocation="${deps}" --offline --no-daemon build -x test - ''; - - installPhase = '' - install -D build/libs/cas.war $out/lib/cas.war - cp ${deps}/cas-server-shell.jar $out/lib/cas-server-shell.jar - cp -R etc $out/etc - makeWrapper ${jdk}/bin/java $out/bin/cas --add-flags "-Dcas.standalone.configurationDirectory=$out/etc/cas/config -jar $out/lib/cas.war" - makeWrapper ${jdk}/bin/java $out/bin/cas-shell --add-flags "-Dcas.standalone.configurationDirectory=$out/etc/cas/config -jar $out/lib/cas-server-shell.jar" - ''; -} diff --git a/third_party/apereo-cas/overlay/.dockerignore b/third_party/apereo-cas/overlay/.dockerignore deleted file mode 100644 index 5e04587dd..000000000 --- a/third_party/apereo-cas/overlay/.dockerignore +++ /dev/null @@ -1,7 +0,0 @@ -target/** -build/** -bin/** -.idea/** -.history/** -.github/** -.git/** diff --git a/third_party/apereo-cas/overlay/.gitattributes b/third_party/apereo-cas/overlay/.gitattributes deleted file mode 100644 index 8fc5677e1..000000000 --- a/third_party/apereo-cas/overlay/.gitattributes +++ /dev/null @@ -1,6 +0,0 @@ -# Set line endings to LF, even on Windows. Otherwise, execution within Docker fails. -# See https://help.github.com/articles/dealing-with-line-endings/ -*.sh text eol=lf -gradlew text eol=lf -*.cmd text eol=crlf -*.bat text eol=crlf diff --git a/third_party/apereo-cas/overlay/.github/FUNDING.yml b/third_party/apereo-cas/overlay/.github/FUNDING.yml deleted file mode 100644 index 30b54fb73..000000000 --- a/third_party/apereo-cas/overlay/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -custom: ['https://www.apereo.org/content/apereo-membership'] diff --git a/third_party/apereo-cas/overlay/.github/renovate.json b/third_party/apereo-cas/overlay/.github/renovate.json deleted file mode 100644 index 58fa77f03..000000000 --- a/third_party/apereo-cas/overlay/.github/renovate.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": [ - "config:base", - ":preserveSemverRanges", - ":rebaseStalePrs", - ":disableRateLimiting", - ":semanticCommits", - ":semanticCommitTypeAll(renovatebot)" - ], - "labels": ["dependencies", "bot"] -} diff --git a/third_party/apereo-cas/overlay/.gitignore b/third_party/apereo-cas/overlay/.gitignore deleted file mode 100755 index 45840be34..000000000 --- a/third_party/apereo-cas/overlay/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -.classpath -!/.project -.project -.settings -.history -.vscode -target/ -.idea/ -.DS_Store -.idea -overlays/ -.gradle/ -build/ -log/ -bin/ -*.war -*.iml -*.log -tmp/ -./apache-tomcat -apache-tomcat.zip -config-metadata.properties diff --git a/third_party/apereo-cas/overlay/.mergify.yml b/third_party/apereo-cas/overlay/.mergify.yml deleted file mode 100644 index 4fcbdbe4a..000000000 --- a/third_party/apereo-cas/overlay/.mergify.yml +++ /dev/null @@ -1,32 +0,0 @@ -# -# Licensed to Apereo under one or more contributor license -# agreements. See the NOTICE file distributed with this work -# for additional information regarding copyright ownership. -# Apereo 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 the following location: -# -# 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. -# - -pull_request_rules: -- name: automatic merge by dependabot - conditions: - - status-success=continuous-integration/travis-ci/pr - - status-success=WIP - - "#changes-requested-reviews-by=0" - - base=master - - label=dependencies - actions: - merge: - method: merge - strict: true - delete_head_branch: \ No newline at end of file diff --git a/third_party/apereo-cas/overlay/.travis.yml b/third_party/apereo-cas/overlay/.travis.yml deleted file mode 100644 index 8347dd171..000000000 --- a/third_party/apereo-cas/overlay/.travis.yml +++ /dev/null @@ -1,62 +0,0 @@ -language: java -sudo: required -dist: trusty -services: - - docker -branches: - only: - - master -before_cache: - - rm -rf $HOME/.gradle/caches/5.*/ - - rm -rf $HOME/.gradle/caches/4.*/ - - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ - - find ~/.gradle/caches/ -name "*.lock" -type f -delete -cache: - bundler: false - cargo: false - directories: - - $HOME/.m2 - - $HOME/.npm/ - - $HOME/.gradle/caches/ - - $HOME/.gradle/wrapper/ -env: - global: - - JAVA_OPTS="-Xms512m -Xmx4048m -Xss128m -XX:ReservedCodeCacheSize=512m -XX:+UseG1GC -Xverify:none -server" - - GRADLE_OPTS="-Xms512m -Xmx1024m -Xss128m -XX:ReservedCodeCacheSize=512m -XX:+UseG1GC -Xverify:none -server" -jdk: -- openjdk11 -before_install: -- echo -e "Configuring Gradle wrapper...\n" -- mkdir -p ~/.gradle && echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties -- chmod -R 777 ./gradlew -- chmod -R 777 *.sh -install: true -stages: - - build - - validate - - docker -jobs: - include: - - stage: build - script: ./gradlew clean build --stacktrace --no-daemon --refresh-dependencies -Dorg.gradle.internal.http.socketTimeout=600000 -Dorg.gradle.internal.http.connectionTimeout=600000 - name: "Build CAS" - ############################################ - - stage: validate - script: ./gradlew downloadShell - name: "Download CAS Shell" - - stage: validate - script: ./gradlew listTemplateViews - name: "List CAS Template Views" - - stage: validate - script: ./gradlew explodeWar - name: "Unzip CAS Web Application" - ############################################ - - stage: docker - script: ./gradlew build jibDockerBuild --stacktrace --no-daemon --refresh-dependencies - name: "Build Docker Image via Jib" - - stage: docker - script: docker-compose build - name: "Build Docker Image via Docker Compose" - - stage: docker - script: ./docker-build.sh - name: "Build Docker Image" \ No newline at end of file diff --git a/third_party/apereo-cas/overlay/Dockerfile b/third_party/apereo-cas/overlay/Dockerfile deleted file mode 100644 index 17ab5648b..000000000 --- a/third_party/apereo-cas/overlay/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM adoptopenjdk/openjdk11:alpine-slim AS overlay - -RUN mkdir -p cas-overlay -COPY ./src cas-overlay/src/ -COPY ./gradle/ cas-overlay/gradle/ -COPY ./gradlew ./settings.gradle ./build.gradle ./gradle.properties /cas-overlay/ - -RUN mkdir -p ~/.gradle \ - && echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties \ - && echo "org.gradle.configureondemand=true" >> ~/.gradle/gradle.properties \ - && cd cas-overlay \ - && chmod 750 ./gradlew \ - && ./gradlew --version; - -RUN cd cas-overlay \ - && ./gradlew clean build --parallel --no-daemon; - -FROM adoptopenjdk/openjdk11:alpine-jre AS cas - -LABEL "Organization"="Apereo" -LABEL "Description"="Apereo CAS" - -RUN cd / \ - && mkdir -p /etc/cas/config \ - && mkdir -p /etc/cas/services \ - && mkdir -p /etc/cas/saml \ - && mkdir -p cas-overlay; - -COPY etc/cas/ /etc/cas/ -COPY etc/cas/config/ /etc/cas/config/ -COPY etc/cas/services/ /etc/cas/services/ -COPY etc/cas/saml/ /etc/cas/saml/ -COPY --from=overlay cas-overlay/build/libs/cas.war cas-overlay/ - -EXPOSE 8080 8443 - -ENV PATH $PATH:$JAVA_HOME/bin:. - -WORKDIR cas-overlay -ENTRYPOINT ["java", "-server", "-noverify", "-Xmx2048M", "-jar", "cas.war"] diff --git a/third_party/apereo-cas/overlay/LICENSE.txt b/third_party/apereo-cas/overlay/LICENSE.txt deleted file mode 100644 index d64569567..000000000 --- a/third_party/apereo-cas/overlay/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed 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. diff --git a/third_party/apereo-cas/overlay/README.md b/third_party/apereo-cas/overlay/README.md deleted file mode 100644 index ec8d96483..000000000 --- a/third_party/apereo-cas/overlay/README.md +++ /dev/null @@ -1,146 +0,0 @@ -CAS Overlay Template [![Build Status](https://travis-ci.org/apereo/cas-overlay-template.svg?branch=master)](https://travis-ci.org/apereo/cas-overlay-template) -======================= - -Generic CAS WAR overlay to exercise the latest versions of CAS. This overlay could be freely used as a starting template for local CAS war overlays. - -# Versions - -- CAS `6.2.x` -- JDK `11` - -# Overview - -To build the project, use: - -```bash -# Use --refresh-dependencies to force-update SNAPSHOT versions -./gradlew[.bat] clean build -``` - -To see what commands are available to the build script, run: - -```bash -./gradlew[.bat] tasks -``` - -To launch into the CAS command-line shell: - -```bash -./gradlew[.bat] downloadShell runShell -``` - -To fetch and overlay a CAS resource or view, use: - -```bash -./gradlew[.bat] getResource -PresourceName=[resource-name] -``` - -To list all available CAS views and templates: - -```bash -./gradlew[.bat] listTemplateViews -``` - -To unzip and explode the CAS web application file and the internal resources jar: - -```bash -./gradlew[.bat] explodeWar -``` - -# Configuration - -- The `etc` directory contains the configuration files and directories that need to be copied to `/etc/cas/config`. - -```bash -./gradlew[.bat] copyCasConfiguration -``` - -- The specifics of the build are controlled using the `gradle.properties` file. - -## Adding Modules - -CAS modules may be specified under the `dependencies` block of the [Gradle build script](build.gradle): - -```gradle -dependencies { - compile "org.apereo.cas:cas-server-some-module:${project.casVersion}" - ... -} -``` - -To collect the list of all project modules and dependencies: - -```bash -./gradlew[.bat] allDependencies -``` - -### Clear Gradle Cache - -If you need to, on Linux/Unix systems, you can delete all the existing artifacts (artifacts and metadata) Gradle has downloaded using: - -```bash -# Only do this when absolutely necessary -rm -rf $HOME/.gradle/caches/ -``` - -Same strategy applies to Windows too, provided you switch `$HOME` to its equivalent in the above command. - -# Deployment - -- Create a keystore file `thekeystore` under `/etc/cas`. Use the password `changeit` for both the keystore and the key/certificate entries. This can either be done using the JDK's `keytool` utility or via the following command: - -```bash -./gradlew[.bat] createKeystore -``` - -- Ensure the keystore is loaded up with keys and certificates of the server. - -On a successful deployment via the following methods, CAS will be available at: - -* `https://cas.server.name:8443/cas` - -## Executable WAR - -Run the CAS web application as an executable WAR: - -```bash -./gradlew[.bat] run -``` - -Debug the CAS web application as an executable WAR: - -```bash -./gradlew[.bat] debug -``` - -Run the CAS web application as a *standalone* executable WAR: - -```bash -./gradlew[.bat] clean executable -``` - -## External - -Deploy the binary web application file `cas.war` after a successful build to a servlet container of choice. - -## Docker - -The following strategies outline how to build and deploy CAS Docker images. - -### Jib - -The overlay embraces the [Jib Gradle Plugin](https://github.com/GoogleContainerTools/jib) to provide easy-to-use out-of-the-box tooling for building CAS docker images. Jib is an open-source Java containerizer from Google that lets Java developers build containers using the tools they know. It is a container image builder that handles all the steps of packaging your application into a container image. It does not require you to write a Dockerfile or have Docker installed, and it is directly integrated into the overlay. - -```bash -./gradlew build jibDockerBuild -``` - -### Dockerfile - -You can also use the native Docker tooling and the provided `Dockerfile` to build and run CAS. - -```bash -chmod +x *.sh -./docker-build.sh -./docker-run.sh -``` diff --git a/third_party/apereo-cas/overlay/build.gradle b/third_party/apereo-cas/overlay/build.gradle deleted file mode 100644 index 464fce48d..000000000 --- a/third_party/apereo-cas/overlay/build.gradle +++ /dev/null @@ -1,124 +0,0 @@ -buildscript { - repositories { - if (rootProject.hasProperty("cacheLocation")) { - mavenLocal() - maven { url cacheLocation } - } else { - mavenLocal() - gradlePluginPortal() - mavenCentral() - jcenter() - maven { - url "https://repo.spring.io/libs-milestone" - mavenContent { releasesOnly() } - } - maven { - url "https://repo.spring.io/libs-snapshot" - mavenContent { snapshotsOnly() } - } - maven { - url "https://plugins.gradle.org/m2/" - mavenContent { releasesOnly() } - } - } - } - dependencies { - classpath "de.undercouch:gradle-download-task:${project.gradleDownloadTaskVersion}" - classpath "org.springframework.boot:spring-boot-gradle-plugin:${project.springBootVersion}" - classpath "gradle.plugin.com.google.cloud.tools:jib-gradle-plugin:${project.jibVersion}" - classpath "io.freefair.gradle:maven-plugin:${project.gradleMavenPluginVersion}" - classpath "io.freefair.gradle:lombok-plugin:${project.gradleLombokPluginVersion}" - } -} - -repositories { - if (rootProject.hasProperty("cacheLocation")) { - mavenLocal() - maven { url cacheLocation } - } else { - mavenLocal() - mavenCentral() - jcenter() - maven { - url "https://oss.sonatype.org/content/repositories/snapshots" - mavenContent { snapshotsOnly() } - } - maven { - mavenContent { releasesOnly() } - url "https://build.shibboleth.net/nexus/content/repositories/releases/" - } - maven { - mavenContent { releasesOnly() } - url "https://repo.spring.io/milestone/" - } - maven { - url "https://repo.spring.io/snapshot/" - mavenContent { snapshotsOnly() } - } - maven { - mavenContent { snapshotsOnly() } - url "https://oss.jfrog.org/artifactory/oss-snapshot-local" - } - } -} - -def casServerVersion = project.'cas.version' -def casWebApplicationBinaryName = "cas.war" - -project.ext."casServerVersion" = casServerVersion -project.ext."casWebApplicationBinaryName" = casWebApplicationBinaryName - -apply plugin: "io.freefair.war-overlay" -apply plugin: "io.freefair.lombok" -apply from: rootProject.file("gradle/tasks.gradle") - -apply plugin: "war" -apply plugin: "eclipse" -apply plugin: "idea" - -apply from: rootProject.file("gradle/springboot.gradle") -apply from: rootProject.file("gradle/dockerjib.gradle") - -dependencies { - // Other CAS dependencies/modules may be listed here... - implementation "org.apereo.cas:cas-server-support-ldap:${project.'cas.version'}" - implementation "org.apereo.cas:cas-server-support-json-service-registry:${project.'cas.version'}" - implementation "org.apereo.cas:cas-server-support-saml-idp:${project.'cas.version'}" - implementation "org.apereo.cas:cas-server-support-oidc:${project.'cas.version'}" -} - -tasks.findByName("jibDockerBuild") - .dependsOn(copyWebAppIntoJib, copyConfigIntoJib) - .finalizedBy(deleteWebAppFromJib) - -tasks.findByName("jib") - .dependsOn(copyWebAppIntoJib, copyConfigIntoJib) - .finalizedBy(deleteWebAppFromJib) - -configurations.all { - resolutionStrategy { - cacheChangingModulesFor 0, "seconds" - cacheDynamicVersionsFor 0, "seconds" - - preferProjectModules() - - def failIfConflict = project.hasProperty("failOnVersionConflict") && Boolean.valueOf(project.getProperty("failOnVersionConflict")) - if (failIfConflict) { - failOnVersionConflict() - } - } -} - -eclipse { - classpath { - downloadSources = true - downloadJavadoc = true - } -} - -idea { - module { - downloadJavadoc = true - downloadSources = true - } -} diff --git a/third_party/apereo-cas/overlay/docker-build.sh b/third_party/apereo-cas/overlay/docker-build.sh deleted file mode 100755 index dc098ade9..000000000 --- a/third_party/apereo-cas/overlay/docker-build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -image_tag=(`cat gradle.properties | grep "cas.version" | cut -d= -f2`) - -echo "Building CAS docker image tagged as [v$image_tag]" -# read -p "Press [Enter] to continue..." any_key; - -docker build --tag="apereo/cas:v$image_tag" . \ - && echo "Built CAS image successfully tagged as apereo/cas:v$image_tag" \ - && docker images "apereo/cas:v$image_tag" \ No newline at end of file diff --git a/third_party/apereo-cas/overlay/docker-compose.yml b/third_party/apereo-cas/overlay/docker-compose.yml deleted file mode 100644 index 8f2e6ca7c..000000000 --- a/third_party/apereo-cas/overlay/docker-compose.yml +++ /dev/null @@ -1,7 +0,0 @@ -version: '3' -services: - cas: - build: . - ports: - - "8443:8443" - - "8080:8080" \ No newline at end of file diff --git a/third_party/apereo-cas/overlay/docker-push.sh b/third_party/apereo-cas/overlay/docker-push.sh deleted file mode 100755 index ca7b784e6..000000000 --- a/third_party/apereo-cas/overlay/docker-push.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -read -p "Docker username: " docker_user -read -s -p "Docker password: " docker_psw - -echo "$docker_psw" | docker login --username "$docker_user" --password-stdin - -image_tag=(`cat gradle.properties | grep "cas.version" | cut -d= -f2`) - -echo "Pushing CAS docker image tagged as v$image_tag to apereo/cas..." -docker push apereo/cas:"v$image_tag" \ - && echo "Pushed apereo/cas:v$image_tag successfully."; \ No newline at end of file diff --git a/third_party/apereo-cas/overlay/docker-run.sh b/third_party/apereo-cas/overlay/docker-run.sh deleted file mode 100755 index 6b4ce9755..000000000 --- a/third_party/apereo-cas/overlay/docker-run.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -docker stop cas > /dev/null 2>&1 -docker rm cas > /dev/null 2>&1 -image_tag=(`cat gradle.properties | grep "cas.version" | cut -d= -f2`) -docker run -d -p 8080:8080 -p 8443:8443 --name="cas" apereo/cas:"v${image_tag}" -docker logs -f cas \ No newline at end of file diff --git a/third_party/apereo-cas/overlay/etc/cas/config/cas.properties b/third_party/apereo-cas/overlay/etc/cas/config/cas.properties deleted file mode 100644 index 01515613d..000000000 --- a/third_party/apereo-cas/overlay/etc/cas/config/cas.properties +++ /dev/null @@ -1,39 +0,0 @@ -cas.server.name=https://login.tvl.fyi -cas.server.prefix=${cas.server.name} -cas.server.scope=tvl.fyi -server.tomcat.basedir=/etc/cas/tomcat -server.servlet.context.path=/ - -cas.service-registry.json.location=file:/etc/cas/services - -server.port=8444 -server.address=127.0.0.1 -server.ssl.enabled=false - -# Enable X-Forwarded-For using Tomcat. -server.forward-headers-strategy=NATIVE -server.tomcat.remoteip.remote-ip-header=x-forwarded-for -server.tomcat.remoteip.protocol-header=x-forwarded-proto - -server.tomcat.basedir=/etc/cas/tomcat -server.servlet.context-path=/ - -cas.authn.saml-idp.entity-id=https://login.tvl.fyi - -cas.authn.accept.users= - -cas.authn.attribute-repository.default-attributes-to-release=uid,mail,displayName,username,principalLdapDn - -cas.authn.ldap[0].pool-passivator=NONE -cas.authn.ldap[0].principal-attribute-list=cn:uid,mail,displayName,cn:username -cas.authn.ldap[0].collect-dn-attribute=true -cas.authn.ldap[0].principal-dn-attribute-name=principalLdapDn -cas.authn.ldap[0].ldap-url=ldap://localhost -cas.authn.ldap[0].use-start-tls=false -cas.authn.ldap[0].validator.base-dn=dc=tvl,dc=fyi -cas.authn.ldap[0].base-dn=dc=tvl,dc=fyi -cas.authn.ldap[0].search-filter=cn={user} -cas.authn.ldap[0].dn-format=cn=%s,ou=users,dc=tvl,dc=fyi -cas.authn.ldap[0].type=DIRECT - -cas.authn.oidc.issuer=${cas.server.name}/oidc diff --git a/third_party/apereo-cas/overlay/etc/cas/config/log4j2.xml b/third_party/apereo-cas/overlay/etc/cas/config/log4j2.xml deleted file mode 100644 index d7d5bb65e..000000000 --- a/third_party/apereo-cas/overlay/etc/cas/config/log4j2.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - - /var/log - - info - warn - info - warn - debug - warn - warn - warn - warn - warn - warn - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/third_party/apereo-cas/overlay/etc/cas/saml/.gitkeep b/third_party/apereo-cas/overlay/etc/cas/saml/.gitkeep deleted file mode 100644 index 882c99944..000000000 --- a/third_party/apereo-cas/overlay/etc/cas/saml/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -This directory is references in the Dockerfile so it needs to be here. \ No newline at end of file diff --git a/third_party/apereo-cas/overlay/etc/cas/services/.donotdel b/third_party/apereo-cas/overlay/etc/cas/services/.donotdel deleted file mode 100644 index e69de29bb..000000000 diff --git a/third_party/apereo-cas/overlay/etc/cas/services/samltest-1.json b/third_party/apereo-cas/overlay/etc/cas/services/samltest-1.json deleted file mode 100644 index 37ea1be98..000000000 --- a/third_party/apereo-cas/overlay/etc/cas/services/samltest-1.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "@class" : "org.apereo.cas.support.saml.services.SamlRegisteredService", - "serviceId" : "https://samltest.id/saml/sp", - "name" : "SAMLTest SP", - "id" : 1, - "evaluationOrder" : 10, - "metadataLocation" : "https://samltest.id/saml/sp" -} diff --git a/third_party/apereo-cas/overlay/etc/cas/thekeystore b/third_party/apereo-cas/overlay/etc/cas/thekeystore deleted file mode 100644 index 78f49baf743bc53e74cb67746992be258229c310..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2266 zcmezO_TO6u1_mYu1_nkjW=>8lW?*1US|#GZ$iTqLXwby+*MN_WOPh_6g;9%1kdcv< zfu)J%rG3TskeZv}lh~XVT$n7y5dNCoD-#Oh_EaJp6sbg}w z)#_KS?XEt}7Zews_w^TV3DFznN{aJ@gNM>+uV#3awM0-`Hk((#B`C)ctd1PhxLA z`mrlS=Ig5Ma+hm9CnzyEGw{lPKlV@{zGKUR1J@6kpS)DQjpf^u3Z7T5PAWVJsK2NC z_}K1ko4$Tv|I@5@W0q^z;f21g#ik)w#iBf~iQi`lGweLQg>Sk2-_3;=8y-JhdUJB> zq>zRUZA;x|&0e}badldm^Yd?EE0%d`_@3ibn)P~y1m`8s&)X+6GwPmLDSh+C%{ION zoj%Hr2UA&v7=NE#-+gq|GOk>sV-wC6pG=<_Ew6g5VWr26X!U1b?6l;v6wUYopB;S= z;Tl(eMD{#G_~kn`#giImZ=O~w|Lx}5S$XT8+S@nBUpu__sxjZeW779sovS`fd)n|! z(A2`u{DxfF*}Y1yPVQV?rgH6eYklX;(@&buFAh9>H!t2XYPa@6rehProEUb0v|eQW zt}H?ze8z6JhkIW+{mg9b>3)<3Roe|?0%cg+#5d2zvK{)t4dTA=RdDPb3^7#AtK#`}5F{LEvImd`Zl z>#a5a654ltde(+if5)`FvuoW}_=q?$Wm(!!5MwI0QM6{Ye3HXAUrOzW6Z^Nb{X6o+ zcwXG_{{8jo5H~ z9`{?v*weu9l3&E#-2v75OOmci`J~J`tK_Hhbm~goZ!zg-Y-V0w#eG=k;^j;E_MGLP zc3zz_@5JF-%OzTOb?g-j_nES8+L4m}JF_N>f91Oy6MFusi*S!`^Z&G6X}fnnK3);z z&SPnH|A2$v{z>~+J=KyheWJGKozR*JZpEW{VYe>HS#|8&@MZtI$`8|xRoN0S`|4C1i_8Wf9Gnef@GT%UNW#)UXB&%;leYtSe#u*=?o*yAO+G ztUVpHC$?2RKx?0o;G?9J#oXVROR`hXEdKIno|H{qs!+A@K}QGn8{DtIY_z;Soj>Do z&v~I8cX|_7^WKWQ9ML%OVt>=$;zegqFjUOj``^Cpn{#{M&l^u2=QepCZh3!L>DaCH zf{*9&7JvBPCFZHNeUDeSO0$d}?+(pn3KyA@N|GKsr@SxS<~Hl$$1StiZ(VWtw~5=` z^}r*3J*B;0UPX%<*cdPWVa8RrN%gn%Hn%JP*5`ZLgx782Z>?lkU&!vZu4td0-ikSM z^;(ZP+Q)5Wc`PH-`$e&1rswRRyO|a+sLWfv<V>)~3+?9K^GG}4vh7Qi(eVq3rp%txk2TAz{rGzN z{6uGU5&5E6qtkJ>gzM5&Vzn&2w`!)(xN=9ZuT$azxKw0~&@(l#WME*PYS6?y(V&T` zase|FBNG!#{Mxic170>xtu~Lg@4SqR+^h@+nTFg3oNUaYENsF|p}{Z?hcJ_4l%aqD zA4rB>nB6@yCn>e4#E{>B7bLkjt2Gya%{|@vVtt)2BJ+^BUKh8&&MLh zA~JQJaQpKg)urpc9IMW9u1W1xl66B4WNvUEGcrU+S8yDRvZ0! zxx+|6I^X!8{i_8@8mVticrNw7*CF$EuG*5W$n{)h8oF~|P0OxqPTx>^oF`S+k>CH+ zp`{b<>whRX%{WWyv+=U)oDq;vv-j8f zNO6{KR*hL<>A2MT)0d-F-PW_T{&;9hA6Lp_zR9Na?&T4&r&W>Hh5O1rr``Hu&0fz@ N;k~@9I@fUjKLGbk*y#WO diff --git a/third_party/apereo-cas/overlay/gradle.properties b/third_party/apereo-cas/overlay/gradle.properties deleted file mode 100644 index f49d921e1..000000000 --- a/third_party/apereo-cas/overlay/gradle.properties +++ /dev/null @@ -1,28 +0,0 @@ -# Versions -cas.version=6.2.0 -springBootVersion=2.2.8.RELEASE - -# Use -jetty, -undertow to other containers -# Or blank if you want to deploy to an external container -appServer=-tomcat -executable=false - -tomcatVersion=9.0.36 - -group=org.apereo.cas -sourceCompatibility=11 -targetCompatibility=11 - -jibVersion=2.4.0 - -# Location of the downloaded CAS shell JAR -shellDir=build/libs -ivyVersion=2.4.0 -gradleDownloadTaskVersion=3.4.3 -gradleMavenPluginVersion=4.1.5 -gradleLombokPluginVersion=4.1.5 - -# use without "-slim" in tag name if you want tools like jstack, adds about 100MB to image size -# (https://hub.docker.com/r/adoptopenjdk/openjdk11/tags/) -baseDockerImage=adoptopenjdk/openjdk11:alpine-jre -allowInsecureRegistries=false diff --git a/third_party/apereo-cas/overlay/gradle/dockerjib.gradle b/third_party/apereo-cas/overlay/gradle/dockerjib.gradle deleted file mode 100644 index dbadd5aa1..000000000 --- a/third_party/apereo-cas/overlay/gradle/dockerjib.gradle +++ /dev/null @@ -1,52 +0,0 @@ -apply plugin: "com.google.cloud.tools.jib" - -jib { - from { - image = project.baseDockerImage - } - to { - image = "${project.group}/${project.name}" - /** - ecr-login: Amazon Elastic Container Registry (ECR) - gcr: Google Container Registry (GCR) - osxkeychain: Docker Hub - */ - credHelper = "osxkeychain" - /** - auth { - username = "*******" - password = "*******" - } - */ - tags = ["v" + casServerVersion] - } - container { - creationTime = "USE_CURRENT_TIMESTAMP" - entrypoint = ['docker/entrypoint.sh'] - ports = ['80', '443', '8080', '8443'] - labels = [version:casServerVersion, name:project.name, group:project.group] - } - extraDirectories { - paths = 'src/main/jib' - permissions = [ - '/docker/entrypoint.sh': '755' - ] - } - allowInsecureRegistries = project.allowInsecureRegistries -} - -task copyWebAppIntoJib(type: Copy, group: "Docker", description: "Copy the web application into Docker image") { - dependsOn build - from "build/libs/${casWebApplicationBinaryName}" - into "src/main/jib/docker/cas/war" -} - -task copyConfigIntoJib(type: Copy, group: "Docker", description: "Copy the CAS configuration into Docker image") { - dependsOn build - from "etc/cas" - into "src/main/jib/docker/cas" -} - -task deleteWebAppFromJib(type: Delete, group: "Docker", description: "Explodes the CAS web application archive") { - delete "src/main/jib/docker/cas" -} \ No newline at end of file diff --git a/third_party/apereo-cas/overlay/gradle/springboot.gradle b/third_party/apereo-cas/overlay/gradle/springboot.gradle deleted file mode 100644 index 79804b18e..000000000 --- a/third_party/apereo-cas/overlay/gradle/springboot.gradle +++ /dev/null @@ -1,101 +0,0 @@ -apply plugin: "org.springframework.boot" - -configurations { - bootRunConfig.extendsFrom compileClasspath -} - -dependencies { - bootRunConfig "org.apereo.cas:cas-server-webapp-init:${casServerVersion}" - bootRunConfig "org.apereo.cas:cas-server-webapp-tomcat:${casServerVersion}" - bootRunConfig "org.springframework.boot:spring-boot-devtools:${project.springBootVersion}" -} - -sourceSets { - bootRunSources { - resources { - srcDirs new File("//etc/cas/templates/"), - new File("${project.getProjectDir()}/src/main/resources/") - } - } -} - -bootRun { - classpath = configurations.bootRunConfig + sourceSets.main.compileClasspath + sourceSets.main.runtimeClasspath - doFirst { - sourceResources sourceSets.bootRunSources - systemProperties = System.properties - } - - def list = [] - list.add("-XX:TieredStopAtLevel=1") - list.add("-Xverify:none") - list.add("--add-modules") - list.add("java.se") - list.add("--add-exports") - list.add("java.base/jdk.internal.ref=ALL-UNNAMED") - list.add("--add-opens") - list.add("java.base/java.lang=ALL-UNNAMED") - list.add("--add-opens") - list.add("java.base/java.nio=ALL-UNNAMED") - list.add("--add-opens") - list.add("java.base/sun.nio.ch=ALL-UNNAMED") - list.add("--add-opens") - list.add("java.management/sun.management=ALL-UNNAMED") - list.add("--add-opens") - list.add("jdk.management/com.sun.management.internal=ALL-UNNAMED") - - list.add("-XX:+UnlockExperimentalVMOptions") - list.add("-XX:+EnableJVMCI") - list.add("-XX:+UseJVMCICompiler") - - list.add("-Xrunjdwp:transport=dt_socket,address=5000,server=y,suspend=n") - - jvmArgs = list - - def appArgList = [] - args = appArgList -} - -springBoot { - buildInfo() - mainClassName = "org.apereo.cas.web.CasWebApplication" -} - -bootWar { - def executable = project.hasProperty("executable") && Boolean.valueOf(project.getProperty("executable")) - if (executable) { - logger.info "Including launch script for executable WAR artifact" - launchScript() - } else { - logger.info "WAR artifact is not marked as an executable" - } - archiveName "${casWebApplicationBinaryName}" - baseName "cas" - excludeDevtools = false - - entryCompression = ZipEntryCompression.STORED - /* - attachClasses = true - classesClassifier = 'classes' - archiveClasses = true - */ - overlays { - /* - https://docs.freefair.io/gradle-plugins/current/reference/#_io_freefair_war_overlay - Note: The "excludes" property is only for files in the war dependency. - If a jar is excluded from the war, it could be brought back into the final war as a dependency - of non-war dependencies. Those should be excluded via normal gradle dependency exclusions. - */ - cas { - from "org.apereo.cas:cas-server-webapp${project.appServer}:${casServerVersion}@war" - provided = false - /* - excludes = ["WEB-INF/lib/somejar-1.0*"] - enableCompilation = true - includes = ["*.xyz"] - targetPath = "sub-path/bar" - skip = false - */ - } - } -} diff --git a/third_party/apereo-cas/overlay/gradle/tasks.gradle b/third_party/apereo-cas/overlay/gradle/tasks.gradle deleted file mode 100644 index 297555b1e..000000000 --- a/third_party/apereo-cas/overlay/gradle/tasks.gradle +++ /dev/null @@ -1,354 +0,0 @@ -import org.apache.ivy.util.url.ApacheURLLister -import org.apache.tools.ant.taskdefs.condition.Os -import org.gradle.internal.logging.text.StyledTextOutputFactory - -import java.nio.file.Files -import java.nio.file.Paths -import java.nio.file.StandardCopyOption - -import static org.gradle.internal.logging.text.StyledTextOutput.Style - -buildscript { - repositories { - if (rootProject.hasProperty("cacheLocation")) { - mavenLocal() - maven { url cacheLocation } - } else { - mavenLocal() - mavenCentral() - jcenter() - maven { - url "https://oss.sonatype.org/content/repositories/snapshots" - mavenContent { snapshotsOnly() } - } - } - } - - dependencies { - classpath "org.apache.ivy:ivy:${project.ivyVersion}" - classpath "org.apereo.cas:cas-server-core-api-configuration-model:${project.'cas.version'}" - classpath "org.apereo.cas:cas-server-core-configuration-metadata-repository:${project.'cas.version'}" - } -} - -apply plugin: "de.undercouch.download" - -def tomcatDirectory = "${buildDir}/apache-tomcat-${tomcatVersion}" -project.ext."tomcatDirectory" = tomcatDirectory - -def explodedDir = "${buildDir}/cas" -def explodedResourcesDir = "${buildDir}/cas-resources" - -def resourcesJarName = "cas-server-webapp-resources" -def templateViewsJarName = "cas-server-support-thymeleaf" - -task copyCasConfiguration(type: Copy, group: "CAS", description: "Copy the CAS configuration from this project to /etc/cas/config") { - from "etc/cas/config" - into new File('/etc/cas/config').absolutePath - doFirst { - new File('/etc/cas/config').mkdirs() - } -} - -task explodeWarOnly(type: Copy, group: "CAS", description: "Explodes the CAS web application archive") { - dependsOn 'build' - from zipTree("build/libs/${casWebApplicationBinaryName}") - into explodedDir - doLast { - println "Exploded WAR into ${explodedDir}" - } -} - -task explodeWar(type: Copy, group: "CAS", description: "Explodes the CAS archive and resources jar from the CAS web application archive") { - dependsOn explodeWarOnly - from zipTree("${explodedDir}/WEB-INF/lib/${templateViewsJarName}-${casServerVersion}.jar") - into explodedResourcesDir - - from zipTree("${explodedDir}/WEB-INF/lib/${resourcesJarName}-${casServerVersion}.jar") - into explodedResourcesDir - - doLast { - println "Exploded WAR resources into ${explodedResourcesDir}" - } -} - -task run(group: "build", description: "Run the CAS web application in embedded container mode") { - dependsOn 'build' - doLast { - def casRunArgs = Arrays.asList("-server -noverify -Xmx2048M -XX:+TieredCompilation -XX:TieredStopAtLevel=1".split(" ")) - javaexec { - main = "-jar" - jvmArgs = casRunArgs - args = ["build/libs/${casWebApplicationBinaryName}"] - systemProperties = System.properties - logger.info "Started ${commandLine}" - } - } -} - -task setExecutable(group: "CAS", description: "Configure the project to run in executable mode") { - doFirst { - project.setProperty("executable", "true") - logger.info "Configuring the project as executable" - } -} - -task executable(type: Exec, group: "CAS", description: "Run the CAS web application in standalone executable mode") { - dependsOn setExecutable, 'build' - doFirst { - workingDir "." - if (!Os.isFamily(Os.FAMILY_WINDOWS)) { - commandLine "chmod", "+x", bootWar.archivePath - } - logger.info "Running ${bootWar.archivePath}" - commandLine bootWar.archivePath - } -} - -task debug(group: "CAS", description: "Debug the CAS web application in embedded mode on port 5005") { - dependsOn 'build' - doLast { - logger.info "Debugging process is started in a suspended state, listening on port 5005." - def casArgs = Arrays.asList("-Xmx2048M".split(" ")) - javaexec { - main = "-jar" - jvmArgs = casArgs - debug = true - args = ["build/libs/${casWebApplicationBinaryName}"] - systemProperties = System.properties - logger.info "Started ${commandLine}" - } - } -} - -task downloadShell(group: "Shell", description: "Download CAS shell jar from snapshot or release maven repo") { - doFirst { - mkdir "${project.shellDir}" - } - doLast { - def downloadFile - if (isRunningCasServerSnapshot(casServerVersion)) { - def snapshotDir = "https://oss.sonatype.org/content/repositories/snapshots/org/apereo/cas/cas-server-support-shell/${casServerVersion}/" - def files = new ApacheURLLister().listFiles(new URL(snapshotDir)) - files = files.sort { it.path } - files.each { - if (it.path.endsWith(".jar")) { - downloadFile = it - } - } - } else { - downloadFile = "https://repo1.maven.org/maven2/org/apereo/cas/cas-server-support-shell/${casServerVersion}/cas-server-support-shell-${casServerVersion}.jar" - } - logger.info "Downloading file: ${downloadFile}" - download { - src downloadFile - dest new File("${project.shellDir}", "cas-server-support-shell-${casServerVersion}.jar") - overwrite false - } - } -} - -task runShell(group: "Shell", description: "Run the CAS shell") { - dependsOn downloadShell - doLast { - println "Run the following command to launch the shell:\n\tjava -jar ${project.shellDir}/cas-server-support-shell-${casServerVersion}.jar" - } -} - -task debugShell(group: "Shell", description: "Run the CAS shell with debug options, wait for debugger on port 5005") { - dependsOn downloadShell - doLast { - println """ - Run the following command to launch the shell:\n\t - java -Xrunjdwp:transport=dt_socket,address=5000,server=y,suspend=y -jar ${project.shellDir}/cas-server-support-shell-${casServerVersion}.jar - """ - } -} - -task showConfiguration(group: "CAS", description: "Show configurations for each dependency, etc") { - doLast() { - def cfg = project.hasProperty("configuration") ? project.property("configuration") : "compile" - configurations.getByName(cfg).each { println it } - } -} - -task allDependenciesInsight(group: "build", type: DependencyInsightReportTask, description: "Produce insight information for all dependencies") {} - -task allDependencies(group: "build", type: DependencyReportTask, description: "Display a graph of all project dependencies") {} - -task casVersion(group: "CAS", description: "Display the current CAS version") { - doFirst { - def verbose = project.hasProperty("verbose") && Boolean.valueOf(project.getProperty("verbose")) - if (verbose) { - def out = services.get(StyledTextOutputFactory).create("CAS") - println "******************************************************************" - out.withStyle(Style.Info).println "Apereo CAS $casServerVersion" - out.withStyle(Style.Description).println "Enterprise Single SignOn for all earthlings and beyond" - out.withStyle(Style.SuccessHeader).println "- GitHub: " - out.withStyle(Style.Success).println "https://github.com/apereo/cas" - out.withStyle(Style.SuccessHeader).println "- Docs: " - out.withStyle(Style.Success).println "https://apereo.github.io/cas" - out.withStyle(Style.SuccessHeader).println "- Blog: " - out.withStyle(Style.Success).println "https://apereo.github.io" - println "******************************************************************" - } else { - println casServerVersion - } - } -} - -task createKeystore(group: "CAS", description: "Create CAS keystore") { - doFirst { - mkdir "/etc/cas" - - def keystorePath = "/etc/cas/thekeystore" - - def dn = "CN=cas.example.org,OU=Example,OU=Org,C=US" - if (project.hasProperty("certificateDn")) { - dn = project.getProperty("certificateDn") - } - def subjectAltName = "dns:example.org,dns:localhost,ip:127.0.0.1" - if (project.hasProperty("certificateSubAltName")) { - subjectAltName = project.getProperty("certificateSubAltName") - } - // this will fail if thekeystore exists and has cert with cas alias already (so delete if you want to recreate) - logger.info "Generating keystore for CAS with DN ${dn}" - exec { - workingDir "." - commandLine "keytool", "-genkeypair", "-alias", "cas", - "-keyalg", "RSA", - "-keypass", "changeit", "-storepass", "changeit", - "-keystore", keystorePath, - "-dname", dn, "-ext", "SAN=${subjectAltName}" - } - logger.info "Exporting cert from keystore..." - exec { - workingDir "." - commandLine "keytool", "-exportcert", "-alias", "cas", - "-storepass", "changeit", "-keystore", keystorePath, - "-file", "/etc/cas/cas.cer" - } - logger.info "Import /etc/cas/cas.cer into your Java truststore (JAVA_HOME/lib/security/cacerts)" - } -} - -task listTemplateViews(group: "CAS", description: "List all CAS views") { - dependsOn explodeWar - - doFirst { - fileTree(explodedResourcesDir).matching { - include "**/*.html" - } - .collect { - return it.path.replace(explodedResourcesDir, "") - } - .toSorted() - .each { println it } - } -} - -task exportConfigMetadata(group: "CAS", description: "Export collection of CAS properties") { - doLast { - def file = new File(project.rootDir, 'config-metadata.properties') - file.withWriter('utf-8') { writer -> - def metadataRepository = new org.apereo.cas.metadata.CasConfigurationMetadataRepository() - def repository = metadataRepository.repository; - repository.allGroups - .values() - .sort { o1, o2 -> o1.id <=> o2.id } - .each({ group -> - def groupProperties = group.properties - if (!groupProperties.isEmpty()) { - def groupId = group.id.equalsIgnoreCase("_ROOT_GROUP_") ? "" : group.id + "." - - writer.writeLine("# Group ${group.id}"); - writer.writeLine("# ====================") - groupProperties - .values() - .sort { o1, o2 -> o1.id <=> o2.id } - .each({ property -> - def description = property.shortDescription - if (!property.shortDescription?.equalsIgnoreCase(property.description) && property.description != null) { - description = property.description.replace('\n', '#') - } - writer.writeLine("# ${description}"); - writer.writeLine("# Type: ${property.type}"); - if (property.deprecated) { - def deprecation = property.deprecation - writer.writeLine("# This setting is deprecated with a severity level of ${deprecation.level}.") - if (deprecation.shortReason != null) { - writer.writeLine("# because ${deprecation.shortReason}") - } - if (deprecation.replacement != null) { - writer.writeLine("# Replace with: ${deprecation.replacement}") - } - } - property.hints.valueHints.each { - if (it.value instanceof Object[]) { - if (it.value[0].toString().contains("RequiresModule")) { - writer.writeLine("# Required module: org.apereo.cas:${it.description}") - writer.writeLine("# Automatically included/available: ${it.value[1]}") - } - } - if (it.value.toString().contains("RequiredProperty")) { - writer.writeLine("# Note: This setting is required!") - } - } - writer.writeLine("${groupId}${property.name}=${property.defaultValue}") - writer.writeLine("") - }); - } - }); - } - println "Configuration metadata is available at ${file.absolutePath}" - } -} - -task getResource(group: "CAS", description: "Fetch a CAS resource and move it into the overlay") { - dependsOn explodeWar - - doFirst { - def resourceName = project.getProperty("resourceName") - - def results = fileTree(explodedResourcesDir).matching { - include "**/${resourceName}.*" - include "**/${resourceName}" - } - if (results.isEmpty()) { - println "No resources could be found matching ${resourceName}" - return - } - if (results.size() > 1) { - println "Multiple resources found matching ${resourceName}:\n" - results.each { - println "\t-" + it.path.replace(explodedResourcesDir, "") - } - println "\nNarrow down your search criteria and try again." - return - } - - def fromFile = explodedResourcesDir - def resourcesDir = "src/main/resources" - mkdir resourcesDir - - def resourceFile = results[0].canonicalPath - def toResourceFile = resourceFile.replace(fromFile, resourcesDir) - - def parent = file(toResourceFile).getParent() - mkdir parent - - Files.copy(Paths.get(resourceFile), Paths.get(toResourceFile), StandardCopyOption.REPLACE_EXISTING) - println "Copied file ${resourceFile} to ${toResourceFile}" - } -} - -def isRunningCasServerSnapshot(casServerVersion) { - return "${casServerVersion}".contains("-SNAPSHOT") -} - -task verifyRequiredJavaVersion { - logger.info "Checking current Java version ${JavaVersion.current()} for required Java version ${project.targetCompatibility}" - if (!JavaVersion.current().name.equalsIgnoreCase("${project.targetCompatibility}")) { - throw new GradleException("Current Java version ${JavaVersion.current()} does not match required Java version ${project.targetCompatibility}") - } -} diff --git a/third_party/apereo-cas/overlay/gradle/wrapper/gradle-wrapper.jar b/third_party/apereo-cas/overlay/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 62d4c053550b91381bbd28b1afc82d634bf73a8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58910 zcmWIWW@h1HVBp|jU|?`$00AZt!N9=4$-uzi>l)&y>*?pF&&+_TFn6P!tpfuCgFOQS zg9x%hUq?SrH`m}0JzuxazGqJRccpwh-0K5rCf zo|1Hb%=t$|+Du{N1LhwZM>Yy`a>SMx7Rwi(ySnrHx%2V&>lrG#_A-3lvAJV6oOj?DLgEJ0!Cg-|K0&O+BBYpS(=)dFPpPORuKd_*UgD z;BNdd)$o*D`X&vL!^aEreh1z^WfFW*UE5tbb+LHmJFepoLb5KGUb0HvKEFi6L9J8D zvT@r^(OirH6GsV{CR=xkSuN!5P z*mpC%)i&1)_`mo|?t3TIIR|dt_npdnQAl?~`O#fD51Y+0ZA5=W8Ev*SzV_|Si&vYK zg+H`k+Q?A8^VY5$-i$+!>mPmkvGZAlg}mGK7p_~H%If}0ADRBj^1SU6nbzijc%4LTi$TAfWBoje(Y z^|yv?2y9(gCffOV|}v4_}&f{c`QC??C8tJd7;jH^*`sPvO`=*(hY@Tt>YFnPzaoeuErTQ<}+FEAL&A0b9Ff#y{I89bdmlwRG*tfF9jKuFT(G(^y2|qLKI1%Eb$sthwHGB{QrRx+YT7vd) zFAI^)KE69A7;N=Qgz9=E%e!z?_G5ZU(?u-tb4|H;(eD*g&E6_&3mOszvw2=B_wm+x1SLn{v^*0U$ z{I$LG7SFETs)aPN3z83R4jq_9JEt%BslgoM+2J4&aY~yRLaEh$iKI`nv zC{G=mk8{1Yy>XXWz+b`e=sdgHG`YF!FGtUs*E6s2A@7Fxmz#KBKmS*+rE>J5v^FZOr+c89jzbpF4fTzFs1jraeV8|UPk{N^~w>rtPlG(|bc{apD9 zuANYa08{TsMQav*7QCrJ|mJXLPznwEA?=73}^5yNytB=wb{d`ebBfRlWLB)Hv zZ!48UzpPDeko)`kh4jrM|L(9o3YD25`Byr2asS`_4pLubYfs4SS}K~^At(`GF*jtT z#?`C|4$C>e88T@(^-aE`u&a(t^d(#{EWbVwTl=S7%nj|Feo!XYJ6yI4y&SF^2_sb@)J{Fb!=^qFV`Uhf!6yO zrdzej^qaV^v+ZrNf8Z2T(R8EjhR~!*A=T#MatE9{H6LA*e8$Va?|a<)pq>Mu>xw=lQUm)FYep4@75ee#WQPyV=O0TpOjW#(kVICa z$v-qNDl9i#Zq35LaDyGv`T{j-aCy-sH7&6;rv&EZfTH~LqSWGIpUmQt)V$OpNCmSr z^lq?psL21jIcD6a*@8SYrfh52X3FBVDs0P=wYiNM85&aq1lC$je`1!i`^}>?=D*Uv z9t6k#TIBB+U-PnumO9SQ>`iCvXGs8a%cJZozMT& zJx|V;`}6suEyMW-y26Ef0{X?~Oh^jo>hXM(BI`HPqE}pc!U4&Zmf4SF+N2D61eqh5 z^=EcGdU|4}h+HmFBiR^S{u0X$y+aln5VnS4~lnh3tyWvN3bq%2P5-o z!GE5&w>Dqqc|Li!K!whUd75n>CWI@k^R2usD!%IT=0o$JZ05_H^*L^$b?}|-Pm6se z`JTPua(=#H$D!4J8-i2Vw4YzHdh)@`b;9A5cPnIn^=E|4a#@+C&0@16tnJy3Xff5c zX(|7-;-6%Ov%K^c-g)N5iZdr4ESOI5AKv#EtP~`T7XE*p~%4*eCEqcZF zZO;t@uOpJo>mw^yISGc#1YrBS#Z8T5%)l5r?ne8t`neLaJHmT^ov$E@>_LZM0d8;4a zVl3*)7w@r9YcD&JdD|)~0zdJ67OT1aN z|EJ!!C3Y>}B+rC|XIHRVot(X0Ks9xRG(*8OI!zlZ$-e)~r(bwO`}j?BDZc7ykkri$op$1f91mz3>&6(j$)G~;6g_sW-l zR|VDuES}RlbLF{rqF0Xlq~|&Kzt~>TGNV=aSG9$LrTUl987|gkKlG%WX85U=ta_Ad z!ux8zg4N}9>lb|dC(CN*z_K<<%6~!Mlk*{0;#U~%e~0^Xdp)(7 zn62_D(g9(AcH=roLqSCRnBqKGiBr`d&Bp+HBO%0Cq7j_h}-K?7v8?|Qj zHlhhU>x_`reDY*y>eK{+ix@WUU&H~L{ z{MN?b=M}%(S!}$&uHKsEgMh!RPr@}vsm*53f@YK#NONoIEZdN>tz1Uu@w#Rf8)p7rG_Sr*(VB`3({Z)Hk?9{Plldcahh5oDg?cgyuIjQ%m ziSPG`nxAeQ6K;F-KUU58-IW_NkDNKNOmdT<;gi6__up*YdLwm)L2=-u3A>JOcoWL5 z5XBm}IL1OgsltrqNB@;KHzj6X*mUVhmanFt+N8L|-G?T~2PN%JQnRsL#yiBOZ(H$|Y2BfNyv(PUp;v-al;5AZ$j`uFrNF?Th(D=8D!H|h zoE6f?OY8a>HhLFSa!k^2+@uqse)RIB(n*_=CN5I(*yA!`ieluX=?5mYup~V^>eMcL zd!q2o!la)abG%X%9hScJKU?5yqvi0mXa`J%t9 zTk9SyJ^JN)T$IcI2TP~Flt21~-}SS<*5A$3Rcb)`+r5bIv%XW}gqw`xQD z)6}?EkEC*1rmwD=e`fNuiC(40 zgSIicsmXh!pMUFj`?1@hKG%}lEF05Sd{4-~|L~sh;aKK{3Gw*Sk3m;6>Q{&s!@v3v>uKES}_Z`AD zN){E{r|fn)k`S97pPwK8T)||H1kbmUue`kTUT~I`vpdJmxG8+-(bug${~Fibt@bi9 zsC@M7#*7=sKjmGP%9h>yCF4$pZSu>LOA@!1o%W1am2hXZzl2ZRmo{E)QDb4BttT!2 zW$39s4|~^~a{gR|Qri2ZS1aZpZ`yfpw)ahgGf&=`EH>D*%zBzZ)n#GjHq#aTM|dCB z8!tNEUaGBjjPGJ@|8apQqMv8-2%oLg{T;dOciQ&C=p#No$Btc^W@x>8$?e#$O)Irh zUQZ0Rt-5rxSE}@ilHse(MZ#@&txN<;wj4QgZSTe%il!P>CR#quS)!YjSQopU>Qj}8 zy?QizB13GtvRjZ(Qem!NxR|`_4^KwWq^?OU!7>Jwszz zBjx2h)dpsXGcv97ZGOZ^7+-yAeq;K!$(hoL246URrXO99R#;~?Lt{=z(61GSDM!

F*SiWTmgptEPVdg~<2Eeqh-;tM<(ig$ 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ℜA_D?n* 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 g#0TLejW \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/third_party/apereo-cas/overlay/gradlew.bat b/third_party/apereo-cas/overlay/gradlew.bat deleted file mode 100644 index 5093609d5..000000000 --- a/third_party/apereo-cas/overlay/gradlew.bat +++ /dev/null @@ -1,104 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/third_party/apereo-cas/overlay/lombok.config b/third_party/apereo-cas/overlay/lombok.config deleted file mode 100644 index 6aa51d71e..000000000 --- a/third_party/apereo-cas/overlay/lombok.config +++ /dev/null @@ -1,2 +0,0 @@ -# This file is generated by the 'io.freefair.lombok' Gradle plugin -config.stopBubbling = true diff --git a/third_party/apereo-cas/overlay/settings.gradle b/third_party/apereo-cas/overlay/settings.gradle deleted file mode 100644 index 3ad50900e..000000000 --- a/third_party/apereo-cas/overlay/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name='cas' \ No newline at end of file diff --git a/third_party/apereo-cas/overlay/src/main/jib/docker/entrypoint.sh b/third_party/apereo-cas/overlay/src/main/jib/docker/entrypoint.sh deleted file mode 100755 index a3a0895b0..000000000 --- a/third_party/apereo-cas/overlay/src/main/jib/docker/entrypoint.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -#echo -e "\nChecking java..." -#java -version - -#echo -e "\nCreating CAS configuration directories..." -mkdir -p /etc/cas/config -mkdir -p /etc/cas/services - -#echo "Listing provided CAS docker artifacts..." -#ls -R docker/cas - -#echo -e "\nMoving CAS configuration artifacts..." -mv docker/cas/thekeystore /etc/cas 2>/dev/null -mv docker/cas/config/*.* /etc/cas/config 2>/dev/null -mv docker/cas/services/*.* /etc/cas/services 2>/dev/null - -#echo -e "\nListing CAS configuration under /etc/cas..." -#ls -R /etc/cas - -echo -e "\nRunning CAS..." -exec java -Xms512m -Xmx2048M -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -jar docker/cas/war/cas.war diff --git a/third_party/apereo-cas/overlay/src/main/webapp/WEB-INF/web.xml b/third_party/apereo-cas/overlay/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 072a6a0fd..000000000 --- a/third_party/apereo-cas/overlay/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - \ No newline at end of file diff --git a/third_party/overlays/tvl.nix b/third_party/overlays/tvl.nix index da504320d..2b7cf0e9e 100644 --- a/third_party/overlays/tvl.nix +++ b/third_party/overlays/tvl.nix @@ -7,16 +7,6 @@ self: super: { # random ecosystem breakage with the newer versions. nix = super.nix_2_3; - # Required for apereo-cas - # TODO(lukegb): Document why? - gradle_6 = self.callPackage (super.gradleGen { - version = "6.5.1"; - nativeVersion = "0.22-milestone-3"; - sha256 = "0jmmipjh4fbsn92zpifa5cqg5ws2a4ha0s4jzqhrg4zs542x79sh"; - }) { - java = self.jdk11; - }; - clang-tools_11 = self.clang-tools.override { llvmPackages = self.llvmPackages_11; };