index.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/prerequisites.inc.php';
  3. if (isset($_SESSION['mailcow_cc_role']) && isset($_SESSION['oauth2_request'])) {
  4. $oauth2_request = $_SESSION['oauth2_request'];
  5. unset($_SESSION['oauth2_request']);
  6. header('Location: ' . $oauth2_request);
  7. exit();
  8. }
  9. elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'admin') {
  10. header('Location: /admin');
  11. exit();
  12. }
  13. elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'domainadmin') {
  14. header('Location: /mailbox');
  15. exit();
  16. }
  17. elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == 'user') {
  18. header('Location: /user');
  19. exit();
  20. }
  21. require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/header.inc.php';
  22. $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
  23. $_SESSION['index_query_string'] = $_SERVER['QUERY_STRING'];
  24. ?>
  25. <div class="container">
  26. <div class="row">
  27. <div class="col-md-offset-3 col-md-6">
  28. <div class="panel panel-default panel-login">
  29. <div class="panel-heading"><i class="bi bi-person-fill"></i> <?= $lang['login']['login']; ?></div>
  30. <div class="panel-body">
  31. <div class="text-center mailcow-logo"><img src="<?=($main_logo = customize('get', 'main_logo')) ? $main_logo : '/img/cow_mailcow.svg';?>" alt="mailcow"></div>
  32. <?php if (!empty($UI_TEXTS['ui_announcement_text']) && in_array($UI_TEXTS['ui_announcement_type'], array('info', 'warning', 'danger')) && $UI_TEXTS['ui_announcement_active'] == 1) { ?>
  33. <div class="alert alert-<?=$UI_TEXTS['ui_announcement_type'];?> rot-enc ui-announcement-alert"><?=str_rot13($UI_TEXTS['ui_announcement_text']);?></div>
  34. <?php } ?>
  35. <legend><?= isset($_SESSION['oauth2_request']) ? $lang['oauth2']['authorize_app'] : $UI_TEXTS['main_name'];?></legend>
  36. <?php
  37. if (strpos($_SESSION['index_query_string'], 'mobileconfig') !== false) {
  38. ?>
  39. <div class="alert alert-info"><?= $lang['login']['mobileconfig_info']; ?></div>
  40. <?php
  41. }
  42. ?>
  43. <form method="post" autofill="off">
  44. <div class="form-group">
  45. <label class="sr-only" for="login_user"><?= $lang['login']['username']; ?></label>
  46. <div class="input-group">
  47. <div class="input-group-addon"><i class="bi bi-person-fill"></i></div>
  48. <input name="login_user" autocorrect="off" autocapitalize="none" type="<?=(strpos($_SESSION['index_query_string'], 'mobileconfig') !== false) ? 'email' : 'text';?>" id="login_user" class="form-control" placeholder="<?= $lang['login']['username']; ?>" required="" autofocus="" autocomplete="username">
  49. </div>
  50. </div>
  51. <div class="form-group">
  52. <label class="sr-only" for="pass_user"><?= $lang['login']['password']; ?></label>
  53. <div class="input-group">
  54. <div class="input-group-addon"><i class="bi bi-lock-fill"></i></div>
  55. <input name="pass_user" type="password" id="pass_user" class="form-control" placeholder="<?= $lang['login']['password']; ?>" required="" autocomplete="current-password">
  56. </div>
  57. </div>
  58. <div class="form-group" style="position: relative">
  59. <div class="btn-group">
  60. <div class="btn-group">
  61. <button type="submit" class="btn btn-xs-lg btn-success" value="Login"><?= $lang['login']['login']; ?></button>
  62. <button type="button" class="btn btn-xs-lg btn-success dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  63. <span class="caret"></span>
  64. </button>
  65. <ul class="dropdown-menu">
  66. <li><a href="#" id="fido2-login" style="line-height:1.4;"><i class="bi bi-shield-fill-check"></i> <?= $lang['login']['fido2_webauthn']; ?></a></li>
  67. </ul>
  68. </div>
  69. </div>
  70. <?php if(!isset($_SESSION['oauth2_request'])) { ?>
  71. <button type="button" <?=(isset($_SESSION['mailcow_locale']) && count($AVAILABLE_LANGUAGES) === 1) ? 'disabled="true"' : '' ?> class="btn btn-xs-lg btn-default pull-right dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  72. <span class="flag-icon flag-icon-<?= $_SESSION['mailcow_locale']; ?>"></span> <span class="caret"></span>
  73. </button>
  74. <ul class="dropdown-menu pull-right login">
  75. <?php
  76. foreach ($AVAILABLE_LANGUAGES as $c => $v) {
  77. ?>
  78. <li<?= ($_SESSION['mailcow_locale'] == $c) ? ' class="active"' : ''; ?>><a href="?<?= http_build_query(array_merge($_GET, array('lang' => $c))) ?>"><span class="flag-icon flag-icon-<?=$c;?>"></span> <?=$v;?></a></li>
  79. <?php } ?>
  80. </ul>
  81. <?php } ?>
  82. <div class="clearfix"></div>
  83. </div>
  84. </form>
  85. <?php
  86. if (isset($_SESSION['ldelay']) && $_SESSION['ldelay'] != '0') {
  87. ?>
  88. <p><div class="alert alert-info"><?= sprintf($lang['login']['delayed'], $_SESSION['ldelay']); ?></b></div></p>
  89. <?php } ?>
  90. <div id="fido2-alerts"></div>
  91. <?php if(!isset($_SESSION['oauth2_request'])) { ?>
  92. <legend><i class="bi bi-link-45deg"></i> <?=$UI_TEXTS['apps_name'];?></legend>
  93. <div class="apps">
  94. <?php
  95. if (!empty($MAILCOW_APPS)) {
  96. foreach ($MAILCOW_APPS as $app) {
  97. if (getenv('SKIP_SOGO') == "y" && preg_match('/^\/SOGo/i', $app['link'])) { continue; }
  98. ?>
  99. <div class="media-clearfix">
  100. <a href="<?=(isset($app['link'])) ? htmlspecialchars($app['link']) : '';?>" role="button" title="<?=(isset($app['description'])) ? htmlspecialchars($app['description']) : '';?>" class="btn btn-primary btn-lg btn-block"><?= htmlspecialchars($app['name']); ?></a>
  101. </div>
  102. <?php
  103. }
  104. }
  105. $app_links = customize('get', 'app_links');
  106. if (!empty($app_links)) {
  107. foreach ($app_links as $row) {
  108. foreach ($row as $key => $val) {
  109. ?>
  110. <div class="media-clearfix">
  111. <a href="<?= htmlspecialchars($val); ?>" role="button" class="btn btn-primary btn-lg btn-block"><?= htmlspecialchars($key); ?></a>
  112. </div>
  113. <?php
  114. }
  115. }
  116. } ?>
  117. </div>
  118. <?php }
  119. ?>
  120. </div>
  121. </div>
  122. </div>
  123. <?php if(!isset($_SESSION['oauth2_request'])) { ?>
  124. <div class="col-md-offset-3 col-md-6">
  125. <div class="panel panel-default">
  126. <div class="panel-heading">
  127. <a data-toggle="collapse" href="#collapse1"><i class="bi bi-patch-question-fill"></i> <?= $lang['start']['help']; ?></a>
  128. </div>
  129. <div id="collapse1" class="panel-collapse collapse">
  130. <div class="panel-body">
  131. <?php if ($UI_TEXTS['help_text']) { ?>
  132. <p><?=$UI_TEXTS['help_text'];?></p>
  133. <?php } else { ?>
  134. <p><span style="border-bottom: 1px dotted #999;"><?=$UI_TEXTS['main_name'];?></span></p>
  135. <p><?= $lang['start']['mailcow_panel_detail']; ?></p>
  136. <p><span style="border-bottom: 1px dotted #999;"><?=$UI_TEXTS['apps_name'];?></span></p>
  137. <p><?= $lang['start']['mailcow_apps_detail']; ?></p>
  138. <?php } ?>
  139. </div>
  140. </div>
  141. </div>
  142. </div>
  143. <?php } ?>
  144. </div>
  145. </div><!-- /.container -->
  146. <?php
  147. $js_minifier->add('/web/js/site/index.js');
  148. require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/footer.inc.php';