11<?php
2+
23/* Hestia way to enable support for SSO to PHPmyAdmin */
34/* To install please run v-add-sys-pma-sso */
45
56/* Following keys will get replaced when calling v-add-sys-pma-sso */
6- define ('PHPMYADMIN_KEY ' ,'%PHPMYADMIN_KEY% ' );
7- define ('API_HOST_NAME ' ,'%API_HOST_NAME% ' );
8- define ('API_HESTIA_PORT ' ,'%API_HESTIA_PORT% ' );
7+ define ('PHPMYADMIN_KEY ' , '%PHPMYADMIN_KEY% ' );
8+ define ('API_HOST_NAME ' , '%API_HOST_NAME% ' );
9+ define ('API_HESTIA_PORT ' , '%API_HESTIA_PORT% ' );
910define ('API_KEY ' , '%API_KEY% ' );
1011
1112
12- class Hestia_API {
13+ class Hestia_API
14+ {
1315 private $ api_url ;
14- function __construct (){
16+ public function __construct ()
17+ {
1518 $ this -> hostname = 'https:// ' . API_HOST_NAME . ': ' . API_HESTIA_PORT .'/api/ ' ;
1619 $ this -> key = API_KEY ;
17- $ this -> pma_key = PHPMYADMIN_KEY ;
20+ $ this -> pma_key = PHPMYADMIN_KEY ;
1821 }
19-
22+
2023 /* Creates curl request */
21- function request ($ postvars ){
24+ public function request ($ postvars )
25+ {
2226 $ postdata = http_build_query ($ postvars );
2327 $ curl = curl_init ();
2428 curl_setopt ($ curl , CURLOPT_URL , $ this -> hostname );
@@ -30,9 +34,10 @@ function request($postvars){
3034 $ answer = curl_exec ($ curl );
3135 return $ answer ;
3236 }
33-
37+
3438 /* Creates an new temp user in mysql */
35- function create_temp_user ($ database , $ user , $ host ){
39+ public function create_temp_user ($ database , $ user , $ host )
40+ {
3641 $ post_request = array (
3742 'hash ' => $ this -> key ,
3843 'returncode ' => 'no ' ,
@@ -44,16 +49,17 @@ function create_temp_user ($database, $user, $host){
4449 );
4550 $ request = $ this -> request ($ post_request );
4651 $ json = json_decode ($ request );
47- if (json_last_error () == JSON_ERROR_NONE ){
52+ if (json_last_error () == JSON_ERROR_NONE ) {
4853 return $ json ;
49- }else {
54+ } else {
55+ trigger_error ('Unable to connect over API please check api connection ' , E_USER_WARNING );
5056 return false ;
5157 }
52-
5358 }
54-
59+
5560 /* Delete an new temp user in mysql */
56- function delete_temp_user ($ database , $ user , $ dbuser , $ host ){
61+ public function delete_temp_user ($ database , $ user , $ dbuser , $ host )
62+ {
5763 $ post_request = array (
5864 'hash ' => $ this -> key ,
5965 'returncode ' => 'yes ' ,
@@ -65,48 +71,49 @@ function delete_temp_user ($database, $user, $dbuser, $host){
6571 'arg5 ' => $ host
6672 );
6773 $ request = $ this -> request ($ post_request );
68- if (is_numeric ($ request ) && $ request == 0 ){
74+ if (is_numeric ($ request ) && $ request == 0 ) {
6975 return true ;
70- }else {
76+ } else {
7177 return false ;
7278 }
7379 }
7480
75- function get_user_ip (){
81+ public function get_user_ip ()
82+ {
7683 // Saving user IPs to the session for preventing session hijacking
77- $ user_combined_ip = array ();
78- if ($ _SERVER ['REMOTE_ADDR ' ] != $ _SERVER ['SERVER_ADDR ' ]){
84+ $ user_combined_ip = array ();
85+ if ($ _SERVER ['REMOTE_ADDR ' ] != $ _SERVER ['SERVER_ADDR ' ]) {
7986 $ user_combined_ip [] = $ _SERVER ['REMOTE_ADDR ' ];
8087 }
81- if (isset ($ _SERVER ['HTTP_CLIENT_IP ' ])){
88+ if (isset ($ _SERVER ['HTTP_CLIENT_IP ' ])) {
8289 $ user_combined_ip .= '| ' . $ _SERVER ['HTTP_CLIENT_IP ' ];
8390 }
84- if (isset ($ _SERVER ['HTTP_X_FORWARDED_FOR ' ])){
85- if ($ _SERVER ['REMOTE_ADDR ' ] != $ _SERVER ['HTTP_X_FORWARDED_FOR ' ]){
91+ if (isset ($ _SERVER ['HTTP_X_FORWARDED_FOR ' ])) {
92+ if ($ _SERVER ['REMOTE_ADDR ' ] != $ _SERVER ['HTTP_X_FORWARDED_FOR ' ]) {
8693 $ user_combined_ip [] = $ _SERVER ['HTTP_X_FORWARDED_FOR ' ];
8794 }
8895 }
89- if (isset ($ _SERVER ['HTTP_FORWARDED_FOR ' ])){
90- if ($ _SERVER ['REMOTE_ADDR ' ] != $ _SERVER ['HTTP_FORWARDED_FOR ' ]){
96+ if (isset ($ _SERVER ['HTTP_FORWARDED_FOR ' ])) {
97+ if ($ _SERVER ['REMOTE_ADDR ' ] != $ _SERVER ['HTTP_FORWARDED_FOR ' ]) {
9198 $ user_combined_ip [] = $ _SERVER ['HTTP_FORWARDED_FOR ' ];
9299 }
93100 }
94- if (isset ($ _SERVER ['HTTP_X_FORWARDED ' ])){
95- if ($ _SERVER ['REMOTE_ADDR ' ] != $ _SERVER ['HTTP_X_FORWARDED ' ]){
96- $ user_combined_ip [] = $ _SERVER ['HTTP_X_FORWARDED ' ];
101+ if (isset ($ _SERVER ['HTTP_X_FORWARDED ' ])) {
102+ if ($ _SERVER ['REMOTE_ADDR ' ] != $ _SERVER ['HTTP_X_FORWARDED ' ]) {
103+ $ user_combined_ip [] = $ _SERVER ['HTTP_X_FORWARDED ' ];
97104 }
98- }
99- if (isset ($ _SERVER ['HTTP_FORWARDED ' ])){
100- if ($ _SERVER ['REMOTE_ADDR ' ] != $ _SERVER ['HTTP_FORWARDED ' ]){
105+ }
106+ if (isset ($ _SERVER ['HTTP_FORWARDED ' ])) {
107+ if ($ _SERVER ['REMOTE_ADDR ' ] != $ _SERVER ['HTTP_FORWARDED ' ]) {
101108 $ user_combined_ip [] = '| ' . $ _SERVER ['HTTP_FORWARDED ' ];
102109 }
103110 }
104- if (isset ($ _SERVER ['HTTP_CF_CONNECTING_IP ' ])){
105- if (!empty ($ _SERVER ['HTTP_CF_CONNECTING_IP ' ])){
106- $ user_combined_ip [] = $ _SERVER ['HTTP_CF_CONNECTING_IP ' ];
111+ if (isset ($ _SERVER ['HTTP_CF_CONNECTING_IP ' ])) {
112+ if (!empty ($ _SERVER ['HTTP_CF_CONNECTING_IP ' ])) {
113+ $ user_combined_ip [] = $ _SERVER ['HTTP_CF_CONNECTING_IP ' ];
107114 }
108115 }
109- return implode ($ user_combined_ip ,'| ' );
116+ return implode ($ user_combined_ip , '| ' );
110117 }
111118}
112119
@@ -117,7 +124,8 @@ function get_user_ip(){
117124session_name ($ session_name );
118125@session_start ();
119126
120- function session_invalid (){
127+ function session_invalid ()
128+ {
121129 global $ session_name ;
122130 //delete all current sessions
123131 session_destroy ();
@@ -126,52 +134,58 @@ function session_invalid(){
126134 die ();
127135}
128136 $ api = new Hestia_API ();
129- if (!empty ($ _GET )){
130- if (isset ($ _GET ['logout ' ])){
131- $ api -> delete_temp_user ($ _SESSION ['HESTIA_sso_database ' ], $ _SESSION ['HESTIA_sso_user ' ], $ _SESSION ['PMA_single_signon_user ' ], $ _SESSION ['HESTIA_sso_host ' ]);
137+ if (!empty ($ _GET )) {
138+ if (isset ($ _GET ['logout ' ])) {
139+ $ api -> delete_temp_user ($ _SESSION ['HESTIA_sso_database ' ], $ _SESSION ['HESTIA_sso_user ' ], $ _SESSION ['PMA_single_signon_user ' ], $ _SESSION ['HESTIA_sso_host ' ]);
132140 //remove sessin
133141 session_invalid ();
134142 header ("Location: " . dirname ($ _SERVER ['PHP_SELF ' ]) . "/index.php " );
135143 die ();
136- }else {
137- if (isset ($ _GET ['user ' ]) && isset ($ _GET ['hestia_token ' ])){
144+ } else {
145+ if (isset ($ _GET ['user ' ]) && isset ($ _GET ['hestia_token ' ])) {
138146 $ database = $ _GET ['database ' ];
139147 $ user = $ _GET ['user ' ];
140148 $ host = 'localhost ' ;
141149 $ token = $ _GET ['hestia_token ' ];
142150 $ time = $ _GET ['exp ' ];
143- if ($ time + 60 > time ()){
151+
152+ if ($ time + 60 > time ()) {
144153 //note: Possible issues with cloudflare due to ip obfuscation
145154 $ ip = $ api -> get_user_ip ();
146- if (!password_verify ($ database .$ user .$ ip .$ time .PHPMYADMIN_KEY ,$ token )){
155+ if (!password_verify ($ database .$ user .$ ip .$ time .PHPMYADMIN_KEY , $ token )) {
156+ trigger_error ('Access denied: There is a security token mismatch ' . $ time , E_USER_WARNING );
157+ session_invalid ();
158+ die ();
147159 session_invalid ();
148- }else {
160+ } else {
149161 $ id = session_id ();
150- //create a new temp user
151- $ data = $ api -> create_temp_user ($ database ,$ user , $ host );
152- $ _SESSION ['PMA_single_signon_user ' ] = $ data -> login -> user ;
153- $ _SESSION ['PMA_single_signon_password ' ] = $ data -> login -> password ;
154- $ _SESSION ['PMA_single_signon_host ' ] = $ host ;
155- //save database / username to be used for sending logout notification.
156- $ _SESSION ['HESTIA_sso_user ' ] = $ user ;
157- $ _SESSION ['HESTIA_sso_database ' ] = $ database ;
158- $ _SESSION ['HESTIA_sso_host ' ] = $ host ;
159-
160- @session_write_close ();
161- setcookie ($ session_name , $ id , 0 , "/ " );
162- header ("Location: " . dirname ($ _SERVER ['PHP_SELF ' ]) . "/index.php " );
162+ //create a new temp user
163+ $ data = $ api -> create_temp_user ($ database , $ user , $ host );
164+ if ($ data ) {
165+ $ _SESSION ['PMA_single_signon_user ' ] = $ data -> login -> user ;
166+ $ _SESSION ['PMA_single_signon_password ' ] = $ data -> login -> password ;
167+ $ _SESSION ['PMA_single_signon_host ' ] = $ host ;
168+ //save database / username to be used for sending logout notification.
169+ $ _SESSION ['HESTIA_sso_user ' ] = $ user ;
170+ $ _SESSION ['HESTIA_sso_database ' ] = $ database ;
171+ $ _SESSION ['HESTIA_sso_host ' ] = $ host ;
172+
173+ @session_write_close ();
174+ setcookie ($ session_name , $ id , 0 , "/ " );
175+ header ("Location: " . dirname ($ _SERVER ['PHP_SELF ' ]) . "/index.php " );
176+ } else {
177+ session_invalid ();
178+ }
163179 die ();
164180 }
165- }else {
181+ } else {
182+ trigger_error ('Link has been expired: System time: ' . time () .' / Time provided in link: ' . $ time , E_USER_WARNING );
166183 session_invalid ();
167- header ("Location: " . dirname ($ _SERVER ['PHP_SELF ' ]) . "/index.php " );
168184 die ();
169185 }
170186 }
171187 }
172- }else {
188+ } else {
173189 session_invalid ();
174- header ("Location: " . dirname ($ _SERVER ['PHP_SELF ' ]) . "/index.php " );
175190 die ();
176191 }
177- ?>
0 commit comments