X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fdbconn.py;h=a90ad10229d052ad83a6f870de5b3e32bc751db9;hb=99475d30981c1952e61c5390cd243afff7888388;hp=293f4dcb799e7abcf0587194dfa593925e1df58d;hpb=54903526ea5f9cd14103bcd3d312683e004c94d4;p=dak.git diff --git a/daklib/dbconn.py b/daklib/dbconn.py index 293f4dcb..a90ad102 100644 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -369,6 +369,20 @@ validator = Validator() ################################################################################ +class ACL(ORMObject): + def __repr__(self): + return "".format(self.name) + +__all__.append('ACL') + +class ACLPerSource(ORMObject): + def __repr__(self): + return "".format(self.acl.name, self.fingerprint.fingerprint, self.source, self.reason) + +__all__.append('ACLPerSource') + +################################################################################ + class Architecture(ORMObject): def __init__(self, arch_string = None, description = None): self.arch_string = arch_string @@ -642,28 +656,6 @@ __all__.append('get_component_by_package_suite') ################################################################################ -class BinaryACL(object): - def __init__(self, *args, **kwargs): - pass - - def __repr__(self): - return '' % self.binary_acl_id - -__all__.append('BinaryACL') - -################################################################################ - -class BinaryACLMap(object): - def __init__(self, *args, **kwargs): - pass - - def __repr__(self): - return '' % self.binary_acl_map_id - -__all__.append('BinaryACLMap') - -################################################################################ - class BuildQueue(object): def __init__(self, *args, **kwargs): pass @@ -1038,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 @@ -1256,8 +1250,19 @@ 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: + # 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) + l.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_HARD) + l.set_option(ldap.OPT_X_TLS_CACERTDIR, None) + l.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"]), @@ -1365,17 +1370,6 @@ __all__.append('get_primary_keyring_path') ################################################################################ -class KeyringACLMap(object): - def __init__(self, *args, **kwargs): - pass - - def __repr__(self): - return '' % self.keyring_acl_map_id - -__all__.append('KeyringACLMap') - -################################################################################ - class DBChange(object): def __init__(self, *args, **kwargs): pass @@ -1493,7 +1487,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. @@ -1511,7 +1505,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) @@ -1520,7 +1514,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 @@ -1542,7 +1536,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) @@ -1869,6 +1863,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 @@ -2157,17 +2171,6 @@ __all__.append('import_metadata_into_db') ################################################################################ -class SourceACL(object): - def __init__(self, *args, **kwargs): - pass - - def __repr__(self): - return '' % self.source_acl_id - -__all__.append('SourceACL') - -################################################################################ - class SrcFormat(object): def __init__(self, *args, **kwargs): pass @@ -2417,17 +2420,6 @@ __all__.append('get_uid_from_fingerprint') ################################################################################ -class UploadBlock(object): - def __init__(self, *args, **kwargs): - pass - - def __repr__(self): - return '' % (self.source, self.upload_block_id) - -__all__.append('UploadBlock') - -################################################################################ - class MetadataKey(ORMObject): def __init__(self, key = None): self.key = key @@ -2551,14 +2543,16 @@ class DBConn(object): def __setuptables(self): tables = ( + 'acl', + 'acl_architecture_map', + 'acl_fingerprint_map', + 'acl_per_source', 'architecture', 'archive', 'bin_associations', 'bin_contents', 'binaries', 'binaries_metadata', - 'binary_acl', - 'binary_acl_map', 'build_queue', 'changelogs_text', 'changes', @@ -2571,7 +2565,6 @@ class DBConn(object): 'files_archive_map', 'fingerprint', 'keyrings', - 'keyring_acl_map', 'maintainer', 'metadata_keys', 'new_comments', @@ -2584,19 +2577,19 @@ class DBConn(object): 'policy_queue_byhand_file', 'priority', 'section', + 'signature_history', 'source', - 'source_acl', 'source_metadata', 'src_associations', 'src_contents', 'src_format', 'src_uploaders', 'suite', + 'suite_acl_map', 'suite_architectures', 'suite_build_queue_copy', 'suite_src_formats', 'uid', - 'upload_blocks', 'version_check', ) @@ -2639,6 +2632,21 @@ class DBConn(object): backref=backref('architectures', order_by=self.tbl_architecture.c.arch_string))), extension = validator) + mapper(ACL, self.tbl_acl, + properties = dict( + architectures = relation(Architecture, secondary=self.tbl_acl_architecture_map, collection_class=set), + fingerprints = relation(Fingerprint, secondary=self.tbl_acl_fingerprint_map, collection_class=set), + match_keyring = relation(Keyring, primaryjoin=(self.tbl_acl.c.match_keyring_id == self.tbl_keyrings.c.id)), + per_source = relation(ACLPerSource, collection_class=set), + )) + + mapper(ACLPerSource, self.tbl_acl_per_source, + properties = dict( + acl = relation(ACL), + 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, properties = dict(archive_id = self.tbl_archive.c.id, archive_name = self.tbl_archive.c.name)) @@ -2676,14 +2684,6 @@ class DBConn(object): collection_class=attribute_mapped_collection('key'))), extension = validator) - mapper(BinaryACL, self.tbl_binary_acl, - properties = dict(binary_acl_id = self.tbl_binary_acl.c.id)) - - mapper(BinaryACLMap, self.tbl_binary_acl_map, - properties = dict(binary_acl_map_id = self.tbl_binary_acl_map.c.id, - fingerprint = relation(Fingerprint, backref="binary_acl_map"), - architecture = relation(Architecture))) - mapper(Component, self.tbl_component, properties = dict(component_id = self.tbl_component.c.id, component_name = self.tbl_component.c.name), @@ -2717,13 +2717,13 @@ class DBConn(object): uid = relation(Uid), keyring_id = self.tbl_fingerprint.c.keyring, keyring = relation(Keyring), - source_acl = relation(SourceACL), - binary_acl = relation(BinaryACL)), + acl = relation(ACL)), extension = validator) 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, @@ -2738,11 +2738,6 @@ class DBConn(object): date = self.tbl_changes.c.date, version = self.tbl_changes.c.version)) - mapper(KeyringACLMap, self.tbl_keyring_acl_map, - properties = dict(keyring_acl_map_id = self.tbl_keyring_acl_map.c.id, - keyring = relation(Keyring, backref="keyring_acl_map"), - architecture = relation(Architecture))) - mapper(Maintainer, self.tbl_maintainer, properties = dict(maintainer_id = self.tbl_maintainer.c.id, maintains_sources = relation(DBSource, backref='maintainer', @@ -2752,7 +2747,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, @@ -2802,6 +2798,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, @@ -2821,9 +2819,6 @@ class DBConn(object): collection_class=attribute_mapped_collection('key'))), extension = validator) - mapper(SourceACL, self.tbl_source_acl, - properties = dict(source_acl_id = self.tbl_source_acl.c.id)) - mapper(SrcFormat, self.tbl_src_format, properties = dict(src_format_id = self.tbl_src_format.c.id, format_name = self.tbl_src_format.c.format_name)) @@ -2831,11 +2826,13 @@ class DBConn(object): mapper(Suite, self.tbl_suite, properties = dict(suite_id = self.tbl_suite.c.id, policy_queue = relation(PolicyQueue, primaryjoin=(self.tbl_suite.c.policy_queue_id == self.tbl_policy_queue.c.id)), + new_queue = relation(PolicyQueue, primaryjoin=(self.tbl_suite.c.new_queue_id == self.tbl_policy_queue.c.id)), copy_queues = relation(BuildQueue, secondary=self.tbl_suite_build_queue_copy), srcformats = relation(SrcFormat, secondary=self.tbl_suite_src_formats, backref=backref('suites', lazy='dynamic')), - archive = relation(Archive, backref='suites')), + archive = relation(Archive, backref='suites'), + acls = relation(ACL, secondary=self.tbl_suite_acl_map, collection_class=set)), extension = validator) mapper(Uid, self.tbl_uid, @@ -2843,11 +2840,6 @@ class DBConn(object): fingerprint = relation(Fingerprint)), extension = validator) - mapper(UploadBlock, self.tbl_upload_blocks, - properties = dict(upload_block_id = self.tbl_upload_blocks.c.id, - fingerprint = relation(Fingerprint, backref="uploadblocks"), - uid = relation(Uid, backref="uploadblocks"))) - mapper(BinContents, self.tbl_bin_contents, properties = dict( binary = relation(DBBinary, @@ -2911,7 +2903,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 in ('0.6', '0.7') and cnf.has_key('DB::Unicode') and \ cnf['DB::Unicode'] == 'false': engine_args['use_native_unicode'] = False