X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FKeys.py;h=ebabd190d555e7e02207700598d0e0db217ad603;hb=bd0cbf4f7f2e4cf7ceda500bfa6f98c0a700018b;hp=c6011959f57bb394e9bb0c873898badc96859e59;hpb=619bbb1a7acb1fcbd68567529913b120678ecc1b;p=plcapi.git diff --git a/PLC/Keys.py b/PLC/Keys.py index c601195..ebabd19 100644 --- a/PLC/Keys.py +++ b/PLC/Keys.py @@ -2,41 +2,46 @@ import re from PLC.Faults import * from PLC.Parameter import Parameter +from PLC.Filter import Filter from PLC.Debug import profile from PLC.Table import Row, Table from PLC.KeyTypes import KeyType, KeyTypes class Key(Row): """ - Representation of a row in the keys table. To use, instantiate with a - dict of values. Update as you would a dict. Commit to the database + Representation of a row in the keys table. To use, instantiate with a + dict of values. Update as you would a dict. Commit to the database with sync(). """ table_name = 'keys' primary_key = 'key_id' - join_tables = ['person_key'] + join_tables = ['person_key', 'peer_key'] fields = { 'key_id': Parameter(int, "Key identifier"), 'key_type': Parameter(str, "Key type"), 'key': Parameter(str, "Key value", max = 4096), + 'person_id': Parameter(int, "User to which this key belongs", nullok = True), + 'peer_id': Parameter(int, "Peer to which this key belongs", nullok = True), + 'peer_key_id': Parameter(int, "Foreign key identifier at peer", nullok = True), } def validate_key_type(self, key_type): - if key_type not in KeyTypes(self.api): + key_types = [row['key_type'] for row in KeyTypes(self.api)] + if key_type not in key_types: raise PLCInvalidArgument, "Invalid key type" - return key_type + return key_type def validate_key(self, key): - # Key must not be blacklisted - rows = self.api.db.selectall("SELECT 1 from keys" \ - " WHERE key = %(key)s" \ + # Key must not be blacklisted + rows = self.api.db.selectall("SELECT 1 from keys" \ + " WHERE key = %(key)s" \ " AND is_blacklisted IS True", locals()) - if rows: + if rows: raise PLCInvalidArgument, "Key is blacklisted and cannot be used" - return key + return key def validate(self): # Basic validation @@ -62,13 +67,13 @@ class Key(Row): def blacklist(self, commit = True): """ - Permanently blacklist key (and all other identical keys), - preventing it from ever being added again. Because this could - affect multiple keys associated with multiple accounts, it - should be admin only. - """ + Permanently blacklist key (and all other identical keys), + preventing it from ever being added again. Because this could + affect multiple keys associated with multiple accounts, it + should be admin only. + """ - assert 'key_id' in self + assert 'key_id' in self assert 'key' in self # Get all matching keys @@ -82,8 +87,8 @@ class Key(Row): self.api.db.do("UPDATE keys SET is_blacklisted = True" \ " WHERE key_id IN (%s)" % ", ".join(map(str, key_ids))) - # But disassociate them from all join tables - for table in ['person_key']: + # But disassociate them from all join tables + for table in self.join_tables: self.api.db.do("DELETE FROM %s WHERE key_id IN (%s)" % \ (table, ", ".join(map(str, key_ids)))) @@ -96,13 +101,19 @@ class Keys(Table): database. """ - def __init__(self, api, key_ids = None, is_blacklisted = False): - Table.__init__(self, api, Key) - - sql = "SELECT %s FROM keys WHERE is_blacklisted IS False" % \ - ", ".join(Key.fields) + def __init__(self, api, key_filter = None, columns = None): + Table.__init__(self, api, Key, columns) + + sql = "SELECT %s FROM view_keys WHERE is_blacklisted IS False" % \ + ", ".join(self.columns) - if key_ids: - sql += " AND key_id IN (%s)" % ", ".join(map(str, key_ids)) + if key_filter is not None: + if isinstance(key_filter, (list, tuple, set, int, long)): + key_filter = Filter(Key.fields, {'key_id': key_filter}) + elif isinstance(key_filter, dict): + key_filter = Filter(Key.fields, key_filter) + else: + raise PLCInvalidArgument, "Wrong key filter %r"%key_filter + sql += " AND (%s) %s" % key_filter.sql(api) - self.selectall(sql) + self.selectall(sql)