| ... | ... | @@ -1,6 +1,7 @@ |
| 1 | 1 | #!/bin/bash |
| 2 | 2 | clover_id="" |
| 3 | 3 | evil_id="" |
| 4 | knot_did="" |
| 4 | 5 | |
| 5 | 6 | while [ $# -gt 0 ]; do |
| 6 | 7 | case "$1" in |
| ... | ... | @@ -12,6 +13,10 @@ while [ $# -gt 0 ]; do |
| 12 | 13 | evil_id="$2" |
| 13 | 14 | shift 2 |
| 14 | 15 | ;; |
| 16 | --knot) |
| 17 | knot_did="$2" |
| 18 | shift 2 |
| 19 | ;; |
| 15 | 20 | *) shift ;; |
| 16 | 21 | esac |
| 17 | 22 | done |
| ... | ... | @@ -20,29 +25,69 @@ repo="${SSH_ORIGINAL_COMMAND#* }" |
| 20 | 25 | repo="${repo%\'*}" |
| 21 | 26 | repo="${repo#\'}" |
| 22 | 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 | 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 | 54 | *[!a-zA-Z0-9/_.-]*) |
| 26 | 55 | echo "invalid repo name: $repo" >&2 |
| 27 | 56 | exit 1 |
| 28 | 57 | ;; |
| 29 | | *..*) |
| 58 | esac |
| 59 | |
| 60 | case "$repo" in |
| 61 | *..* | /*) |
| 30 | 62 | echo "invalid repo name: $repo" >&2 |
| 31 | 63 | exit 1 |
| 32 | 64 | ;; |
| 33 | | /*) |
| 34 | | echo "invalid repo name: $repo" >&2 |
| 35 | | exit 1 |
| 65 | esac |
| 66 | |
| 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 | 88 | esac |
| 38 | 89 | |
| 39 | | if [ -z "$repo" ]; then |
| 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 |
| 90 | repo="$repo.git" |
| 46 | 91 | |
| 47 | 92 | if [ -d "/mnt/storage1/apps/forgejo/git/repositories/${repo}" ]; then |
| 48 | 93 | [ -z "$clover_id" ] && echo "ssh key is not configured for repository on git.paperclover.net" >&2 && exit 1 |