#!/bin/bash set -euo pipefail # Get the directory where this script is located SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" USERNAME=$(secret-mgr get-username --key git) KC_PASS=$(secret-mgr get-secret --key keycloak) GITEA_PASS=$(secret-mgr get-secret --key git) if [[ -z "$USERNAME" || -z "$KC_PASS" || -z "$GITEA_PASS" ]]; then echo "[ERROR] Missing required credentials in secret-mgr" >&2 exit 1 fi sql_escape() { printf '%s' "$1" | sed "s/'/''/g" } WORKDIR="/tmp" COOKIES_FILE="$WORKDIR/${USERNAME}_oidc_cookies.txt" KC_LOGIN_HTML="$WORKDIR/${USERNAME}_kc_login.html" KC_POST_LOGIN_HTML="$WORKDIR/${USERNAME}_kc_post_login.html" KC_POST_LOGIN_LOG="$WORKDIR/${USERNAME}_kc_post_login.log" GITEA_CALLBACK_HTML="$WORKDIR/${USERNAME}_gitea_after_callback.html" GITEA_LINK_HTML="$WORKDIR/${USERNAME}_gitea_link_account.html" GITEA_LINK_RESP_HTML="$WORKDIR/${USERNAME}_gitea_link_signin.html" GITEA_LINK_RESP_LOG="$WORKDIR/${USERNAME}_gitea_link_signin.log" OIDC_URL="https://git.hangman-lab.top/user/oauth2/hangman-lab" ESCAPED_USERNAME=$(sql_escape "$USERNAME") cleanup() { "$SCRIPT_DIR/external-login-ctrl" --disable >/dev/null 2>&1 || true if [[ -n "${ORIG_LOGIN_TYPE:-}" && -n "${ORIG_LOGIN_SOURCE:-}" ]]; then ssh root@vps.git " set -euo pipefail . /root/git-kc/.env docker exec -i git-kc-mysql mysql -uroot -p\"\$MYSQL_ROOT_PASSWORD\" giteadb -e \"UPDATE user SET login_type=${ORIG_LOGIN_TYPE}, login_source=${ORIG_LOGIN_SOURCE}, login_name=${ORIG_LOGIN_NAME_SQL:-NULL} WHERE name='${ESCAPED_USERNAME}';\" " >/dev/null 2>&1 || true fi rm -f "$COOKIES_FILE" "$KC_LOGIN_HTML" "$KC_POST_LOGIN_HTML" "$KC_POST_LOGIN_LOG" \ "$GITEA_CALLBACK_HTML" "$GITEA_LINK_HTML" "$GITEA_LINK_RESP_HTML" "$GITEA_LINK_RESP_LOG" } trap cleanup EXIT rm -f "$COOKIES_FILE" "$KC_LOGIN_HTML" "$KC_POST_LOGIN_HTML" "$KC_POST_LOGIN_LOG" \ "$GITEA_CALLBACK_HTML" "$GITEA_LINK_HTML" "$GITEA_LINK_RESP_HTML" "$GITEA_LINK_RESP_LOG" # Capture original login fields so we can restore them exactly. ORIG_STATE=$(ssh root@vps.git " set -euo pipefail . /root/git-kc/.env docker exec -i git-kc-mysql mysql -N -B -uroot -p\"\$MYSQL_ROOT_PASSWORD\" giteadb -e \"SELECT login_type, login_source, COALESCE(login_name, '__NULL__') FROM user WHERE name='${ESCAPED_USERNAME}' LIMIT 1;\" ") if [[ -z "$ORIG_STATE" ]]; then echo "[ERROR] User not found in Gitea DB: $USERNAME" >&2 exit 1 fi IFS=$'\t' read -r ORIG_LOGIN_TYPE ORIG_LOGIN_SOURCE ORIG_LOGIN_NAME <<< "$ORIG_STATE" if [[ "$ORIG_LOGIN_NAME" == "__NULL__" ]]; then ORIG_LOGIN_NAME_SQL="NULL" else ORIG_LOGIN_NAME_SQL="'$(sql_escape "$ORIG_LOGIN_NAME")'" fi "$SCRIPT_DIR/external-login-ctrl" --enable echo "[INFO] 通过 OIDC 入口触发跳转,获取 Keycloak 登录页..." curl -s -L -c "$COOKIES_FILE" "$OIDC_URL" -o "$KC_LOGIN_HTML" KC_LOGIN_URL=$(perl -ne ' if(/