[v4] Require TUs to explicitly request to overwrite a pkgbase
diff mbox

Message ID 20170725033119.15714-1-eschwartz@archlinux.org
State Accepted, archived
Headers show

Commit Message

Eli Schwartz July 25, 2017, 3:31 a.m. UTC
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>
---
 INSTALL               | 1 +
 aurweb/git/auth.py    | 2 ++
 aurweb/git/update.py  | 3 ++-
 doc/git-interface.txt | 6 ++++++
 4 files changed, 11 insertions(+), 1 deletion(-)

Comments

Lukas Fleischer July 25, 2017, 6:12 p.m. UTC | #1
On Tue, 25 Jul 2017 at 05:31:19, Eli Schwartz wrote:
> 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>
> ---
>  INSTALL               | 1 +
>  aurweb/git/auth.py    | 2 ++
>  aurweb/git/update.py  | 3 ++-
>  doc/git-interface.txt | 6 ++++++
>  4 files changed, 11 insertions(+), 1 deletion(-)
> [...]

Looks good. Queued, thanks!

Patch
diff mbox

diff --git a/INSTALL b/INSTALL
index 8c9c4dd..369e1e3 100644
--- a/INSTALL
+++ b/INSTALL
@@ -76,6 +76,7 @@  read the instructions below.
         PasswordAuthentication no
         AuthorizedKeysCommand /usr/local/bin/aurweb-git-auth "%t" "%k"
         AuthorizedKeysCommandUser aur
+        AcceptEnv AUR_OVERWRITE
 
 9) If you want to enable smart HTTP support with nginx and fcgiwrap, you can
    use the following directives:
diff --git a/aurweb/git/auth.py b/aurweb/git/auth.py
index 022b0ff..d02390d 100755
--- a/aurweb/git/auth.py
+++ b/aurweb/git/auth.py
@@ -1,5 +1,6 @@ 
 #!/usr/bin/python3
 
+import os
 import shlex
 import re
 import sys
@@ -52,6 +53,7 @@  def main():
     env_vars = {
         'AUR_USER': user,
         '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
 
diff --git a/aurweb/git/update.py b/aurweb/git/update.py
index c9a98d0..16fa2b0 100755
--- a/aurweb/git/update.py
+++ b/aurweb/git/update.py
@@ -238,6 +238,7 @@  def main():
     user = os.environ.get("AUR_USER")
     pkgbase = os.environ.get("AUR_PKGBASE")
     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
 
     if len(sys.argv) == 2 and sys.argv[1] == "restore":
@@ -258,7 +259,7 @@  def main():
     conn = aurweb.db.Connection()
 
     # 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.hide(sha1_new)
         if next(walker, None) is not None:
diff --git a/doc/git-interface.txt b/doc/git-interface.txt
index 7758512..f940961 100644
--- a/doc/git-interface.txt
+++ b/doc/git-interface.txt
@@ -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
 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
 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.
 * 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, ...)
 * Update package base information and package information in the database.
 * Update the named branch and the namespaced HEAD ref of the package.