Require TUs to explicitly request to overwrite a pkgbase

AUR_PRIVILEGED allows people with privileged AUR accounts to evade the
block on non-fast-forward commits. While valid in this case, we should
not do so by default, since in at least one case a TU did this without
realizing there was an existing package.
( https://aur.archlinux.org/packages/rtmidi/ )

Switch to using allow_overwrite to check for destructive actions.
Use .ssh/config "SendEnv" on the TU's side and and sshd_config
"AcceptEnv" in the AUR server to specifically request overwrite access.
TUs should use: `AUR_OVERWRITE=1 git push --force`

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
This commit is contained in:
Eli Schwartz 2017-07-24 23:31:19 -04:00 committed by Lukas Fleischer
parent 243fb92273
commit c5302d3a33
4 changed files with 11 additions and 1 deletions

View file

@ -76,6 +76,7 @@ read the instructions below.
PasswordAuthentication no PasswordAuthentication no
AuthorizedKeysCommand /usr/local/bin/aurweb-git-auth "%t" "%k" AuthorizedKeysCommand /usr/local/bin/aurweb-git-auth "%t" "%k"
AuthorizedKeysCommandUser aur AuthorizedKeysCommandUser aur
AcceptEnv AUR_OVERWRITE
9) If you want to enable smart HTTP support with nginx and fcgiwrap, you can 9) If you want to enable smart HTTP support with nginx and fcgiwrap, you can
use the following directives: use the following directives:

View file

@ -1,5 +1,6 @@
#!/usr/bin/python3 #!/usr/bin/python3
import os
import shlex import shlex
import re import re
import sys import sys
@ -52,6 +53,7 @@ def main():
env_vars = { env_vars = {
'AUR_USER': user, 'AUR_USER': user,
'AUR_PRIVILEGED': '1' if account_type > 1 else '0', 'AUR_PRIVILEGED': '1' if account_type > 1 else '0',
'AUR_OVERWRITE' : os.environ.get('AUR_OVERWRITE', '0') if account_type > 1 else '0',
} }
key = keytype + ' ' + keytext key = keytype + ' ' + keytext

View file

@ -238,6 +238,7 @@ def main():
user = os.environ.get("AUR_USER") user = os.environ.get("AUR_USER")
pkgbase = os.environ.get("AUR_PKGBASE") pkgbase = os.environ.get("AUR_PKGBASE")
privileged = (os.environ.get("AUR_PRIVILEGED", '0') == '1') privileged = (os.environ.get("AUR_PRIVILEGED", '0') == '1')
allow_overwrite = (os.environ.get("AUR_OVERWRITE", '0') == '1')
warn_or_die = warn if privileged else die warn_or_die = warn if privileged else die
if len(sys.argv) == 2 and sys.argv[1] == "restore": if len(sys.argv) == 2 and sys.argv[1] == "restore":
@ -258,7 +259,7 @@ def main():
conn = aurweb.db.Connection() conn = aurweb.db.Connection()
# Detect and deny non-fast-forwards. # Detect and deny non-fast-forwards.
if sha1_old != "0" * 40 and not privileged: if sha1_old != "0" * 40 and not allow_overwrite:
walker = repo.walk(sha1_old, pygit2.GIT_SORT_TOPOLOGICAL) walker = repo.walk(sha1_old, pygit2.GIT_SORT_TOPOLOGICAL)
walker.hide(sha1_new) walker.hide(sha1_new)
if next(walker, None) is not None: if next(walker, None) is not None:

View file

@ -33,6 +33,11 @@ users cannot access anything on the server except for the aurweb SSH interface.
The forced command can be configured in the aurweb configuration file and it The forced command can be configured in the aurweb configuration file and it
usually points to the git-serve program. usually points to the git-serve program.
If SSH has been configured to pass on the AUR_OVERWRITE environment variable
(via SendEnv, see ssh_config(5) for details) and the user's account is a
registered Trusted User or Developer, this will be passed on to the git-update
program in order to enable a non-fast-forward push.
The INSTALL file in the top-level directory contains detailed instructions on The INSTALL file in the top-level directory contains detailed instructions on
how to configure sshd(8) to use git-auth for authentication. how to configure sshd(8) to use git-auth for authentication.
@ -67,6 +72,7 @@ The Git update hook, called git-update, performs several subtasks:
* Prevent from creating branches or tags other than master. * Prevent from creating branches or tags other than master.
* Deny non-fast-forwards, except for Trusted Users and Developers. * Deny non-fast-forwards, except for Trusted Users and Developers.
* Deny blacklisted packages, except for Trusted Users and Developers.
* Verify each new commit (validate meta data, impose file size limits, ...) * Verify each new commit (validate meta data, impose file size limits, ...)
* Update package base information and package information in the database. * Update package base information and package information in the database.
* Update the named branch and the namespaced HEAD ref of the package. * Update the named branch and the namespaced HEAD ref of the package.