1111use PhpMyAdmin \Container \ContainerBuilder ;
1212use PhpMyAdmin \DatabaseInterface ;
1313use PhpMyAdmin \Dbal \ConnectionType ;
14+ use PhpMyAdmin \Exceptions \AuthenticationFailure ;
1415use PhpMyAdmin \Exceptions \AuthenticationPluginException ;
1516use PhpMyAdmin \Exceptions \ExitException ;
1617use PhpMyAdmin \Http \Factory \ResponseFactory ;
1718use PhpMyAdmin \Http \ServerRequest ;
1819use PhpMyAdmin \LanguageManager ;
1920use PhpMyAdmin \Logging ;
20- use PhpMyAdmin \Plugins \AuthenticationPlugin ;
2121use PhpMyAdmin \Plugins \AuthenticationPluginFactory ;
2222use PhpMyAdmin \ResponseRenderer ;
2323use PhpMyAdmin \Template ;
2626use Psr \Http \Message \ServerRequestInterface ;
2727use Psr \Http \Server \MiddlewareInterface ;
2828use Psr \Http \Server \RequestHandlerInterface ;
29+ use Throwable ;
2930
3031use function assert ;
3132use function define ;
@@ -60,7 +61,23 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
6061 }
6162
6263 try {
63- $ authPlugin ->authenticate ();
64+ try {
65+ $ response = $ authPlugin ->authenticate ();
66+ if ($ response !== null ) {
67+ return $ response ;
68+ }
69+ } catch (AuthenticationFailure $ exception ) {
70+ return $ authPlugin ->showFailure ($ exception );
71+ } catch (Throwable $ exception ) {
72+ $ response = $ this ->responseFactory ->createResponse (StatusCodeInterface::STATUS_INTERNAL_SERVER_ERROR );
73+
74+ return $ response ->write ($ this ->template ->render ('error/generic ' , [
75+ 'lang ' => $ GLOBALS ['lang ' ] ?? 'en ' ,
76+ 'dir ' => LanguageManager::$ textDir ,
77+ 'error_message ' => $ exception ->getMessage (),
78+ ]));
79+ }
80+
6481 $ currentServer = new Server (Config::getInstance ()->selectedServer );
6582
6683 /* Enable LOAD DATA LOCAL INFILE for LDI plugin */
@@ -71,7 +88,11 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
7188 // phpcs:enable
7289 }
7390
74- $ this ->connectToDatabaseServer (DatabaseInterface::getInstance (), $ authPlugin , $ currentServer );
91+ try {
92+ $ this ->connectToDatabaseServer (DatabaseInterface::getInstance (), $ currentServer );
93+ } catch (AuthenticationFailure $ exception ) {
94+ return $ authPlugin ->showFailure ($ exception );
95+ }
7596
7697 // Relation should only be initialized after the connection is successful
7798 /** @var Relation $relation */
@@ -81,9 +102,16 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
81102 // Tracker can only be activated after the relation has been initialized
82103 Tracker::enable ();
83104
84- $ authPlugin ->rememberCredentials ();
105+ $ response = $ authPlugin ->rememberCredentials ();
106+ if ($ response !== null ) {
107+ return $ response ;
108+ }
109+
85110 assert ($ request instanceof ServerRequest);
86- $ authPlugin ->checkTwoFactor ($ request );
111+ $ response = $ authPlugin ->checkTwoFactor ($ request );
112+ if ($ response !== null ) {
113+ return $ response ;
114+ }
87115 } catch (ExitException ) {
88116 return ResponseRenderer::getInstance ()->response ();
89117 }
@@ -94,11 +122,9 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
94122 return $ handler ->handle ($ request );
95123 }
96124
97- private function connectToDatabaseServer (
98- DatabaseInterface $ dbi ,
99- AuthenticationPlugin $ auth ,
100- Server $ currentServer ,
101- ): void {
125+ /** @throws AuthenticationFailure */
126+ private function connectToDatabaseServer (DatabaseInterface $ dbi , Server $ currentServer ): void
127+ {
102128 /**
103129 * Try to connect MySQL with the control user profile (will be used to get the privileges list for the current
104130 * user but the true user link must be open after this one, so it would be default one for all the scripts).
@@ -111,7 +137,7 @@ private function connectToDatabaseServer(
111137 // Connects to the server (validates user's login)
112138 $ userConnection = $ dbi ->connect ($ currentServer , ConnectionType::User);
113139 if ($ userConnection === null ) {
114- $ auth -> showFailure ( ' mysql-denied ' );
140+ throw AuthenticationFailure:: deniedByDatabaseServer ( );
115141 }
116142
117143 if ($ controlConnection !== null ) {
0 commit comments