| ... | @@ -1,6 +1,7 @@ | ... | @@ -1,6 +1,7 @@ |
| 1 | #!/bin/bash | 1 | #!/bin/bash |
| 2 | clover_id="" | 2 | clover_id="" |
| 3 | evil_id="" | 3 | evil_id="" |
| | 4 | knot_did="" |
| 4 | | 5 | |
| 5 | while [ $# -gt 0 ]; do | 6 | while [ $# -gt 0 ]; do |
| 6 | case "$1" in | 7 | case "$1" in |
| ... | @@ -12,6 +13,10 @@ while [ $# -gt 0 ]; do | ... | @@ -12,6 +13,10 @@ while [ $# -gt 0 ]; do |
| 12 | evil_id="$2" | 13 | evil_id="$2" |
| 13 | shift 2 | 14 | shift 2 |
| 14 | ;; | 15 | ;; |
| | 16 | --knot) |
| | 17 | knot_did="$2" |
| | 18 | shift 2 |
| | 19 | ;; |
| 15 | *) shift ;; | 20 | *) shift ;; |
| 16 | esac | 21 | esac |
| 17 | done | 22 | done |
| ... | @@ -20,29 +25,69 @@ repo="${SSH_ORIGINAL_COMMAND#* }" | ... | @@ -20,29 +25,69 @@ repo="${SSH_ORIGINAL_COMMAND#* }" |
| 20 | repo="${repo%\'*}" | 25 | repo="${repo%\'*}" |
| 21 | repo="${repo#\'}" | 26 | repo="${repo#\'}" |
| 22 | repo="${repo#/}" | 27 | repo="${repo#/}" |
| | 28 | repo="${repo%.git}" |
| | 29 | |
| | 30 | if [ -z "$repo" ]; then |
| | 31 | echo "your git ssh key works :3" >&2 |
| | 32 | exit 1 |
| | 33 | fi |
| | 34 | |
| | 35 | git_command="${SSH_ORIGINAL_COMMAND%% *}" |
| | 36 | |
| | 37 | case "$git_command" in |
| | 38 | git-receive-pack | git-upload-pack | git-upload-archive) ;; |
| | 39 | *) |
| | 40 | echo "invalid git command" >&2 |
| | 41 | exit 1 |
| | 42 | ;; |
| | 43 | esac |
| 23 | | 44 | |
| 24 | case "$repo" in | 45 | case "$repo" in |
| | 46 | did:plc:*) |
| | 47 | case "${repo#did:plc:}" in |
| | 48 | *[!a-zA-Z0-9]* | "") |
| | 49 | echo "invalid repo name: $repo" >&2 |
| | 50 | exit 1 |
| | 51 | ;; |
| | 52 | esac |
| | 53 | ;; |
| 25 | *[!a-zA-Z0-9/_.-]*) | 54 | *[!a-zA-Z0-9/_.-]*) |
| 26 | echo "invalid repo name: $repo" >&2 | 55 | echo "invalid repo name: $repo" >&2 |
| 27 | exit 1 | 56 | exit 1 |
| 28 | ;; | 57 | ;; |
| 29 | *..*) | 58 | esac |
| | 59 | |
| | 60 | case "$repo" in |
| | 61 | *..* | /*) |
| 30 | echo "invalid repo name: $repo" >&2 | 62 | echo "invalid repo name: $repo" >&2 |
| 31 | exit 1 | 63 | exit 1 |
| 32 | ;; | 64 | ;; |
| 33 | /*) | 65 | esac |
| 34 | echo "invalid repo name: $repo" >&2 | 66 | |
| 35 | exit 1 | 67 | route_knot() { |
| | 68 | [ -z "$knot_did" ] && echo "ssh key is not configured for repository on knot.paperclover.net" >&2 && exit 1 |
| | 69 | exec sudo docker exec -i -u git knot /usr/bin/env \ |
| | 70 | SSH_ORIGINAL_COMMAND="$git_command '$repo'" \ |
| | 71 | SSH_CONNECTION="$SSH_CONNECTION" \ |
| | 72 | /usr/bin/knot guard \ |
| | 73 | -git-dir /home/git/repositories \ |
| | 74 | -user "$knot_did" \ |
| | 75 | -log-path /tmp/knotguard.log \ |
| | 76 | -internal-api http://localhost:5444 |
| | 77 | } |
| | 78 | |
| | 79 | case "$repo" in |
| | 80 | did:plc:*) |
| | 81 | route_knot |
| | 82 | ;; |
| | 83 | */*) |
| | 84 | if [ ! -d "/mnt/storage1/apps/forgejo/git/repositories/${repo}.git" ] && [ ! -d "/mnt/storage1/apps/evil-infra/forgejo/git/repositories/${repo}.git" ]; then |
| | 85 | route_knot |
| | 86 | fi |
| 36 | ;; | 87 | ;; |
| 37 | esac | 88 | esac |
| 38 | | 89 | |
| 39 | if [ -z "$repo" ]; then | 90 | repo="$repo.git" |
| 40 | echo "your git ssh key works :3" >&2 | | |
| 41 | exit 1 | | |
| 42 | fi | | |
| 43 | if [[ "$repo" != *".git" ]]; then | | |
| 44 | repo="$repo.git" | | |
| 45 | fi | | |
| 46 | | 91 | |
| 47 | if [ -d "/mnt/storage1/apps/forgejo/git/repositories/${repo}" ]; then | 92 | if [ -d "/mnt/storage1/apps/forgejo/git/repositories/${repo}" ]; then |
| 48 | [ -z "$clover_id" ] && echo "ssh key is not configured for repository on git.paperclover.net" >&2 && exit 1 | 93 | [ -z "$clover_id" ] && echo "ssh key is not configured for repository on git.paperclover.net" >&2 && exit 1 |