@@ -25,91 +25,42 @@ public function __construct(private DatabaseInterface $dbi)
2525 {
2626 }
2727
28- /**
29- * Extracts details from a result row of a SHOW GRANT query
30- *
31- * @param string $row grant row
32- *
33- * @return array<int,string>
34- */
35- public function getItemsFromShowGrantsRow (string $ row ): array
36- {
37- $ dbNameOffset = mb_strpos ($ row , ' ON ' ) + 4 ;
38-
39- $ tableNameEndOffset = mb_strpos ($ row , ' TO ' );
40- $ tableNameStartOffset = false ;
41- $ tableNameStartOffset2 = mb_strpos ($ row , '`. ' , $ dbNameOffset );
42-
43- if ($ tableNameStartOffset2 && $ tableNameStartOffset2 < $ tableNameEndOffset ) {
44- $ tableNameStartOffset = $ tableNameStartOffset2 + 1 ;
45- }
46-
47- if ($ tableNameStartOffset === false ) {
48- $ tableNameStartOffset = mb_strpos ($ row , '. ' , $ dbNameOffset );
49- }
50-
51- $ showGrantsDbName = mb_substr ($ row , $ dbNameOffset , $ tableNameStartOffset - $ dbNameOffset );
52-
53- $ showGrantsDbName = Util::unQuote ($ showGrantsDbName , '` ' );
54-
55- $ showGrantsString = mb_substr (
56- $ row ,
57- 6 ,
58- mb_strpos ($ row , ' ON ' ) - 6 ,
59- );
60-
61- $ showGrantsTableName = mb_substr (
62- $ row ,
63- $ tableNameStartOffset + 1 ,
64- $ tableNameEndOffset - $ tableNameStartOffset - 1 ,
65- );
66- $ showGrantsTableName = Util::unQuote ($ showGrantsTableName , '` ' );
67-
68- return [$ showGrantsString , $ showGrantsDbName , $ showGrantsTableName ];
69- }
70-
7128 /**
7229 * Check if user has required privileges for
7330 * performing 'Adjust privileges' operations
74- *
75- * @param string $showGrantsString string containing grants for user
76- * @param string $showGrantsDbName name of db extracted from grant string
77- * @param string $showGrantsTableName name of table extracted from grant string
7831 */
7932 public function checkRequiredPrivilegesForAdjust (
80- string $ showGrantsString ,
81- string $ showGrantsDbName ,
82- string $ showGrantsTableName ,
33+ ShowGrants $ showGrants ,
8334 ): void {
8435 // '... ALL PRIVILEGES ON *.* ...' OR '... ALL PRIVILEGES ON `mysql`.* ..'
8536 // OR
8637 // SELECT, INSERT, UPDATE, DELETE .... ON *.* OR `mysql`.*
8738 if (
88- $ showGrantsString !== 'ALL '
89- && $ showGrantsString !== 'ALL PRIVILEGES '
90- && (mb_strpos ($ showGrantsString , 'SELECT, INSERT, UPDATE, DELETE ' ) === false )
39+ $ showGrants -> grants !== 'ALL '
40+ && $ showGrants -> grants !== 'ALL PRIVILEGES '
41+ && (mb_strpos ($ showGrants -> grants , 'SELECT, INSERT, UPDATE, DELETE ' ) === false )
9142 ) {
9243 return ;
9344 }
9445
95- if ($ showGrantsDbName === '* ' && $ showGrantsTableName === '* ' ) {
46+ if ($ showGrants -> dbName === '* ' && $ showGrants -> tableName === '* ' ) {
9647 $ GLOBALS ['col_priv ' ] = true ;
9748 $ GLOBALS ['db_priv ' ] = true ;
9849 $ GLOBALS ['proc_priv ' ] = true ;
9950 $ GLOBALS ['table_priv ' ] = true ;
10051
101- if ($ showGrantsString === 'ALL PRIVILEGES ' || $ showGrantsString === 'ALL ' ) {
52+ if ($ showGrants -> grants === 'ALL PRIVILEGES ' || $ showGrants -> grants === 'ALL ' ) {
10253 $ GLOBALS ['is_reload_priv ' ] = true ;
10354 }
10455 }
10556
10657 // check for specific tables in `mysql` db
10758 // Ex. '... ALL PRIVILEGES on `mysql`.`columns_priv` .. '
108- if ($ showGrantsDbName !== 'mysql ' ) {
59+ if ($ showGrants -> dbName !== 'mysql ' ) {
10960 return ;
11061 }
11162
112- switch ($ showGrantsTableName ) {
63+ switch ($ showGrants -> tableName ) {
11364 case 'columns_priv ' :
11465 $ GLOBALS ['col_priv ' ] = true ;
11566 break ;
@@ -154,7 +105,6 @@ private function analyseShowGrant(): void
154105 $ GLOBALS ['is_create_db_priv ' ] = SessionCache::get ('is_create_db_priv ' );
155106 $ GLOBALS ['is_reload_priv ' ] = SessionCache::get ('is_reload_priv ' );
156107 $ GLOBALS ['db_to_create ' ] = SessionCache::get ('db_to_create ' );
157- $ GLOBALS ['dbs_where_create_table_allowed ' ] = SessionCache::get ('dbs_where_create_table_allowed ' );
158108 $ GLOBALS ['dbs_to_test ' ] = SessionCache::get ('dbs_to_test ' );
159109
160110 $ GLOBALS ['db_priv ' ] = SessionCache::get ('db_priv ' );
@@ -169,7 +119,6 @@ private function analyseShowGrant(): void
169119 $ GLOBALS ['is_create_db_priv ' ] = false ;
170120 $ GLOBALS ['is_reload_priv ' ] = false ;
171121 $ GLOBALS ['db_to_create ' ] = '' ;
172- $ GLOBALS ['dbs_where_create_table_allowed ' ] = [];
173122 $ GLOBALS ['dbs_to_test ' ] = Utilities::getSystemSchemas ();
174123 $ GLOBALS ['proc_priv ' ] = false ;
175124 $ GLOBALS ['db_priv ' ] = false ;
@@ -185,52 +134,48 @@ private function analyseShowGrant(): void
185134 $ re0 = '(^|( \\\\\\\\)+|[^ \\\\]) ' ; // non-escaped wildcards
186135 $ re1 = '(^|[^ \\\\])( \\\)+ ' ; // escaped wildcards
187136
188- while ($ row = $ showGrantsResult ->fetchRow ()) {
189- [ $ showGrantsString , $ showGrantsDbName , $ showGrantsTableName ] = $ this -> getItemsFromShowGrantsRow ( $ row [ 0 ] );
137+ while ($ showGrants = $ showGrantsResult ->fetchValue ()) {
138+ $ showGrants = new ShowGrants ( $ showGrants );
190139
191- if ($ showGrantsDbName === '* ' ) {
192- if ($ showGrantsString !== 'USAGE ' ) {
140+ if ($ showGrants -> dbName === '* ' ) {
141+ if ($ showGrants -> grants !== 'USAGE ' ) {
193142 $ GLOBALS ['dbs_to_test ' ] = false ;
194143 }
195144 } elseif ($ GLOBALS ['dbs_to_test ' ] !== false ) {
196- $ GLOBALS ['dbs_to_test ' ][] = $ showGrantsDbName ;
145+ $ GLOBALS ['dbs_to_test ' ][] = $ showGrants -> dbName ;
197146 }
198147
199- if (str_contains ($ showGrantsString , 'RELOAD ' )) {
148+ if (str_contains ($ showGrants -> grants , 'RELOAD ' )) {
200149 $ GLOBALS ['is_reload_priv ' ] = true ;
201150 }
202151
203152 // check for the required privileges for adjust
204- $ this ->checkRequiredPrivilegesForAdjust ($ showGrantsString , $ showGrantsDbName , $ showGrantsTableName );
153+ $ this ->checkRequiredPrivilegesForAdjust ($ showGrants );
205154
206155 /**
207156 * @todo if we find CREATE VIEW but not CREATE, do not offer
208157 * the create database dialog box
209158 */
210159 if (
211- $ showGrantsString !== 'ALL '
212- && $ showGrantsString !== 'ALL PRIVILEGES '
213- && $ showGrantsString !== 'CREATE '
214- && ! str_contains ($ showGrantsString , 'CREATE, ' )
160+ $ showGrants -> grants !== 'ALL '
161+ && $ showGrants -> grants !== 'ALL PRIVILEGES '
162+ && $ showGrants -> grants !== 'CREATE '
163+ && ! str_contains ($ showGrants -> grants , 'CREATE, ' )
215164 ) {
216165 continue ;
217166 }
218167
219- if ($ showGrantsDbName === '* ' ) {
168+ if ($ showGrants -> dbName === '* ' ) {
220169 // a global CREATE privilege
221170 $ GLOBALS ['is_create_db_priv ' ] = true ;
222171 $ GLOBALS ['is_reload_priv ' ] = true ;
223172 $ GLOBALS ['db_to_create ' ] = '' ;
224- $ GLOBALS ['dbs_where_create_table_allowed ' ][] = '* ' ;
225173 // @todo we should not break here, cause GRANT ALL *.*
226174 // could be revoked by a later rule like GRANT SELECT ON db.*
227175 break ;
228176 }
229177
230- // this array may contain wildcards
231- $ GLOBALS ['dbs_where_create_table_allowed ' ][] = $ showGrantsDbName ;
232-
233- $ dbNameToTest = Util::backquote ($ showGrantsDbName );
178+ $ dbNameToTest = Util::backquote ($ showGrants ->dbName );
234179
235180 if ($ GLOBALS ['is_create_db_priv ' ]) {
236181 // no need for any more tests if we already know this
@@ -239,8 +184,8 @@ private function analyseShowGrant(): void
239184
240185 // does this db exist?
241186 if (
242- (! preg_match ('/ ' . $ re0 . '%|_/ ' , $ showGrantsDbName )
243- || preg_match ('/ \\\\%| \\\\_/ ' , $ showGrantsDbName ))
187+ (! preg_match ('/ ' . $ re0 . '%|_/ ' , $ showGrants -> dbName )
188+ || preg_match ('/ \\\\%| \\\\_/ ' , $ showGrants -> dbName ))
244189 && ($ this ->dbi ->tryQuery (
245190 'USE ' . preg_replace (
246191 '/ ' . $ re1 . '(%|_)/ ' ,
@@ -257,7 +202,7 @@ private function analyseShowGrant(): void
257202 * Do not handle the underscore wildcard
258203 * (this case must be rare anyway)
259204 */
260- $ GLOBALS ['db_to_create ' ] = preg_replace ('/ ' . $ re0 . '%/ ' , '\\1 ' , $ showGrantsDbName );
205+ $ GLOBALS ['db_to_create ' ] = preg_replace ('/ ' . $ re0 . '%/ ' , '\\1 ' , $ showGrants -> dbName );
261206 $ GLOBALS ['db_to_create ' ] = preg_replace ('/ ' . $ re1 . '(%|_)/ ' , '\\1 \\3 ' , $ GLOBALS ['db_to_create ' ]);
262207 $ GLOBALS ['is_create_db_priv ' ] = true ;
263208
@@ -274,7 +219,6 @@ private function analyseShowGrant(): void
274219 SessionCache::set ('is_create_db_priv ' , $ GLOBALS ['is_create_db_priv ' ]);
275220 SessionCache::set ('is_reload_priv ' , $ GLOBALS ['is_reload_priv ' ]);
276221 SessionCache::set ('db_to_create ' , $ GLOBALS ['db_to_create ' ]);
277- SessionCache::set ('dbs_where_create_table_allowed ' , $ GLOBALS ['dbs_where_create_table_allowed ' ]);
278222 SessionCache::set ('dbs_to_test ' , $ GLOBALS ['dbs_to_test ' ]);
279223
280224 SessionCache::set ('proc_priv ' , $ GLOBALS ['proc_priv ' ]);
@@ -291,7 +235,7 @@ public function getPrivileges(): void
291235 $ username = '' ;
292236
293237 $ current = $ this ->dbi ->getCurrentUserAndHost ();
294- if (! empty ( $ current) ) {
238+ if ($ current !== [] ) {
295239 [$ username ] = $ current ;
296240 }
297241
@@ -300,7 +244,6 @@ public function getPrivileges(): void
300244 $ GLOBALS ['is_create_db_priv ' ] = true ;
301245 $ GLOBALS ['is_reload_priv ' ] = true ;
302246 $ GLOBALS ['db_to_create ' ] = '' ;
303- $ GLOBALS ['dbs_where_create_table_allowed ' ] = ['* ' ];
304247 $ GLOBALS ['dbs_to_test ' ] = false ;
305248 $ GLOBALS ['db_priv ' ] = true ;
306249 $ GLOBALS ['col_priv ' ] = true ;
0 commit comments