← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~jugmac00/launchpad:grant-ppa-edit-permissions-to-launchpad-devs into launchpad:master

 

Jürgen Gmach has proposed merging ~jugmac00/launchpad:grant-ppa-edit-permissions-to-launchpad-devs into launchpad:master.

Commit message:
Grant Launchpad devs selected edit permissions for PPAs

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~jugmac00/launchpad/+git/launchpad/+merge/437151
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~jugmac00/launchpad:grant-ppa-edit-permissions-to-launchpad-devs into launchpad:master.
diff --git a/lib/lp/soyuz/configure.zcml b/lib/lp/soyuz/configure.zcml
index 893878a..fd31388 100644
--- a/lib/lp/soyuz/configure.zcml
+++ b/lib/lp/soyuz/configure.zcml
@@ -365,18 +365,18 @@
         <require
             permission="launchpad.Admin"
             interface="lp.soyuz.interfaces.archive.IArchiveAdmin"
-            set_attributes="authorized_size
-                            enabled_restricted_processors
+            set_attributes="enabled_restricted_processors
                             external_dependencies
                             name
                             permit_obsolete_series_uploads
-                            private
-                            publishing_method
-                            repository_format
                             require_virtualized"/>
         <require
             permission="launchpad.Moderate"
-            set_schema="lp.soyuz.interfaces.archive.IArchiveRestricted"/>
+            set_schema="lp.soyuz.interfaces.archive.IArchiveRestricted"
+            set_attributes="authorized_size
+                            private
+                            publishing_method
+                            repository_format"/>
         <require
             permission="launchpad.InternalScriptsOnly"
             set_attributes="dirty_suites distribution signing_key_owner
diff --git a/lib/lp/soyuz/security.py b/lib/lp/soyuz/security.py
index 7df030b..b6b5cf0 100644
--- a/lib/lp/soyuz/security.py
+++ b/lib/lp/soyuz/security.py
@@ -414,9 +414,8 @@ class ModerateArchive(AuthorizationBase):
     def checkAuthenticated(self, user):
         return (
             user.in_buildd_admin
-            or user.in_ppa_admin
-            or user.in_commercial_admin
-            or user.in_admin
+            or user.in_launchpad_developers
+            or AdminArchive(self.obj).checkAuthenticated(user)
         )
 
 
diff --git a/lib/lp/soyuz/tests/test_archive.py b/lib/lp/soyuz/tests/test_archive.py
index d366f80..5851aad 100644
--- a/lib/lp/soyuz/tests/test_archive.py
+++ b/lib/lp/soyuz/tests/test_archive.py
@@ -74,6 +74,7 @@ from lp.soyuz.enums import (
     ArchivePermissionType,
     ArchivePublishingMethod,
     ArchivePurpose,
+    ArchiveRepositoryFormat,
     ArchiveStatus,
     PackageCopyPolicy,
     PackagePublishingStatus,
@@ -5804,6 +5805,104 @@ class TestDisplayName(TestCaseWithFactory):
             archive.displayname = "My testing packages"
 
 
+class TestAuthorizedSize(TestCaseWithFactory):
+    """Tests for Archive.authorized_size"""
+
+    layer = DatabaseFunctionalLayer
+
+    def test_editable(self):
+        archive = self.factory.makeArchive(name="test-ppa")
+        self.assertEqual(8192, archive.authorized_size)
+
+        # unprivileged person cannot edit `authorized_size`
+        login("no-priv@xxxxxxxxxxxxx")
+        self.assertRaises(
+            Unauthorized, setattr, archive, "authorized_size", 1234
+        )
+
+        # launchpad developers can edit `authorized_size`
+        with celebrity_logged_in("launchpad_developers"):
+            archive.authorized_size *= 2
+        self.assertEqual(16384, archive.authorized_size)
+
+
+class TestPrivate(TestCaseWithFactory):
+    """Tests for Archive.private"""
+
+    layer = DatabaseFunctionalLayer
+
+    def test_editable(self):
+        archive = self.factory.makeArchive(name="test-ppa")
+        self.assertEqual(False, archive.private)
+
+        # unprivileged person cannot edit `private`
+        login("no-priv@xxxxxxxxxxxxx")
+        self.assertRaises(Unauthorized, setattr, archive, "private", True)
+
+        # launchpad developers can edit `private`
+        with celebrity_logged_in("launchpad_developers"):
+            archive.private = True
+        self.assertEqual(True, archive.private)
+
+
+class TestPublishingMethod(TestCaseWithFactory):
+    """Tests for Archive.publishing_method"""
+
+    layer = DatabaseFunctionalLayer
+
+    def test_editable(self):
+        archive = self.factory.makeArchive(name="test-ppa")
+        self.assertEqual(
+            ArchivePublishingMethod.LOCAL, archive.publishing_method
+        )
+
+        # unprivileged person cannot edit `publishing_method`
+        login("no-priv@xxxxxxxxxxxxx")
+        self.assertRaises(
+            Unauthorized,
+            setattr,
+            archive,
+            "publishing_method",
+            ArchivePublishingMethod.ARTIFACTORY,
+        )
+
+        # launchpad developers can edit `publishing_method`
+        with celebrity_logged_in("launchpad_developers"):
+            archive.publishing_method = ArchivePublishingMethod.ARTIFACTORY
+        self.assertEqual(
+            ArchivePublishingMethod.ARTIFACTORY, archive.publishing_method
+        )
+
+
+class TestRepositoryFormat(TestCaseWithFactory):
+    """Tests for Archive.repository_format"""
+
+    layer = DatabaseFunctionalLayer
+
+    def test_editable(self):
+        archive = self.factory.makeArchive(name="test-ppa")
+        self.assertEqual(
+            ArchiveRepositoryFormat.DEBIAN, archive.repository_format
+        )
+
+        # unprivileged person cannot edit `repository_format`
+        login("no-priv@xxxxxxxxxxxxx")
+        self.assertRaises(
+            Unauthorized,
+            setattr,
+            archive,
+            "repository_format",
+            ArchiveRepositoryFormat.PYTHON,
+        )
+
+        # launchpad developers can edit `repository_format`
+        with celebrity_logged_in("launchpad_developers"):
+            archive.repository_format = ArchiveRepositoryFormat.PYTHON
+        self.assertEqual(
+            ArchiveRepositoryFormat.PYTHON, archive.repository_format
+        )
+
+
 class TestSigningKeyPropagation(TestCaseWithFactory):
     """Signing keys are shared between PPAs owned by the same person/team."""