X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FGetKeys.py;h=2d7550ca028b39af6a0f5bc62aaaeec6dbc58428;hb=454ed505788aacb55658479b06fa05a9d73cc74e;hp=80c45381cc77ff8c3e6e11ae0b46821a7c626a5f;hpb=7f8fff0ec9405fa80ded520791d39b422f93666f;p=plcapi.git diff --git a/PLC/Methods/GetKeys.py b/PLC/Methods/GetKeys.py index 80c4538..2d7550c 100644 --- a/PLC/Methods/GetKeys.py +++ b/PLC/Methods/GetKeys.py @@ -1,39 +1,41 @@ from PLC.Faults import * from PLC.Method import Method from PLC.Parameter import Parameter, Mixed +from PLC.Filter import Filter +from PLC.Persons import Person, Persons from PLC.Keys import Key, Keys -from PLC.Auth import PasswordAuth +from PLC.Auth import Auth class GetKeys(Method): """ - Return an array of structs containing details about keys. If - key_id_list is specified, only the specified keys will be queried. + Returns an array of structs containing details about keys. If + key_filter is specified and is an array of key identifiers, or a + struct of key attributes, only keys matching the filter will be + returned. If return_fields is specified, only the specified + details will be returned. Admin may query all keys. Non-admins may only query their own keys. """ - roles = ['admin', 'pi', 'user', 'tech'] + roles = ['admin', 'pi', 'user', 'tech', 'node'] accepts = [ - PasswordAuth(), - [Key.fields['key_id']] + Auth(), + Mixed([Mixed(Key.fields['key_id'])], + Filter(Key.fields)), + Parameter([str], "List of fields to return", nullok = True) ] returns = [Key.fields] - def call(self, auth, key_id_list = None): + + def call(self, auth, key_filter = None, return_fields = None): + keys = Keys(self.api, key_filter, return_fields) + # If we are not admin, make sure to only return our own keys - if 'admin' not in self.caller['roles']: - if not key_id_list: - key_id_list = self.caller['key_ids'] - else: - valid_keys = lambda x: x in self.caller['key_ids'] - key_id_list = filter(valid_keys, key_id_list) - - keys = Keys(self.api, key_id_list).values() - - # Turn each key into a real dict - keys = [dict(key.items()) for key in keys] - + if isinstance(self.caller, Person) and \ + 'admin' not in self.caller['roles']: + keys = filter(lambda key: key['key_id'] in self.caller['key_ids'], keys) + return keys