~edwargix/git.sr.ht

45cf6a9971471e257870e63ebca94d6f88465834 — Drew DeVault 6 years ago 2e5d1e3
Cache keys when fetching from fallback
2 files changed, 29 insertions(+), 27 deletions(-)

M gitsrht-keys
M gitsrht/service.py
M gitsrht-keys => gitsrht-keys +15 -18
@@ 25,24 25,21 @@ else:
    from gitsrht.types import User, SSHKey
    db.init()

    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
    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 user:
        user_id = user.id
        username = user.username

M gitsrht/service.py => gitsrht/service.py +14 -9
@@ 9,6 9,7 @@ from srht.flask import csrf_bypass
from srht.oauth import AbstractOAuthService
import json
import requests
import sys

origin = cfg("git.sr.ht", "origin")
meta_origin = get_origin("meta.sr.ht")


@@ 25,6 26,17 @@ class GitOAuthService(AbstractOAuthService):
                delegated_scopes=scm_scopes,
                token_class=OAuthToken, user_class=User)

    def cache_key(self, user, meta_key):
        b64key = meta_key["key"].split(" ")
        if len(b64key) > 3:
            return False
        b64key = b64key[1]
        cache = {
            "user_id": user.id,
            "username": user.username,
        }
        redis.set(f"git.sr.ht.ssh-keys.{b64key}", json.dumps(cache))

    def ensure_user_sshkey(self, user, meta_key):
        """
        Ensures this SSH key is registered with this user, and returns True if


@@ 35,6 47,7 @@ class GitOAuthService(AbstractOAuthService):
        key = SSHKey.query.filter(
                SSHKey.meta_id == meta_key["id"]).one_or_none()
        if key:
            self.cache_key(user, meta_key)
            return False
        key = SSHKey()
        key.user_id = user.id


@@ 42,15 55,7 @@ class GitOAuthService(AbstractOAuthService):
        key.key = meta_key["key"]
        key.fingerprint = meta_key["fingerprint"]
        db.session.add(key)
        b64key = meta_key["key"].split(" ")
        if len(b64key) > 3:
            return True
        b64key = b64key[1]
        cache = {
            "user_id": user.id,
            "username": user.username,
        }
        redis.set(f"git.sr.ht.ssh-keys.{b64key}", json.dumps(cache))
        self.cache_key(user, meta_key)
        return True

    def ensure_meta_webhooks(self, user, webhooks):