Colin Watson has proposed merging 
~cjwatson/launchpad:librarian-public-files-on-restricted-host into 
launchpad:master.

Commit message:
Allow serving public files from the restricted librarian

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/438523

This is generally harmless (as opposed to the other way round), and it makes it 
substantially easier to build a caching configuration for the upcoming archive 
snapshot service.
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of 
~cjwatson/launchpad:librarian-public-files-on-restricted-host into 
launchpad:master.
diff --git a/lib/lp/services/librarianserver/db.py b/lib/lp/services/librarianserver/db.py
index f138c14..ce703e6 100644
--- a/lib/lp/services/librarianserver/db.py
+++ b/lib/lp/services/librarianserver/db.py
@@ -12,7 +12,7 @@ from urllib.parse import quote, unquote
 from xmlrpc.client import Fault
 
 from pymacaroons import Macaroon
-from storm.expr import SQL, And
+from storm.expr import SQL
 from twisted.internet import defer
 from twisted.internet import reactor as default_reactor
 from twisted.internet import threads
@@ -21,6 +21,7 @@ from twisted.web import xmlrpc
 from lp.services.config import config
 from lp.services.database.interfaces import IStore
 from lp.services.database.sqlbase import session_store
+from lp.services.database.stormexpr import IsFalse
 from lp.services.librarian.model import (
     LibraryFileAlias,
     LibraryFileContent,
@@ -128,13 +129,13 @@ class Library:
                 restricted = True
             else:
                 raise LookupError("Token stale/pruned/path mismatch")
-        alias = LibraryFileAlias.selectOne(
-            And(
-                LibraryFileAlias.id == aliasid,
-                LibraryFileAlias.contentID == LibraryFileContent.q.id,
-                LibraryFileAlias.restricted == restricted,
-            )
-        )
+        clauses = [
+            LibraryFileAlias.id == aliasid,
+            LibraryFileAlias.content == LibraryFileContent.id,
+        ]
+        if not restricted:
+            clauses.append(IsFalse(LibraryFileAlias.restricted))
+        alias = IStore(LibraryFileAlias).find(LibraryFileAlias, *clauses).one()
         if alias is None:
             raise LookupError("No file alias with LibraryFileContent")
         return alias
diff --git a/lib/lp/services/librarianserver/tests/test_db.py b/lib/lp/services/librarianserver/tests/test_db.py
index ce3d499..d892613 100644
--- a/lib/lp/services/librarianserver/tests/test_db.py
+++ b/lib/lp/services/librarianserver/tests/test_db.py
@@ -108,7 +108,7 @@ class TestLibrarianStuff(TestCase):
 
     def test_getAlias(self):
         # Library.getAlias() returns the LibrarayFileAlias for a given
-        # LibrarayFileAlias ID.
+        # LibraryFileAlias ID.
         library = db.Library(restricted=False)
         alias = library.getAlias(1, None, "/")
         self.assertEqual(1, alias.id)
@@ -135,15 +135,16 @@ class TestLibrarianStuff(TestCase):
         alias.content = None
         self.assertRaises(LookupError, library.getAlias, 1, None, "/")
 
-    def test_getAlias_content_wrong_library(self):
-        # Library.getAlias() raises a LookupError, if a restricted
-        # library looks up a unrestricted LibraryFileAlias and
-        # vice versa.
+    def test_getAlias_restricted_library_unrestricted_alias(self):
+        # Library.getAlias() allows looking up unrestricted
+        # LibraryFileAliases from a restricted library.
         restricted_library = db.Library(restricted=True)
-        self.assertRaises(
-            LookupError, restricted_library.getAlias, 1, None, "/"
-        )
+        alias = restricted_library.getAlias(1, None, "/")
+        self.assertEqual(1, alias.id)
 
+    def test_getAlias_unrestricted_library_restricted_alias(self):
+        # Library.getAlias() raises a LookupError if an unrestricted
+        # library looks up a restricted LibraryFileAlias.
         unrestricted_library = db.Library(restricted=False)
         alias = unrestricted_library.getAlias(1, None, "/")
         alias.restricted = True
_______________________________________________
Mailing list: https://launchpad.net/~launchpad-reviewers
Post to     : launchpad-reviewers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~launchpad-reviewers
More help   : https://help.launchpad.net/ListHelp

Reply via email to