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/modals/mailbox.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
<!-- add mailbox modal -->
2
<div class="modal fade" id="addMailboxModal" tabindex="-1" role="dialog" aria-hidden="true">
3
<div class="modal-dialog modal-xl">
4
<div class="modal-content">
5
<div class="modal-header">
6
<h3 class="modal-title">{{ lang.mailbox.add_mailbox }}</h3>
7
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
8
</div>
9
<div class="modal-body">
10
<form class="form-horizontal" data-cached-form="true" data-id="add_mailbox" role="form" autocomplete="off">
11
<input type="hidden" value="0" name="force_pw_update">
12
<input type="hidden" value="0" name="force_tfa">
13
<input type="hidden" value="0" name="sogo_access">
14
<input type="hidden" value="0" name="protocol_access">
15
<input type="hidden" value="mailcow" name="authsource">
17
<div class="row mb-2">
18
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="local_part">{{ lang.add.mailbox_username }}</label>
19
<div class="col-sm-10">
20
<input type="text" pattern="[A-Za-z0-9\.!#$%&'*+/=?^_`{|}~-]+" autocorrect="off" autocapitalize="none" class="form-control" name="local_part" required>
21
</div>
22
</div>
23
<div class="row mb-2">
24
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="name">{{ lang.add.full_name }}</label>
25
<div class="col-sm-10">
26
<input type="text" class="form-control" name="name">
27
</div>
28
</div>
29
<div class="row mb-2">
30
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="domain">{{ lang.add.domain }}</label>
31
<div class="col-sm-10">
32
<select class="full-width-select" data-live-search="true" id="addSelectDomain" name="domain" required>
33
{% for domain in domains %}
34
<option>{{ domain }}</option>
35
{% endfor %}
36
</select>
37
</div>
38
</div>
39
<div class="row mb-4">
40
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="description">{{ lang.mailbox.template }}</label>
41
<div class="col-sm-10">
42
<select data-live-search="true" id="mailbox_templates" class="form-control" title="{{ lang.mailbox.template }}">
43
</select>
44
</div>
45
</div>
46
<div id="mbox_add_pwds">
47
<div class="row mb-2">
48
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="password">{{ lang.add.password }} (<a href="#" class="generate_password">{{ lang.add.generate }}</a>)</label>
49
<div class="col-sm-10">
50
<input type="password" data-pwgen-field="true" data-hibp="true" class="form-control" name="password" placeholder="" autocomplete="new-password" required>
51
</div>
52
</div>
53
<div class="row mb-4">
54
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="password2">{{ lang.add.password_repeat }}</label>
55
<div class="col-sm-10">
56
<input type="password" data-pwgen-field="true" class="form-control" name="password2" placeholder="" autocomplete="new-password" required>
57
</div>
58
</div>
59
</div>
60
<div class="row mb-2">
61
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.add.tags }}</label>
62
<div class="col-sm-10">
63
<div class="form-control tag-box">
64
<input type="text" class="tag-input" id="addMailbox_tags">
65
<span class="btn tag-add"><i class="bi bi-plus-lg"></i></span>
66
<input type="hidden" value="" name="tags" class="tag-values" />
67
</div>
68
</div>
69
</div>
70
<div class="row mb-4">
71
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="addInputQuota">{{ lang.add.quota_mb }}
72
<br /><span id="quotaBadge" class="badge bg-primary">max. - MiB</span>
73
</label>
74
<div class="col-sm-10">
75
<input type="text" class="form-control" name="quota" min="0" max="" id="addInputQuota" disabled value="{{ lang.add.select_domain }}" required>
76
<small class="text-muted">0 = ∞</small>
77
<div class="badge fs-5 bg-warning addInputQuotaExhausted" style="display:none;">{{ lang.warning.quota_exceeded_scope }}</div>
78
</div>
79
</div>
80
<div class="row mb-2">
81
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.user.tag_handling }}</label>
82
<div class="col-sm-10">
83
<div class="btn-group">
84
<input type="radio" class="btn-check" name="tagged_mail_handler" id="tagged_mail_handler_subfolder" autocomplete="off" value="subfolder">
85
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="tagged_mail_handler_subfolder">{{ lang.user.tag_in_subfolder }}</label>
87
<input type="radio" class="btn-check" name="tagged_mail_handler" id="tagged_mail_handler_subject" autocomplete="off" value="subject">
88
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="tagged_mail_handler_subject">{{ lang.user.tag_in_subject }}</label>
90
<input type="radio" class="btn-check" name="tagged_mail_handler" id="tagged_mail_handler_none" autocomplete="off" value="none">
91
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="tagged_mail_handler_none">{{ lang.user.tag_in_none }}</label>
92
</div>
93
<p class="text-muted"><small>{{ lang.user.tag_help_explain|raw }}</small></p>
94
<p class="text-muted"><small>{{ lang.user.tag_help_example|raw }}</small></p>
95
</div>
96
</div>
97
<div class="row mb-2">
98
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.user.quarantine_notification }}</label>
99
<div class="col-sm-10">
100
<div class="btn-group">
101
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_never" autocomplete="off" value="never">
102
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_never">{{ lang.user.never }}</label>
104
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_hourly" autocomplete="off" value="hourly">
105
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_hourly">{{ lang.user.hourly }}</label>
107
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_daily" autocomplete="off" value="daily">
108
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_daily">{{ lang.user.daily }}</label>
110
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_weekly" autocomplete="off" value="weekly">
111
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_weekly">{{ lang.user.weekly }}</label>
112
</div>
113
<p class="text-muted"><small>{{ lang.user.quarantine_notification_info }}</small></p>
114
</div>
115
</div>
116
<div class="row mb-2">
117
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.user.quarantine_category }}</label>
118
<div class="col-sm-10">
119
<div class="btn-group">
120
<input type="radio" class="btn-check" name="quarantine_category" id="quarantine_category_reject" autocomplete="off" value="reject">
121
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_category_reject">{{ lang.user.q_reject }}</label>
123
<input type="radio" class="btn-check" name="quarantine_category" id="quarantine_category_add_header" autocomplete="off" value="add_header">
124
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_category_add_header">{{ lang.user.q_add_header }}</label>
126
<input type="radio" class="btn-check" name="quarantine_category" id="quarantine_category_all" autocomplete="off" value="all">
127
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_category_all">{{ lang.user.q_all }}</label>
128
</div>
129
<p class="text-muted"><small>{{ lang.user.quarantine_category_info }}</small></p>
130
</div>
131
</div>
132
<div class="row mb-4">
133
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="tls_enforce_in">{{ lang.user.tls_policy }}</label>
134
<div class="col-sm-10">
135
<div class="btn-group">
136
<input type="checkbox" class="btn-check" name="tls_enforce_in" id="tls_enforce_in" autocomplete="off" value="1">
137
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="tls_enforce_in">{{ lang.user.tls_enforce_in }}</label>
139
<input type="checkbox" class="btn-check" name="tls_enforce_out" id="tls_enforce_out" autocomplete="off" value="1">
140
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="tls_enforce_out">{{ lang.user.tls_enforce_out }}</label>
141
</div>
142
</div>
143
</div>
144
<div class="row mb-2">
145
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="protocol_access">{{ lang.edit.allowed_protocols }}</label>
146
<div class="col-sm-10">
147
<select name="protocol_access" id="protocol_access" multiple class="form-control">
148
<option value="imap">IMAP</option>
149
<option value="pop3">POP3</option>
150
<option value="smtp">SMTP</option>
151
<option value="sieve">Sieve</option>
152
<option value="eas">ActiveSync</option>
153
<option value="dav">CalDAV/CardDAV</option>
154
</select>
155
</div>
156
</div>
157
<div class="row mb-4">
158
<label class="control-label col-sm-2 text-sm-end text-sm-end">ACL</label>
159
<div class="col-sm-10">
160
<select id="user_acl" name="acl" multiple class="form-control">
161
<option value="spam_alias" selected>{{ lang.acl["spam_alias"] }}</option>
162
<option value="tls_policy" selected>{{ lang.acl["tls_policy"] }}</option>
163
<option value="spam_score" selected>{{ lang.acl["spam_score"] }}</option>
164
<option value="spam_policy" selected>{{ lang.acl["spam_policy"] }}</option>
165
<option value="delimiter_action" selected>{{ lang.acl["delimiter_action"] }}</option>
166
<option value="syncjobs">{{ lang.acl["syncjobs"] }}</option>
167
<option value="eas_reset" selected>{{ lang.acl["eas_reset"] }}</option>
168
<option value="sogo_profile_reset">{{ lang.acl["sogo_profile_reset"] }}</option>
169
<option value="pushover" selected>{{ lang.acl["pushover"] }}</option>
170
<option value="quarantine" selected>{{ lang.acl["quarantine"] }}</option>
171
<option value="quarantine_attachments" selected>{{ lang.acl["quarantine_attachments"] }}</option>
172
<option value="quarantine_notification" selected>{{ lang.acl["quarantine_notification"] }}</option>
173
<option value="quarantine_category" selected>{{ lang.acl["quarantine_category"] }}</option>
174
<option value="app_passwds" selected>{{ lang.acl["app_passwds"] }}</option>
175
<option value="pw_reset" selected>{{ lang.acl["pw_reset"] }}</option>
176
</select>
177
</div>
178
</div>
179
<div class="row mb-4">
180
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.acl.ratelimit }}</label>
181
<div class="col-sm-10">
182
<div class="input-group">
183
<input name="rl_value" id="rl_value" type="number" autocomplete="off" value="" class="form-control mb-2" placeholder="{{ lang.ratelimit.disabled }}">
184
<select name="rl_frame" id="rl_frame" class="form-control">
185
{% include 'mailbox/rl-frame.twig' %}
186
</select>
187
</div>
188
<p class="text-muted mt-1">{{ lang.edit.mbox_rl_info }}</p>
189
</div>
190
</div>
191
<div class="row mb-2">
192
<div class="offset-sm-2 col-sm-10">
193
<select name="active" id="mbox_active" class="form-control">
194
<option value="1" selected>{{ lang.add.active }}</option>
195
<option value="2">{{ lang.add.disable_login }}</option>
196
<option value="0">{{ lang.add.inactive }}</option>
197
</select>
198
</div>
199
</div>
200
<div class="row">
201
<div class="offset-sm-2 col-sm-10">
202
<div class="form-check">
203
<label><input type="checkbox" class="form-check-input" value="1" name="force_pw_update" id="force_pw_update"> {{ lang.edit.force_pw_update }}</label>
204
<small class="text-muted">{{ lang.edit.force_pw_update_info|format(ui_texts.main_name) }}</small>
205
</div>
206
</div>
207
</div>
208
<div class="row">
209
<div class="offset-sm-2 col-sm-10">
210
<div class="form-check">
211
<label><input type="checkbox" class="form-check-input" value="1" name="force_tfa" id="force_tfa"> {{ lang.tfa.force_tfa }}</label>
212
<small class="text-muted">{{ lang.tfa.force_tfa_info }}</small>
213
</div>
214
</div>
215
</div>
216
{% if not skip_sogo %}
217
<div class="row">
218
<div class="offset-sm-2 col-sm-10">
219
<div class="form-check">
220
<label><input type="checkbox" class="form-check-input" value="1" name="sogo_access" id="sogo_access"> {{ lang.edit.sogo_access }}</label>
221
<small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
222
</div>
223
</div>
224
</div>
225
{% endif %}
226
<hr>
227
<div class="row">
228
<div class="offset-sm-2 col-sm-10">
229
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="add_mailbox" data-api-url='add/mailbox' data-api-attr='{}' href="#">{{ lang.admin.add }}</button>
230
</div>
231
</div>
232
</form>
233
</div>
234
</div>
235
</div>
236
</div><!-- add mailbox modal -->
237
<!-- add mailbox template modal -->
238
<div class="modal fade" id="addMailboxTemplateModal" tabindex="-1" role="dialog" aria-hidden="true">
239
<div class="modal-dialog modal-xl">
240
<div class="modal-content">
241
<div class="modal-header">
242
<h3 class="modal-title">{{ lang.mailbox.add_template }}</h3>
243
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
244
</div>
245
<div class="modal-body">
246
<form class="form-horizontal" data-id="addmailbox_template" role="form" method="post">
247
<input type="hidden" value="default" name="sender_acl">
248
<input type="hidden" value="0" name="force_pw_update">
249
<input type="hidden" value="0" name="force_tfa">
250
<input type="hidden" value="0" name="sogo_access">
251
<input type="hidden" value="0" name="protocol_access">
253
<div class="row mb-4">
254
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="template">{{ lang.mailbox.template }}</label>
255
<div class="col-sm-10">
256
<div class="input-group mb-3">
257
<input type="text" name="template" class="form-control" aria-label="Text input with dropdown button" value="" />
258
</div>
259
</div>
260
</div>
261
<div class="row mb-2">
262
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.add.tags }}</label>
263
<div class="col-sm-10">
264
<div class="form-control tag-box">
265
<input type="text" class="tag-input" id="addMailbox_tags">
266
<span class="btn tag-add"><i class="bi bi-plus-lg"></i></span>
267
<input type="hidden" value="" name="tags" class="tag-values" />
268
</div>
269
</div>
270
</div>
271
<div class="row mb-2">
272
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="quota">{{ lang.edit.quota_mb }}</label>
273
<div class="col-sm-10">
274
<input type="number" name="quota" style="width:100%" min="0" value="" class="form-control">
275
<small class="text-muted">0 = ∞</small>
276
</div>
277
</div>
278
<div class="row mb-2">
279
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.user.tag_handling }}</label>
280
<div class="col-sm-10">
281
<div class="btn-group">
282
<input type="radio" class="btn-check" name="tagged_mail_handler" id="template_tagged_mail_handler_subfolder" autocomplete="off" value="subfolder">
283
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_tagged_mail_handler_subfolder">{{ lang.user.tag_in_subfolder }}</label>
285
<input type="radio" class="btn-check" name="tagged_mail_handler" id="template_tagged_mail_handler_subject" autocomplete="off" value="subject">
286
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_tagged_mail_handler_subject">{{ lang.user.tag_in_subject }}</label>
288
<input type="radio" class="btn-check" name="tagged_mail_handler" id="template_tagged_mail_handler_none" autocomplete="off" value="none">
289
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_tagged_mail_handler_none">{{ lang.user.tag_in_none }}</label>
290
</div>
291
<p class="text-muted"><small>{{ lang.user.tag_help_explain|raw }}</small></p>
292
<p class="text-muted"><small>{{ lang.user.tag_help_example|raw }}</small></p>
293
</div>
294
</div>
295
<div class="row mb-2">
296
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.user.quarantine_notification }}</label>
297
<div class="col-sm-10">
298
<div class="btn-group">
299
<input type="radio" class="btn-check" name="quarantine_notification" id="template_quarantine_notification_never" autocomplete="off" value="never">
300
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_notification_never">{{ lang.user.never }}</label>
302
<input type="radio" class="btn-check" name="quarantine_notification" id="template_quarantine_notification_hourly" autocomplete="off" value="hourly">
303
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_notification_hourly">{{ lang.user.hourly }}</label>
305
<input type="radio" class="btn-check" name="quarantine_notification" id="template_quarantine_notification_daily" autocomplete="off" value="daily">
306
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_notification_daily">{{ lang.user.daily }}</label>
308
<input type="radio" class="btn-check" name="quarantine_notification" id="template_quarantine_notification_weekly" autocomplete="off" value="weekly">
309
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_notification_weekly">{{ lang.user.weekly }}</label>
310
</div>
311
<p class="text-muted"><small>{{ lang.user.quarantine_notification_info }}</small></p>
312
</div>
313
</div>
314
<div class="row mb-2">
315
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.user.quarantine_category }}</label>
316
<div class="col-sm-10">
317
<div class="btn-group">
318
<input type="radio" class="btn-check" name="quarantine_category" id="template_quarantine_category_reject" autocomplete="off" value="reject" >
319
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_category_reject">{{ lang.user.q_reject }}</label>
321
<input type="radio" class="btn-check" name="quarantine_category" id="template_quarantine_category_add_header" autocomplete="off" value="add_header">
322
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_category_add_header">{{ lang.user.q_add_header }}</label>
324
<input type="radio" class="btn-check" name="quarantine_category" id="template_quarantine_category_all" autocomplete="off" value="all">
325
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_category_all">{{ lang.user.q_all }}</label>
326
</div>
327
<p class="text-muted"><small>{{ lang.user.quarantine_category_info }}</small></p>
328
</div>
329
</div>
330
<div class="row mb-4">
331
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="sender_acl">{{ lang.user.tls_policy }}</label>
332
<div class="col-sm-10">
333
<div class="btn-group">
334
<input type="checkbox" class="btn-check" name="tls_enforce_in" id="template_tls_enforce_in" autocomplete="off" value="1">
335
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_tls_enforce_in">{{ lang.user.tls_enforce_in }}</label>
337
<input type="checkbox" class="btn-check" name="tls_enforce_out" id="template_tls_enforce_out" autocomplete="off" value="1">
338
<label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_tls_enforce_out">{{ lang.user.tls_enforce_out }}</label>
339
</div>
340
</div>
341
</div>
342
<div class="row mb-2">
343
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="protocol_access">{{ lang.edit.allowed_protocols }}</label>
344
<div class="col-sm-10">
345
<select name="protocol_access" multiple class="form-control">
346
<option value="imap" selected>IMAP</option>
347
<option value="pop3" selected>POP3</option>
348
<option value="smtp" selected>SMTP</option>
349
<option value="sieve" selected>Sieve</option>
350
<option value="activesync" selected>ActiveSync</option>
351
<option value="dav" selected>CalDAV/CardDAV</option>
352
</select>
353
</div>
354
</div>
355
<div class="row mb-4">
356
<label class="control-label col-sm-2 text-sm-end text-sm-end">ACL</label>
357
<div class="col-sm-10">
358
<select id="template_user_acl" name="acl" size="10" multiple class="form-control">
359
<option value="spam_alias" selected>{{ lang.acl["spam_alias"] }}</option>
360
<option value="tls_policy" selected>{{ lang.acl["tls_policy"] }}</option>
361
<option value="spam_score" selected>{{ lang.acl["spam_score"] }}</option>
362
<option value="spam_policy" selected>{{ lang.acl["spam_policy"] }}</option>
363
<option value="delimiter_action" selected>{{ lang.acl["delimiter_action"] }}</option>
364
<option value="syncjobs">{{ lang.acl["syncjobs"] }}</option>
365
<option value="eas_reset" selected>{{ lang.acl["eas_reset"] }}</option>
366
<option value="sogo_profile_reset">{{ lang.acl["sogo_profile_reset"] }}</option>
367
<option value="pushover" selected>{{ lang.acl["pushover"] }}</option>
368
<option value="quarantine" selected>{{ lang.acl["quarantine"] }}</option>
369
<option value="quarantine_attachments" selected>{{ lang.acl["quarantine_attachments"] }}</option>
370
<option value="quarantine_notification" selected>{{ lang.acl["quarantine_notification"] }}</option>
371
<option value="quarantine_category" selected>{{ lang.acl["quarantine_category"] }}</option>
372
<option value="app_passwds" selected>{{ lang.acl["app_passwds"] }}</option>
373
<option value="pw_reset" selected>{{ lang.acl["pw_reset"] }}</option>
374
</select>
375
</div>
376
</div>
377
<div class="row mb-4">
378
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.acl.ratelimit }}</label>
379
<div class="col-sm-10">
380
<div class="input-group">
381
<input name="rl_value" type="number" autocomplete="off" value="" class="form-control mb-2" placeholder="{{ lang.ratelimit.disabled }}">
382
<select name="rl_frame" class="form-control">
383
{% include 'mailbox/rl-frame.twig' %}
384
</select>
385
</div>
386
<p class="text-muted mt-1">{{ lang.edit.mbox_rl_info }}</p>
387
</div>
388
</div>
389
<hr>
390
<div class="row my-2">
391
<div class="offset-sm-2 col-sm-10">
392
<select id="mbox_acitve" name="active" class="form-control">
393
<option value="1" selected>{{ lang.edit.active }}</option>
394
<option value="2">{{ lang.edit.disable_login }}</option>
395
<option value="0">{{ lang.edit.inactive }}</option>
396
</select>
397
</div>
398
</div>
399
<div class="row">
400
<div class="offset-sm-2 col-sm-10">
401
<div class="form-check">
402
<label><input type="checkbox" class="form-check-input" value="1" name="force_pw_update"> {{ lang.edit.force_pw_update }}</label>
403
<small class="text-muted">{{ lang.edit.force_pw_update_info|format(ui_texts.main_name) }}</small>
404
</div>
405
</div>
406
</div>
407
<div class="row">
408
<div class="offset-sm-2 col-sm-10">
409
<div class="form-check">
410
<label><input type="checkbox" class="form-check-input" value="1" name="force_tfa"> {{ lang.tfa.force_tfa }}</label>
411
<small class="text-muted">{{ lang.tfa.force_tfa_info }}</small>
412
</div>
413
</div>
414
</div>
415
{% if not skip_sogo %}
416
<div class="row">
417
<div class="offset-sm-2 col-sm-10">
418
<div class="form-check">
419
<label><input type="checkbox" class="form-check-input" value="1" name="sogo_access"> {{ lang.edit.sogo_access }}</label>
420
<small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
421
</div>
422
</div>
423
</div>
424
{% endif %}
425
<div class="row my-2">
426
<div class="offset-sm-2 col-sm-10">
427
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="addmailbox_template" data-api-url='add/mailbox/template' data-api-attr='{}' href="#">{{ lang.admin.add }}</button>
428
</div>
429
</div>
430
</form>
431
</div>
432
</div>
433
</div>
434
</div><!-- add mailbox template modal -->
435
<!-- add domain modal -->
436
<div class="modal fade" id="addDomainModal" tabindex="-1" role="dialog" aria-hidden="true">
437
<div class="modal-dialog modal-xl">
438
<div class="modal-content">
439
<div class="modal-header">
440
<h3 class="modal-title">{{ lang.mailbox.add_domain }}</h3>
441
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
442
</div>
443
<div class="modal-body">
444
<form class="form-horizontal" data-cached-form="true" data-id="add_domain" role="form">
445
<input type="hidden" value="0" name="gal">
446
<input type="hidden" value="0" name="active">
447
<input type="hidden" value="0" name="backupmx">
448
<input type="hidden" value="0" name="relay_all_recipients">
449
<input type="hidden" value="0" name="relay_unknown_only">
451
<div class="row mb-2">
452
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="domain">{{ lang.add.domain }}</label>
453
<div class="col-sm-10">
454
<input type="text" autocorrect="off" autocapitalize="none" class="form-control" name="domain" required>
455
</div>
456
</div>
457
<div class="row mb-4">
458
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="description">{{ lang.add.description }}</label>
459
<div class="col-sm-10">
460
<input type="text" class="form-control" name="description">
461
</div>
462
</div>
463
<div class="row mb-2">
464
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="description">{{ lang.mailbox.template }}</label>
465
<div class="col-sm-10">
466
<select data-live-search="true" id="domain_templates" class="form-control">
467
</select>
468
</div>
469
</div>
470
<div class="row mb-2">
471
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.add.tags }}</label>
472
<div class="col-sm-10">
473
<div class="form-control tag-box">
474
<input type="text" class="tag-input" id="addDomain_tags">
475
<span class="btn tag-add"><i class="bi bi-plus-lg"></i></span>
476
<input type="hidden" value="" name="tags" class="tag-values" />
477
</div>
478
</div>
479
</div>
480
<div class="row mb-2">
481
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="aliases">{{ lang.add.max_aliases }}</label>
482
<div class="col-sm-10">
483
<input type="number" id="addDomain_max_aliases" class="form-control" name="aliases" value="400" required>
484
</div>
485
</div>
486
<div class="row mb-2">
487
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="mailboxes">{{ lang.add.max_mailboxes }}</label>
488
<div class="col-sm-10">
489
<input type="number" id="addDomain_max_mailboxes" class="form-control" name="mailboxes" value="10" required>
490
</div>
491
</div>
492
<div class="row mb-2">
493
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="defquota">{{ lang.add.mailbox_quota_def }}</label>
494
<div class="col-sm-10">
495
<input type="number" id="addDomain_mailbox_quota_def" class="form-control" name="defquota" value="3072" required>
496
</div>
497
</div>
498
<div class="row mb-2">
499
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="maxquota">{{ lang.add.mailbox_quota_m }}</label>
500
<div class="col-sm-10">
501
<input type="number" id="addDomain_mailbox_quota_m" class="form-control" name="maxquota" value="10240" required>
502
</div>
503
</div>
504
<div class="row mb-4">
505
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="quota">{{ lang.add.domain_quota_m }}</label>
506
<div class="col-sm-10">
507
<input type="number" id="addDomain_domain_quota_m" class="form-control" name="quota" value="10240" required>
508
</div>
509
</div>
510
{% if not skip_sogo %}
511
<div class="row mb-2">
512
<div class="offset-sm-2 col-sm-10">
513
<div class="form-check">
514
<label><input type="checkbox" class="form-check-input" id="addDomain_gal" value="1" name="gal" checked> {{ lang.edit.gal }}</label>
515
<small class="text-muted">{{ lang.edit.gal_info|raw }}</small>
516
</div>
517
</div>
518
</div>
519
{% endif %}
520
<div class="row mb-4">
521
<div class="offset-sm-2 col-sm-10">
522
<div class="form-check">
523
<label><input type="checkbox" class="form-check-input" id="addDomain_active" value="1" name="active" checked> {{ lang.add.active }}</label>
524
</div>
525
</div>
526
</div>
527
<hr>
528
<div class="row mb-4">
529
<label class="control-label col-sm-2 text-sm-end" for="rl_frame">{{ lang.acl.ratelimit }}</label>
530
<div class="col-sm-10">
531
<div class="input-group">
532
<input name="rl_value" id="addDomain_rl_value" type="number" class="form-control" placeholder="{{ lang.ratelimit.disabled }}">
533
<select name="rl_frame" id="addDomain_rl_frame" class="form-control">
534
{% include 'mailbox/rl-frame.twig' %}
535
</select>
536
</div>
537
</div>
538
</div>
539
<hr>
540
<div class="row mb-2">
541
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="dkim_selector">{{ lang.admin.dkim_domains_selector }}</label>
542
<div class="col-sm-10">
543
<input class="form-control" id="dkim_selector" name="dkim_selector" value="dkim">
544
</div>
545
</div>
546
<div class="row mb-4">
547
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="key_size">{{ lang.admin.dkim_key_length }}</label>
548
<div class="col-sm-10">
549
<select data-style="btn btn-light" class="form-control" id="key_size" name="key_size">
550
<option data-subtext="bits" value="1024">1024</option>
551
<option data-subtext="bits" value="2048" selected>2048</option>
552
<option data-subtext="bits" value="3072">3072</option>
553
<option data-subtext="bits" value="4096">4096</option>
554
</select>
555
</div>
556
</div>
557
<hr>
558
<div class="row mb-4">
559
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.add.backup_mx_options }}</label>
560
<div class="col-sm-10">
561
<div class="form-check">
562
<label><input type="checkbox" class="form-check-input" id="addDomain_relay_domain" value="1" name="backupmx"> {{ lang.add.relay_domain }}</label>
563
<br>
564
<label><input type="checkbox" class="form-check-input" id="addDomain_relay_all" value="1" name="relay_all_recipients"> {{ lang.add.relay_all }}</label>
565
<p>{{ lang.add.relay_all_info|raw }}</p>
566
<label><input type="checkbox" class="form-check-input" id="addDomain_relay_unknown_only" value="1" name="relay_unknown_only"> {{ lang.add.relay_unknown_only }}</label>
567
<br>
568
<p>{{ lang.add.relay_transport_info|raw }}</p>
569
</div>
570
</div>
571
</div>
572
<hr>
573
<div class="row mb-4">
574
<div class="offset-sm-2 col-sm-10 btn-group">
575
{% if not skip_sogo %}
576
<button class="btn btn-xs-lg btn-xs-half d-block d-sm-inline btn-secondary" data-action="add_item" data-id="add_domain" data-api-url='add/domain' data-api-attr='{"tags": []}' href="#">{{ lang.add.add_domain_only }}</button>
577
<button class="btn btn-xs-lg btn-xs-half d-block d-sm-inline btn-secondary" data-action="add_item" data-id="add_domain" data-api-url='add/domain' data-api-attr='{"restart_sogo":"1", "tags": []}' href="#">{{ lang.add.add_domain_restart }}</button>
578
{% else %}
579
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="add_domain" data-api-url='add/domain' data-api-attr='{"tags": []}' href="#">{{ lang.add.add }}</button>
580
{% endif %}
581
</div>
582
</div>
583
{# TODO: Separate SOGo-related text #}
584
{% if not skip_sogo %}
585
<p><i class="bi bi-shield-fill-exclamation text-danger"></i> {{ lang.add.post_domain_add|raw }}</p>
586
{% endif %}
587
</form>
588
</div>
589
</div>
590
</div>
591
</div><!-- add domain modal -->
592
<!-- add domain template modal -->
593
<div class="modal fade" id="addDomainTemplateModal" tabindex="-1" role="dialog" aria-hidden="true">
594
<div class="modal-dialog modal-xl">
595
<div class="modal-content">
596
<div class="modal-header">
597
<h3 class="modal-title">{{ lang.mailbox.add_template }}</h3>
598
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
599
</div>
600
<div class="modal-body">
601
<form data-id="adddomain_template" class="form-horizontal" role="form" method="post">
602
{% if mailcow_cc_role == 'admin' %}
603
<div class="row mb-4">
604
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="template">{{ lang.mailbox.template }}</label>
605
<div class="col-sm-10">
606
<div class="input-group mb-3">
607
<input type="text" name="template" class="form-control" aria-label="Text input with dropdown button" value="" />
608
</div>
609
</div>
610
</div>
611
<div class="row mb-2">
612
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.add.tags }}</label>
613
<div class="col-sm-10">
614
<div class="form-control tag-box">
615
<input type="text" class="tag-input">
616
<span class="btn tag-add"><i class="bi bi-plus-lg"></i></span>
617
<input type="hidden" value="" name="tags" class="tag-values" />
618
</div>
619
</div>
620
</div>
621
<div class="row mb-2">
622
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="max_num_aliases_for_domain">{{ lang.add.max_aliases }}</label>
623
<div class="col-sm-10">
624
<input type="number" class="form-control" name="max_num_aliases_for_domain" value="">
625
</div>
626
</div>
627
<div class="row mb-2">
628
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="max_num_mboxes_for_domain">{{ lang.add.max_mailboxes }}</label>
629
<div class="col-sm-10">
630
<input type="number" class="form-control" name="max_num_mboxes_for_domain" value="">
631
</div>
632
</div>
633
<div class="row mb-2">
634
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="def_quota_for_mbox">{{ lang.add.mailbox_quota_def }}</label>
635
<div class="col-sm-10">
636
<input type="number" class="form-control" name="def_quota_for_mbox" value="">
637
</div>
638
</div>
639
<div class="row mb-2">
640
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="max_quota_for_mbox">{{ lang.add.mailbox_quota_m }}</label>
641
<div class="col-sm-10">
642
<input type="number" class="form-control" name="max_quota_for_mbox" value="">
643
</div>
644
</div>
645
<div class="row mb-4">
646
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="max_quota_for_domain">{{ lang.add.domain_quota_m }}</label>
647
<div class="col-sm-10">
648
<input type="number" class="form-control" name="max_quota_for_domain" value="">
649
</div>
650
</div>
651
<div class="row">
652
<div class="offset-sm-2 col-sm-10">
653
<div class="form-check">
654
<label><input type="checkbox" class="form-check-input" value="1" name="gal" checked> {{ lang.add.gal }}</label>
655
<small class="text-muted">{{ lang.add.gal_info|raw }}</small>
656
</div>
657
</div>
658
</div>
659
<div class="row mb-2">
660
<div class="offset-sm-2 col-sm-10">
661
<div class="form-check">
662
<label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
663
</div>
664
</div>
665
</div>
666
<hr>
667
<div class="row">
668
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.edit.ratelimit }}</label>
669
<div class="col-sm-10">
670
<div class="input-group">
671
<input name="rl_value" type="number" value="" autocomplete="off" class="form-control mb-4" placeholder="{{ lang.ratelimit.disabled }}">
672
<select name="rl_frame" class="form-control">
673
{% include 'mailbox/rl-frame.twig' %}
674
</select>
675
</div>
676
</div>
677
</div>
678
{% endif %}
679
<hr>
680
<div class="row mb-2">
681
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="dkim_selector">{{ lang.admin.dkim_domains_selector }}</label>
682
<div class="col-sm-10">
683
<input class="form-control" id="dkim_selector" name="dkim_selector" value="dkim">
684
</div>
685
</div>
686
<div class="row mb-4">
687
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="key_size">{{ lang.admin.dkim_key_length }}</label>
688
<div class="col-sm-10">
689
<select data-style="btn btn-light" class="form-control" id="key_size" name="key_size">
690
<option data-subtext="bits">1024</option>
691
<option data-subtext="bits" selected>2048</option>
692
<option data-subtext="bits">3072</option>
693
<option data-subtext="bits">4096</option>
694
</select>
695
</div>
696
</div>
697
<hr>
698
<div class="row mb-2">
699
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.edit.backup_mx_options }}</label>
700
<div class="col-sm-10">
701
<div class="form-check">
702
<label><input type="checkbox" class="form-check-input" value="1" name="backupmx"> {{ lang.edit.relay_domain }}</label>
703
<br>
704
<label><input type="checkbox" class="form-check-input" value="1" name="relay_all_recipients"> {{ lang.edit.relay_all }}</label>
705
<p>{{ lang.edit.relay_all_info|raw }}</p>
706
<label><input type="checkbox" class="form-check-input" value="1" name="relay_unknown_only"> {{ lang.edit.relay_unknown_only }}</label>
707
<br>
708
<p>{{ lang.edit.relay_transport_info|raw }}</p>
709
</div>
710
</div>
711
</div>
712
<hr>
713
<div class="row">
714
<div class="offset-sm-2 col-sm-10">
715
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="adddomain_template" data-item="{{ domain }}" data-api-url='add/domain/template' data-api-attr='{}' href="#">{{ lang.admin.add }}</button>
716
</div>
717
</div>
718
</form>
719
</div>
720
</div>
721
</div>
722
</div><!-- add domain template modal -->
723
<!-- add resource modal -->
724
<div class="modal fade" id="addResourceModal" tabindex="-1" role="dialog" aria-hidden="true">
725
<div class="modal-dialog modal-xl">
726
<div class="modal-content">
727
<div class="modal-header">
728
<h3 class="modal-title">{{ lang.mailbox.add_resource }}</h3>
729
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
730
</div>
731
<div class="modal-body">
732
<form class="form-horizontal" data-cached-form="true" role="form" data-id="add_resource">
733
<div class="row mb-2">
734
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="description">{{ lang.add.description }}</label>
735
<div class="col-sm-10">
736
<input type="text" class="form-control" name="description" required>
737
</div>
738
</div>
739
<div class="row mb-2">
740
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="domain">{{ lang.add.domain }}</label>
741
<div class="col-sm-10">
742
<select data-live-search="true" name="domain" title="{{ lang.add.select }}" required>
743
{% for domain in domains %}
744
<option>{{ domain }}</option>
745
{% endfor %}
746
</select>
747
</div>
748
</div>
749
<div class="row mb-2">
750
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="domain">{{ lang.add.kind }}</label>
751
<div class="col-sm-10">
752
<select name="kind" title="{{ lang.add.select }}" required>
753
<option value="location">Location</option>
754
<option value="group">Group</option>
755
<option value="thing">Thing</option>
756
</select>
757
</div>
758
</div>
759
<div class="row mb-4">
760
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="multiple_bookings_select">{{ lang.add.multiple_bookings }}</label>
761
<div class="col-sm-10">
762
<select name="multiple_bookings_select" id="multiple_bookings_select" title="{{ lang.add.select }}" required>
763
<option value="0">{{ lang.mailbox.booking_null }}</option>
764
<option value="-1" selected>{{ lang.mailbox.booking_ltnull }}</option>
765
<option value="custom">{{ lang.mailbox.booking_custom }}</option>
766
</select>
767
<div style="display:none" id="multiple_bookings_custom_div">
768
<hr>
769
<input type="number" class="form-control" name="multiple_bookings_custom" id="multiple_bookings_custom">
770
</div>
771
<input type="hidden" name="multiple_bookings" id="multiple_bookings">
772
</div>
773
</div>
774
<div class="row mb-2">
775
<div class="offset-sm-2 col-sm-10">
776
<div class="form-check">
777
<label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
778
</div>
779
</div>
780
</div>
781
<div class="row mb-4">
782
<div class="offset-sm-2 col-sm-10">
783
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="add_resource" data-api-url='add/resource' data-api-attr='{}' href="#">{{ lang.admin.add }}</button>
784
</div>
785
</div>
786
</form>
787
</div>
788
</div>
789
</div>
790
</div><!-- add resource modal -->
791
<!-- add alias modal -->
792
<div class="modal fade" id="addAliasModal" tabindex="-1" role="dialog" aria-hidden="true">
793
<div class="modal-dialog modal-xl">
794
<div class="modal-content">
795
<div class="modal-header">
796
<h3 class="modal-title">{{ lang.mailbox.add_alias }}</h3>
797
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
798
</div>
799
<div class="modal-body">
800
<form class="form-horizontal" data-cached-form="true" role="form" data-id="add_alias">
801
<input type="hidden" value="0" name="active">
802
<input type="hidden" value="0" name="internal">
803
<input type="hidden" value="0" name="sender_allowed">
804
<div class="row mb-2">
805
<label class="control-label col-sm-2 text-sm-end" for="address">{{ lang.add.alias_address }}</label>
806
<div class="col-sm-10">
807
<textarea autocorrect="off" autocapitalize="none" class="form-control" rows="5" name="address" id="address" required></textarea>
808
<p>{{ lang.add.alias_address_info|raw }}</p>
809
</div>
810
</div>
811
<div class="row mb-4">
812
<label class="control-label col-sm-2 text-sm-end" for="goto">{{ lang.add.target_address }}</label>
813
<div class="col-sm-10">
814
<textarea id="textarea_alias_goto" autocorrect="off" autocapitalize="none" class="form-control" rows="5" id="goto" name="goto" required></textarea>
815
<p>{{ lang.add.target_address_info|raw }}</p>
816
<div class="form-check">
817
<label><input class="form-check-input goto_checkbox" type="checkbox" value="1" name="goto_null"> {{ lang.add.goto_null }}</label>
818
</div>
819
<div class="form-check">
820
<label><input class="form-check-input goto_checkbox" type="checkbox" value="1" name="goto_spam"> {{ lang.add.goto_spam|raw }}</label>
821
</div>
822
<div class="form-check">
823
<label><input class="form-check-input goto_checkbox" type="checkbox" value="1" name="goto_ham"> {{ lang.add.goto_ham|raw }}</label>
824
</div>
825
{% if not skip_sogo %}
826
<hr>
827
<div class="form-check">
828
<label><input type="checkbox" class="form-check-input" value="1" name="sogo_visible" checked> {{ lang.edit.sogo_visible }}</label>
829
</div>
830
<small class="text-muted d-block mb-2">{{ lang.edit.sogo_visible_info }}</small>
831
{% endif %}
832
<div class="form-check">
833
<label><input type="checkbox" class="form-check-input" value="1" name="internal"> {{ lang.add.internal }}</label>
834
</div>
835
<small class="text-muted d-block mb-2">{{ lang.edit.internal_info }}</small>
836
<div class="form-check">
837
<label><input type="checkbox" class="form-check-input" value="1" name="sender_allowed" checked> {{ lang.add.sender_allowed }}</label>
838
</div>
839
<small class="text-muted d-block">{{ lang.edit.sender_allowed_info }}</small>
840
</div>
841
</div>
842
<div class="row mb-4">
843
<div class="offset-sm-2 col-sm-10">
844
<div class="form-check">
845
<label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
846
</div>
847
</div>
848
</div>
849
<div class="row mb-4">
850
<div class="offset-sm-2 col-sm-10">
851
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="add_alias" data-api-url='add/alias' data-api-attr='{}' href="#">{{ lang.admin.add }}</button>
852
</div>
853
</div>
854
</form>
855
</div>
856
</div>
857
</div>
858
</div><!-- add alias modal -->
859
<!-- add domain alias modal -->
860
<div class="modal fade" id="addAliasDomainModal" tabindex="-1" role="dialog" aria-hidden="true">
861
<div class="modal-dialog modal-xl">
862
<div class="modal-content">
863
<div class="modal-header">
864
<h3 class="modal-title">{{ lang.mailbox.add_domain_alias }}</h3>
865
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
866
</div>
867
<div class="modal-body">
868
<form class="form-horizontal" data-cached-form="true" role="form" data-id="add_alias_domain">
869
<input type="hidden" value="0" name="active">
870
<div class="row mb-2">
871
<label class="control-label col-sm-2 text-sm-end" for="alias_domain">{{ lang.add.alias_domain }}</label>
872
<div class="col-sm-10">
873
<textarea autocorrect="off" autocapitalize="none" class="form-control" rows="5" name="alias_domain" id="alias_domain" required></textarea>
874
<p>{{ lang.add.alias_domain_info|raw }}</p>
875
</div>
876
</div>
877
<div class="row mb-4">
878
<label class="control-label col-sm-2 text-sm-end" for="target_domain">{{ lang.add.target_domain }}</label>
879
<div class="col-sm-10">
880
<select data-live-search="true" name="target_domain" title="{{ lang.add.select }}" required>
881
{% for domain in domains %}
882
<option>{{ domain }}</option>
883
{% endfor %}
884
</select>
885
</div>
886
</div>
887
<div class="row mb-4">
888
<div class="offset-sm-2 col-sm-10">
889
<div class="form-check">
890
<label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
891
</div>
892
</div>
893
</div>
894
<hr>
895
<div class="row mb-2">
896
<label class="control-label col-sm-2 text-sm-end" for="rl_frame">{{ lang.acl.ratelimit }}</label>
897
<div class="col-sm-10">
898
<div class="input-group">
899
<input name="rl_value" type="number" class="form-control" placeholder="{{ lang.ratelimit.disabled }}">
900
<select name="rl_frame" class="form-control">
901
{% include 'mailbox/rl-frame.twig' %}
902
</select>
903
</div>
904
</div>
905
</div>
906
<hr>
907
<div class="row mb-2">
908
<label class="control-label col-sm-2 text-sm-end" for="dkim_selector2">{{ lang.admin.dkim_domains_selector }}</label>
909
<div class="col-sm-10">
910
<input class="form-control" id="dkim_selector2" name="dkim_selector" value="dkim">
911
</div>
912
</div>
913
<div class="row mb-4">
914
<label class="control-label col-sm-2 text-sm-end" for="key_size2">{{ lang.admin.dkim_key_length }}</label>
915
<div class="col-sm-10">
916
<select data-style="btn btn-light" class="form-control" id="key_size2" name="key_size">
917
<option data-subtext="bits">1024</option>
918
<option data-subtext="bits" selected>2048</option>
919
<option data-subtext="bits">3072</option>
920
<option data-subtext="bits">4096</option>
921
</select>
922
</div>
923
</div>
924
<hr>
925
<div class="row mb-4">
926
<div class="offset-sm-2 col-sm-10">
927
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="add_alias_domain" data-api-url='add/alias-domain' data-api-attr='{}' href="#">{{ lang.admin.add }}</button>
928
</div>
929
</div>
930
</form>
931
</div>
932
</div>
933
</div>
934
</div><!-- add domain alias modal -->
935
<!-- add sync job modal -->
936
<div class="modal fade" id="addSyncJobModalAdmin" tabindex="-1" role="dialog" aria-hidden="true">
937
<div class="modal-dialog modal-xl">
938
<div class="modal-content">
939
<div class="modal-header">
940
<h3 class="modal-title">{{ lang.add.syncjob }}</h3>
941
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
942
</div>
943
<div class="modal-body">
944
<p class="text-muted">{{ lang.add.syncjob_hint }}</p>
945
<form class="form-horizontal" data-cached-form="false" role="form" data-id="add_syncjob">
946
<div class="row mb-2">
947
<label class="control-label col-sm-2 text-sm-end" for="username">{{ lang.add.username }}</label>
948
<div class="col-sm-10">
949
<select data-live-search="true" name="username" title="{{ lang.add.select }}" required>
950
{% for mailbox in mailboxes %}
951
<option>{{ mailbox }}</option>
952
{% endfor %}
953
</select>
954
</div>
955
</div>
956
<div class="row mb-2">
957
<label class="control-label col-sm-2 text-sm-end" for="host1">{{ lang.add.hostname }}</label>
958
<div class="col-sm-10">
959
<input type="text" class="form-control" name="host1" required>
960
</div>
961
</div>
962
<div class="row mb-2">
963
<label class="control-label col-sm-2 text-sm-end" for="port1">{{ lang.add.port }}</label>
964
<div class="col-sm-10">
965
<input type="number" class="form-control" name="port1" min="1" max="65535" value="143" required>
966
<small class="text-muted">1-65535</small>
967
</div>
968
</div>
969
<div class="row mb-2">
970
<label class="control-label col-sm-2 text-sm-end" for="user1">{{ lang.add.username }}</label>
971
<div class="col-sm-10">
972
<input type="text" class="form-control" name="user1" required>
973
</div>
974
</div>
975
<div class="row mb-2">
976
<label class="control-label col-sm-2 text-sm-end" for="password1">{{ lang.add.password }}</label>
977
<div class="col-sm-10">
978
<input type="password" class="form-control" name="password1" required>
979
</div>
980
</div>
981
<div class="row mb-2">
982
<label class="control-label col-sm-2 text-sm-end" for="enc1">{{ lang.add.enc_method }}</label>
983
<div class="col-sm-10">
984
<select name="enc1" title="{{ lang.add.select }}" required>
985
<option value="SSL" selected>SSL</option>
986
<option value="TLS">STARTTLS</option>
987
<option value="PLAIN">PLAIN</option>
988
</select>
989
</div>
990
</div>
991
<div class="row mb-2">
992
<label class="control-label col-sm-2 text-sm-end" for="mins_interval">{{ lang.add.mins_interval }}</label>
993
<div class="col-sm-10">
994
<input type="number" class="form-control" name="mins_interval" min="1" max="43800" value="20" required>
995
<small class="text-muted">1-43800</small>
996
</div>
997
</div>
998
<div class="row mb-2">
999
<label class="control-label col-sm-2 text-sm-end" for="subfolder2">{{ lang.edit.subfolder2|raw }}</label>
1000
<div class="col-sm-10">
1001
<input type="text" class="form-control" name="subfolder2" value="">
1002
</div>
1003
</div>
1004
<div class="row mb-2">
1005
<label class="control-label col-sm-2 text-sm-end" for="maxage">{{ lang.edit.maxage|raw }}</label>
1006
<div class="col-sm-10">
1007
<input type="number" class="form-control" name="maxage" min="0" max="32000" value="0">
1008
<small class="text-muted">0-32000</small>
1009
</div>
1010
</div>
1011
<div class="row mb-2">
1012
<label class="control-label col-sm-2 text-sm-end" for="maxbytespersecond">{{ lang.edit.maxbytespersecond|raw }}</label>
1013
<div class="col-sm-10">
1014
<input type="number" class="form-control" name="maxbytespersecond" min="0" max="125000000" value="0">
1015
<small class="text-muted">0-125000000</small>
1016
</div>
1017
</div>
1018
<div class="row mb-2">
1019
<label class="control-label col-sm-2 text-sm-end" for="timeout1">{{ lang.edit.timeout1 }}</label>
1020
<div class="col-sm-10">
1021
<input type="number" class="form-control" name="timeout1" min="1" max="32000" value="600">
1022
<small class="text-muted">1-32000</small>
1023
</div>
1024
</div>
1025
<div class="row mb-2">
1026
<label class="control-label col-sm-2 text-sm-end" for="timeout2">{{ lang.edit.timeout2 }}</label>
1027
<div class="col-sm-10">
1028
<input type="number" class="form-control" name="timeout2" min="1" max="32000" value="600">
1029
<small class="text-muted">1-32000</small>
1030
</div>
1031
</div>
1032
<div class="row mb-2">
1033
<label class="control-label col-sm-2 text-sm-end" for="exclude">{{ lang.add.exclude }}</label>
1034
<div class="col-sm-10">
1035
<input type="text" class="form-control" name="exclude" value="(?i)spam|(?i)junk">
1036
</div>
1037
</div>
1038
<div class="row mb-4">
1039
<label class="control-label col-sm-2 text-sm-end" for="custom_params">{{ lang.add.custom_params }}</label>
1040
<div class="col-sm-10">
1041
<input type="text" class="form-control" name="custom_params" placeholder="--some-param=xy --other-param=yx">
1042
<small class="text-muted">{{ lang.add.custom_params_hint }}</small>
1043
</div>
1044
</div>
1045
<div class="row mb-2">
1046
<div class="offset-sm-2 col-sm-10">
1047
<div class="form-check">
1048
<label><input type="checkbox" class="form-check-input" value="1" name="delete2duplicates" checked> {{ lang.add.delete2duplicates }} (--delete2duplicates)</label>
1049
</div>
1050
</div>
1051
</div>
1052
<div class="row mb-2">
1053
<div class="offset-sm-2 col-sm-10">
1054
<div class="form-check">
1055
<label><input type="checkbox" class="form-check-input" value="1" name="delete1"> {{ lang.add.delete1 }} (--delete1)</label>
1056
</div>
1057
</div>
1058
</div>
1059
<div class="row mb-2">
1060
<div class="offset-sm-2 col-sm-10">
1061
<div class="form-check">
1062
<label><input type="checkbox" class="form-check-input" value="1" name="delete2"> {{ lang.add.delete2 }} (--delete2)</label>
1063
</div>
1064
</div>
1065
</div>
1066
<div class="row mb-2">
1067
<div class="offset-sm-2 col-sm-10">
1068
<div class="form-check">
1069
<label><input type="checkbox" class="form-check-input" value="1" name="automap" checked> {{ lang.add.automap }} (--automap)</label>
1070
</div>
1071
</div>
1072
</div>
1073
<div class="row mb-2">
1074
<div class="offset-sm-2 col-sm-10">
1075
<div class="form-check">
1076
<label><input type="checkbox" class="form-check-input" value="1" name="skipcrossduplicates"> {{ lang.add.skipcrossduplicates }} (--skipcrossduplicates)</label>
1077
</div>
1078
</div>
1079
</div>
1080
<div class="row mb-2">
1081
<div class="offset-sm-2 col-sm-10">
1082
<div class="form-check">
1083
<label><input type="checkbox" class="form-check-input" value="1" name="subscribeall" checked> {{ lang.add.subscribeall }} (--subscribeall)</label>
1084
</div>
1085
</div>
1086
</div>
1087
<div class="row mb-4">
1088
<div class="offset-sm-2 col-sm-10">
1089
<div class="form-check">
1090
<label><input type="checkbox" class="form-check-input" value="1" name="dry"> {{ lang.add.dry }} (--dry)</label>
1091
</div>
1092
</div>
1093
</div>
1094
<div class="row mb-2">
1095
<div class="offset-sm-2 col-sm-10">
1096
<div class="form-check">
1097
<label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
1098
</div>
1099
</div>
1100
</div>
1101
<div class="row mb-4">
1102
<div class="offset-sm-2 col-sm-10">
1103
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="add_syncjob" data-api-url='add/syncjob' data-api-attr='{}' href="#">{{ lang.admin.add }}</button>
1104
</div>
1105
</div>
1106
</form>
1107
</div>
1108
</div>
1109
</div>
1110
</div><!-- add sync job modal -->
1111
<!-- add add_filter modal -->
1112
<div class="modal fade" id="addFilterModalAdmin" tabindex="-1" role="dialog" aria-hidden="true">
1113
<div class="modal-dialog modal-xl">
1114
<div class="modal-content">
1115
<div class="modal-header">
1116
<h3 class="modal-title">Filter</h3>
1117
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
1118
</div>
1119
<div class="modal-body">
1120
<form class="form-horizontal" data-cached-form="true" role="form" data-id="add_filter">
1121
<div class="row mb-2">
1122
<label class="control-label col-sm-2 text-sm-end" for="username">{{ lang.add.username }}</label>
1123
<div class="col-sm-10">
1124
<select data-live-search="true" name="username" required>
1125
{% for mailbox in mailboxes %}
1126
<option>{{ mailbox }}</option>
1127
{% endfor %}
1128
</select>
1129
</div>
1130
</div>
1131
<div class="row mb-2">
1132
<label class="control-label col-sm-2 text-sm-end" for="filter_type">{{ lang.add.sieve_type }}</label>
1133
<div class="col-sm-10">
1134
<select id="addFilterType" name="filter_type" required>
1135
<option value="prefilter">Prefilter</option>
1136
<option value="postfilter">Postfilter</option>
1137
</select>
1138
</div>
1139
</div>
1140
<div class="row mb-2">
1141
<label class="control-label col-sm-2 text-sm-end" for="script_desc">{{ lang.add.sieve_desc }}</label>
1142
<div class="col-sm-10">
1143
<input type="text" class="form-control" id="script_desc" name="script_desc" required maxlength="255">
1144
</div>
1145
</div>
1146
<div class="row mb-4">
1147
<label class="control-label col-sm-2 text-sm-end" for="script_data">Script:</label>
1148
<div class="col-sm-10">
1149
<textarea autocorrect="off" spellcheck="false" autocapitalize="none" class="form-control textarea-code script_data" rows="20" name="script_data" required></textarea>
1150
<p class="text-muted">{{ lang.add.activate_filter_warn }}</p>
1151
</div>
1152
</div>
1153
<div class="row mb-2">
1154
<div class="offset-sm-2 col-sm-10">
1155
<div class="form-check">
1156
<label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
1157
</div>
1158
</div>
1159
</div>
1160
<div class="row mb-4">
1161
<div class="offset-sm-2 col-sm-10 add_filter_btns btn-group">
1162
<button class="btn btn-xs-lg btn-xs-half d-block d-sm-inline btn-secondary validate_sieve" href="#">{{ lang.add.validate }}</button>
1163
<button class="btn btn-xs-lg btn-xs-half d-block d-sm-inline btn-success add_sieve_script" data-action="add_item" data-id="add_filter" data-api-url='add/filter' data-api-attr='{}' href="#" disabled>{{ lang.admin.add }}</button>
1164
</div>
1165
</div>
1166
</form>
1167
{{ lang.mailbox.sieve_preset_header|raw }}
1168
<ul id="sieve_presets"></ul>
1169
</div>
1170
</div>
1171
</div>
1172
</div><!-- add add_filter modal -->
1173
<!-- add add_bcc modal -->
1174
<div class="modal fade" id="addBCCModalAdmin" tabindex="-1" role="dialog" aria-hidden="true">
1175
<div class="modal-dialog modal-xl">
1176
<div class="modal-content">
1177
<div class="modal-header">
1178
<h3 class="modal-title">{{ lang.mailbox.bcc_maps }}</h3>
1179
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
1180
</div>
1181
<div class="modal-body">
1182
<form class="form-horizontal" data-cached-form="true" role="form" data-id="add_bcc">
1183
<div class="row mb-2">
1184
<label class="control-label col-sm-2 text-sm-end" for="local_dest">{{ lang.mailbox.bcc_local_dest }}</label>
1185
<div class="col-sm-10">
1186
<select id="bcc-local-dest" data-live-search="true" data-size="20" name="local_dest" required>
1187
</select>
1188
</div>
1189
</div>
1190
<div class="row mb-2">
1191
<label class="control-label col-sm-2 text-sm-end" for="type">{{ lang.mailbox.bcc_map_type }}</label>
1192
<div class="col-sm-10">
1193
<select name="type" required>
1194
<option value="sender">{{ lang.mailbox.bcc_sender_map }}</option>
1195
<option value="rcpt">{{ lang.mailbox.bcc_rcpt_map }}</option>
1196
</select>
1197
</div>
1198
</div>
1199
<div class="row mb-4">
1200
<label class="control-label col-sm-2 text-sm-end" for="bcc_dest">{{ lang.mailbox.bcc_destination }}</label>
1201
<div class="col-sm-10">
1202
<input type="text" class="form-control" name="bcc_dest">
1203
<small>{{ lang.add.bcc_dest_format|raw }}</small>
1204
</div>
1205
</div>
1206
<div class="row mb-2">
1207
<div class="offset-sm-2 col-sm-10">
1208
<div class="form-check">
1209
<label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
1210
</div>
1211
</div>
1212
</div>
1213
<div class="row mb-4">
1214
<div class="offset-sm-2 col-sm-10">
1215
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="add_bcc" data-api-url='add/bcc' data-api-attr='{}' href="#">{{ lang.admin.add }}</button>
1216
</div>
1217
</div>
1218
</form>
1219
</div>
1220
</div>
1221
</div>
1222
</div><!-- add add_bcc modal -->
1223
<!-- add add_recipient_map modal -->
1224
<div class="modal fade" id="addRecipientMapModalAdmin" tabindex="-1" role="dialog" aria-hidden="true">
1225
<div class="modal-dialog modal-xl">
1226
<div class="modal-content">
1227
<div class="modal-header">
1228
<h3 class="modal-title">{{ lang.mailbox.recipient_maps }}</h3>
1229
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
1230
</div>
1231
<div class="modal-body">
1232
<form class="form-horizontal" data-cached-form="true" role="form" data-id="add_recipient_map">
1233
<div class="row mb-2">
1234
<label class="control-label col-sm-2 text-sm-end" for="recipient_map_old">{{ lang.mailbox.recipient_map_old }}</label>
1235
<div class="col-sm-10">
1236
<input type="text" class="form-control" name="recipient_map_old">
1237
<small>{{ lang.mailbox.recipient_map_old_info }}</small>
1238
</div>
1239
</div>
1240
<div class="row mb-4">
1241
<label class="control-label col-sm-2 text-sm-end" for="recipient_map_new">{{ lang.mailbox.recipient_map_new }}</label>
1242
<div class="col-sm-10">
1243
<input type="text" class="form-control" name="recipient_map_new">
1244
<small>{{ lang.mailbox.recipient_map_new_info }}</small>
1245
</div>
1246
</div>
1247
<div class="row mb-2">
1248
<div class="offset-sm-2 col-sm-10">
1249
<div class="form-check">
1250
<label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
1251
</div>
1252
</div>
1253
</div>
1254
<div class="row mb-4">
1255
<div class="offset-sm-2 col-sm-10">
1256
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="add_recipient_map" data-api-url='add/recipient_map' data-api-attr='{}' href="#">{{ lang.admin.add }}</button>
1257
</div>
1258
</div>
1259
</form>
1260
</div>
1261
</div>
1262
</div>
1263
</div><!-- add add_recipient_map modal -->
1264
<!-- add add_tls_policy_map modal -->
1265
<div class="modal fade" id="addTLSPolicyMapAdmin" tabindex="-1" role="dialog" aria-hidden="true">
1266
<div class="modal-dialog modal-xl">
1267
<div class="modal-content">
1268
<div class="modal-header">
1269
<h3 class="modal-title">{{ lang.mailbox.tls_policy_maps }}</h3>
1270
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
1271
</div>
1272
<div class="modal-body">
1273
<form class="form-horizontal" data-cached-form="true" role="form" data-id="add_tls_policy_map">
1274
<div class="row mb-2">
1275
<label class="control-label col-sm-2 text-sm-end" for="dest">{{ lang.mailbox.tls_map_dest }}</label>
1276
<div class="col-sm-10">
1277
<input type="text" class="form-control" name="dest">
1278
<small>{{ lang.mailbox.tls_map_dest_info }}</small>
1279
</div>
1280
</div>
1281
<div class="row mb-2">
1282
<label class="control-label col-sm-2 text-sm-end" for="policy">{{ lang.mailbox.tls_map_policy }}</label>
1283
<div class="col-sm-10">
1284
<select class="full-width-select" name="policy" required>
1285
<option value="none">none</option>
1286
<option value="may">may</option>
1287
<option value="encrypt">encrypt</option>
1288
<option value="dane">dane</option>
1289
<option value="dane-only">dane-only</option>
1290
<option value="fingerprint">fingerprint</option>
1291
<option value="verify">verify</option>
1292
<option value="secure">secure</option>
1293
</select>
1294
</div>
1295
</div>
1296
<div class="row mb-4">
1297
<label class="control-label col-sm-2 text-sm-end" for="parameters">{{ lang.mailbox.tls_map_parameters }}</label>
1298
<div class="col-sm-10">
1299
<input type="text" class="form-control" name="parameters">
1300
<small>{{ lang.mailbox.tls_map_parameters_info }}</small>
1301
</div>
1302
</div>
1303
<div class="row mb-2">
1304
<div class="offset-sm-2 col-sm-10">
1305
<div class="form-check">
1306
<label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
1307
</div>
1308
</div>
1309
</div>
1310
<div class="row mb-4">
1311
<div class="offset-sm-2 col-sm-10">
1312
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="add_tls_policy_map" data-api-url='add/tls-policy-map' data-api-attr='{}' href="#">{{ lang.admin.add }}</button>
1313
</div>
1314
</div>
1315
</form>
1316
</div>
1317
</div>
1318
</div>
1319
</div><!-- add add_tls_policy_map modal -->
1320
<!-- log modal -->
1321
<div class="modal fade" id="syncjobLogModal" tabindex="-1" role="dialog" aria-labelledby="syncjobLogModalLabel">
1322
<div class="modal-dialog modal-xl" role="document">
1323
<div class="modal-content">
1324
<div class="modal-header">
1325
<h3 class="modal-title">Log</h3>
1326
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
1327
</div>
1328
<div class="modal-body">
1329
<textarea class="form-control" rows="20" id="logText" spellcheck="false"></textarea>
1330
</div>
1331
</div>
1332
</div>
1333
</div><!-- log modal -->
1334
<!-- DNS info modal -->
1335
<div class="modal fade" id="dnsInfoModal" tabindex="-1" role="dialog" aria-labelledby="dnsInfoModalLabel">
1336
<div class="modal-dialog modal-xl" role="document">
1337
<div class="modal-content">
1338
<div class="modal-header">
1339
<h3 class="modal-title">{{ lang.diagnostics.dns_records }}</h3>
1340
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
1341
</div>
1342
<div class="modal-body">
1343
<p>{{ lang.diagnostics.dns_records_24hours }}</p>
1344
<div class="dns-modal-body"></div>
1345
<p>{{ lang.diagnostics.dns_records_docs|raw }}</p>
1346
</div>
1347
</div>
1348
</div>
1349
</div><!-- DNS info modal -->