@@ -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