gitea-repo-create: dediziertes Anlage-Token (Push-Token bleibt unberuehrt)
Sicherer als .git-credentials zu ueberschreiben: Anlage-Token (write:user) aus $GITEA_CREATE_TOKEN oder ~/.config/gitea/create-token; Push/PR-Token in ~/.git-credentials bleibt unangetastet (kein Bruch, falls das neue Token kein write:repository hat). User/Host nicht-geheim mit Defaults. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+22
-15
@@ -18,6 +18,10 @@ set -uo pipefail
|
|||||||
NAME="${1:-}"
|
NAME="${1:-}"
|
||||||
BESCHREIBUNG="${2:-Von Lucy angelegtes Projekt-Repo.}"
|
BESCHREIBUNG="${2:-Von Lucy angelegtes Projekt-Repo.}"
|
||||||
CRED="$HOME/.git-credentials"
|
CRED="$HOME/.git-credentials"
|
||||||
|
# Dediziertes Anlage-Token (Scope write:user) — GETRENNT vom Push-Token in
|
||||||
|
# ~/.git-credentials, damit ein Überschreiben nie Push/PR bricht. Priorität:
|
||||||
|
# ENV GITEA_CREATE_TOKEN → ~/.config/gitea/create-token → Fallback .git-credentials.
|
||||||
|
CREATE_TOKEN_FILE="$HOME/.config/gitea/create-token"
|
||||||
LOG="$HOME/.hermes/state/gitea-repos-created.log"
|
LOG="$HOME/.hermes/state/gitea-repos-created.log"
|
||||||
|
|
||||||
if [ -z "$NAME" ]; then
|
if [ -z "$NAME" ]; then
|
||||||
@@ -29,20 +33,22 @@ if ! printf '%s' "$NAME" | grep -qE '^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$'; then
|
|||||||
echo "Ungültiger Repo-Name '$NAME' (erlaubt: Buchstaben/Ziffern/.-_, Beginn alphanumerisch)." >&2
|
echo "Ungültiger Repo-Name '$NAME' (erlaubt: Buchstaben/Ziffern/.-_, Beginn alphanumerisch)." >&2
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
if [ ! -r "$CRED" ]; then
|
# User + Host sind NICHT geheim: aus .git-credentials ableiten, sonst Standardwerte.
|
||||||
echo "Keine ~/.git-credentials gefunden — ohne gespeicherte Gitea-Anmeldung geht das nicht." >&2
|
LINE="$(grep -m1 'git\.tobisniceshomelab\.ddnsfree\.com' "$CRED" 2>/dev/null || head -1 "$CRED" 2>/dev/null || true)"
|
||||||
exit 1
|
USER="$(printf '%s' "$LINE" | sed -nE 's#https://([^:]+):.*#\1#p')"; USER="${USER:-Hitonabi}"
|
||||||
fi
|
HOST="$(printf '%s' "$LINE" | sed -nE 's#https://[^@]+@([^/]+).*#\1#p')"; HOST="${HOST:-git.tobisniceshomelab.ddnsfree.com}"
|
||||||
|
|
||||||
# Zeile für den Gitea-Host herausgreifen (falls mehrere Hosts hinterlegt sind)
|
|
||||||
LINE="$(grep -m1 'git\.tobisniceshomelab\.ddnsfree\.com' "$CRED" || head -1 "$CRED")"
|
|
||||||
USER="$(printf '%s' "$LINE" | sed -E 's#https://([^:]+):.*#\1#')"
|
|
||||||
TOKEN="$(printf '%s' "$LINE" | sed -E 's#https://[^:]+:([^@]+)@.*#\1#')"
|
|
||||||
HOST="$(printf '%s' "$LINE" | sed -E 's#https://[^@]+@([^/]+).*#\1#')"
|
|
||||||
BASE="https://${HOST}"
|
BASE="https://${HOST}"
|
||||||
|
|
||||||
if [ -z "$USER" ] || [ -z "$TOKEN" ] || [ -z "$HOST" ]; then
|
# Anlage-Token bestimmen (dediziert bevorzugt, damit Push-Token unberührt bleibt)
|
||||||
echo "Konnte User/Token/Host nicht aus ~/.git-credentials lesen." >&2
|
if [ -n "${GITEA_CREATE_TOKEN:-}" ]; then
|
||||||
|
TOKEN="$GITEA_CREATE_TOKEN"
|
||||||
|
elif [ -r "$CREATE_TOKEN_FILE" ]; then
|
||||||
|
TOKEN="$(tr -d '[:space:]' < "$CREATE_TOKEN_FILE")"
|
||||||
|
else
|
||||||
|
TOKEN="$(printf '%s' "$LINE" | sed -nE 's#https://[^:]+:([^@]+)@.*#\1#p')"
|
||||||
|
fi
|
||||||
|
if [ -z "$TOKEN" ]; then
|
||||||
|
echo "Kein Gitea-Token gefunden (weder \$GITEA_CREATE_TOKEN noch $CREATE_TOKEN_FILE noch ~/.git-credentials)." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -67,10 +73,11 @@ case "$CODE" in
|
|||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
403)
|
403)
|
||||||
if grep -q 'write:user' "$RESP"; then
|
if grep -q 'write:user' "$RESP"; then
|
||||||
echo "FEHLT: Das gespeicherte Gitea-Token darf keine Repos anlegen (Scope 'write:user' fehlt)." >&2
|
echo "FEHLT: Das benutzte Gitea-Token darf keine Repos anlegen (Scope 'write:user' fehlt)." >&2
|
||||||
echo "So wird es freigeschaltet (einmalig, durch den Commander):" >&2
|
echo "So wird es freigeschaltet (einmalig, durch den Commander):" >&2
|
||||||
echo " Gitea → Einstellungen → Anwendungen → neues Token mit Scopes 'write:repository' UND 'write:user'," >&2
|
echo " 1) In Gitea ein Token mit Scope 'write:user' erzeugen (nur DAS reicht fürs Anlegen)." >&2
|
||||||
echo " dann in ~/.git-credentials das alte Token ersetzen. Danach funktioniert dieses Skript." >&2
|
echo " 2) Den Token-Wert in ~/.config/gitea/create-token legen (chmod 600) —" >&2
|
||||||
|
echo " getrennt vom Push-Token, das in ~/.git-credentials unberührt bleibt." >&2
|
||||||
else
|
else
|
||||||
echo "403 von Gitea:" >&2; head -c 300 "$RESP" >&2; echo >&2
|
echo "403 von Gitea:" >&2; head -c 300 "$RESP" >&2; echo >&2
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user