@@ -7558,48 +7558,80 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
75587558 }
75597559 $ path = RequestUtils::getPathSegment ($ request , 1 );
75607560 $ method = $ request ->getMethod ();
7561- if ($ method == 'POST ' && in_array ($ path , ['login ' , 'register ' ])) {
7561+ if ($ method == 'POST ' && in_array ($ path , ['login ' , 'register ' , ' password ' ])) {
75627562 $ body = $ request ->getParsedBody ();
75637563 $ username = isset ($ body ->username ) ? $ body ->username : '' ;
75647564 $ password = isset ($ body ->password ) ? $ body ->password : '' ;
7565+ $ newPassword = isset ($ body ->newPassword ) ? $ body ->newPassword : '' ;
75657566 $ tableName = $ this ->getProperty ('usersTable ' , 'users ' );
75667567 $ table = $ this ->reflection ->getTable ($ tableName );
75677568 $ usernameColumnName = $ this ->getProperty ('usernameColumn ' , 'username ' );
75687569 $ usernameColumn = $ table ->getColumn ($ usernameColumnName );
75697570 $ passwordColumnName = $ this ->getProperty ('passwordColumn ' , 'password ' );
7570- $ passwordColumn = $ table ->getColumn ( $ passwordColumnName );
7571+ $ pkName = $ table ->getPk ()-> getName ( );
75717572 $ registerUser = $ this ->getProperty ('registerUser ' , '' );
7573+ $ condition = new ColumnCondition ($ usernameColumn , 'eq ' , $ username );
7574+ $ returnedColumns = $ this ->getProperty ('returnedColumns ' , '' );
7575+ if (!$ returnedColumns ) {
7576+ $ columnNames = $ table ->getColumnNames ();
7577+ } else {
7578+ $ columnNames = array_map ('trim ' , explode (', ' , $ returnedColumns ));
7579+ $ columnNames [] = $ passwordColumnName ;
7580+ $ columnNames [] = $ pkName ;
7581+ }
7582+ $ columnOrdering = $ this ->ordering ->getDefaultColumnOrdering ($ table );
75727583 if ($ path == 'register ' ) {
75737584 if (!$ registerUser ) {
75747585 return $ this ->responder ->error (ErrorCode::AUTHENTICATION_FAILED , $ username );
75757586 }
7587+ $ users = $ this ->db ->selectAll ($ table , $ columnNames , $ condition , $ columnOrdering , 0 , 1 );
7588+ if (!empty ($ users )) {
7589+ return $ this ->responder ->error (ErrorCode::USER_ALREADY_EXIST , $ username );
7590+ }
75767591 $ data = json_decode ($ registerUser , true );
75777592 $ data = is_array ($ data ) ? $ data : [];
75787593 $ data [$ usernameColumnName ] = $ username ;
75797594 $ data [$ passwordColumnName ] = password_hash ($ password , PASSWORD_DEFAULT );
75807595 $ this ->db ->createSingle ($ table , $ data );
7596+ $ users = $ this ->db ->selectAll ($ table , $ columnNames , $ condition , $ columnOrdering , 0 , 1 );
7597+ foreach ($ users as $ user ) {
7598+ unset($ user [$ passwordColumnName ]);
7599+ return $ this ->responder ->success ($ user );
7600+ }
7601+ return $ this ->responder ->error (ErrorCode::AUTHENTICATION_FAILED , $ username );
75817602 }
7582- $ condition = new ColumnCondition ($ usernameColumn , 'eq ' , $ username );
7583- $ returnedColumns = $ this ->getProperty ('returnedColumns ' , '' );
7584- if (!$ returnedColumns ) {
7585- $ columnNames = $ table ->getColumnNames ();
7586- } else {
7587- $ columnNames = array_map ('trim ' , explode (', ' , $ returnedColumns ));
7588- $ columnNames [] = $ passwordColumnName ;
7603+ if ($ path == 'login ' ) {
7604+ $ users = $ this ->db ->selectAll ($ table , $ columnNames , $ condition , $ columnOrdering , 0 , 1 );
7605+ foreach ($ users as $ user ) {
7606+ if (password_verify ($ password , $ user [$ passwordColumnName ]) == 1 ) {
7607+ if (!headers_sent ()) {
7608+ session_regenerate_id (true );
7609+ }
7610+ unset($ user [$ passwordColumnName ]);
7611+ $ _SESSION ['user ' ] = $ user ;
7612+ return $ this ->responder ->success ($ user );
7613+ }
7614+ }
7615+ return $ this ->responder ->error (ErrorCode::AUTHENTICATION_FAILED , $ username );
75897616 }
7590- $ columnOrdering = $ this ->ordering ->getDefaultColumnOrdering ($ table );
7591- $ users = $ this ->db ->selectAll ($ table , $ columnNames , $ condition , $ columnOrdering , 0 , 1 );
7592- foreach ($ users as $ user ) {
7593- if (password_verify ($ password , $ user [$ passwordColumnName ]) == 1 ) {
7594- if (!headers_sent ()) {
7595- session_regenerate_id (true );
7617+ if ($ path == 'password ' ) {
7618+ if ($ username != ($ _SESSION ['user ' ][$ usernameColumnName ] ?? '' )) {
7619+ return $ this ->responder ->error (ErrorCode::AUTHENTICATION_FAILED , $ username );
7620+ }
7621+ $ users = $ this ->db ->selectAll ($ table , $ columnNames , $ condition , $ columnOrdering , 0 , 1 );
7622+ foreach ($ users as $ user ) {
7623+ if (password_verify ($ password , $ user [$ passwordColumnName ]) == 1 ) {
7624+ if (!headers_sent ()) {
7625+ session_regenerate_id (true );
7626+ }
7627+ $ data = [$ passwordColumnName => password_hash ($ newPassword , PASSWORD_DEFAULT )];
7628+ $ this ->db ->updateSingle ($ table , $ data , $ user [$ pkName ]);
7629+ unset($ user [$ passwordColumnName ]);
7630+ return $ this ->responder ->success ($ user );
75967631 }
7597- unset($ user [$ passwordColumnName ]);
7598- $ _SESSION ['user ' ] = $ user ;
7599- return $ this ->responder ->success ($ user );
76007632 }
7633+ return $ this ->responder ->error (ErrorCode::AUTHENTICATION_FAILED , $ username );
76017634 }
7602- return $ this ->responder ->error (ErrorCode::AUTHENTICATION_FAILED , $ username );
76037635 }
76047636 if ($ method == 'POST ' && $ path == 'logout ' ) {
76057637 if (isset ($ _SESSION ['user ' ])) {
@@ -9929,6 +9961,7 @@ class ErrorCode
99299961 const BAD_OR_MISSING_XSRF_TOKEN = 1017 ;
99309962 const ONLY_AJAX_REQUESTS_ALLOWED = 1018 ;
99319963 const PAGINATION_FORBIDDEN = 1019 ;
9964+ const USER_ALREADY_EXIST = 1020 ;
99329965
99339966 private $ values = [
99349967 9999 => ["%s " , ResponseFactory::INTERNAL_SERVER_ERROR ],
@@ -9952,6 +9985,7 @@ class ErrorCode
99529985 1017 => ["Bad or missing XSRF token " , ResponseFactory::FORBIDDEN ],
99539986 1018 => ["Only AJAX requests allowed for '%s' " , ResponseFactory::FORBIDDEN ],
99549987 1019 => ["Pagination forbidden " , ResponseFactory::FORBIDDEN ],
9988+ 1020 => ["User '%s' already exists " , ResponseFactory::CONFLICT ],
99559989 ];
99569990
99579991 public function __construct (int $ code )
0 commit comments