summaryrefslogtreecommitdiff
path: root/ssh/git-ns
diff options
context:
space:
mode:
Diffstat (limited to 'ssh/git-ns')
-rwxr-xr-xssh/git-ns25
1 files changed, 25 insertions, 0 deletions
diff --git a/ssh/git-ns b/ssh/git-ns
new file mode 100755
index 0000000..f8b6b0b
--- /dev/null
+++ b/ssh/git-ns
@@ -0,0 +1,25 @@
+#!/bin/sh
+# Форс-команда из authorized_keys: command="git-ns <namespace>".
+# Пускает пользователя только в git-операции над репозиториями ЕГО неймспейса.
+NS="$1"
+REPOS="${REPOS_DIR:-/repos}"
+set -- $SSH_ORIGINAL_COMMAND
+cmd="$1"
+repo=$(printf '%s' "$2" | tr -d "'\"")
+repo="${repo#/}"
+case "$cmd" in
+ git-receive-pack|git-upload-pack|git-upload-archive) ;;
+ *) echo "разрешены только git-команды" >&2; exit 1 ;;
+esac
+# без слеша -> свой неймспейс
+case "$repo" in
+ */*) ;;
+ *) repo="$NS/$repo" ;;
+esac
+# запрет выхода в чужой неймспейс
+case "$repo" in
+ "$NS/"*) ;;
+ *) echo "чужой неймспейс запрещён" >&2; exit 1 ;;
+esac
+repo="${repo%/}"
+exec git-shell -c "$cmd '$REPOS/$repo'"