git.iko.soy/typeable/nixpkgs
on master help sign in
Merge pull request #140406 from mkg20001/mvn
commit511e56d76cf528afcbff2e5c7930a791e5484eee authorMaciej Krüger <mkg20001@gmail.com> dateFri 25 Mar 2022, 15:08 (5 years ago) parentd6e2e396f56362
10 files changed+207−16
nixos/modules/services/web-apps/keycloak.nix+19−1 nixos/tests/keycloak.nix+19−3 pkgs/applications/misc/dbeaver/default.nix+7−10 pkgs/development/java-modules/maven-fod.nix+56 pkgs/servers/keycloak/all-plugins.nix+7 pkgs/servers/keycloak/default.nix+5−1 pkgs/servers/keycloak/keycloak-discord/default.nix+29 pkgs/servers/keycloak/keycloak-metrics-spi/default.nix+26 pkgs/servers/keycloak/scim-for-keycloak/default.nix+36 pkgs/top-level/java-packages.nix+3−1
nixos/modules/services/web-apps/keycloak.nix+19−1
@@ -129,6 +129,14 @@ in
129129 '';
130130 };
131131
132+ plugins = lib.mkOption {
133+ type = lib.types.listOf lib.types.path;
134+ default = [];
135+ description = ''
136+ Keycloak plugin jar, ear files or derivations with them
137+ '';
138+ };
139+
132140 database = {
133141 type = mkOption {
134142 type = enum [ "mysql" "postgresql" ];
@@ -787,6 +795,14 @@ in
787795
788796 umask u=rwx,g=,o=
789797
798+ install_plugin() {
799+ if [ -d "$1" ]; then
800+ find "$1" -type f \( -iname \*.ear -o -iname \*.jar \) -exec install -m 0500 -o keycloak -g keycloak "{}" "/run/keycloak/deployments/" \;
801+ else
802+ install -m 0500 -o keycloak -g keycloak "$1" "/run/keycloak/deployments/"
803+ fi
804+ }
805+
790806 install -m 0600 ${cfg.package}/standalone/configuration/*.properties /run/keycloak/configuration
791807 install -T -m 0600 ${keycloakConfig} /run/keycloak/configuration/standalone.xml
792808
@@ -794,7 +810,9 @@ in
794810
795811 export JAVA_OPTS=-Djboss.server.config.user.dir=/run/keycloak/configuration
796812 add-user-keycloak.sh -u admin -p '${cfg.initialAdminPassword}'
797− '' + optionalString (cfg.sslCertificate != null && cfg.sslCertificateKey != null) ''
813+ ''
814+ + lib.optionalString (cfg.plugins != []) (lib.concatStringsSep "\n" (map (pl: "install_plugin ${lib.escapeShellArg pl}") cfg.plugins)) + "\n"
815+ + optionalString (cfg.sslCertificate != null && cfg.sslCertificateKey != null) ''
798816 pushd /run/keycloak/ssl/
799817 cat "$CREDENTIALS_DIRECTORY/ssl_cert" <(echo) \
800818 "$CREDENTIALS_DIRECTORY/ssl_key" <(echo) \
nixos/tests/keycloak.nix+19−3
@@ -16,8 +16,7 @@ let
1616 };
1717
1818 nodes = {
19− keycloak = { ... }: {
20−
19+ keycloak = { config, ... }: {
2120 security.pki.certificateFiles = [
2221 certs.ca.cert
2322 ];
@@ -36,6 +35,10 @@ let
3635 username = "bogus";
3736 passwordFile = pkgs.writeText "dbPassword" "wzf6vOCbPp6cqTH";
3837 };
38+ plugins = with config.services.keycloak.package.plugins; [
39+ keycloak-discord
40+ keycloak-metrics-spi
41+ ];
3942 };
4043
4144 environment.systemPackages = with pkgs; [
@@ -102,8 +105,21 @@ let
102105 ### Realm Setup ###
103106
104107 # Get an admin interface access token
108+ keycloak.succeed("""
109+ curl -sSf -d 'client_id=admin-cli' \
110+ -d 'username=admin' \
111+ -d 'password=${initialAdminPassword}' \
112+ -d 'grant_type=password' \
113+ '${frontendUrl}/realms/master/protocol/openid-connect/token' \
114+ | jq -r '"Authorization: bearer " + .access_token' >admin_auth_header
115+ """)
116+
117+ # Register the metrics SPI
105118 keycloak.succeed(
106− "curl -sSf -d 'client_id=admin-cli' -d 'username=admin' -d 'password=${initialAdminPassword}' -d 'grant_type=password' '${frontendUrl}/realms/master/protocol/openid-connect/token' | jq -r '\"Authorization: bearer \" + .access_token' >admin_auth_header"
119+ "${pkgs.jre}/bin/keytool -import -alias snakeoil -file ${certs.ca.cert} -storepass aaaaaa -keystore cacert.jks -noprompt",
120+ "KC_OPTS='-Djavax.net.ssl.trustStore=cacert.jks -Djavax.net.ssl.trustStorePassword=aaaaaa' ${pkgs.keycloak}/bin/kcadm.sh config credentials --server '${frontendUrl}' --realm master --user admin --password '${initialAdminPassword}'",
121+ "KC_OPTS='-Djavax.net.ssl.trustStore=cacert.jks -Djavax.net.ssl.trustStorePassword=aaaaaa' ${pkgs.keycloak}/bin/kcadm.sh update events/config -s 'eventsEnabled=true' -s 'adminEventsEnabled=true' -s 'eventsListeners+=metrics-listener'",
122+ "curl -sSf '${frontendUrl}/realms/master/metrics' | grep '^keycloak_admin_event_UPDATE'"
107123 )
108124
109125 # Publish the realm, including a test OIDC client and user
pkgs/applications/misc/dbeaver/default.nix+7−10
@@ -16,9 +16,10 @@
1616, maven
1717, webkitgtk
1818, glib-networking
19+, javaPackages
1920}:
2021
21−stdenv.mkDerivation rec {
22+javaPackages.mavenfod rec {
2223 pname = "dbeaver";
2324 version = "22.0.1"; # When updating also update fetchedMavenDeps.sha256
2425
@@ -29,6 +30,10 @@ stdenv.mkDerivation rec {
2930 sha256 = "sha256-IG5YWwq3WVzQBvAslQ9Z2Ou6ADzf4n9NkQCtH4Jgkac=";
3031 };
3132
33+
34+ mvnSha256 = "7Sm1hAoi5xc4MLONOD8ySLLkpao0qmlMRRva/8zR210=";
35+ mvnParameters = "-P desktop,all-platforms";
36+
3237 fetchedMavenDeps = stdenv.mkDerivation {
3338 name = "dbeaver-${version}-maven-deps";
3439 inherit src;
@@ -37,7 +42,7 @@ stdenv.mkDerivation rec {
3742 maven
3843 ];
3944
40− buildPhase = "mvn package -Dmaven.repo.local=$out/.m2 -P desktop,all-platforms";
45+ buildPhase = "mvn package -Dmaven.repo.local=$out/.m2 ${mvnParameters}";
4146
4247 # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside
4348 installPhase = ''
@@ -88,14 +93,6 @@ stdenv.mkDerivation rec {
8893 })
8994 ];
9095
91− buildPhase = ''
92− runHook preBuild
93−
94− mvn package --offline -Dmaven.repo.local=$(cp -dpR ${fetchedMavenDeps}/.m2 ./ && chmod +w -R .m2 && pwd)/.m2 -P desktop,all-platforms
95−
96− runHook postBuild
97− '';
98−
9996 installPhase =
10097 let
10198 productTargetPath = "product/community/target/products/org.jkiss.dbeaver.core.product";
pkgs/development/java-modules/maven-fod.nixnew file+56
@@ -0,0 +1,56 @@
1+{ lib
2+, stdenv
3+, maven
4+}:
5+
6+{ src
7+, patches ? []
8+, pname
9+, version
10+, mvnSha256 ? "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
11+, mvnHash ? "sha256-${mvnSha256}"
12+, mvnFetchExtraArgs ? {}
13+, mvnParameters ? ""
14+, ...
15+} @args:
16+
17+# originally extracted from dbeaver
18+# created to allow using maven packages in the same style as rust
19+
20+stdenv.mkDerivation (rec {
21+ fetchedMavenDeps = stdenv.mkDerivation ({
22+ name = "${pname}-${version}-maven-deps";
23+ inherit src;
24+
25+ buildInputs = [
26+ maven
27+ ];
28+
29+ buildPhase = ''
30+ mvn package -Dmaven.repo.local=$out/.m2 ${mvnParameters}
31+ '';
32+
33+ # keep only *.{pom,jar,sha1,nbm} and delete all ephemeral files with lastModified timestamps inside
34+ installPhase = ''
35+ find $out -type f \
36+ -name \*.lastUpdated -or \
37+ -name resolver-status.properties -or \
38+ -name _remote.repositories \
39+ -delete
40+ '';
41+
42+ # don't do any fixup
43+ dontFixup = true;
44+ outputHashMode = "recursive";
45+ outputHash = mvnHash;
46+ } // mvnFetchExtraArgs);
47+
48+ buildPhase = ''
49+ runHook preBuild
50+
51+ mvnDeps=$(cp -dpR ${fetchedMavenDeps}/.m2 ./ && chmod +w -R .m2 && pwd)
52+ mvn package --offline "-Dmaven.repo.local=$mvnDeps/.m2" -P desktop,all-platforms
53+
54+ runHook postBuild
55+ '';
56+} // args)
pkgs/servers/keycloak/all-plugins.nixnew file+7
@@ -0,0 +1,7 @@
1+{ callPackage }:
2+
3+{
4+ scim-for-keycloak = callPackage ./scim-for-keycloak {};
5+ keycloak-discord = callPackage ./keycloak-discord {};
6+ keycloak-metrics-spi = callPackage ./keycloak-metrics-spi {};
7+}
pkgs/servers/keycloak/default.nix+5−1
@@ -1,5 +1,6 @@
11{ stdenv, lib, fetchzip, makeWrapper, jre, writeText, nixosTests
22, postgresql_jdbc ? null, mysql_jdbc ? null
3+, callPackage
34}:
45
56let
@@ -57,7 +58,10 @@ stdenv.mkDerivation rec {
5758 wrapProgram $out/bin/kcreg.sh --prefix PATH : ${jre}/bin
5859 '';
5960
60− passthru.tests = nixosTests.keycloak;
61+ passthru = {
62+ tests = nixosTests.keycloak;
63+ plugins = callPackage ./all-plugins.nix {};
64+ };
6165
6266 meta = with lib; {
6367 homepage = "https://www.keycloak.org/";
pkgs/servers/keycloak/keycloak-discord/default.nixnew file+29
@@ -0,0 +1,29 @@
1+{ stdenv
2+, lib
3+, fetchurl
4+}:
5+
6+stdenv.mkDerivation rec {
7+ pname = "keycloak-discord";
8+ version = "0.3.1";
9+
10+ src = fetchurl {
11+ url = "https://github.com/wadahiro/keycloak-discord/releases/download/v${version}/keycloak-discord-ear-${version}.ear";
12+ sha256 = "0fswhbnxc80dpfqf5y6j29dxk3vcnm4kki6qdk22qliasvpw5n9c";
13+ };
14+
15+ dontUnpack = true;
16+ dontBuild = true;
17+
18+ installPhase = ''
19+ mkdir -p "$out"
20+ install "$src" "$out/${pname}-ear-${version}.ear"
21+ '';
22+
23+ meta = with lib; {
24+ homepage = "https://github.com/wadahiro/keycloak-discord";
25+ description = "Keycloak Social Login extension for Discord";
26+ license = licenses.apsl20;
27+ maintainers = with maintainers; [ mkg20001 ];
28+ };
29+}
pkgs/servers/keycloak/keycloak-metrics-spi/default.nixnew file+26
@@ -0,0 +1,26 @@
1+{ stdenv, lib, fetchurl }:
2+
3+stdenv.mkDerivation rec {
4+ pname = "keycloak-metrics-spi";
5+ version = "2.5.3";
6+
7+ src = fetchurl {
8+ url = "https://github.com/aerogear/keycloak-metrics-spi/releases/download/${version}/keycloak-metrics-spi-${version}.jar";
9+ sha256 = "15lsy8wjw6nlfdfhllc45z9l5474p0lsghrwzzsssvd68bw54gwv";
10+ };
11+
12+ dontUnpack = true;
13+ dontBuild = true;
14+
15+ installPhase = ''
16+ mkdir -p $out
17+ install "$src" "$out"
18+ '';
19+
20+ meta = with lib; {
21+ homepage = "https://github.com/aerogear/keycloak-metrics-spi";
22+ description = "Keycloak Service Provider that adds a metrics endpoint";
23+ license = licenses.apsl20;
24+ maintainers = with maintainers; [ benley ];
25+ };
26+}
pkgs/servers/keycloak/scim-for-keycloak/default.nixnew file+36
@@ -0,0 +1,36 @@
1+{ lib
2+, stdenv
3+, fetchFromGitHub
4+, maven
5+, javaPackages
6+}:
7+
8+javaPackages.mavenfod rec {
9+ pname = "scim-for-keycloak";
10+ version = "kc-15-b2"; # When updating also update mvnHash
11+
12+ src = fetchFromGitHub {
13+ owner = "Captain-P-Goldfish";
14+ repo = "scim-for-keycloak";
15+ rev = version;
16+ sha256 = "K34c7xISjEETI3jFkRLdZ0C8pZHTWtPtrrIzwC76Tv0=";
17+ };
18+
19+ mvnHash = "sha256-kDYhXTEOAWH/dcRJalKtbwBpoxcD1aX9eqcRKs6ewbE=";
20+
21+ nativeBuildInputs = [
22+ maven
23+ ];
24+
25+ installPhase = ''
26+ EAR=$(find -iname "*.ear")
27+ install -D "$EAR" "$out/$(basename $EAR)"
28+ '';
29+
30+ meta = with lib; {
31+ homepage = "https://github.com/Captain-P-Goldfish/scim-for-keycloak";
32+ description = "A third party module that extends Keycloak with SCIM functionality";
33+ license = licenses.bsd3;
34+ maintainers = with maintainers; [ mkg20001 ];
35+ };
36+}
pkgs/top-level/java-packages.nix+3−1
@@ -10,8 +10,10 @@ let
1010 openjfx15 = callPackage ../development/compilers/openjdk/openjfx/15.nix { };
1111 openjfx17 = callPackage ../development/compilers/openjdk/openjfx/17.nix { };
1212
13+ mavenfod = callPackage ../development/java-modules/maven-fod.nix { };
14+
1315in {
14− inherit mavenbuild fetchMaven openjfx11 openjfx15 openjfx17;
16+ inherit mavenbuild mavenfod fetchMaven openjfx11 openjfx15 openjfx17;
1517
1618 compiler = let
1719