sessions.inc.php 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. // Start session
  3. ini_set("session.cookie_httponly", 1);
  4. ini_set('session.gc_maxlifetime', $SESSION_LIFETIME);
  5. if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
  6. strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == "https") {
  7. ini_set("session.cookie_secure", 1);
  8. $IS_HTTPS = true;
  9. }
  10. elseif (isset($_SERVER['HTTPS'])) {
  11. ini_set("session.cookie_secure", 1);
  12. $IS_HTTPS = true;
  13. }
  14. else {
  15. $IS_HTTPS = false;
  16. }
  17. // session_set_cookie_params($SESSION_LIFETIME, '/', '', $IS_HTTPS, true);
  18. session_start();
  19. if (!isset($_SESSION['CSRF']['TOKEN'])) {
  20. $_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
  21. }
  22. // Set session UA
  23. if (!isset($_SESSION['SESS_REMOTE_UA'])) {
  24. $_SESSION['SESS_REMOTE_UA'] = $_SERVER['HTTP_USER_AGENT'];
  25. }
  26. // API
  27. if (!empty($_SERVER['HTTP_X_API_KEY'])) {
  28. $stmt = $pdo->prepare("SELECT `allow_from` FROM `api` WHERE `api_key` = :api_key AND `active` = '1';");
  29. $stmt->execute(array(
  30. ':api_key' => preg_replace('/[^a-zA-Z0-9-]/', '', $_SERVER['HTTP_X_API_KEY'])
  31. ));
  32. $api_return = $stmt->fetch(PDO::FETCH_ASSOC);
  33. if (!empty($api_return['allow_from'])) {
  34. $remote = get_remote_ip(false);
  35. $allow_from = array_map('trim', preg_split( "/( |,|;|\n)/", $api_return['allow_from']));
  36. if (in_array($remote, $allow_from)) {
  37. $_SESSION['mailcow_cc_username'] = 'API';
  38. $_SESSION['mailcow_cc_role'] = 'admin';
  39. $_SESSION['mailcow_cc_api'] = true;
  40. }
  41. }
  42. }
  43. // Update session cookie
  44. // setcookie(session_name() ,session_id(), time() + $SESSION_LIFETIME);
  45. // Check session
  46. function session_check() {
  47. if ($_SESSION['mailcow_cc_api'] === true) {
  48. return true;
  49. }
  50. if (!isset($_SESSION['SESS_REMOTE_UA']) || ($_SESSION['SESS_REMOTE_UA'] != $_SERVER['HTTP_USER_AGENT'])) {
  51. $_SESSION['return'][] = array(
  52. 'type' => 'warning',
  53. 'msg' => 'session_ua'
  54. );
  55. return false;
  56. }
  57. if (!empty($_POST)) {
  58. if ($_SESSION['CSRF']['TOKEN'] != $_POST['csrf_token']) {
  59. $_SESSION['return'][] = array(
  60. 'type' => 'warning',
  61. 'msg' => 'session_token'
  62. );
  63. return false;
  64. }
  65. unset($_POST['csrf_token']);
  66. $_SESSION['CSRF']['TOKEN'] = bin2hex(random_bytes(32));
  67. $_SESSION['CSRF']['TIME'] = time();
  68. }
  69. return true;
  70. }
  71. if (isset($_SESSION['mailcow_cc_role']) && session_check() === false) {
  72. $_POST = array();
  73. $_FILES = array();
  74. }
  75. // Handle logouts
  76. if (isset($_POST["logout"])) {
  77. if (isset($_SESSION["dual-login"])) {
  78. $_SESSION["mailcow_cc_username"] = $_SESSION["dual-login"]["username"];
  79. $_SESSION["mailcow_cc_role"] = $_SESSION["dual-login"]["role"];
  80. unset($_SESSION["dual-login"]);
  81. header("Location: /mailbox");
  82. exit();
  83. }
  84. else {
  85. session_regenerate_id(true);
  86. session_unset();
  87. session_destroy();
  88. session_write_close();
  89. header("Location: /");
  90. }
  91. }