#!/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)