]> git.decadent.org.uk Git - dak.git/commitdiff
Add replay protection for uploaded changes files.
authorAnsgar Burchardt <ansgar@debian.org>
Sun, 3 Aug 2014 15:02:26 +0000 (17:02 +0200)
committerAnsgar Burchardt <ansgar@debian.org>
Sun, 3 Aug 2014 15:40:55 +0000 (17:40 +0200)
Look in signature_history table if the changes was already seen to
prevent re-uploading old changes files.

daklib/checks.py
daklib/dbconn.py
daklib/upload.py

index dce112b878ed77cfeba890f0263d37e2993e3359..b7931f2f6d8e60a2b893f6a304b357fe88cefd31 100644 (file)
@@ -109,6 +109,18 @@ class Check(object):
         return False
 
 class SignatureAndHashesCheck(Check):
+    def check_replay(self, upload):
+        # Use private session as we want to remember having seen the .changes
+        # in all cases.
+        session = DBConn().session()
+        history = SignatureHistory.from_signed_file(upload.changes)
+        r = history.query(session)
+        if r is not None:
+            raise Reject('Signature for changes file was already seen at {0}'.format(r.seen))
+        session.add(history)
+        session.commit()
+        return True
+
     """Check signature of changes and dsc file (if included in upload)
 
     Make sure the signature is valid and done by a known user.
@@ -117,6 +129,7 @@ class SignatureAndHashesCheck(Check):
         changes = upload.changes
         if not changes.valid_signature:
             raise Reject("Signature for .changes not valid.")
+        self.check_replay(upload)
         self._check_hashes(upload, changes.filename, changes.files.itervalues())
 
         source = None
index e55c283daa58444193839cb50ffc7810337d2224..c2621e36d150a38b042fd25182e15ff7374cbb87 100644 (file)
@@ -1859,6 +1859,9 @@ class SignatureHistory(ORMObject):
         self.contents_sha1 = signed_file.contents_sha1()
         return self
 
+    def query(self, session):
+        return session.query(SignatureHistory).filter_by(fingerprint=self.fingerprint, signature_timestamp=self.signature_timestamp, contents_sha1=self.contents_sha1).first()
+
 __all__.append('SignatureHistory')
 
 ################################################################################
index 406b1d4069101d63669e1edb903075d24d0b69f1..ec120a7bdbdd9964d2b3fbfd7304ea567ad4a184 100644 (file)
@@ -274,6 +274,14 @@ class Changes(object):
         """
         return self._signed_file.valid
 
+    @property
+    def signature_timestamp(self):
+        return self._signed_file.signature_timestamp
+
+    @property
+    def contents_sha1(self):
+        return self._signed_file.contents_sha1
+
     @property
     def architectures(self):
         """list of architectures included in the upload