all() ) ); } public static function loginAs() { global $user; if ( !$user ) return \controls\Users::login_form(); $impersonator_user = self::getImpersonatorUser(); if ( !self::canManageUsers( $user, $impersonator_user ) ) self::forbiddenRedirect(); $target_user_id = (int)\S::get( 'user_id' ); $users_repository = new \Domain\Users\UserRepository(); $target_user = $users_repository -> byId( $target_user_id ); if ( !$target_user ) { \S::alert( 'Nie znaleziono wskazanego uzytkownika.' ); header( 'Location: /users/main_view/' ); exit; } $new_session_state = self::impersonationStateAfterLoginAs( $user, $target_user, $impersonator_user ); \S::set_session( 'user', $new_session_state['user'] ); \S::set_session( self::IMPERSONATOR_SESSION_KEY, $new_session_state['impersonator_user'] ); \S::alert( 'Zalogowano jako: ' . $target_user['name'] . ' ' . $target_user['surname'] . '.' ); header( 'Location: /' ); exit; } public static function switchBackToAdmin() { $impersonator_user = self::getImpersonatorUser(); if ( !$impersonator_user or !isset( $impersonator_user['id'] ) or (int)$impersonator_user['id'] !== self::ADMIN_USER_ID ) { \S::alert( 'Brak aktywnej sesji podszywania.' ); header( 'Location: /' ); exit; } \S::set_session( 'user', $impersonator_user ); \S::del_session( self::IMPERSONATOR_SESSION_KEY ); \S::alert( 'Powrot do konta administratora.' ); header( 'Location: /users/main_view/' ); exit; } public static function canManageUsers( $current_user, $impersonator_user = null ) { if ( !is_array( $current_user ) ) return false; if ( isset( $current_user['id'] ) and (int)$current_user['id'] === self::ADMIN_USER_ID ) return true; if ( is_array( $impersonator_user ) and isset( $impersonator_user['id'] ) and (int)$impersonator_user['id'] === self::ADMIN_USER_ID ) return true; return false; } public static function buildMainViewModel( $current_user, $impersonator_user, array $users ) { return [ 'current_user' => $current_user, 'impersonator_user' => $impersonator_user, 'users' => $users, 'can_switch_back' => is_array( $impersonator_user ) and isset( $impersonator_user['id'] ) and (int)$impersonator_user['id'] === self::ADMIN_USER_ID ]; } public static function impersonationStateAfterLoginAs( $current_user, $target_user, $existing_impersonator_user = null ) { $impersonator_user = $existing_impersonator_user; if ( !is_array( $impersonator_user ) ) $impersonator_user = ( is_array( $current_user ) and isset( $current_user['id'] ) and (int)$current_user['id'] === self::ADMIN_USER_ID ) ? $current_user : null; return [ 'user' => $target_user, 'impersonator_user' => $impersonator_user ]; } private static function getImpersonatorUser() { $session_value = \S::get_session( self::IMPERSONATOR_SESSION_KEY ); if ( is_array( $session_value ) ) return $session_value; return null; } private static function forbiddenRedirect() { \S::alert( 'Brak uprawnien do zarzadzania uzytkownikami.' ); header( 'Location: /' ); exit; } }