tab-user-auth.twig 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <div class="tab-pane fade in active show" id="tab-user-auth" role="tabpanel" aria-labelledby="tab-user-auth">
  2. <div class="card mb-4">
  3. <div class="card-header d-flex fs-5">
  4. <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-user-auth" data-bs-toggle="collapse" aria-controls="collapse-tab-user-auth">
  5. {{ lang.user.mailbox_general }}
  6. </button>
  7. <span class="d-none d-md-block">{{ lang.user.mailbox_general }}</span>
  8. </div>
  9. <div id="collapse-tab-user-auth" class="card-body collapse" data-bs-parent="#user-content">
  10. {% if mailboxdata.attributes.force_pw_update == '1' %}
  11. <div class="alert alert-danger">{{ lang.user.force_pw_update|raw }}</div>
  12. {% endif %}
  13. <div class="row">
  14. <div class="col-xl-9 col-lg-7 col-md-12 col-12 d-flex flex-column mb-4">
  15. {% if not skip_sogo %}
  16. <div class="row mb-4">
  17. <div class="col-12 col-lg-6 col-xl-4">
  18. {% if dual_login and allow_admin_email_login == 'n' or mailboxdata.attributes.force_pw_update == '1' %}
  19. <button disabled class="btn btn-secondary btn-block btn-xs-lg w-100">
  20. {{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
  21. </button>
  22. {% elseif dual_login %}
  23. <a href="/sogo-auth.php?login={{ mailcow_cc_username }}" role="button" class="btn btn-primary btn-lg btn-block btn-xs-lg w-100">
  24. {{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
  25. </a>
  26. {% elseif acl.sogo_access == 1 %}
  27. <a href="/SOGo/so" role="button" class="btn btn-primary btn-lg btn-block btn-xs-lg w-100">
  28. {{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
  29. </a>
  30. {% else %}
  31. <button disabled class="btn btn-secondary btn-block btn-xs-lg w-100">
  32. {{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
  33. </button>
  34. {% endif %}
  35. </div>
  36. </div>
  37. {% endif %}
  38. <legend>{{ lang.user.overview }}</legend>
  39. <hr>
  40. <div class="d-flex">
  41. <h5><i class="bi bi-envelope-fill"></i> {{ mailboxdata.messages }} {{ lang.user.messages }}</h5>
  42. <h5 class="ms-auto">{{ mailboxdata.quota_used|formatBytes(2) }} / {% if mailboxdata.quota == 0 %}∞{% else %}{{ mailboxdata.quota|formatBytes(2) }}{% endif %}</h5>
  43. </div>
  44. <div class="progress mb-4" style="height: 20px";>
  45. <div class="progress-bar bg-{{ mailboxdata.percent_class }}" role="progressbar" aria-valuenow="{{ mailboxdata.percent_in_use }}" aria-valuemin="0" aria-valuemax="100" style="min-width:2em;width: {{ mailboxdata.percent_in_use }}%;">
  46. {{ mailboxdata.percent_in_use }}%
  47. </div>
  48. </div>
  49. <div class="row">
  50. <div class="col-12 col-md-3 d-flex">
  51. <span class="mt-2 w-100 text-md-end">{{ lang.user.protocols }}:</span>
  52. </div>
  53. <div class="col-12 col-md-9 d-flex">
  54. <i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill m-2 ms-0" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.direct_protocol_access|raw }}"></i>
  55. <div class="d-flex flex-wrap">
  56. {% if mailboxdata.attributes.imap_access == 1 %}<div class="badge fs-6 bg-success m-2">IMAP <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger m-2">IMAP <i class="bi bi-x-lg"></i></div>{% endif %}
  57. {% if mailboxdata.attributes.smtp_access == 1 %}<div class="badge fs-6 bg-success m-2">SMTP <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger m-2">SMTP <i class="bi bi-x-lg"></i></div>{% endif %}
  58. {% if mailboxdata.attributes.sieve_access == 1 %}<div class="badge fs-6 bg-success m-2">Sieve <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger m-2">Sieve <i class="bi bi-x-lg"></i></div>{% endif %}
  59. {% if mailboxdata.attributes.pop3_access == 1 %}<div class="badge fs-6 bg-success m-2">POP3 <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger m-2">POP3 <i class="bi bi-x-lg"></i></div>{% endif %}
  60. </div>
  61. </div>
  62. </div>
  63. <div class="row mt-2">
  64. <div class="col-12 col-md-3 d-flex">
  65. <span class="mt-2 w-100 text-md-end">{{ lang.user.apple_connection_profile }}:</span>
  66. </div>
  67. <div class="col-12 col-md-8">
  68. <div class="d-flex">
  69. <i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill me-2" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.apple_connection_profile_mailonly }}"></i>
  70. <a href="/mobileconfig.php?only_email">{{ lang.user.email }} <small>[IMAP, SMTP]</small></a>
  71. </div>
  72. {% if not skip_sogo %}
  73. <div class="d-flex">
  74. <i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill me-2" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.apple_connection_profile_complete }}"></i>
  75. <a href="/mobileconfig.php">{{ lang.user.email_and_dav }} <small>[IMAP, SMTP, Cal/CardDAV]</small></a>
  76. </div>
  77. {% endif %}
  78. </div>
  79. </div>
  80. <div class="row mt-2">
  81. <div class="col-12 col-md-3 d-flex">
  82. <span class="mt-2 w-100 text-md-end">{{ lang.user.apple_connection_profile }}<br>{{ lang.user.with_app_password }}:</span>
  83. </div>
  84. <div class="col-12 col-md-9">
  85. <div class="d-flex">
  86. <i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill me-2" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.apple_connection_profile_mailonly }} {{ lang.user.apple_connection_profile_with_app_password }}"></i>
  87. <a href="/mobileconfig.php?only_email&amp;app_password">{{ lang.user.email }} <small>[IMAP, SMTP]</small></a>
  88. </div>
  89. {% if not skip_sogo %}
  90. <div class="d-flex">
  91. <i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill me-2" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.apple_connection_profile_complete }} {{ lang.user.apple_connection_profile_with_app_password }}"></i>
  92. <a href="/mobileconfig.php?app_password">{{ lang.user.email_and_dav }} <small>[IMAP, SMTP, Cal/CardDAV]</small></a>
  93. </div>
  94. {% endif %}
  95. </div>
  96. </div>
  97. <div class="row">
  98. <div class="col-12 d-flex flex-column text-center align-items-center mt-4">
  99. <a target="_blank" href="https://mailcow.github.io/mailcow-dockerized-docs/client/client/#{{ clientconfigstr }}">{{ lang.user.client_configuration }}</a>
  100. <a class="mt-2" href="#userFilterModal" data-bs-toggle="modal">{{ lang.user.show_sieve_filters }}</a>
  101. </div>
  102. </div>
  103. {% if mailboxdata.authsource == "mailcow" %}
  104. <legend class="mt-4">{{ lang.user.authentication }}</legend>
  105. <hr>
  106. {# Password Change #}
  107. <div class="row">
  108. <div class="col-12 col-md-3 d-flex"></div>
  109. <div class="col-12 col-md-9 d-flex flex-wrap">
  110. <a class="btn btn-secondary" href="#pwChangeModal" data-bs-toggle="modal"><i class="bi bi-pencil-fill"></i> {{ lang.user.change_password }}</a>
  111. {% if acl.pw_reset == 1 %}
  112. <a class="btn btn-secondary ms-4" href="#pwRecoveryEmailModal" data-bs-toggle="modal"><i class="bi bi-pencil-fill"></i> {{ lang.user.pw_recovery_email }}</a></p>
  113. {% endif %}
  114. </div>
  115. </div>
  116. {% endif %}
  117. {# TFA #}
  118. {% if mailboxdata.authsource == "mailcow" or mailboxdata.authsource == "ldap" %}
  119. <div class="row mt-4">
  120. <div class="col-12 col-md-3 d-flex">
  121. <span class="mt-2 w-100 text-md-end">{{ lang.tfa.tfa }}:</span>
  122. </div>
  123. <div class="col-12 col-md-9 d-flex flex-wrap justify-content-center justify-content-sm-start">
  124. <span id="tfa_pretty">{{ tfa_data.pretty }}</span>
  125. {% include 'tfa_keys.twig' %}
  126. </div>
  127. </div>
  128. <div class="row mt-2 mb-4">
  129. <div class="col-12 col-md-3 d-flex">
  130. <span class="mt-2 w-100 text-md-end">{{ lang.tfa.set_tfa }}:</span>
  131. </div>
  132. <div class="col-12 col-md-9 d-flex flex-wrap align-items-center justify-content-center justify-content-sm-start">
  133. <i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill m-2 ms-0" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.tfa_info|raw }}"></i>
  134. <select data-style="ms-2 btn btn-sm dropdown-toggle bs-placeholder btn-secondary" data-width="fit" id="selectTFA" class="selectpicker" title="{{ lang.tfa.select }}">
  135. <option value="yubi_otp">{{ lang.tfa.yubi_otp }}</option>
  136. <option value="webauthn">{{ lang.tfa.webauthn }}</option>
  137. <option value="totp">{{ lang.tfa.totp }}</option>
  138. <option value="none">{{ lang.tfa.none }}</option>
  139. </select>
  140. </div>
  141. </div>
  142. {% endif %}
  143. {# FIDO2 #}
  144. {% if mailboxdata.authsource == "mailcow" %}
  145. <div class="row mt-4">
  146. <div class="col-sm-3 col-12 text-sm-end text-start">
  147. <p><i class="bi bi-shield-fill-check"></i> {{ lang.fido2.fido2_auth }}</p>
  148. </div>
  149. </div>
  150. <div class="row">
  151. <div class="col-sm-3 col-12 text-sm-end text-start mb-4">
  152. {{ lang.fido2.known_ids }}:
  153. </div>
  154. <div class="col-sm-9 col-12">
  155. <div class="table-responsive">
  156. <table class="table table-striped table-hover table-condensed" id="fido2_keys">
  157. <tr>
  158. <th>ID</th>
  159. <th style="min-width:240px;text-align: right">{{ lang.admin.action }}</th>
  160. </tr>
  161. {% include 'fido2.twig' %}
  162. </table>
  163. </div>
  164. <br>
  165. </div>
  166. </div>
  167. <div class="row">
  168. <div class="offset-sm-3 col-sm-9">
  169. <div class="btn-group nowrap">
  170. <button class="btn btn-sm btn-primary d-block d-sm-inline" id="register-fido2">{{ lang.fido2.set_fido2 }}</button>
  171. <button type="button" class="btn btn-sm btn-xs-lg btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
  172. <ul class="dropdown-menu">
  173. <li><a class="dropdown-item" href="#" id="register-fido2-touchid"><i class="bi bi-apple"></i> {{ lang.fido2.set_fido2_touchid }}</a></li>
  174. </ul>
  175. </div>
  176. </div>
  177. </div>
  178. <br>
  179. <div class="row" id="status-fido2">
  180. <div class="col-sm-3 col-5 text-end">{{ lang.fido2.register_status }}:</div>
  181. <div class="col-sm-9 col-7">
  182. <div id="fido2-alerts">-</div>
  183. </div>
  184. <br>
  185. </div>
  186. {% endif %}
  187. </div>
  188. <div class="ms-auto col-xl-3 col-lg-5 col-md-12 col-12 d-flex flex-column well flex-grow-1" id="recent-logins">
  189. <legend class="d-flex">
  190. <span>{{ lang.user.recent_successful_connections }}</span>
  191. <div id="spinner-last-login" class="ms-auto my-auto spinner-border spinner-border-sm d-none" role="status">
  192. <span class="visually-hidden">Loading...</span>
  193. </div>
  194. </legend>
  195. <hr>
  196. <div class="d-flex">
  197. <span class="clear-last-logins mt-auto mb-2">
  198. {{ lang.user.clear_recent_successful_connections }}
  199. </span>
  200. <div class="dropdown mt-4 mb-2 ms-auto">
  201. <button class="btn btn-secondary btn-xs btn-xs-lg dropdown-toggle" type="button" id="history_sasl_days" data-bs-toggle="dropdown">{{ lang.user.login_history }}</button>
  202. <ul class="dropdown-menu">
  203. <li class="login-history" data-days="1"><a class="dropdown-item" href="#">1 {{ lang.user.day }}</a></li>
  204. <li class="login-history" data-days="7"><a class="dropdown-item active" href="#">1 {{ lang.user.week }}</a></li>
  205. <li class="login-history" data-days="14"><a class="dropdown-item" href="#">2 {{ lang.user.weeks }}</a></li>
  206. <li class="login-history" data-days="31"><a class="dropdown-item" href="#">1 {{ lang.user.month }}</a></li>
  207. </ul>
  208. </div>
  209. </div>
  210. <ul class="list-group last-sasl-login overflow-auto" style="flex: 1 1 0; min-height: 400px;"></ul>
  211. </div>
  212. </div>
  213. </div>
  214. </div>
  215. </div>