diff --git a/profiles/unl_profile/unl_profile.install b/profiles/unl_profile/unl_profile.install index 372523ea2ad8dae41a990007a828ad77fc80b00b..70224d08dfbe78655e6fe7b713ee6ccb06cb9d8b 100644 --- a/profiles/unl_profile/unl_profile.install +++ b/profiles/unl_profile/unl_profile.install @@ -226,13 +226,8 @@ EOF; 'default' => $new_prefix, // shared tables across all sites - 'authmap' => $shared_prefix, 'filter' => $shared_prefix, 'filter_format' => $shared_prefix, - 'role' => $shared_prefix, - 'sessions' => $shared_prefix, - 'users' => $shared_prefix, - 'users_roles' => $shared_prefix, 'wysiwyg' => $shared_prefix, ); @@ -243,6 +238,9 @@ EOF; foreach ($settings['databases']['value'] as &$database) { $database['default']['prefix'] = $new_prefixes; + if (!isset($database['slave'])) { + continue; + } foreach ($database['slave'] as &$slave_database) { $slave_database['prefix'] = $new_prefixes; } @@ -263,16 +261,12 @@ EOF; module_enable(array('unl_cas')); // Copy permissions from the parent site to the new site. - db_query("TRUNCATE ${new_prefix}role_permission")->execute(); + db_query("TRUNCATE {$new_prefix}role_permission")->execute(); // I'm using REPLACE because I keep getting duplicate entry errors, despite inserting into what should be an empty table. - db_query("REPLACE INTO ${new_prefix}role_permission (rid, permission, module) SELECT rid, permission, module FROM ${shared_prefix}role_permission")->execute(); + db_query("REPLACE INTO {$new_prefix}role_permission (rid, permission, module) SELECT rid, permission, module FROM {$shared_prefix}role_permission")->execute(); } - //$permissions = array_keys(module_invoke_all('permission')); - //print_r($permissions); - //user_role_grant_permissions(3, array($permissions)); - $files_dir = $settings_dir . '/files'; chmod($files_dir, 0777); diff --git a/sites/all/modules/unl/unl_cas.module b/sites/all/modules/unl/unl_cas.module index d31dfe42d9b3208098d2452593831289e9a71459..52bc00001957bdac47bd796ead807a3b51625a88 100644 --- a/sites/all/modules/unl/unl_cas.module +++ b/sites/all/modules/unl/unl_cas.module @@ -179,6 +179,69 @@ function unl_cas_import_user($username) { return $user; } +/** + * Implements hook_user_presave() + * + * On non-default sites, only allow users who are administrators on the default + * to be administrators. Also, automatically make users who are administrators + * on the default site an administrator on non-default sites. + */ +function unl_cas_user_presave(&$edit, $account, $category) { + if (conf_path() == 'sites/default') { + return; + } + + if (isset($account->name)) { + $username = $account->name; + } + else { + $username = $edit['name']; + } + + $local_admin_role_id = variable_get('user_admin_role'); + + if (_unl_cas_is_user_default_site_administrator($username)) { + $local_admin_role = user_role_load($local_admin_role_id); + $edit['roles'][$local_admin_role_id] = $local_admin_role->name; + } + else { + unset($edit['roles'][$local_admin_role_id]); + } +} + +/** + * Implements hook_user_login() + * + * On non-default sites, if a user with the administrator role logs in, verify + * that they are still an admin in the default site. If not, remove them from + * the role. + */ +function unl_cas_user_login(&$edit, $account) { + if (conf_path() == 'sites/default') { + return; + } + + if (!in_array(variable_get('user_admin_role'), array_keys($account->roles))) { + return; + } + + $edit = array( + 'roles' => $account->roles, + ); + user_save($account, $edit); +} + +function _unl_cas_is_user_default_site_administrator($username) { + require 'sites/default/settings.php'; + $shared_prefix = $databases['default']['default']['prefix']; + + $data = db_query("SELECT value FROM {$shared_prefix}variable WHERE name='user_admin_role'")->fetchCol(); + $shared_admin_role_id = unserialize($data[0]); + + $shared_admin_usernames = db_query("SELECT u.name FROM {$shared_prefix}users AS u JOIN {$shared_prefix}users_roles AS r ON u.uid = r.uid WHERE name=:name AND rid=:rid", array(':name' => $username, ':rid' => $shared_admin_role_id))->fetchCol(); + return count($shared_admin_usernames) > 0; +} + function unl_cas_preprocess_user_picture(&$variables) { //Default image: http://planetred.unl.edu/mod/profile/graphics/defaultmedium.gif if ($variables['account']->uid == 0) {