hestia-sso.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <?php
  2. /* Hestia way to enable support for SSO to PHPmyAdmin */
  3. /* To install please run v-add-sys-pma-sso */
  4. /* Following keys will get replaced when calling v-add-sys-pma-sso */
  5. define('PHPMYADMIN_KEY','%PHPMYADMIN_KEY%');
  6. define('API_HOST_NAME','%API_HOST_NAME%');
  7. define('API_HESTIA_PORT','%API_HESTIA_PORT%');
  8. define('API_KEY', '%API_KEY%');
  9. class Hestia_API {
  10. private $api_url;
  11. function __construct(){
  12. $this -> hostname = 'https://' . API_HOST_NAME . ':' . API_HESTIA_PORT .'/api/';
  13. $this -> key = API_KEY;
  14. $this -> pma_key = PHPMYADMIN_KEY;
  15. }
  16. /* Creates curl request */
  17. function request($postvars){
  18. $postdata = http_build_query($postvars);
  19. $curl = curl_init();
  20. curl_setopt($curl, CURLOPT_URL, $this -> hostname);
  21. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  22. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  23. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  24. curl_setopt($curl, CURLOPT_POST, true);
  25. curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
  26. $answer = curl_exec($curl);
  27. return $answer;
  28. }
  29. /* Creates an new temp user in mysql */
  30. function create_temp_user ($database, $user, $host){
  31. $post_request = array(
  32. 'hash' => $this -> key,
  33. 'returncode' => 'no',
  34. 'cmd' => 'v-add-database-temp-user',
  35. 'arg1' => $user,
  36. 'arg2' => $database,
  37. 'arg3' => 'mysql',
  38. 'arg4' => $host
  39. );
  40. $request = $this -> request($post_request);
  41. $json = json_decode($request);
  42. if(json_last_error() == JSON_ERROR_NONE){
  43. return $json;
  44. }else{
  45. return false;
  46. }
  47. }
  48. /* Delete an new temp user in mysql */
  49. function delete_temp_user ($database, $user, $dbuser, $host){
  50. $post_request = array(
  51. 'hash' => $this -> key,
  52. 'returncode' => 'yes',
  53. 'cmd' => 'v-delete-database-temp-user',
  54. 'arg1' => $user,
  55. 'arg2' => $database,
  56. 'arg3' => $dbuser,
  57. 'arg4' => 'mysql',
  58. 'arg5' => $host
  59. );
  60. $request = $this -> request($post_request);
  61. if(is_numeric($request) && $request == 0){
  62. return true;
  63. }else{
  64. return false;
  65. }
  66. }
  67. function get_user_ip(){
  68. // Saving user IPs to the session for preventing session hijacking
  69. $user_combined_ip = array();
  70. if($_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR']){
  71. $user_combined_ip[] = $_SERVER['REMOTE_ADDR'];
  72. }
  73. if(isset($_SERVER['HTTP_CLIENT_IP'])){
  74. $user_combined_ip .= '|'. $_SERVER['HTTP_CLIENT_IP'];
  75. }
  76. if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
  77. if($_SERVER['REMOTE_ADDR'] != $_SERVER['HTTP_X_FORWARDED_FOR']){
  78. $user_combined_ip[] = $_SERVER['HTTP_X_FORWARDED_FOR'];
  79. }
  80. }
  81. if(isset($_SERVER['HTTP_FORWARDED_FOR'])){
  82. if($_SERVER['REMOTE_ADDR'] != $_SERVER['HTTP_FORWARDED_FOR']){
  83. $user_combined_ip[] = $_SERVER['HTTP_FORWARDED_FOR'];
  84. }
  85. }
  86. if(isset($_SERVER['HTTP_X_FORWARDED'])){
  87. if($_SERVER['REMOTE_ADDR'] != $_SERVER['HTTP_X_FORWARDED']){
  88. $user_combined_ip[] = $_SERVER['HTTP_X_FORWARDED'];
  89. }
  90. }
  91. if(isset($_SERVER['HTTP_FORWARDED'])){
  92. if($_SERVER['REMOTE_ADDR'] != $_SERVER['HTTP_FORWARDED']){
  93. $user_combined_ip[] = '|'. $_SERVER['HTTP_FORWARDED'];
  94. }
  95. }
  96. if(isset($_SERVER['HTTP_CF_CONNECTING_IP'])){
  97. if(!empty($_SERVER['HTTP_CF_CONNECTING_IP'])){
  98. $user_combined_ip[] = $_SERVER['HTTP_CF_CONNECTING_IP'];
  99. }
  100. }
  101. return implode($user_combined_ip,'|');
  102. }
  103. }
  104. /* Need to have cookie visible from parent directory */
  105. session_set_cookie_params(0, '/', '', true, true);
  106. /* Create signon session */
  107. $session_name = 'SignonSession';
  108. session_name($session_name);
  109. @session_start();
  110. function session_invalid(){
  111. global $session_name;
  112. //delete all current sessions
  113. session_destroy();
  114. setcookie($session_name, null, -1, '/');
  115. header("Location: " . dirname($_SERVER['PHP_SELF']) . "/index.php");
  116. die();
  117. }
  118. $api = new Hestia_API();
  119. if(!empty($_GET)){
  120. if(isset($_GET['logout'])){
  121. $api -> delete_temp_user($_SESSION['HESTIA_sso_database'], $_SESSION['HESTIA_sso_user'], $_SESSION['PMA_single_signon_user'], $_SESSION['HESTIA_sso_host']);
  122. //remove sessin
  123. session_invalid();
  124. header("Location: " . dirname($_SERVER['PHP_SELF']) . "/index.php");
  125. die();
  126. }else{
  127. if(isset($_GET['user']) && isset($_GET['hestia_token'])){
  128. $database = $_GET['database'];
  129. $user = $_GET['user'];
  130. $host = 'localhost';
  131. $token = $_GET['hestia_token'];
  132. $time = $_GET['exp'];
  133. if($time + 60 > time()){
  134. //note: Possible issues with cloudflare due to ip obfuscation
  135. $ip = $api -> get_user_ip();
  136. if(!password_verify($database.$user.$ip.$time.PHPMYADMIN_KEY,$token)){
  137. session_invalid();
  138. }else{
  139. $id = session_id();
  140. //create a new temp user
  141. $data = $api -> create_temp_user($database,$user, $host);
  142. $_SESSION['PMA_single_signon_user'] = $data -> login -> user;
  143. $_SESSION['PMA_single_signon_password'] = $data -> login -> password ;
  144. $_SESSION['PMA_single_signon_host'] = $host;
  145. //save database / username to be used for sending logout notification.
  146. $_SESSION['HESTIA_sso_user'] = $user;
  147. $_SESSION['HESTIA_sso_database'] = $database;
  148. $_SESSION['HESTIA_sso_host'] = $host;
  149. @session_write_close();
  150. setcookie($session_name, $id , 0, "/");
  151. header("Location: " . dirname($_SERVER['PHP_SELF']) . "/index.php");
  152. die();
  153. }
  154. }else{
  155. session_invalid();
  156. header("Location: " . dirname($_SERVER['PHP_SELF']) . "/index.php");
  157. die();
  158. }
  159. }
  160. }
  161. }else{
  162. session_invalid();
  163. header("Location: " . dirname($_SERVER['PHP_SELF']) . "/index.php");
  164. die();
  165. }
  166. ?>