Skip to content
This repository was archived by the owner on Mar 10, 2025. It is now read-only.

Commit 148fa68

Browse files
committed
User credentials can be configured for SQLite database
1 parent fd90bb2 commit 148fa68

File tree

1 file changed

+62
-15
lines changed

1 file changed

+62
-15
lines changed

AdminerLoginServers.php

Lines changed: 62 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class AdminerLoginServers
3333
* For example:
3434
* - mysql://localhost:3306 (server host and port)
3535
* - pgsql://localhost#database_name (server and database name)
36-
* - sqlite://database.db (relative path to database file)
37-
* - sqlite:///var/www/#database.db (absolute path as 'server' and file name as 'database')
36+
* - sqlite://database.db (relative path to database file, no authentication)
37+
* - sqlite://user:password@/var/www/#database.db (authentication, absolute path as 'server' and file name as 'database')
3838
*
3939
* Possible driver names are: `sqlite`, `sqlite2`, `pgsql`, `firebird`, `oracle`, `simpledb`, `elastic`, `mysql`,
4040
* `mongo`, `mssql`. Default driver is `mysql`.
@@ -54,31 +54,43 @@ public function __construct(array $servers, $defaultDriver = "mysql")
5454

5555
/**
5656
* Checks whether current server is in a list of supported servers.
57+
* For SQLite database, verify also user name and password.
5758
*
58-
* @param string $login
59+
* @param string $username
5960
* @param string $password
6061
*
6162
* @return bool
6263
*/
63-
public function login($login, $password)
64+
public function login($username, $password)
6465
{
65-
if (!$this->checkServer($this->servers, SERVER)) {
66+
$params = $this->checkServer($this->servers, SERVER, DB);
67+
if (!$params) {
6668
return false;
6769
}
6870

71+
if ($this->isSQLite($params["driver"])) {
72+
return $username == $params["username"] && password_verify($password, $params["password"]);
73+
}
74+
6975
return true;
7076
}
7177

72-
private function checkServer(array $servers, $server)
78+
private function checkServer(array $servers, $server, $database)
7379
{
7480
foreach ($servers as $key => $value) {
7581
if (is_array($value)) {
76-
if ($this->checkServer($value, $server)) {
77-
return true;
82+
if ($params = $this->checkServer($value, $server, $database)) {
83+
return $params;
7884
}
7985
} else {
80-
if ($key == $server) {
81-
return true;
86+
if ($key != $server) {
87+
continue;
88+
}
89+
90+
$params = $this->loginParams[$key];
91+
92+
if (!$this->isSQLite($params["driver"]) || $params["database"] == $database) {
93+
return $params;
8294
}
8395
}
8496
}
@@ -95,7 +107,10 @@ private function parseServers(array $servers, array &$out, array &$loginParams)
95107
} else {
96108
$this->parseServer(is_string($key) ? $key : $value, $params);
97109

98-
$out[$params["server"]] = $value;
110+
$out[$params["server"]] = "(" . $this->formatDriver($params["driver"]) . ") " .
111+
$params["server"] .
112+
($params["database"] ? " » " . $params["database"] : "");
113+
99114
$loginParams[$params["server"]] = $params;
100115
}
101116
}
@@ -104,32 +119,64 @@ private function parseServers(array $servers, array &$out, array &$loginParams)
104119
private function parseServer($server, &$params)
105120
{
106121
$matches = [];
107-
preg_match('@^(([^:]+)://)?([^#]+)(#(.*))?$@', $server, $matches);
122+
preg_match('~^(([^:]+)://)?(([^:@]+)(:([^@]+)?)?@)?([^#]+)(#(.*))?$~', $server, $matches);
108123

109124
$driver = $matches[2];
110-
$server = $matches[3];
111-
$database = isset($matches[5]) ? $matches[5] : "";
125+
$username = $matches[4];
126+
$password = $matches[6];
127+
$server = $matches[7];
128+
$database = isset($matches[9]) ? $matches[9] : "";
112129

113130
// Default driver is 'server'. It is used also for MySQL.
114131
$driver = $driver == "" ? $this->defaultDriver : $this->sanitizeDriver($driver);
115132

116-
if (($driver == "sqlite" || $driver == "sqlite2") && $database == "") {
133+
$sqlite = $this->isSQLite($driver);
134+
if ($sqlite && $database == "") {
117135
$database = $server;
118136
$server = "";
119137
}
120138

139+
if (!$sqlite && $username != "") {
140+
throw new InvalidArgumentException("User name and password in server URI can be used only with 'sqlite' and 'sqlite2' drivers.");
141+
}
142+
121143
$params = [
122144
"driver" => $driver,
145+
"username" => $username,
146+
"password" => password_hash($password, PASSWORD_DEFAULT),
123147
"server" => $server,
124148
"database" => $database,
125149
];
126150
}
127151

152+
private function isSQLite($driver)
153+
{
154+
return $driver == "sqlite" || $driver == "sqlite2";
155+
}
156+
128157
private function sanitizeDriver($driver)
129158
{
130159
return $driver == "mysql" ? "server" : $driver;
131160
}
132161

162+
private function formatDriver($driver)
163+
{
164+
static $drivers = [
165+
"server" => "MySQL",
166+
"sqlite" => "SQLite 3",
167+
"sqlite2" => "SQLite 2",
168+
"pgsql" => "PostgreSQL",
169+
"oracle" => "Oracle",
170+
"mssql" => "MS SQL",
171+
"firebird" => "Firebird",
172+
"simpledb" => "SimpleDB",
173+
"mongo" => "MongoDB",
174+
"elastic" => "Elasticsearch",
175+
];
176+
177+
return isset($drivers[$driver]) ? $drivers[$driver] : $driver;
178+
}
179+
133180
public function loginForm()
134181
{
135182
?>

0 commit comments

Comments
 (0)