remove simplejson dependency
[plcapi.git] / PLC / Keys.py
index 9af1e6c..ebabd19 100644 (file)
@@ -9,42 +9,39 @@ 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),
-        'peer_id': Parameter(int, "Peer at which this node is managed", nullok = True),
+        '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),
         }
 
-    # for Cache
-    class_key= 'key'
-    foreign_fields = ['key_type']
-    foreign_xrefs = {}
-
     def validate_key_type(self, key_type):
         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
@@ -70,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
@@ -90,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))))
 
@@ -106,15 +103,17 @@ class Keys(Table):
 
     def __init__(self, api, key_filter = None, columns = None):
         Table.__init__(self, api, Key, columns)
-       
-       sql = "SELECT %s FROM keys WHERE is_blacklisted IS False" % \
+
+        sql = "SELECT %s FROM view_keys WHERE is_blacklisted IS False" % \
               ", ".join(self.columns)
 
         if key_filter is not None:
-            if isinstance(key_filter, (list, tuple, set)):
+            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)
-            sql += " AND (%s)" % key_filter.sql(api)
+            else:
+                raise PLCInvalidArgument, "Wrong key filter %r"%key_filter
+            sql += " AND (%s) %s" % key_filter.sql(api)
 
-       self.selectall(sql)
+        self.selectall(sql)