public
nobgit
read
NobMail
Based on mailcow: dockerized
Languages
Repository composition by tracked source files.
PHP
49%
JavaScript
35%
HTML
9%
CSS
4%
Shell
2%
Python
1%
Lua
0%
Perl
0%
Ruby
0%
SCSS
0%
Create file
Wiki Documentation
Clone
https://nobgit.com/orgs/nobgit/nobmail.git
ssh://[email protected]:2222/orgs/nobgit/nobmail.git
Trace
data/web/templates/user/tab-user-auth.twig
Trace helps you understand code history line by line. See who changed each line, when it changed, and which commit introduced it.
Author
Date
Commit
Line
Code
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
{% else %}
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
{% endif %}
31
</div>
32
</div>
33
{% endif %}
35
<legend>{{ lang.user.overview }}</legend>
36
<hr>
37
<div class="d-flex">
38
<h5><i class="bi bi-envelope-fill"></i> {{ mailboxdata.messages }} {{ lang.user.messages }}</h5>
39
<h5 class="ms-auto">{{ mailboxdata.quota_used|formatBytes(2) }} / {% if mailboxdata.quota == 0 %}∞{% else %}{{ mailboxdata.quota|formatBytes(2) }}{% endif %}</h5>
40
</div>
41
<div class="progress mb-4" style="height: 20px";>
42
<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 }}%;">
43
{{ mailboxdata.percent_in_use }}%
44
</div>
45
</div>
47
<div class="row">
48
<div class="col-12 col-md-3 d-flex">
49
<span class="mt-2 w-100 text-md-end">{{ lang.user.protocols }}:</span>
50
</div>
51
<div class="col-12 col-md-9 d-flex">
52
<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>
53
<div class="d-flex flex-wrap">
54
{% 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 %}
55
{% 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 %}
56
{% 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 %}
57
{% 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 %}
58
{% if mailboxdata.attributes.eas_access == 1 %}<div class="badge fs-6 bg-success m-2">ActiveSync <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger m-2">ActiveSync <i class="bi bi-x-lg"></i></div>{% endif %}
59
{% if mailboxdata.attributes.dav_access == 1 %}<div class="badge fs-6 bg-success m-2">CalDAV/CardDAV <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger m-2">CalDAV/CardDAV <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&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>
104
{% if mailboxdata.authsource == "mailcow" %}
105
<legend class="mt-4">{{ lang.user.authentication }}</legend>
106
<hr>
107
{# Password Change #}
108
<div class="row">
109
<div class="col-12 col-md-3 d-flex"></div>
110
<div class="col-12 col-md-9 d-flex flex-wrap">
111
<a class="btn btn-secondary" href="#pwChangeModal" data-bs-toggle="modal"><i class="bi bi-pencil-fill"></i> {{ lang.user.change_password }}</a>
112
{% if acl.pw_reset == 1 %}
113
<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>
114
{% endif %}
115
</div>
116
</div>
117
{% endif %}
118
{# TFA #}
119
{% if mailboxdata.authsource == "mailcow" or mailboxdata.authsource == "ldap" %}
120
<div class="row mt-4">
121
<div class="col-12 col-md-3 d-flex">
122
<span class="mt-2 w-100 text-md-end">{{ lang.tfa.tfa }}:</span>
123
</div>
124
<div class="col-12 col-md-9 d-flex flex-wrap justify-content-center justify-content-sm-start">
125
<span id="tfa_pretty">{{ tfa_data.pretty }}</span>
126
{% include 'tfa_keys.twig' %}
127
</div>
128
</div>
129
<div class="row mt-2 mb-4">
130
<div class="col-12 col-md-3 d-flex">
131
<span class="mt-2 w-100 text-md-end">{{ lang.tfa.set_tfa }}:</span>
132
</div>
133
<div class="col-12 col-md-9 d-flex flex-wrap align-items-center justify-content-center justify-content-sm-start">
134
<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>
135
<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 }}">
136
<option value="yubi_otp">{{ lang.tfa.yubi_otp }}</option>
137
<option value="webauthn">{{ lang.tfa.webauthn }}</option>
138
<option value="totp">{{ lang.tfa.totp }}</option>
139
<option value="none">{{ lang.tfa.none }}</option>
140
</select>
141
</div>
142
</div>
143
{% endif %}
144
{# FIDO2 #}
145
{% if mailboxdata.authsource == "mailcow" %}
146
<div class="row mt-4">
147
<div class="col-sm-3 col-12 text-sm-end text-start">
148
<p><i class="bi bi-shield-fill-check"></i> {{ lang.fido2.fido2_auth }}</p>
149
</div>
150
</div>
151
<div class="row">
152
<div class="col-sm-3 col-12 text-sm-end text-start mb-4">
153
{{ lang.fido2.known_ids }}:
154
</div>
155
<div class="col-sm-9 col-12">
156
<div class="table-responsive">
157
<table class="table table-striped table-hover table-condensed" id="fido2_keys">
158
<tr>
159
<th>ID</th>
160
<th style="min-width:240px;text-align: right">{{ lang.admin.action }}</th>
161
</tr>
162
{% include 'fido2.twig' %}
163
</table>
164
</div>
165
<br>
166
</div>
167
</div>
168
<div class="row">
169
<div class="offset-sm-3 col-sm-9">
170
<div class="btn-group nowrap">
171
<button class="btn btn-sm btn-primary d-block d-sm-inline" id="register-fido2">{{ lang.fido2.set_fido2 }}</button>
172
<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>
173
<ul class="dropdown-menu">
174
<li><a class="dropdown-item" href="#" id="register-fido2-touchid"><i class="bi bi-apple"></i> {{ lang.fido2.set_fido2_touchid }}</a></li>
175
</ul>
176
</div>
177
</div>
178
</div>
179
<br>
180
<div class="row" id="status-fido2">
181
<div class="col-sm-3 col-5 text-end">{{ lang.fido2.register_status }}:</div>
182
<div class="col-sm-9 col-7">
183
<div id="fido2-alerts">-</div>
184
</div>
185
<br>
186
</div>
187
{% endif %}
188
</div>
189
<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">
190
<legend class="d-flex">
191
<span>{{ lang.user.recent_successful_connections }}</span>
192
<div id="spinner-last-login" class="ms-auto my-auto spinner-border spinner-border-sm d-none" role="status">
193
<span class="visually-hidden">Loading...</span>
194
</div>
195
</legend>
196
<hr>
197
<div class="d-flex">
198
<span class="clear-last-logins mt-auto mb-2">
199
{{ lang.user.clear_recent_successful_connections }}
200
</span>
201
<div class="dropdown mt-4 mb-2 ms-auto">
202
<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>
203
<ul class="dropdown-menu">
204
<li class="login-history" data-days="1"><a class="dropdown-item" href="#">1 {{ lang.user.day }}</a></li>
205
<li class="login-history" data-days="7"><a class="dropdown-item active" href="#">1 {{ lang.user.week }}</a></li>
206
<li class="login-history" data-days="14"><a class="dropdown-item" href="#">2 {{ lang.user.weeks }}</a></li>
207
<li class="login-history" data-days="31"><a class="dropdown-item" href="#">1 {{ lang.user.month }}</a></li>
208
</ul>
209
</div>
210
</div>
211
<ul class="list-group last-sasl-login overflow-auto" style="flex: 1 1 0; min-height: 400px;"></ul>
212
</div>
213
</div>
214
</div>
215
</div>
216
</div>