summaryrefslogtreecommitdiffstats
path: root/gitsrht-keys
blob: 83ae364d56f189cd6b7a0bedb3c7212da579fa3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python3
import os
import sys
import requests
from srht.api import get_results
from srht.config import cfg, get_origin
from srht.database import DbSession
db = DbSession(cfg("git.sr.ht", "connection-string"))
from gitsrht.types import User, SSHKey
db.init()
from uuid import uuid4

sys.stderr.write(str(sys.argv) + "\n")
key_type = sys.argv[3]
b64key = sys.argv[4]

user = (User.query.join(SSHKey)
        .filter(SSHKey.key.ilike(f"%{b64key}%"))).one_or_none()
if not user:
    from gitsrht.service import oauth_service
    # Fall back to meta.sr.ht first
    meta_origin = get_origin("meta.sr.ht")
    r = requests.get(f"{meta_origin}/api/ssh-key/{b64key}")
    if r.status_code == 200:
        username = r.json()["owner"]["name"]
        user = User.query.filter(User.username == username).one_or_none()
        try:
            # Attempt to pull down keys for next time
            keys_url = f"{meta_origin}/api/user/ssh-keys"
            for key in get_results(keys_url, user.oauth_token):
                oauth_service.ensure_user_sshkey(user, key)
            db.session.commit()
        except:
            pass
if not user:
    sys.stderr.write("Unknown public key")
    sys.exit(0)

default_shell = os.path.join(os.path.dirname(sys.argv[0]), "gitsrht-shell")
shell = cfg("git.sr.ht", "shell", default=default_shell)
keys = ("command=\"{} '{}' '{}'\",".format(shell, user.id, b64key) +
    "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty," +
    "environment=\"SRHT_UID={}\",environment=\"SRHT_PUSH={}\"".format(
        user.id, str(uuid4())) +
    " {} {} {}".format(key_type, b64key, user.username) + "\n")
print(keys)
sys.stderr.write(keys)
sys.exit(0)