mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
BUG: cleaner can* methods for Member
This commit is contained in:
parent
0f08176c6c
commit
4b5bd2d744
@ -1464,85 +1464,99 @@ class Member extends DataObject implements TemplateGlobalProvider {
|
|||||||
return $labels;
|
return $labels;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Users can view their own record.
|
* Users can view their own record.
|
||||||
* Otherwise they'll need ADMIN or CMS_ACCESS_SecurityAdmin permissions.
|
* Otherwise they'll need ADMIN or CMS_ACCESS_SecurityAdmin permissions.
|
||||||
* This is likely to be customized for social sites etc. with a looser permission model.
|
* This is likely to be customized for social sites etc. with a looser permission model.
|
||||||
*/
|
*/
|
||||||
public function canView($member = null) {
|
public function canView($member = null) {
|
||||||
if(!$member || !(is_a($member, 'Member')) || is_numeric($member)) $member = Member::currentUser();
|
//get member
|
||||||
|
if(!($member instanceof Member)) {
|
||||||
|
$member = Member::currentUser();
|
||||||
|
}
|
||||||
|
//check for extensions, we do this first as they can overrule everything
|
||||||
|
$extended = $this->extendedCan(__FUNCTION__, $member);
|
||||||
|
if($extended !== null) {
|
||||||
|
return $extended;
|
||||||
|
}
|
||||||
|
|
||||||
// extended access checks
|
//need to be logged in and/or most checks below rely on $member being a Member
|
||||||
$results = $this->extend('canView', $member);
|
if(!$member) {
|
||||||
if($results && is_array($results)) {
|
return false;
|
||||||
if(!min($results)) return false;
|
}
|
||||||
else return true;
|
// members can usually view their own record
|
||||||
}
|
if($this->ID == $member->ID) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//standard check
|
||||||
|
return Permission::checkMember($member, 'CMS_ACCESS_SecurityAdmin');
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Users can edit their own record.
|
||||||
|
* Otherwise they'll need ADMIN or CMS_ACCESS_SecurityAdmin permissions
|
||||||
|
*/
|
||||||
|
public function canEdit($member = null) {
|
||||||
|
//get member
|
||||||
|
if(!($member instanceof Member)) {
|
||||||
|
$member = Member::currentUser();
|
||||||
|
}
|
||||||
|
//check for extensions, we do this first as they can overrule everything
|
||||||
|
$extended = $this->extendedCan(__FUNCTION__, $member);
|
||||||
|
if($extended !== null) {
|
||||||
|
return $extended;
|
||||||
|
}
|
||||||
|
|
||||||
// members can usually edit their own record
|
//need to be logged in and/or most checks below rely on $member being a Member
|
||||||
if($member && $this->ID == $member->ID) return true;
|
if(!$member) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if(
|
// HACK: we should not allow for an non-Admin to edit an Admin
|
||||||
Permission::checkMember($member, 'ADMIN')
|
if(!Permission::checkMember($member, 'ADMIN') && Permission::checkMember($this, 'ADMIN')) {
|
||||||
|| Permission::checkMember($member, 'CMS_ACCESS_SecurityAdmin')
|
return false;
|
||||||
) {
|
}
|
||||||
return true;
|
// members can usually edit their own record
|
||||||
}
|
if($this->ID == $member->ID) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//standard check
|
||||||
|
return Permission::checkMember($member, 'CMS_ACCESS_SecurityAdmin');
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Users can edit their own record.
|
||||||
|
* Otherwise they'll need ADMIN or CMS_ACCESS_SecurityAdmin permissions
|
||||||
|
*/
|
||||||
|
public function canDelete($member = null) {
|
||||||
|
if(!($member instanceof Member)) {
|
||||||
|
$member = Member::currentUser();
|
||||||
|
}
|
||||||
|
//check for extensions, we do this first as they can overrule everything
|
||||||
|
$extended = $this->extendedCan(__FUNCTION__, $member);
|
||||||
|
if($extended !== null) {
|
||||||
|
return $extended;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
//need to be logged in and/or most checks below rely on $member being a Member
|
||||||
}
|
if(!$member) {
|
||||||
|
return false;
|
||||||
/**
|
}
|
||||||
* Users can edit their own record.
|
// Members are not allowed to remove themselves,
|
||||||
* Otherwise they'll need ADMIN or CMS_ACCESS_SecurityAdmin permissions
|
// since it would create inconsistencies in the admin UIs.
|
||||||
*/
|
if($this->ID && $member->ID == $this->ID) {
|
||||||
public function canEdit($member = null) {
|
return false;
|
||||||
if(!$member || !(is_a($member, 'Member')) || is_numeric($member)) $member = Member::currentUser();
|
}
|
||||||
|
|
||||||
// extended access checks
|
|
||||||
$results = $this->extend('canEdit', $member);
|
|
||||||
if($results && is_array($results)) {
|
|
||||||
if(!min($results)) return false;
|
|
||||||
else return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No member found
|
|
||||||
if(!($member && $member->exists())) return false;
|
|
||||||
|
|
||||||
// If the requesting member is not an admin, but has access to manage members,
|
|
||||||
// they still can't edit other members with ADMIN permission.
|
|
||||||
// This is a bit weak, strictly speaking they shouldn't be allowed to
|
|
||||||
// perform any action that could change the password on a member
|
|
||||||
// with "higher" permissions than himself, but thats hard to determine.
|
|
||||||
if(!Permission::checkMember($member, 'ADMIN') && Permission::checkMember($this, 'ADMIN')) return false;
|
|
||||||
|
|
||||||
return $this->canView($member);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Users can edit their own record.
|
|
||||||
* Otherwise they'll need ADMIN or CMS_ACCESS_SecurityAdmin permissions
|
|
||||||
*/
|
|
||||||
public function canDelete($member = null) {
|
|
||||||
if(!$member || !(is_a($member, 'Member')) || is_numeric($member)) $member = Member::currentUser();
|
|
||||||
|
|
||||||
// extended access checks
|
|
||||||
$results = $this->extend('canDelete', $member);
|
|
||||||
if($results && is_array($results)) {
|
|
||||||
if(!min($results)) return false;
|
|
||||||
else return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No member found
|
|
||||||
if(!($member && $member->exists())) return false;
|
|
||||||
|
|
||||||
// Members are not allowed to remove themselves,
|
|
||||||
// since it would create inconsistencies in the admin UIs.
|
|
||||||
if($this->ID && $member->ID == $this->ID) return false;
|
|
||||||
|
|
||||||
return $this->canEdit($member);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// HACK: if you want to delete a member, you have to be a member yourself.
|
||||||
|
// this is a hack because what this should do is to stop a user
|
||||||
|
// deleting a member who has more privileges (e.g. a non-Admin deleting an Admin)
|
||||||
|
if(Permission::checkMember($this, 'ADMIN')) {
|
||||||
|
if( ! Permission::checkMember($member, 'ADMIN')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//standard check
|
||||||
|
return Permission::checkMember($member, 'CMS_ACCESS_SecurityAdmin');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validate this member object.
|
* Validate this member object.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user