- merge from PlanetLab Europe
[plcapi.git] / PLC / Methods / AddPersonKey.py
index b4ba0d3..aa4ed00 100644 (file)
@@ -3,7 +3,9 @@ from PLC.Method import Method
 from PLC.Parameter import Parameter, Mixed
 from PLC.Keys import Key, Keys
 from PLC.Persons import Person, Persons
 from PLC.Parameter import Parameter, Mixed
 from PLC.Keys import Key, Keys
 from PLC.Persons import Person, Persons
-from PLC.Auth import PasswordAuth
+from PLC.Auth import Auth
+
+can_update = lambda (field, value): field in ['key_type','key']
 
 class AddPersonKey(Method):
     """
 
 class AddPersonKey(Method):
     """
@@ -16,34 +18,42 @@ class AddPersonKey(Method):
 
     roles = ['admin', 'pi', 'tech', 'user']
 
 
     roles = ['admin', 'pi', 'tech', 'user']
 
+    key_fields = dict(filter(can_update, Key.fields.items()))
+
     accepts = [
     accepts = [
-        PasswordAuth(),
+        Auth(),
         Mixed(Person.fields['person_id'],
               Person.fields['email']),
         Mixed(Person.fields['person_id'],
               Person.fields['email']),
-        Key.fields['key_type'],
-        Key.fields['key']
+        key_fields
         ]
 
     returns = Parameter(int, 'New key_id (> 0) if successful')
 
         ]
 
     returns = Parameter(int, 'New key_id (> 0) if successful')
 
-    def call(self, auth, person_id_or_email, key_type, key_value):
+    def call(self, auth, person_id_or_email, key_fields):
+        key_fields = dict(filter(can_update, key_fields.items()))
+
         # Get account details
         # Get account details
-        persons = Persons(self.api, [person_id_or_email]).values()
+        persons = Persons(self.api, [person_id_or_email])
         if not persons:
             raise PLCInvalidArgument, "No such account"
         person = persons[0]
 
         if not persons:
             raise PLCInvalidArgument, "No such account"
         person = persons[0]
 
+        if person['peer_id'] is not None:
+            raise PLCInvalidArgument, "Not a local account"
+
        # If we are not admin, make sure caller is adding a key to their account
         if 'admin' not in self.caller['roles']:
             if person['person_id'] != self.caller['person_id']:
                 raise PLCPermissionDenied, "You may only modify your own keys"
 
        # If we are not admin, make sure caller is adding a key to their account
         if 'admin' not in self.caller['roles']:
             if person['person_id'] != self.caller['person_id']:
                 raise PLCPermissionDenied, "You may only modify your own keys"
 
-        key = Key(self.api)
-        key['person_id'] = person['person_id']
-        key['key_type'] = key_type
-        key['key'] = key_value
+        key = Key(self.api, key_fields)
         key.sync(commit = False)
         key.sync(commit = False)
-
         person.add_key(key, commit = True)
         person.add_key(key, commit = True)
-        
+
+        # Logging variables
+       self.event_objects = {'Person': [person['person_id']],
+                             'Key': [key['key_id']]}
+       self.message = 'Key %d added to person %d' % \
+               (key['key_id'], person['person_id'])
+
         return key['key_id']
         return key['key_id']