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