extend('beforeFindOrCreateDefaultAdmin'); // Check if we have default admins if (!static::hasDefaultAdmin()) { return null; } // Create admin with default admin username $admin = $this->findOrCreateAdmin( static::getDefaultAdminUsername(), _t(__CLASS__ . '.DefaultAdminFirstname', 'Default Admin') ); $this->extend('afterFindOrCreateDefaultAdmin', $admin); return $admin; } /** * Find or create a Member with admin permissions * * @skipUpgrade * @param string $email * @param string $name * @return Member */ public function findOrCreateAdmin($email, $name = null) { $this->extend('beforeFindOrCreateAdmin', $email, $name); // Find member /** @var Member $admin */ $admin = Member::get() ->filter('Email', $email) ->first(); // Find or create admin group $adminGroup = $this->findOrCreateAdminGroup(); // If no admin is found, create one if ($admin) { $inGroup = $admin->inGroup($adminGroup); } else { // Note: This user won't be able to login until a password is set // Set 'Email' to identify this as the default admin $inGroup = false; $admin = Member::create(); $admin->FirstName = $name ?: $email; $admin->Email = $email; $admin->PasswordEncryption = Security::config()->get('password_encryption_algorithm'); $admin->write(); } // Ensure this user is in an admin group if (!$inGroup) { // Add member to group instead of adding group to member // This bypasses the privilege escallation code in Member_GroupSet $adminGroup ->DirectMembers() ->add($admin); } $this->extend('afterFindOrCreateAdmin', $admin); return $admin; } /** * Ensure a Group exists with admin permission * * @return Group */ protected function findOrCreateAdminGroup() { // Check pre-existing group $adminGroup = Permission::get_groups_by_permission('ADMIN')->first(); if ($adminGroup) { return $adminGroup; } // Check if default records create the group Group::singleton()->requireDefaultRecords(); $adminGroup = Permission::get_groups_by_permission('ADMIN')->first(); if ($adminGroup) { return $adminGroup; } // Create new admin group directly $adminGroup = Group::create(); $adminGroup->Code = 'administrators'; $adminGroup->Title = _t('SilverStripe\\Security\\Group.DefaultGroupTitleAdministrators', 'Administrators'); $adminGroup->Sort = 0; $adminGroup->write(); Permission::grant($adminGroup->ID, 'ADMIN'); return $adminGroup; } /** * Check if the user is a default admin. * Returns false if there is no default admin. * * @param string $username * @return bool */ public static function isDefaultAdmin($username) { return static::hasDefaultAdmin() && $username && $username === static::getDefaultAdminUsername(); } /** * Check if the user credentials match the default admin. * Returns false if there is no default admin. * * @param string $username * @param string $password * @return bool */ public static function isDefaultAdminCredentials($username, $password) { return static::isDefaultAdmin($username) && $password && $password === static::getDefaultAdminPassword(); } }