Index: masquerade.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/masquerade/masquerade.module,v
retrieving revision 1.16.2.30
diff -u -r1.16.2.30 masquerade.module
--- masquerade.module 30 Oct 2009 23:07:58 -0000 1.16.2.30
+++ masquerade.module 23 Feb 2010 16:02:18 -0000
@@ -583,36 +585,27 @@
return drupal_goto(referer_uri());
}
- $new_user = user_load(array('uid' => $uid));
-
- $roles = array_keys(array_filter(variable_get('masquerade_admin_roles', array())));
- $perm = $uid == 1 || array_intersect(array_keys($new_user->roles), $roles) ?
- 'masquerade as admin' :
- 'masquerade as user';
+ if (masquerade_check_user($uid)) {
+ $new_user = user_load(array('uid' => $uid));
- // check to see if we need admin permission
- if (!user_access($perm) && !$_SESSION['masquerading'] && !db_result(db_query("SELECT TRUE FROM {masquerade_users} WHERE uid_from = %d AND uid_to = %d", $user->uid, $new_user->uid))) {
- return drupal_access_denied();
- }
+ if (variable_get('site_offline', 0) && !user_access('administer site configuration', $new_user)) {
+ drupal_set_message(t('This user is not allowed to access the site while the site is in off-line mode. Please set the site status to "online" to switch to this user.', array('@site-maintenance' => url('admin/settings/site-maintenance'))), 'error');
+ return drupal_access_denied();
+ }
- if ($user->uid == $uid || isset($user->masquerading)) {
- return drupal_access_denied();
+ db_query("INSERT INTO {masquerade} (uid_from, uid_as, sid) VALUES (%d, %d, '%s')",
+ $user->uid, $new_user->uid, session_id());
+ // switch user
+
+ watchdog('masquerade', 'User %user now masquerading as %masq_as.', array('%user' => $user->name, '%masq_as' => $new_user->name ? $new_user->name : variable_get('anonymous', 'Anonymous')), WATCHDOG_INFO);
+ drupal_set_message(t('You are now masquerading as %masq_as.', array('%masq_as' => $new_user->name ? $new_user->name : variable_get('anonymous', 'Anonymous'))));
+ $user->masquerading = $new_user->uid;
+ $user = $new_user;
+ drupal_goto(referer_uri());
}
-
- if (variable_get('site_offline', 0) && !user_access('administer site configuration', $new_user)) {
- drupal_set_message(t('This user is not allowed to access the site while the site is in off-line mode. Please set the site status to "online" to switch to this user.', array('@site-maintenance' => url('admin/settings/site-maintenance'))), 'error');
+ else {
return drupal_access_denied();
}
-
- db_query("INSERT INTO {masquerade} (uid_from, uid_as, sid) VALUES (%d, %d, '%s')",
- $user->uid, $new_user->uid, session_id());
- // switch user
-
- watchdog('masquerade', 'User %user now masquerading as %masq_as.', array('%user' => $user->name, '%masq_as' => $new_user->name ? $new_user->name : variable_get('anonymous', 'Anonymous')), WATCHDOG_INFO);
- drupal_set_message(t('You are now masquerading as %masq_as.', array('%masq_as' => $new_user->name ? $new_user->name : variable_get('anonymous', 'Anonymous'))));
- $user->masquerading = $new_user->uid;
- $user = $new_user;
- drupal_goto(referer_uri());
}
/**
@@ -632,3 +625,50 @@
drupal_set_message(t('You are no longer masquerading as %masq_as and are now logged in as %user.', array('%user' => $user->name, '%masq_as' => $oldname)));
drupal_goto(referer_uri());
}
+
+/**
+ * Helper function that checks if user has the right permissions to become
+ * the selected user.
+ */
+function masquerade_check_user($uid) {
+ global $user;
+
+ // noone has permission to masquerade as a non-existent user.
+ if (!is_numeric($uid)) {
+ return FALSE;
+ }
+
+ //Implement masquerade_increase_user_access
+ $tmp = module_invoke_all('masquerade_increase_user_access', $uid);
+ foreach($tmp as $temp => $allowed) {
+ if ($allowed)
+ return TRUE;
+ }
+
+ $new_user = user_load(array('uid' => $uid));
+
+ $roles = array_keys(array_filter(variable_get('masquerade_admin_roles', array())));
+ $perm = $uid == 1 || array_intersect(array_keys($new_user->roles), $roles) ?
+ 'masquerade as admin' :
+ 'masquerade as user';
+
+ // check to see if we need admin permission
+ if (!user_access($perm) && !$_SESSION['masquerading'] && !db_result(db_query("SELECT TRUE FROM {masquerade_users} WHERE uid_from = %d AND uid_to = %d", $user->uid, $new_user->uid))) {
+ return FALSE;
+ }
+
+ // masquerading as yourself or recursivly is prohibitted.
+ if ($user->uid == $uid || isset($user->masquerading)) {
+ return FALSE;
+ }
+
+
+ //Implement masquerade_limit_user_access
+ $tmp = module_invoke_all('masquerade_limit_user_access', $uid);
+ foreach($tmp as $temp => $allowed) {
+ if (!$allowed)
+ return FALSE;
+ }
+
+ return TRUE;
+}