From 6450810b4cf1ff33c6cac4832749c3e316b99f47 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 12 Apr 2010 21:17:07 +0000 Subject: [PATCH] BUGFIX Checking for presence of all columns in Security::database_is_ready(). This was necessitated by an earlier change to the sapphire ORM which now selects all columns explicitly in a SQL query (instead of SELECT *) (see #4027) (from r97480) git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@102494 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- security/Security.php | 19 ++++++++++++++++--- tests/security/SecurityTest.php | 13 +++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/security/Security.php b/security/Security.php index df4fb5ac6..df93e9461 100644 --- a/security/Security.php +++ b/security/Security.php @@ -832,6 +832,8 @@ class Security extends Controller { /** * Checks the database is in a state to perform security checks. + * See {@link DatabaseAdmin->init()} for more information. + * * @return bool */ public static function database_is_ready() { @@ -839,10 +841,21 @@ class Security extends Controller { $requiredTables[] = 'Group'; $requiredTables[] = 'Permission'; - foreach($requiredTables as $table) if(!ClassInfo::hasTable($table)) return false; + foreach($requiredTables as $table) { + // if any of the tables aren't created in the database + if(!ClassInfo::hasTable($table)) return false; - return (($permissionFields = DB::fieldList('Permission')) && isset($permissionFields['Type'])) && - (($memberFields = DB::fieldList('Member')) && isset($memberFields['RememberLoginToken'])); + // if any of the tables don't have all fields mapped as table columns + $dbFields = DB::fieldList($table); + if(!$dbFields) return false; + + $objFields = DataObject::database_fields($table); + $missingFields = array_diff_key($objFields, $dbFields); + + if($missingFields) return false; + } + + return true; } /** diff --git a/tests/security/SecurityTest.php b/tests/security/SecurityTest.php index 5adf20c5e..00ef762a2 100644 --- a/tests/security/SecurityTest.php +++ b/tests/security/SecurityTest.php @@ -261,6 +261,19 @@ class SecurityTest extends FunctionalTest { $this->assertEquals($attempt->Email, 'sam@silverstripe.com'); $this->assertEquals($attempt->Member(), $member); } + + function testDatabaseIsReadyWithInsufficientMemberColumns() { + // Assumption: The database has been built correctly by the test runner, + // and has all columns present in the ORM + DB::getConn()->renameField('Member', 'Email', 'Email_renamed'); + + // Email column is now missing, which means we're not ready to do permission checks + $this->assertFalse(Security::database_is_ready()); + + // Rebuild the database (which re-adds the Email column), and try again + $this->resetDBSchema(true); + $this->assertTrue(Security::database_is_ready()); + } /** * Execute a log-in form using Director::test().