Blame files/aclchecker.py

Patrick Uiterwijk 7b7c23
#!/usr/bin/env python
Patrick Uiterwijk 7b7c23
# -*- coding: utf-8 -*-
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
"""
Patrick Uiterwijk 7b7c23
 (c) 2014-2018 - Copyright Red Hat Inc
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
 Authors:
Patrick Uiterwijk 7b7c23
   Patrick Uiterwijk <puiterwijk@redhat.com></puiterwijk@redhat.com>
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
"""
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
from __future__ import unicode_literals, print_function
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
import subprocess
Patrick Uiterwijk 7b7c23
import sys
Patrick Uiterwijk 7b7c23
import os
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk d75948
import requests
Patrick Uiterwijk d75948
Patrick Uiterwijk 59387b
if "SSH_ORIGINAL_COMMAND" not in os.environ:
Patrick Uiterwijk c440e0
    print("Welcome %s. This server does not offer shell access." % sys.argv[1])
Patrick Uiterwijk 59387b
    sys.exit(0)
Patrick Uiterwijk 59387b
Patrick Uiterwijk 7b7c23
# Since this is run by sshd, we don't have a way to set environment
Patrick Uiterwijk 7b7c23
# variables ahead of time
Patrick Uiterwijk 7b7c23
if "PAGURE_CONFIG" not in os.environ and os.path.exists(
Patrick Uiterwijk 7b7c23
    "/etc/pagure/pagure.cfg"
Patrick Uiterwijk 7b7c23
):
Patrick Uiterwijk 7b7c23
    os.environ["PAGURE_CONFIG"] = "/etc/pagure/pagure.cfg"
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
# Here starts the code
Patrick Uiterwijk 7b7c23
from pagure.config import config as pagure_config
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
# Get the arguments
Patrick Uiterwijk 7b7c23
if len(sys.argv) != 2:
Patrick Uiterwijk 7b7c23
    print("Invalid call, too few arguments", file=sys.stderr)
Patrick Uiterwijk 7b7c23
    sys.exit(1)
Patrick Uiterwijk 7b7c23
remoteuser = sys.argv[1]
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
args = os.environ["SSH_ORIGINAL_COMMAND"].split(" ")
Patrick Uiterwijk 7b7c23
# Expects: <git-(receive|upload)-pack> <repopath></repopath></git-(receive|upload)-pack>
Patrick Uiterwijk 7b7c23
if len(args) != 2:
Patrick Uiterwijk 7b7c23
    print("Invalid call, too few inner arguments", file=sys.stderr)
Patrick Uiterwijk 7b7c23
    sys.exit(1)
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
cmd = args[0]
Patrick Uiterwijk d75948
gitdir = args[1]
Patrick Uiterwijk 7b7c23
if cmd not in ("git-receive-pack", "git-upload-pack"):
Patrick Uiterwijk 7b7c23
    print("Invalid call, invalid operation", file=sys.stderr)
Patrick Uiterwijk 7b7c23
    sys.exit(1)
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk d75948
# Normalization of the gitdir
Patrick Uiterwijk 7b7c23
# Git will encode the file path argument within single quotes
Patrick Uiterwijk d75948
if gitdir[0] != "'" or gitdir[-1] != "'":
Patrick Uiterwijk 7b7c23
    print("Invalid call: invalid path", file=sys.stderr)
Patrick Uiterwijk 7b7c23
    sys.exit(1)
Patrick Uiterwijk d75948
gitdir = gitdir[1:-1]
Patrick Uiterwijk d75948
# With the "ssh://hostname/repo.git", SSH sends "/repo.git"
Patrick Uiterwijk d75948
if gitdir[0] == "/":
Patrick Uiterwijk d75948
    gitdir = gitdir[1:]
Patrick Uiterwijk d75948
# Always add .git for good measure
Patrick Uiterwijk d75948
if not gitdir.endswith(".git"):
Patrick Uiterwijk d75948
    gitdir = gitdir + ".git"
Patrick Uiterwijk d75948
Patrick Uiterwijk d75948
Patrick Uiterwijk d75948
url = "%s/pv/ssh/checkaccess/" % pagure_config["APP_URL"]
Patrick Uiterwijk d75948
data = {"gitdir": gitdir, "username": remoteuser}
Slavek Kabrda 984d0f
headers = {}
Slavek Kabrda 984d0f
if pagure_config.get("SSH_ADMIN_TOKEN"):
Slavek Kabrda 984d0f
    headers["Authorization"] = "token %s" % pagure_config["SSH_ADMIN_TOKEN"]
Slavek Kabrda 984d0f
resp = requests.post(url, data=data, headers=headers)
Patrick Uiterwijk d75948
if not resp.status_code == 200:
Patrick Uiterwijk d75948
    print(
Patrick Uiterwijk d75948
        "Error during lookup request: status: %s" % resp.status_code,
Patrick Uiterwijk d75948
        file=sys.stderr,
Patrick Uiterwijk d75948
    )
Patrick Uiterwijk 7b7c23
    sys.exit(1)
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk d75948
result = resp.json()
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk d75948
if not result["access"]:
Patrick Uiterwijk d75948
    # The user does not have access to this repo, or project does
Patrick Uiterwijk d75948
    # not exist. Whatever it is, no access.
Pierre-Yves Chibon c2ffdd
    print("No such repository", file=sys.stderr)
Patrick Uiterwijk 7b7c23
    sys.exit(1)
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 7b7c23
Patrick Uiterwijk 59387b
# Now go run the configured command
Patrick Uiterwijk 7b7c23
# We verified that cmd is either "git-receive-pack" or "git-send-pack"
Patrick Uiterwijk 59387b
# and "path" is a path that points to a valid Pagure repository.
Patrick Uiterwijk d75948
if result["region"]:
Patrick Uiterwijk 59387b
    runner, env = pagure_config["SSH_COMMAND_REPOSPANNER"]
Patrick Uiterwijk 59387b
else:
Patrick Uiterwijk 59387b
    runner, env = pagure_config["SSH_COMMAND_NON_REPOSPANNER"]
Patrick Uiterwijk 59387b
Patrick Uiterwijk d75948
result.update({"username": remoteuser, "cmd": cmd})
Patrick Uiterwijk d75948
Patrick Uiterwijk 3e0550
for key in result:
Patrick Uiterwijk 3e0550
    if result[key] is None:
Patrick Uiterwijk 3e0550
        result[key] = ''
Patrick Uiterwijk 3e0550
Patrick Uiterwijk d75948
runargs = [arg % result for arg in runner]
Patrick Uiterwijk 59387b
if env:
Patrick Uiterwijk 59387b
    for key in env:
Patrick Uiterwijk d75948
        os.environ[key] = env[key] % result
Patrick Uiterwijk 59387b
os.execvp(runargs[0], runargs)