diff --git a/admin/code/SecurityAdmin.php b/admin/code/SecurityAdmin.php index 216cafc92..317c12e5e 100755 --- a/admin/code/SecurityAdmin.php +++ b/admin/code/SecurityAdmin.php @@ -86,7 +86,7 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { return $item->getBreadcrumbs(' > '); } )); - + $fields = new FieldList( $root = new TabSet( 'Root', @@ -100,34 +100,42 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { . ' database' ) ) - ), - new HeaderField(_t('SecurityAdmin.IMPORTUSERS', 'Import users'), 3), - new LiteralField( - 'MemberImportFormIframe', - sprintf( - '', - $this->Link('memberimport') - ) ) ), $groupsTab = new Tab('Groups', singleton('Group')->i18n_plural_name(), - $groupList, - new HeaderField(_t('SecurityAdmin.IMPORTGROUPS', 'Import groups'), 3), - new LiteralField( - 'GroupImportFormIframe', - sprintf( - '', - $this->Link('groupimport') - ) - ) + $groupList ) ), // necessary for tree node selection in LeftAndMain.EditForm.js new HiddenField('ID', false, 0) ); + // Add import capabilities. Limit to admin since the import logic can affect assigned permissions + if(Permission::check('ADMIN')) { + $fields->addFieldsToTab('Root.Users', array( + new HeaderField(_t('SecurityAdmin.IMPORTUSERS', 'Import users'), 3), + new LiteralField( + 'MemberImportFormIframe', + sprintf( + '', + $this->Link('memberimport') + ) + ) + )); + $fields->addFieldsToTab('Root.Groups', array( + new HeaderField(_t('SecurityAdmin.IMPORTGROUPS', 'Import groups'), 3), + new LiteralField( + 'GroupImportFormIframe', + sprintf( + '', + $this->Link('groupimport') + ) + ) + )); + } + // Tab nav in CMS is rendered through separate template $root->setTemplate('CMSTabSet'); @@ -195,6 +203,8 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { * @return Form */ public function MemberImportForm() { + if(!Permission::check('ADMIN')) return false; + $group = $this->currentPage(); $form = new MemberImportForm( $this, @@ -225,6 +235,8 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { * @return Form */ public function GroupImportForm() { + if(!Permission::check('ADMIN')) return false; + $form = new GroupImportForm( $this, 'GroupImportForm' @@ -306,7 +318,7 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { /** * The permissions represented in the $codes will not appearing in the form * containing {@link PermissionCheckboxSetField} so as not to be checked / unchecked. - * + * * @deprecated 3.1 Use "Permission.hidden_permissions" config setting instead * @param $codes String|Array */ diff --git a/docs/en/changelogs/3.0.6.md b/docs/en/changelogs/3.0.6.md index 540d6e734..2aaac2704 100644 --- a/docs/en/changelogs/3.0.6.md +++ b/docs/en/changelogs/3.0.6.md @@ -26,6 +26,10 @@ a custom start up script will still process all flush requests as normal. ### Security: Privilege escalation through Group hierarchy setting (SS-2013-003) See [announcement](http://www.silverstripe.org/ss-2013-003-privilege-escalation-through-group-hierarchy-setting/) + +### Security: Privilege escalation through Group and Member CSV upload (SS-2013-004) + +See [announcement](http://www.silverstripe.org/ss-2013-004-privilege-escalation-through-group-and-member-csv-upload/) ## Upgrading * If you have created your own composite database fields, then you should amend the setValue() to allow the passing of