owner->config()->disable_security) { return false; } // Check for necessary security module if (!class_exists('SecureFileExtension')) { trigger_error('SecureEditableFileField requires secureassets module', E_USER_WARNING); return false; } return true; } public function requireDefaultRecords() { // Skip if disabled if (!$this->getIsSecurityEnabled()) { return; } // Update all instances of editablefilefield which do NOT have a secure folder assigned foreach (EditableFileField::get() as $fileField) { // Skip if secured if ($fileField->getIsSecure()) { continue; } // Force this field to secure itself on write $fileField->write(false, false, true); DB::alteration_message( "Restricting editable file field \"{$fileField->Title}\" to secure folder", "changed" ); } } /** * Secure this field before saving */ public function onBeforeWrite() { $this->makeSecure(); } /** * Ensure this field is secured, but does not write changes to the database */ public function makeSecure() { // Skip if disabled or already secure if (!$this->getIsSecurityEnabled() || $this->owner->getIsSecure()) { return; } // Ensure folder exists $folder = $this->owner->Folder(); if (!$folder || !$folder->exists()) { // Create new folder in default location $folder = Folder::find_or_make($this->owner->config()->secure_folder_name); $this->owner->FolderID = $folder->ID; } elseif ($this->isFolderSecured($folder)) { // If folder exists and is secure stop return; } // Make secure $folder->CanViewType = 'OnlyTheseUsers'; $folder->ViewerGroups()->add($this->findAdminGroup()); $folder->write(); } /** * Find target group to record * * @return Group */ protected function findAdminGroup() { singleton('Group')->requireDefaultRecords(); return Permission::get_groups_by_permission('ADMIN')->First(); } /** * Determine if the field is secure * * @return bool */ public function getIsSecure() { return $this->isFolderSecured($this->owner->Folder()); } /** * Check if a Folder object is secure * * @param Folder $folder * @return boolean */ protected function isFolderSecured($folder) { if (! ($folder instanceof Folder) || !$folder->exists()) { return false; } switch ($folder->CanViewType) { case 'OnlyTheseUsers': return true; case 'Inherit': $parent = $folder->Parent(); return $parent && $parent->exists() && $this->isFolderSecured($parent); case 'Anyone': case 'LoggedInUsers': default: return false; } } }