X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fdbconn.py;h=e611d47df2106e9a084d0951b9e9b3b44710e57b;hb=39799e5acc0db0c864ebea1b38fc6c1e1a5cec25;hp=9617bb77a6a00241a77e3bb7332f8336d9bd11a2;hpb=707a89a3b86961755a99cb9e1a0a5f23690f9529;p=dak.git diff --git a/daklib/dbconn.py b/daklib/dbconn.py index 9617bb77..e611d47d 100644 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -110,11 +110,11 @@ class DebVersion(UserDefinedType): return None sa_major_version = sqlalchemy.__version__[0:3] -if sa_major_version in ["0.5", "0.6", "0.7"]: +if sa_major_version in ["0.5", "0.6", "0.7", "0.8"]: from sqlalchemy.databases import postgres postgres.ischema_names['debversion'] = DebVersion else: - raise Exception("dak only ported to SQLA versions 0.5 to 0.7. See daklib/dbconn.py") + raise Exception("dak only ported to SQLA versions 0.5 to 0.8. See daklib/dbconn.py") ################################################################################ @@ -311,7 +311,7 @@ class ORMObject(object): return object_session(self) def clone(self, session = None): - ''' + """ Clones the current object in a new session and returns the new clone. A fresh session is created if the optional session parameter is not provided. The function will fail if a session is provided and has @@ -324,8 +324,8 @@ class ORMObject(object): WARNING: Only persistent (committed) objects can be cloned. Changes made to the original object that are not committed yet will get lost. The session of the new object will always be rolled back to avoid - ressource leaks. - ''' + resource leaks. + """ if self.session() is None: raise RuntimeError( \ @@ -1030,7 +1030,9 @@ class PoolFile(ORMObject): @property def fullpath(self): session = DBConn().session().object_session(self) - af = session.query(ArchiveFile).join(Archive).filter(ArchiveFile.file == self).first() + af = session.query(ArchiveFile).join(Archive) \ + .filter(ArchiveFile.file == self) \ + .order_by(Archive.tainted.desc()).first() return af.path @property @@ -1248,8 +1250,22 @@ class Keyring(object): LDAPDn = cnf["Import-LDAP-Fingerprints::LDAPDn"] LDAPServer = cnf["Import-LDAP-Fingerprints::LDAPServer"] + ca_cert_file = cnf.get('Import-LDAP-Fingerprints::CACertFile') l = ldap.open(LDAPServer) + + if ca_cert_file: + # TODO: This should request a new context and use + # connection-specific options (i.e. "l.set_option(...)") + + # Request a new TLS context. If there was already one, libldap + # would not change the TLS options (like which CAs to trust). + #l.set_option(ldap.OPT_X_TLS_NEWCTX, True) + ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_HARD) + #ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, None) + ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, ca_cert_file) + l.start_tls_s() + l.simple_bind_s("","") Attrs = l.search_s(LDAPDn, ldap.SCOPE_ONELEVEL, "(&(keyfingerprint=*)(gidnumber=%s))" % (cnf["Import-Users-From-Passwd::ValidGID"]), @@ -1474,7 +1490,7 @@ class NewComment(object): __all__.append('NewComment') @session_wrapper -def has_new_comment(package, version, session=None): +def has_new_comment(policy_queue, package, version, session=None): """ Returns true if the given combination of C{package}, C{version} has a comment. @@ -1492,7 +1508,7 @@ def has_new_comment(package, version, session=None): @return: true/false """ - q = session.query(NewComment) + q = session.query(NewComment).filter_by(policy_queue=policy_queue) q = q.filter_by(package=package) q = q.filter_by(version=version) @@ -1501,7 +1517,7 @@ def has_new_comment(package, version, session=None): __all__.append('has_new_comment') @session_wrapper -def get_new_comments(package=None, version=None, comment_id=None, session=None): +def get_new_comments(policy_queue, package=None, version=None, comment_id=None, session=None): """ Returns (possibly empty) list of NewComment objects for the given parameters @@ -1523,7 +1539,7 @@ def get_new_comments(package=None, version=None, comment_id=None, session=None): @return: A (possibly empty) list of NewComment objects will be returned """ - q = session.query(NewComment) + q = session.query(NewComment).filter_by(policy_queue=policy_queue) if package is not None: q = q.filter_by(package=package) if version is not None: q = q.filter_by(version=version) if comment_id is not None: q = q.filter_by(comment_id=comment_id) @@ -1850,6 +1866,26 @@ __all__.append('get_sections') ################################################################################ +class SignatureHistory(ORMObject): + @classmethod + def from_signed_file(cls, signed_file): + """signature history entry from signed file + + @type signed_file: L{daklib.gpg.SignedFile} + @param signed_file: signed file + + @rtype: L{SignatureHistory} + """ + self = cls() + self.fingerprint = signed_file.primary_fingerprint + self.signature_timestamp = signed_file.signature_timestamp + self.contents_sha1 = signed_file.contents_sha1() + return self + +__all__.append('SignatureHistory') + +################################################################################ + class SrcContents(ORMObject): def __init__(self, file = None, source = None): self.file = file @@ -2524,6 +2560,7 @@ class DBConn(object): 'changelogs_text', 'changes', 'component', + 'component_suite', 'config', 'dsc_files', 'external_overrides', @@ -2544,6 +2581,7 @@ class DBConn(object): 'policy_queue_byhand_file', 'priority', 'section', + 'signature_history', 'source', 'source_metadata', 'src_associations', @@ -2609,7 +2647,8 @@ class DBConn(object): mapper(ACLPerSource, self.tbl_acl_per_source, properties = dict( acl = relation(ACL), - fingerprint = relation(Fingerprint), + fingerprint = relation(Fingerprint, primaryjoin=(self.tbl_acl_per_source.c.fingerprint_id == self.tbl_fingerprint.c.id)), + created_by = relation(Fingerprint, primaryjoin=(self.tbl_acl_per_source.c.created_by_id == self.tbl_fingerprint.c.id)), )) mapper(Archive, self.tbl_archive, @@ -2687,7 +2726,8 @@ class DBConn(object): mapper(Keyring, self.tbl_keyrings, properties = dict(keyring_name = self.tbl_keyrings.c.name, - keyring_id = self.tbl_keyrings.c.id)) + keyring_id = self.tbl_keyrings.c.id, + acl = relation(ACL, primaryjoin=(self.tbl_keyrings.c.acl_id == self.tbl_acl.c.id)))), mapper(DBChange, self.tbl_changes, properties = dict(change_id = self.tbl_changes.c.id, @@ -2711,7 +2751,8 @@ class DBConn(object): extension = validator) mapper(NewComment, self.tbl_new_comments, - properties = dict(comment_id = self.tbl_new_comments.c.id)) + properties = dict(comment_id = self.tbl_new_comments.c.id, + policy_queue = relation(PolicyQueue))) mapper(Override, self.tbl_override, properties = dict(suite_id = self.tbl_override.c.suite, @@ -2761,6 +2802,8 @@ class DBConn(object): properties = dict(section_id = self.tbl_section.c.id, section=self.tbl_section.c.section)) + mapper(SignatureHistory, self.tbl_signature_history) + mapper(DBSource, self.tbl_source, properties = dict(source_id = self.tbl_source.c.id, version = self.tbl_source.c.version, @@ -2793,7 +2836,10 @@ class DBConn(object): srcformats = relation(SrcFormat, secondary=self.tbl_suite_src_formats, backref=backref('suites', lazy='dynamic')), archive = relation(Archive, backref='suites'), - acls = relation(ACL, secondary=self.tbl_suite_acl_map, collection_class=set)), + acls = relation(ACL, secondary=self.tbl_suite_acl_map, collection_class=set), + components = relation(Component, secondary=self.tbl_component_suite, + order_by=self.tbl_component.c.ordering, + backref=backref('suite'))), extension = validator) mapper(Uid, self.tbl_uid, @@ -2864,7 +2910,7 @@ class DBConn(object): engine_args['pool_size'] = int(cnf['DB::PoolSize']) if cnf.has_key('DB::MaxOverflow'): engine_args['max_overflow'] = int(cnf['DB::MaxOverflow']) - if sa_major_version == '0.6' and cnf.has_key('DB::Unicode') and \ + if sa_major_version != '0.5' and cnf.has_key('DB::Unicode') and \ cnf['DB::Unicode'] == 'false': engine_args['use_native_unicode'] = False