/** * This handler keeps track of the keys. The keys are arranged in * groups and each key type in the group has a name and a set of * permissions associated with it. * @author Deutha */ #define RESTORE_PATH "/save/keys/" inherit "/std/object"; mapping keys; mapping key_names; nosave string _current_group; /** * This sets up the variables with the correct statup values. * @param group the key ground to initialise */ private void init_data( string group ) { keys = ([ ]); key_names = ([ ]); } /* init_data() */ /** * This gets all the current data for a specified key group. * @param group the key group to get the data for * @return 0 if the group was not found */ private int get_data_file( string group ) { if (_current_group == group) { return 1; } _current_group = group; if ( file_size( RESTORE_PATH + group +".o" ) > 0 ) { unguarded((: restore_object, RESTORE_PATH + group :)); } else { init_data( group ); return 0; } return 1; } /* get_data_file() */ /** * This method saves the data currently in memory to the specified key * group. */ private void save_data_file( ) { unguarded((: save_object, RESTORE_PATH + _current_group :)); } /* save_data_file() */ /** * This method returns all the keys in the current group. The mapping * consists has an index of the key name and a value of an array of * key permission types. * @param group the key group to get permissions for * @return a mapping containing all the permissions * @see remove_key_permission() * @see add_key_permission() * @see query_key_permission() * @see set_key_permissions() * @see query_all_key_permissions() */ mapping query_all_keys( string group ) { get_data_file( group ); return keys; } /* query_all_keys() */ /** * This method should never be called. It assumes internal knowedge. * Bad bad bad! * @ignore yes */ private void set_keys( string group, mapping list ) { get_data_file( group ); keys = list; save_data_file( ); } /* set_keys() */ /** * This method returns all the permision types associated with the key. * The permission types are an array of string permision type names. If * the key name is non-existant an empty array will be returned. * @param group the key group to lookup * @param key the key name to lookup * @return the array of permission types * @see remove_key_permission() * @see add_key_permission() * @see query_key_permission() * @see set_key_permissions() * @see query_all_keys() */ string *query_all_key_permissions( string group, string key ) { get_data_file( group ); if ( !keys[ key ] ) { return ({ }); } return keys[ key ]; } /* query_all_key_permissions() */ /** * This method will set the key permissions for a certain sort of * key. It will overwrite any current possible key permission sets. * @param group the key group to set the permissions for * @param key the key to set the permission for * @param types the new set of permission types * @see remove_key_permission() * @see add_key_permission() * @see query_key_permission() * @see query_all_key_permissions() * @see query_all_keys() */ void set_key_permissions( string group, string key, string *types ) { get_data_file( group ); if (sizeof(types)) { keys[ key ] = types; } else { map_delete(keys, key); } save_data_file( ); } /* set_key_permissions() */ /** * This method will see if the given key perrmision exists for this * key in this particular group and key. * @param group the key group to look up in * @param key the key to check * @param type the permission type to see if it exists * @return 1 if the permission exists, 0 if not * @see remove_key_permission() * @see add_key_permission() * @see set_key_permissions() * @see query_all_key_permissions() * @see query_all_keys() */ int query_key_permission( string group, string key, string type ) { get_data_file( group ); if ( !keys[ key ] ) { return 0; } if ( member_array( type, keys[ key ] ) == -1 ) { return 0; } return 1; } /* query_key_permission() */ /** * This method adds in a specific permission type into the current * permission set for this key. * @param group the key group to add the permision to * @param key the key to add the permission for * @param type the permission type to add in * @return 0 if it is already added, 1 if not * @see remove_key_permission() * @see query_key_permission() * @see set_key_permissions() * @see query_all_key_permissions() * @see query_all_keys() */ int add_key_permission( string group, string key, string type ) { get_data_file( group ); if ( !keys[ key ] ) { keys[ key ] = ({ }); } if ( member_array( type, keys[ key ] ) != -1 ) { return 0; } keys[ key ] += ({ type }); save_data_file( ); return 1; } /* add_key_permission() */ /** * This method removes a specific permission type from the given * key group and key. * @param group the key group to remove the key from * @param key the key to remove the permission from * @param type the type of permission to remove * @return 0 if the permission was not remove, 1 if it was * @see add_key_permission() * @see query_key_permission() * @see set_key_permissions() * @see query_all_key_permissions() * @see query_all_keys() */ int remove_key_permission( string group, string key, string type ) { int i; get_data_file( group ); if ( !keys[ key ] ) { return 0; } if ( ( i = member_array( type, keys[ key ] ) ) == -1 ) { return 0; } keys[ key ] = delete( keys[ key ], i, 1 ); if (!sizeof(keys[key])) { map_delete(keys, key); } save_data_file( ); return 1; } /* remove_key_permission() */ /** * This method returns all the key names for the given key group. * The index of the mapping is the key type and the value is its name. * @param group the key group * @return the mapping containing the key names * @see delete_key_name() * @see set_key_name() * @see query_key_name() */ mapping query_all_key_names( string group ) { get_data_file( group ); return key_names; } /* query_all_key_names() */ private void set_key_names( string group, mapping list ) { get_data_file( group ); key_names = list; save_data_file( ); } /* set_key_names() */ /** * This method returns the key name for a given key. * @param group the key group to lookup * @param key the key type to look up * @return the key's name * @see delete_key_name() * @see set_key_name() * @see query_all_key_names() */ string query_key_name( string group, string key ) { get_data_file( group ); return key_names[ key ]; } /* query_key_name() */ /** * This method sets the name of the specified key. * @param group the group to set the name of the key in * @param key the type of key to set the name for * @param name the name of the key to set * @see delete_key_name() * @see query_key_name() * @see query_all_key_names() */ void set_key_name( string group, string key, string name ) { get_data_file( group ); key_names[ key ] = name; save_data_file( ); } /* set_key_name() */ /** * This method removes a specified key name from the current key name * mapping. * @param group the group to remove the key from * @param key the key type to remove the name of * @see set_key_name() * @see query_key_name() * @see query_all_key_names() */ void delete_key_name( string group, string key ) { get_data_file( group ); if ( !key_names[ key ] ) { return; } map_delete( key_names, key ); save_data_file( ); } /* delete_key_name() */