| <?php | |
| // Start session | |
| if (session_status() !== PHP_SESSION_ACTIVE) { | |
| ini_set("session.cookie_httponly", 1); | |
| ini_set('session.gc_maxlifetime', $SESSION_LIFETIME); | |
| } | |
| if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && | |
| strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == "https") { | |
| if (session_status() !== PHP_SESSION_ACTIVE) { | |
| ini_set("session.cookie_secure", 1); | |
| } | |
| $IS_HTTPS = true; | |
| } | |
| elseif (isset($_SERVER['HTTPS'])) { | |
| if (session_status() !== PHP_SESSION_ACTIVE) { | |
| ini_set("session.cookie_secure", 1); | |
| } | |
| $IS_HTTPS = true; | |
| } | |
| else { | |
| $IS_HTTPS = false; | |
| } | |
| if (session_status() !== PHP_SESSION_ACTIVE) { | |
| session_start(); | |
| } | |
| if (!isset($_SESSION['CSRF']['TOKEN'])) { | |
| $_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32)); | |
| } | |
| // Set session UA | |
| if (!isset($_SESSION['SESS_REMOTE_UA'])) { | |
| $_SESSION['SESS_REMOTE_UA'] = $_SERVER['HTTP_USER_AGENT']; | |
| } | |
| // Keep session active | |
| if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $SESSION_LIFETIME)) { | |
| session_unset(); | |
| session_destroy(); | |
| } | |
| $_SESSION['LAST_ACTIVITY'] = time(); | |
| // API | |
| if (!empty($_SERVER['HTTP_X_API_KEY'])) { | |
| $stmt = $pdo->prepare("SELECT * FROM `api` WHERE `api_key` = :api_key AND `active` = '1';"); | |
| $stmt->execute(array( | |
| ':api_key' => preg_replace('/[^a-zA-Z0-9-]/', '', $_SERVER['HTTP_X_API_KEY']) | |
| )); | |
| $api_return = $stmt->fetch(PDO::FETCH_ASSOC); | |
| if (!empty($api_return['api_key'])) { | |
| $skip_ip_check = ($api_return['skip_ip_check'] == 1); | |
| $remote = get_remote_ip(false); | |
| $allow_from = array_map('trim', preg_split( "/( |,|;|\n)/", $api_return['allow_from'])); | |
| if ($skip_ip_check === true || ip_acl($remote, $allow_from)) { | |
| $_SESSION['mailcow_cc_username'] = 'API'; | |
| $_SESSION['mailcow_cc_role'] = 'admin'; | |
| $_SESSION['mailcow_cc_api'] = true; | |
| if ($api_return['access'] == 'rw') { | |
| $_SESSION['mailcow_cc_api_access'] = 'rw'; | |
| } | |
| else { | |
| $_SESSION['mailcow_cc_api_access'] = 'ro'; | |
| } | |
| } | |
| else { | |
| $redis->publish("F2B_CHANNEL", "mailcow UI: Invalid password for API_USER by " . $_SERVER['REMOTE_ADDR']); | |
| error_log("mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']); | |
| http_response_code(401); | |
| echo json_encode(array( | |
| 'type' => 'error', | |
| 'msg' => 'api access denied for ip ' . $_SERVER['REMOTE_ADDR'] | |
| )); | |
| unset($_POST); | |
| exit(); | |
| } | |
| } | |
| else { | |
| $redis->publish("F2B_CHANNEL", "mailcow UI: Invalid password for API_USER by " . $_SERVER['REMOTE_ADDR']); | |
| error_log("mailcow UI: Invalid password for " . $user . " by " . $_SERVER['REMOTE_ADDR']); | |
| http_response_code(401); | |
| echo json_encode(array( | |
| 'type' => 'error', | |
| 'msg' => 'authentication failed' | |
| )); | |
| unset($_POST); | |
| exit(); | |
| } | |
| } | |
| // Handle logouts | |
| if (isset($_POST["logout"])) { | |
| if (isset($_SESSION["dual-login"])) { | |
| $_SESSION["mailcow_cc_username"] = $_SESSION["dual-login"]["username"]; | |
| $_SESSION["mailcow_cc_role"] = $_SESSION["dual-login"]["role"]; | |
| unset($_SESSION["dual-login"]); | |
| header("Location: /mailbox"); | |
| exit(); | |
| } | |
| else { | |
| session_regenerate_id(true); | |
| session_unset(); | |
| session_destroy(); | |
| session_write_close(); | |
| header("Location: /"); | |
| } | |
| } | |
| // Check session | |
| function session_check() { | |
| if (isset($_SESSION['mailcow_cc_api']) && $_SESSION['mailcow_cc_api'] === true) { | |
| return true; | |
| } | |
| if (!isset($_SESSION['SESS_REMOTE_UA']) || ($_SESSION['SESS_REMOTE_UA'] != $_SERVER['HTTP_USER_AGENT'])) { | |
| $_SESSION['return'][] = array( | |
| 'type' => 'warning', | |
| 'msg' => 'session_ua' | |
| ); | |
| return false; | |
| } | |
| if (!empty($_POST)) { | |
| if ($_SESSION['CSRF']['TOKEN'] != $_POST['csrf_token']) { | |
| $_SESSION['return'][] = array( | |
| 'type' => 'warning', | |
| 'msg' => 'session_token' | |
| ); | |
| return false; | |
| } | |
| unset($_POST['csrf_token']); | |
| $_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32)); | |
| $_SESSION['CSRF']['TIME'] = time(); | |
| } | |
| return true; | |
| } | |
| if (isset($_SESSION['mailcow_cc_role']) && session_check() === false) { | |
| $_POST = array(); | |
| $_FILES = array(); | |
| } |