forked from php/php-src
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement phpGH-17321: Add setAuthorizer to Pdo\Sqlite
- Loading branch information
Showing
9 changed files
with
317 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
102 changes: 102 additions & 0 deletions
102
ext/pdo_sqlite/tests/subclasses/pdosqlite_setauthorizer.phpt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
--TEST-- | ||
Pdo\Sqlite user authorizer callback | ||
--EXTENSIONS-- | ||
pdo_sqlite | ||
--FILE-- | ||
<?php | ||
|
||
$db = new Pdo\Sqlite('sqlite::memory:'); | ||
|
||
$db->setAuthorizer(function (int $action) { | ||
if ($action == 21 /* SELECT */) { | ||
return Pdo\Sqlite::OK; | ||
} | ||
|
||
return Pdo\Sqlite::DENY; | ||
}); | ||
|
||
// This query should be accepted | ||
var_dump($db->query('SELECT 1;')); | ||
|
||
try { | ||
// This one should fail | ||
var_dump($db->exec('CREATE TABLE test (a, b);')); | ||
} catch (\Exception $e) { | ||
echo $e->getMessage() . "\n"; | ||
} | ||
|
||
// Test disabling the authorizer | ||
$db->setAuthorizer(null); | ||
|
||
// This should now succeed | ||
var_dump($db->exec('CREATE TABLE test (a); INSERT INTO test VALUES (42);')); | ||
var_dump($db->exec('SELECT a FROM test;')); | ||
|
||
// Test if we are getting the correct arguments | ||
$db->setAuthorizer(function (int $action) { | ||
$constants = (new ReflectionClass('SQLite3'))->getConstants(); | ||
$constants = array_flip($constants); | ||
|
||
var_dump($constants[$action], implode(',', array_slice(func_get_args(), 1))); | ||
return Pdo\Sqlite::OK; | ||
}); | ||
|
||
var_dump($db->exec('SELECT * FROM test WHERE a = 42;')); | ||
var_dump($db->exec('DROP TABLE test;')); | ||
|
||
// Try to return something invalid from the authorizer | ||
$db->setAuthorizer(function () { | ||
return 'FAIL'; | ||
}); | ||
|
||
try { | ||
var_dump($db->query('SELECT 1;')); | ||
} catch (\Exception $e) { | ||
echo $e->getMessage() . "\n"; | ||
} | ||
|
||
$db->setAuthorizer(function () { | ||
return 4200; | ||
}); | ||
|
||
try { | ||
var_dump($db->query('SELECT 1;')); | ||
} catch (\Exception $e) { | ||
echo $e->getMessage() . "\n"; | ||
} | ||
|
||
?> | ||
--EXPECTF-- | ||
object(PDOStatement)#%d (1) { | ||
["queryString"]=> | ||
string(9) "SELECT 1;" | ||
} | ||
SQLSTATE[HY000]: General error: 23 not authorized | ||
int(1) | ||
int(1) | ||
string(6) "SELECT" | ||
string(3) ",,," | ||
string(4) "READ" | ||
string(12) "test,a,main," | ||
string(4) "READ" | ||
string(12) "test,a,main," | ||
int(1) | ||
string(6) "DELETE" | ||
string(20) "sqlite_master,,main," | ||
string(10) "DROP_TABLE" | ||
string(11) "test,,main," | ||
string(6) "DELETE" | ||
string(11) "test,,main," | ||
string(6) "DELETE" | ||
string(20) "sqlite_master,,main," | ||
string(4) "READ" | ||
string(28) "sqlite_master,tbl_name,main," | ||
string(4) "READ" | ||
string(24) "sqlite_master,type,main," | ||
string(6) "UPDATE" | ||
string(28) "sqlite_master,rootpage,main," | ||
string(4) "READ" | ||
string(28) "sqlite_master,rootpage,main," | ||
int(1) | ||
The authorizer callback returned an invalid type: expected int | ||
The authorizer callback returned an invalid value: 4200 |
43 changes: 43 additions & 0 deletions
43
ext/pdo_sqlite/tests/subclasses/pdosqlite_setauthorizer_trampoline.phpt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
--TEST-- | ||
Pdo\Sqlite user authorizer trampoline callback | ||
--EXTENSIONS-- | ||
pdo_sqlite | ||
--FILE-- | ||
<?php | ||
|
||
class TrampolineTest { | ||
public function __call(string $name, array $arguments) { | ||
echo 'Trampoline for ', $name, PHP_EOL; | ||
if ($arguments[0] == 21 /* SELECT */) { | ||
return Pdo\Sqlite::OK; | ||
} | ||
|
||
return Pdo\Sqlite::DENY; | ||
} | ||
} | ||
$o = new TrampolineTest(); | ||
$callback = [$o, 'authorizer']; | ||
|
||
$db = new Pdo\Sqlite('sqlite::memory:'); | ||
|
||
$db->setAuthorizer($callback); | ||
|
||
// This query should be accepted | ||
var_dump($db->query('SELECT 1;')); | ||
|
||
try { | ||
// This one should fail | ||
var_dump($db->query('CREATE TABLE test (a, b);')); | ||
} catch (\Exception $e) { | ||
echo $e->getMessage() . "\n"; | ||
} | ||
|
||
?> | ||
--EXPECTF-- | ||
Trampoline for authorizer | ||
object(PDOStatement)#%d (1) { | ||
["queryString"]=> | ||
string(9) "SELECT 1;" | ||
} | ||
Trampoline for authorizer | ||
SQLSTATE[HY000]: General error: 23 not authorized |
Oops, something went wrong.