From 1d85bfece1ac3d6de3b4c350cbb617982e9d8638 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 22 Oct 2010 10:31:50 -0400 Subject: New events when granting and revoking roles Four new events for when roles are granted or revoked. --- EVENTS.txt | 16 +++++++++++++++ classes/Profile.php | 57 +++++++++++++++++++++++++++++++---------------------- 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/EVENTS.txt b/EVENTS.txt index e5cafa857..8e730945a 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -1142,3 +1142,19 @@ StartShowNoticeForm: before showing the notice form (before
) EndShowNoticeForm: after showing the notice form (after ) - $action: action being executed + +StartGrantRole: when a role is being assigned +- $profile: profile that will have the role +- $role: string name of the role + +EndGrantRole: when a role has been successfully assigned +- $profile: profile that will have the role +- $role: string name of the role + +StartRevokeRole: when a role is being revoked +- $profile: profile that will lose the role +- $role: string name of the role + +EndRevokeRole: when a role has been revoked +- $profile: profile that lost the role +- $role: string name of the role diff --git a/classes/Profile.php b/classes/Profile.php index a32051d07..cb5ca54b0 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -758,43 +758,52 @@ class Profile extends Memcached_DataObject function grantRole($name) { - $role = new Profile_role(); + if (Event::handle('StartGrantRole', array($this, $name))) { - $role->profile_id = $this->id; - $role->role = $name; - $role->created = common_sql_now(); + $role = new Profile_role(); - $result = $role->insert(); + $role->profile_id = $this->id; + $role->role = $name; + $role->created = common_sql_now(); - if (!$result) { - common_log_db_error($role, 'INSERT', __FILE__); - return false; + $result = $role->insert(); + + if (!$result) { + throw new Exception("Can't save role '$name' for profile '{$this->id}'"); + } + + Event::handle('EndGrantRole', array($this, $name)); } - return true; + return $result; } function revokeRole($name) { - $role = Profile_role::pkeyGet(array('profile_id' => $this->id, - 'role' => $name)); + if (Event::handle('StartRevokeRole', array($this, $name))) { - if (empty($role)) { - // TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. - // TRANS: %1$s is the role name, %2$s is the user ID (number). - throw new Exception(sprintf(_('Cannot revoke role "%1$s" for user #%2$d; does not exist.'),$name, $this->id)); - } + $role = Profile_role::pkeyGet(array('profile_id' => $this->id, + 'role' => $name)); - $result = $role->delete(); + if (empty($role)) { + // TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. + // TRANS: %1$s is the role name, %2$s is the user ID (number). + throw new Exception(sprintf(_('Cannot revoke role "%1$s" for user #%2$d; does not exist.'),$name, $this->id)); + } - if (!$result) { - common_log_db_error($role, 'DELETE', __FILE__); - // TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. - // TRANS: %1$s is the role name, %2$s is the user ID (number). - throw new Exception(sprintf(_('Cannot revoke role "%1$s" for user #%2$d; database error.'),$name, $this->id)); - } + $result = $role->delete(); - return true; + if (!$result) { + common_log_db_error($role, 'DELETE', __FILE__); + // TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. + // TRANS: %1$s is the role name, %2$s is the user ID (number). + throw new Exception(sprintf(_('Cannot revoke role "%1$s" for user #%2$d; database error.'),$name, $this->id)); + } + + Event::handle('EndRevokeRole', array($this, $name)); + + return true; + } } function isSandboxed() -- cgit v1.2.3