From 7a09045e82c8fe311d12bc832f9e2c453b4e7d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20Gourv=C3=A9nec?= Date: Thu, 27 Feb 2025 16:01:54 +0100 Subject: [PATCH 1/3] feat(hydra-cleaner): add component --- .../hydra-cleaner/files/hydra-cleaner.sh | 116 ++++++++++++++++++ components/hydra-cleaner/kustomization.yaml | 17 +++ .../resources/hydra-cleaner-cronjob.yaml | 54 ++++++++ 3 files changed, 187 insertions(+) create mode 100644 components/hydra-cleaner/files/hydra-cleaner.sh create mode 100644 components/hydra-cleaner/kustomization.yaml create mode 100644 components/hydra-cleaner/resources/hydra-cleaner-cronjob.yaml diff --git a/components/hydra-cleaner/files/hydra-cleaner.sh b/components/hydra-cleaner/files/hydra-cleaner.sh new file mode 100644 index 0000000..dadfad3 --- /dev/null +++ b/components/hydra-cleaner/files/hydra-cleaner.sh @@ -0,0 +1,116 @@ +#!/bin/sh + +set -e +set -o nounset + +# 4 tables to empty, at least +# oidc, code, flow, authentication_session + +# \d hydra_oauth2_flow +#Referenced by: +# TABLE "hydra_oauth2_access" CONSTRAINT "hydra_oauth2_access_challenge_id_fk" FOREIGN KEY (challenge_id) REFERENCES hydra_oauth2_flow(consent_challenge_id) ON DELETE CASCADE +# TABLE "hydra_oauth2_code" CONSTRAINT "hydra_oauth2_code_challenge_id_fk" FOREIGN KEY (challenge_id) REFERENCES hydra_oauth2_flow(consent_challenge_id) ON DELETE CASCADE +# TABLE "hydra_oauth2_oidc" CONSTRAINT "hydra_oauth2_oidc_challenge_id_fk" FOREIGN KEY (challenge_id) REFERENCES hydra_oauth2_flow(consent_challenge_id) ON DELETE CASCADE +# TABLE "hydra_oauth2_pkce" CONSTRAINT "hydra_oauth2_pkce_challenge_id_fk" FOREIGN KEY (challenge_id) REFERENCES hydra_oauth2_flow(consent_challenge_id) ON DELETE CASCADE +# TABLE "hydra_oauth2_refresh" CONSTRAINT "hydra_oauth2_refresh_challenge_id_fk" FOREIGN KEY (challenge_id) REFERENCES hydra_oauth2_flow(consent_challenge_id) ON DELETE CASCADE + +# -> delete "cascade" on table "flow" cleans access, code, oidc, pkce and refresh tables. + + +DSN="postgresql://${HYDRA_DATABASE_USER}:${HYDRA_DATABASE_PASSWORD}@${HYDRA_DATABASE_SERVICE_NAME}:5432/hydra?sslmode=disable" +RETENTION_HOURS="${RETENTION_HOURS:-48}" +BATCH_SIZE="${BATCH_SIZE:-50}" +LIMIT="${LIMIT:-1000}" +BEFORE_DATE="$(date +'%Y-%m-%d %H:%M:%S' --date=@$(($(date +%s) - RETENTION_HOURS * 3600)))" + + +log() { + echo "$(date +'%d-%m-%y %H:%M:%S%z')| $1" +} + +perror() { + log "Something went wrong, exiting." + trap - EXIT + exit 1 +} + +trap perror EXIT + +if ! [[ ${RETENTION_HOURS} =~ '^[0-9]+$' ]]; then + log "Error: variable RETENTION_HOURS is not a positive integer." + perror +fi + +if ! [[ ${LIMIT} =~ '^[0-9]+$' ]]; then + log "Error: variable LIMIT is not a positive integer." + perror +fi + +if ! [[ ${BATCH_SIZE} =~ '^[0-9]+$' ]]; then + log "Error: variable BATCH_SIZE is not a positive integer." + perror +fi + +log "Starting hydra cleaner" + +log "Removing up to ${LIMIT} elements before ${BEFORE_DATE} by batch of ${BATCH_SIZE}" + +log "Beginning estimated size:" +psql "${DSN}" < Date: Wed, 5 Mar 2025 17:12:42 +0100 Subject: [PATCH 2/3] feat: integrate hydra-cleaner in example app --- examples/authenticated-app/kustomization.yaml | 11 +++++++++++ .../authenticated-app/patches/hydra-cleaner-env.yaml | 9 +++++++++ examples/authenticated-app/patches/hydra-cleaner.yaml | 3 +++ 3 files changed, 23 insertions(+) create mode 100644 examples/authenticated-app/patches/hydra-cleaner-env.yaml create mode 100644 examples/authenticated-app/patches/hydra-cleaner.yaml diff --git a/examples/authenticated-app/kustomization.yaml b/examples/authenticated-app/kustomization.yaml index c2e4685..ba58311 100644 --- a/examples/authenticated-app/kustomization.yaml +++ b/examples/authenticated-app/kustomization.yaml @@ -14,6 +14,7 @@ components: - ../../components/hydra-ldap - ../../components/oidc-test - ../../components/redis + - ../../components/hydra-cleaner patchesJson6902: - target: @@ -51,6 +52,16 @@ patchesJson6902: kind: OAuth2Client name: oidc-test-oauth2-client path: patches/oidc-test-oauth2-client.yaml + - target: + version: v1 + kind: ConfigMap + name: hydra-cleaner-env + path: patches/hydra-cleaner-env.yaml + - target: + version: v1 + kind: CronJob + name: hydra-cleaner + path: patches/hydra-cleaner.yaml configMapGenerator: - name: hydra-dispatcher-apps diff --git a/examples/authenticated-app/patches/hydra-cleaner-env.yaml b/examples/authenticated-app/patches/hydra-cleaner-env.yaml new file mode 100644 index 0000000..35e9707 --- /dev/null +++ b/examples/authenticated-app/patches/hydra-cleaner-env.yaml @@ -0,0 +1,9 @@ +- op: replace + path: "/data/RETENTION_HOURS" + value: "1" # 1 HOUR +- op: replace + path: "/data/BATCH_SIZE" + value: "100" +- op: replace + path: "/data/LIMIT" + value: "1000" diff --git a/examples/authenticated-app/patches/hydra-cleaner.yaml b/examples/authenticated-app/patches/hydra-cleaner.yaml new file mode 100644 index 0000000..3b58dd1 --- /dev/null +++ b/examples/authenticated-app/patches/hydra-cleaner.yaml @@ -0,0 +1,3 @@ +- op: replace + path: "/spec/schedule" + value: "* * * * *" From fedf44a0627c797c99737382edc283f686e3506c Mon Sep 17 00:00:00 2001 From: William Petit Date: Thu, 6 Mar 2025 10:07:40 +0100 Subject: [PATCH 3/3] feat(hydra-cleaner): configurable dsn and hydra port --- components/hydra-cleaner/files/hydra-cleaner.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/hydra-cleaner/files/hydra-cleaner.sh b/components/hydra-cleaner/files/hydra-cleaner.sh index dadfad3..da52fe7 100644 --- a/components/hydra-cleaner/files/hydra-cleaner.sh +++ b/components/hydra-cleaner/files/hydra-cleaner.sh @@ -17,7 +17,7 @@ set -o nounset # -> delete "cascade" on table "flow" cleans access, code, oidc, pkce and refresh tables. -DSN="postgresql://${HYDRA_DATABASE_USER}:${HYDRA_DATABASE_PASSWORD}@${HYDRA_DATABASE_SERVICE_NAME}:5432/hydra?sslmode=disable" +DSN="${DSN:-postgresql://${HYDRA_DATABASE_USER}:${HYDRA_DATABASE_PASSWORD}@${HYDRA_DATABASE_SERVICE_NAME}:${HYDRA_DATABASE_SERVICE_PORT:-5432}/hydra?sslmode=disable}" RETENTION_HOURS="${RETENTION_HOURS:-48}" BATCH_SIZE="${BATCH_SIZE:-50}" LIMIT="${LIMIT:-1000}"