From 3e3a4cdc823571fbf7248d027a8374b37a708615 Mon Sep 17 00:00:00 2001 From: Mark Huang Date: Tue, 10 Oct 2006 22:09:31 +0000 Subject: [PATCH] add key_types interface --- PLC/KeyTypes.py | 73 ++++++++++++++++++++++++++++++++++++ PLC/Methods/AddKeyType.py | 28 ++++++++++++++ PLC/Methods/DeleteKeyType.py | 33 ++++++++++++++++ PLC/Methods/GetKeyTypes.py | 21 +++++++++++ 4 files changed, 155 insertions(+) create mode 100644 PLC/KeyTypes.py create mode 100644 PLC/Methods/AddKeyType.py create mode 100644 PLC/Methods/DeleteKeyType.py create mode 100644 PLC/Methods/GetKeyTypes.py diff --git a/PLC/KeyTypes.py b/PLC/KeyTypes.py new file mode 100644 index 0000000..0b0d16e --- /dev/null +++ b/PLC/KeyTypes.py @@ -0,0 +1,73 @@ +# +# Functions for interacting with the key_types table in the database +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: KeyTypes.py,v 1.1 2006/10/10 20:24:06 mlhuang Exp $ +# + +from PLC.Faults import * +from PLC.Parameter import Parameter +from PLC.Table import Row, Table + +class KeyType(Row): + """ + Representation of a row in the key_types table. To use, + instantiate with a dict of values. + """ + + table_name = 'key_types' + primary_key = 'key_type' + fields = { + 'key_type': Parameter(str, "Key type", max = 20), + } + + def __init__(self, api, fields = {}): + Row.__init__(self, fields) + self.api = api + + def validate_key_type(self, name): + # Remove leading and trailing spaces + name = name.strip() + + # Make sure name is not blank after we removed the spaces + if not name: + raise PLCInvalidArgument, "Key type must be specified" + + # Make sure key type does not alredy exist + conflicts = KeyTypes(self.api, [name]) + if conflicts: + raise PLCInvalidArgument, "Key type name already in use" + + return name + + def delete(self, commit = True): + assert 'key_type' in self + + # Clean up miscellaneous join tables + for table in ['keys', 'key_types']: + self.api.db.do("DELETE FROM " + table + \ + " WHERE key_type = %(key_type)s", + self) + + if commit: + self.api.db.commit() + +class KeyTypes(Table): + """ + Representation of the key_types table in the database. + """ + + def __init__(self, api, names = None): + sql = "SELECT %s FROM key_types" % \ + ", ".join(KeyType.fields) + + if names: + # Separate the list into integers and strings + sql += " WHERE key_type IN (%s)" % ", ".join(api.db.quote(names)) + + rows = api.db.selectall(sql) + + for row in rows: + self[row['key_type']] = KeyType(api, row) diff --git a/PLC/Methods/AddKeyType.py b/PLC/Methods/AddKeyType.py new file mode 100644 index 0000000..86c2bc9 --- /dev/null +++ b/PLC/Methods/AddKeyType.py @@ -0,0 +1,28 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Auth import PasswordAuth + +class AddKeyType(Method): + """ + Adds a new key type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + PasswordAuth(), + KeyType.fields['key_type'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, name): + key_type = KeyType(self.api) + key_type['key_type'] = name + key_type.sync() + + return 1 diff --git a/PLC/Methods/DeleteKeyType.py b/PLC/Methods/DeleteKeyType.py new file mode 100644 index 0000000..9f230a9 --- /dev/null +++ b/PLC/Methods/DeleteKeyType.py @@ -0,0 +1,33 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Auth import PasswordAuth + +class DeleteKeyType(Method): + """ + Deletes a key type. + + WARNING: This will cause the deletion of all keys of this type. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + PasswordAuth(), + KeyType.fields['key_type'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, name): + key_types = KeyTypes(self.api, [name]) + if not key_types: + raise PLCInvalidArgument, "No such key type" + key_type = key_types.values()[0] + + key_type.delete() + + return 1 diff --git a/PLC/Methods/GetKeyTypes.py b/PLC/Methods/GetKeyTypes.py new file mode 100644 index 0000000..64e9399 --- /dev/null +++ b/PLC/Methods/GetKeyTypes.py @@ -0,0 +1,21 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.KeyTypes import KeyType, KeyTypes +from PLC.Auth import PasswordAuth + +class GetKeyTypes(Method): + """ + Returns a list of all valid key types. + """ + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + PasswordAuth() + ] + + returns = [KeyType.fields['key_type']] + + def call(self, auth): + return [key_type['key_type'] for key_type in KeyTypes(self.api).values()] -- 2.43.0