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/admin/tab-config-identity-provider.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 role="tabpanel" class="tab-pane fade" id="tab-config-identity-provider" role="tabpanel" aria-labelledby="tab-config-identity-provider">
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-config-identity-provider" data-bs-toggle="collapse" aria-controls="collapse-tab-config-identity-provider">
5
{{ lang.admin.iam }}
6
</button>
7
<span class="d-none d-md-block">{{ lang.admin.iam }}</span>
8
</div>
9
<div id="collapse-tab-config-identity-provider" class="card-body collapse" data-bs-parent="#admin-content">
10
<p class="offset-sm-3 mb-4">{{ lang.admin.iam_description|raw }}</p>
11
<div class="row mb-4">
12
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
13
<label class="control-label" for="iam_realm">{{ lang.admin.iam }}:</label>
14
</div>
15
<div class="col-12 col-md-9 col-lg-4">
16
<select
17
data-style="btn btn-secondary"
18
data-id="iam_provider"
19
title="{{ lang.admin.iam_provider }}"
20
name="iam_provider" id="iam_provider" class="full-width-select form-control" required>
21
<option value="keycloak" {% if not iam_settings.authsource or iam_settings.authsource == 'keycloak' %}selected{% endif %}>Keycloak</option>
22
<option value="generic-oidc" {% if iam_settings.authsource == 'generic-oidc' %}selected{% endif %}>Generic-OIDC</option>
23
<option value="ldap" {% if iam_settings.authsource == 'ldap' %}selected{% endif %}>LDAP</option>
24
</select>
25
</div>
26
</div>
27
<div id="keycloak_settings" class="{% if iam_settings.authsource and iam_settings.authsource != 'keycloak' %}d-none{% endif %}">
28
<form class="form-horizontal" autocapitalize="none" data-id="iam_keycloak" autocorrect="off" role="form" method="post">
29
<input type="hidden" name="authsource" value="keycloak">
30
<div class="row mb-2">
31
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
32
<label class="control-label" for="iam_keycloak_url">{{ lang.admin.iam_server_url }}:</label>
33
</div>
34
<div class="col-12 col-md-9 col-lg-4">
35
<input type="text" class="form-control" id="iam_keycloak_url" name="server_url" value="{{ iam_settings.server_url }}" required>
36
</div>
37
</div>
38
<div class="row mb-2">
39
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
40
<label class="control-label" for="iam_keycloak_realm">{{ lang.admin.iam_realm }}:</label>
41
</div>
42
<div class="col-12 col-md-9 col-lg-4">
43
<input type="text" class="form-control" id="iam_keycloak_realm" name="realm" value="{{ iam_settings.realm }}" required>
44
</div>
45
</div>
46
<div class="row mb-2">
47
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
48
<label class="control-label" for="iam_keycloak_clientid">{{ lang.admin.iam_client_id }}:</label>
49
</div>
50
<div class="col-12 col-md-9 col-lg-4">
51
<input type="text" class="form-control" id="iam_keycloak_clientid" name="client_id" value="{{ iam_settings.client_id }}" required>
52
</div>
53
</div>
54
<div class="row mb-2">
55
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
56
<label class="control-label" for="iam_keycloak_clientsecret">{{ lang.admin.iam_client_secret }}:</label>
57
</div>
58
<div class="col-12 col-md-9 col-lg-4">
59
<div class="reveal-password-input input-group">
60
<input type="password" class="password-field form-control" id="iam_keycloak_clientsecret" name="client_secret" value="{{ iam_settings.client_secret }}" required>
61
<button class="toggle-password btn btn-secondary" type="button"><i class="bi bi-eye"></i></button>
62
</div>
63
</div>
64
</div>
65
<div class="row mb-2">
66
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
67
<label class="control-label">{{ lang.admin.iam_redirect_url }}:</label>
68
</div>
69
<div class="col-12 col-md-9 col-lg-4">
70
<div class="row px-2 align-items-center">
71
<span class="col-10 p-0 pe-2">
72
<input type="text" class="form-control" name="redirect_url" value="{{ iam_settings.redirect_url }}" required>
73
</span>
74
<div class="col-2 p-0 d-flex">
75
<button class="btn btn-sm d-block d-sm-inline btn-secondary ms-auto iam_redirect_add_keycloak"><i class="bi bi-plus-lg"></i></button>
76
</div>
77
</div>
78
</div>
79
</div>
80
<div class="row mb-2" id="iam_keycloak_redirect_list">
81
<input type="hidden" name="redirect_url_extra" value="">
82
{% for key, url in iam_settings.redirect_url_extra %}
83
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
84
<div class="row px-2">
85
<div class="col-10 p-0 pe-2">
86
<input type="text" class="form-control me-2" name="redirect_url_extra" value="{{ iam_settings.redirect_url_extra[key] }}">
87
</div>
88
<div class="col-2 p-0 d-flex">
89
<button class="iam_keycloak_redirect_del btn btn-sm d-block d-sm-inline btn-secondary ms-auto"><i class="bi bi-x-lg"></i></button>
90
</div>
91
</div>
92
</div>
93
{% endfor %}
94
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
95
<div class="row px-2">
96
<div class="col-10 p-0 pe-2">
97
<input type="text" class="form-control me-2" name="redirect_url_extra" value="">
98
</div>
99
<div class="col-2 p-0 d-flex">
100
<button class="iam_keycloak_redirect_del btn btn-sm d-block d-sm-inline btn-secondary ms-auto"><i class="bi bi-x-lg"></i></button>
101
</div>
102
</div>
103
</div>
104
</div>
105
<div class="row mb-4">
106
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
107
<label class="control-label" for="iam_keycloak_version">{{ lang.admin.iam_version }}:</label>
108
</div>
109
<div class="col-sm-4">
110
<input type="text" class="form-control" id="iam_keycloak_version" name="version" value="{{ iam_settings.version }}" required>
111
</div>
112
</div>
113
<div class="row mb-2">
114
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
115
<label class="control-label">{{ lang.admin.iam_mapping }}:</label>
116
</div>
117
<div class="col-12 col-md-9 col-lg-4">
118
<div class="row px-2 align-items-center">
119
<span class="col-5 p-0 pe-2">{{ lang.user.attribute }}</span>
120
<span class="col-5 p-0 pe-2">{{ lang.mailbox.template }}</span>
121
<div class="col-2 p-0 d-flex">
122
<button class="btn btn-sm d-block d-sm-inline btn-secondary ms-auto iam_rolemap_add_keycloak"><i class="bi bi-plus-lg"></i></button>
123
</div>
124
</div>
125
</div>
126
</div>
127
<div class="row mb-2" id="iam_keycloak_mapping_list">
128
<input type="hidden" name="mappers" value="">
129
<input type="hidden" name="templates" value="">
130
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
131
<div class="row px-2">
132
<div class="col-5 p-0 pe-2">
133
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.admin.iam_default_template_description }}"></i>
134
<span>{{ lang.admin.iam_default_template}}</span>
135
</div>
136
<div class="col-5 p-0 pe-2 align-content-end">
137
<select data-live-search="true" name="default_template" class="form-control" title="-- {{ lang.mailbox.template }} --">
138
<option value="" {% if not iam_settings.default_template %}selected{% endif %}>-- {{ lang.mailbox.template }} --</option>
139
{% for mbox_template in mbox_templates %}
140
<option {% if mbox_template.template == iam_settings.default_template %}selected{% endif %}>
141
{{ mbox_template.template }}
142
</option>
143
{% endfor %}
144
</select>
145
</div>
146
<div class="col-2 p-0 d-flex"></div>
147
</div>
148
</div>
149
{% for key, role in iam_settings.mappers %}
150
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
151
<div class="row px-2">
152
<div class="col-5 p-0 pe-2">
153
<input type="text" class="form-control me-2" name="mappers" value="{{ iam_settings.mappers[key] }}" required>
154
</div>
155
<div class="col-5 p-0 pe-2">
156
<select data-live-search="true" name="templates" class="form-control" title="-- {{ lang.mailbox.template }} --" required>
157
{% for mbox_template in mbox_templates %}
158
<option{% if mbox_template.template == iam_settings.templates[key] %} selected{% endif %}>
159
{{ mbox_template.template }}
160
</option>
161
{% endfor %}
162
</select>
163
</div>
164
<div class="col-2 p-0 d-flex">
165
<button class="iam_keycloak_rolemap_del btn btn-sm d-block d-sm-inline btn-secondary ms-auto"><i class="bi bi-x-lg"></i></button>
166
</div>
167
</div>
168
</div>
169
{% endfor %}
170
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
171
<div class="row px-2">
172
<div class="col-5 p-0 pe-2">
173
<input type="text" class="form-control me-2" name="mappers" value="">
174
</div>
175
<div class="col-5 p-0 pe-2">
176
<select data-live-search="true" name="templates" class="form-control" title="-- {{ lang.mailbox.template }} --">
177
<option value="" selected>-- {{ lang.mailbox.template }} --</option>
178
{% for mbox_template in mbox_templates %}
179
<option>
180
{{ mbox_template.template }}
181
</option>
182
{% endfor %}
183
</select>
184
</div>
185
<div class="col-2 p-0 d-flex">
186
<button class="iam_keycloak_rolemap_del btn btn-sm d-block d-sm-inline btn-secondary ms-auto"><i class="bi bi-x-lg"></i></button>
187
</div>
188
</div>
189
</div>
190
</div>
191
<div class="row mb-2 mt-4">
192
<div class="col-md-3 d-flex align-items-center justify-content-md-end"></div>
193
<div class="col-12 col-md-9">
194
<span>{{ lang.admin.iam_extra_permission|raw }}</span>
195
</div>
196
</div>
197
<div class="row mb-2">
198
<div class="col-md-3 d-flex align-items-start justify-content-md-end">
199
<label class="control-label">{{ lang.admin.iam_rest_flow }}</label>
200
</div>
201
<div class="col-12 col-md-9">
202
<div class="form-check form-switch">
203
<input class="form-check-input" type="checkbox" role="switch" name="mailpassword_flow" value="1" {% if iam_settings.mailpassword_flow == 1 %}checked{% endif %}>
204
</div>
205
<p class="text-muted">
206
<small>
207
{{ lang.admin.iam_auth_flow_info|raw }}
208
</small>
209
</p>
210
</div>
211
</div>
212
<div class="row mb-2">
213
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
214
<label class="control-label">{{ lang.admin.ignore_ssl_error }}</label>
215
</div>
216
<div class="col-12 col-md-9">
217
<div class="form-check form-switch">
218
<input class="form-check-input" type="checkbox" role="switch" name="ignore_ssl_error" value="1" {% if iam_settings.ignore_ssl_error == 1 %}checked{% endif %}>
219
</div>
220
</div>
221
</div>
222
<div class="row mb-2">
223
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
224
<label class="control-label">{{ lang.admin.iam_login_provisioning }}</label>
225
</div>
226
<div class="col-12 col-md-9">
227
<div class="form-check form-switch">
228
<input class="form-check-input" type="checkbox" role="switch" name="login_provisioning" value="1" {% if iam_settings.login_provisioning == 1 %}checked{% endif %}>
229
</div>
230
</div>
231
</div>
232
<div class="row mb-2">
233
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
234
<label class="control-label">{{ lang.admin.iam_periodic_full_sync }}</label>
235
</div>
236
<div class="col-12 col-md-9">
237
<div class="form-check form-switch">
238
<input class="form-check-input" type="checkbox" role="switch" name="periodic_sync" value="1" {% if iam_settings.periodic_sync == 1 %}checked{% endif %}>
239
</div>
240
</div>
241
</div>
242
<div class="row mb-2">
243
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
244
<label class="control-label">{{ lang.admin.iam_import_users }}</label>
245
</div>
246
<div class="col-12 col-md-9">
247
<div class="form-check form-switch">
248
<input class="form-check-input" type="checkbox" role="switch" name="import_users" value="1" {% if iam_settings.import_users == 1 %}checked{% endif %}>
249
</div>
250
</div>
251
</div>
252
<div class="row mb-2">
253
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
254
<label class="control-label">{{ lang.admin.iam_sync_interval }}</label>
255
</div>
256
<div class="col-12 col-md-9 col-lg-4">
257
<input class="form-control" type="number" min="1" name="sync_interval" style="width: 80px;" {% if iam_settings.sync_interval %}value="{{ iam_settings.sync_interval }}"{% else %}value="15"{% endif %}>
258
</div>
259
</div>
260
<div class="row mt-4 mb-2">
261
<div class="offset-md-3 col-12 col-md-9 d-flex flex-wrap">
262
<div class="btn-group mb-2">
263
<button class="btn btn-sm d-block d-sm-inline btn-secondary iam_test_connection iam_test_connection" data-id="iam_keycloak"><i class="bi bi-play"></i> {{ lang.admin.iam_test_connection }}</button>
264
<button class="btn btn-sm d-block d-sm-inline btn-success" data-item="identity-provider" data-action="edit_selected" data-id="iam_keycloak" data-api-url='edit/identity-provider' data-api-attr='{}'><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
265
</div>
266
<button class="btn btn-sm d-block d-sm-inline btn-danger ms-auto mb-2" data-item="identity-provider" data-action="delete_selected" data-id="iam_keycloak" data-api-url='delete/identity-provider'><i class="bi bi-trash"></i> {{ lang.mailbox.remove }}</button>
267
</div>
268
</div>
269
</form>
270
</div>
271
<div id="generic_oidc_settings" class="{% if not iam_settings.authsource or iam_settings.authsource != 'generic-oidc' %}d-none{% endif %}">
272
<form class="form-horizontal" autocapitalize="none" data-id="iam_generic" autocorrect="off" role="form" method="post">
273
<input type="hidden" name="authsource" value="generic-oidc">
274
<div class="row mb-2">
275
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
276
<label class="control-label" for="iam_authorize_url">{{ lang.admin.iam_authorize_url }}:</label>
277
</div>
278
<div class="col-12 col-md-9 col-lg-4">
279
<input type="text" class="form-control" id="iam_authorize_url" name="authorize_url" value="{{ iam_settings.authorize_url }}" required>
280
</div>
281
</div>
282
<div class="row mb-2">
283
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
284
<label class="control-label" for="iam_token_url">{{ lang.admin.iam_token_url }}:</label>
285
</div>
286
<div class="col-12 col-md-9 col-lg-4">
287
<input type="text" class="form-control" id="iam_token_url" name="token_url" value="{{ iam_settings.token_url }}" required>
288
</div>
289
</div>
290
<div class="row mb-2">
291
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
292
<label class="control-label" for="iam_userinfo_url">{{ lang.admin.iam_userinfo_url }}:</label>
293
</div>
294
<div class="col-12 col-md-9 col-lg-4">
295
<input type="text" class="form-control" id="iam_userinfo_url" name="userinfo_url" value="{{ iam_settings.userinfo_url }}" required>
296
</div>
297
</div>
298
<div class="row mb-2">
299
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
300
<label class="control-label" for="iam_client_id">{{ lang.admin.iam_client_id }}:</label>
301
</div>
302
<div class="col-12 col-md-9 col-lg-4">
303
<input type="text" class="form-control" id="iam_client_id" name="client_id" value="{{ iam_settings.client_id }}" required>
304
</div>
305
</div>
306
<div class="row mb-2">
307
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
308
<label class="control-label" for="iam_client_secret">{{ lang.admin.iam_client_secret }}:</label>
309
</div>
310
<div class="col-12 col-md-9 col-lg-4">
311
<div class="reveal-password-input input-group">
312
<input type="password" class="password-field form-control" id="iam_client_secret" name="client_secret" value="{{ iam_settings.client_secret }}" required>
313
<button class="toggle-password btn btn-secondary" type="button"><i class="bi bi-eye"></i></button>
314
</div>
315
</div>
316
</div>
317
<div class="row mb-2">
318
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
319
<label class="control-label">{{ lang.admin.iam_redirect_url }}:</label>
320
</div>
321
<div class="col-12 col-md-9 col-lg-4">
322
<div class="row px-2 align-items-center">
323
<span class="col-10 p-0 pe-2">
324
<input type="text" class="form-control" name="redirect_url" value="{{ iam_settings.redirect_url }}" required>
325
</span>
326
<div class="col-2 p-0 d-flex">
327
<button class="btn btn-sm d-block d-sm-inline btn-secondary ms-auto iam_redirect_add_generic"><i class="bi bi-plus-lg"></i></button>
328
</div>
329
</div>
330
</div>
331
</div>
332
<div class="row mb-2" id="iam_generic_redirect_list">
333
<input type="hidden" name="redirect_url_extra" value="">
334
{% for key, url in iam_settings.redirect_url_extra %}
335
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
336
<div class="row px-2">
337
<div class="col-10 p-0 pe-2">
338
<input type="text" class="form-control me-2" name="redirect_url_extra" value="{{ iam_settings.redirect_url_extra[key] }}">
339
</div>
340
<div class="col-2 p-0 d-flex">
341
<button class="iam_generic_redirect_del btn btn-sm d-block d-sm-inline btn-secondary ms-auto"><i class="bi bi-x-lg"></i></button>
342
</div>
343
</div>
344
</div>
345
{% endfor %}
346
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
347
<div class="row px-2">
348
<div class="col-10 p-0 pe-2">
349
<input type="text" class="form-control me-2" name="redirect_url_extra" value="">
350
</div>
351
<div class="col-2 p-0 d-flex">
352
<button class="iam_generic_redirect_del btn btn-sm d-block d-sm-inline btn-secondary ms-auto"><i class="bi bi-x-lg"></i></button>
353
</div>
354
</div>
355
</div>
356
</div>
357
<div class="row mb-4">
358
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
359
<label class="control-label" for="iam_client_scopes">{{ lang.admin.iam_client_scopes }}:</label>
360
</div>
361
<div class="col-12 col-md-9 col-lg-4">
362
<input type="text" placeholder="openid profile email mailcow_template" class="form-control" id="iam_client_scopes" name="client_scopes" value="{{ iam_settings.client_scopes }}">
363
</div>
364
</div>
365
<div class="row mb-2">
366
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
367
<label class="control-label">{{ lang.admin.iam_mapping }}:</label>
368
</div>
369
<div class="col-12 col-md-9 col-lg-4">
370
<div class="row px-2 align-items-center">
371
<span class="col-5 p-0 pe-2">{{ lang.user.attribute }}</span>
372
<span class="col-5 p-0 pe-2">{{ lang.mailbox.template }}</span>
373
<div class="col-2 p-0 d-flex">
374
<button class="btn btn-sm d-block d-sm-inline btn-secondary ms-auto iam_rolemap_add_generic"><i class="bi bi-plus-lg"></i></button>
375
</div>
376
</div>
377
</div>
378
</div>
379
<div class="row mb-2" id="iam_generic_mapping_list">
380
<input type="hidden" name="mappers" value="">
381
<input type="hidden" name="templates" value="">
382
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
383
<div class="row px-2">
384
<div class="col-5 p-0 pe-2">
385
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.admin.iam_default_template_description }}"></i>
386
<span>{{ lang.admin.iam_default_template}}</span>
387
</div>
388
<div class="col-5 p-0 pe-2 align-content-end">
389
<select data-live-search="true" name="default_template" class="form-control" title="-- {{ lang.mailbox.template }} --">
390
<option value="" {% if not iam_settings.default_template %}selected{% endif %}>-- {{ lang.mailbox.template }} --</option>
391
{% for mbox_template in mbox_templates %}
392
<option {% if mbox_template.template == iam_settings.default_template %}selected{% endif %}>
393
{{ mbox_template.template }}
394
</option>
395
{% endfor %}
396
</select>
397
</div>
398
<div class="col-2 p-0 d-flex"></div>
399
</div>
400
</div>
401
{% for key, role in iam_settings.mappers %}
402
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
403
<div class="row px-2">
404
<div class="col-5 p-0 pe-2">
405
<input type="text" class="form-control me-2" name="mappers" value="{{ iam_settings.mappers[key] }}" required>
406
</div>
407
<div class="col-5 p-0 pe-2">
408
<select data-live-search="true" name="templates" class="form-control" title="-- {{ lang.mailbox.template }} --" required>
409
{% for mbox_template in mbox_templates %}
410
<option{% if mbox_template.template == iam_settings.templates[key] %} selected{% endif %}>
411
{{ mbox_template.template }}
412
</option>
413
{% endfor %}
414
</select>
415
</div>
416
<div class="col-2 p-0 d-flex">
417
<button class="iam_generic_rolemap_del btn btn-sm d-block d-sm-inline btn-secondary ms-auto"><i class="bi bi-x-lg"></i></button>
418
</div>
419
</div>
420
</div>
421
{% endfor %}
422
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
423
<div class="row px-2">
424
<div class="col-5 p-0 pe-2">
425
<input type="text" class="form-control me-2" name="mappers" value="">
426
</div>
427
<div class="col-5 p-0 pe-2">
428
<select data-live-search="true" name="templates" class="form-control" title="-- {{ lang.mailbox.template }} --">
429
<option value="" selected>-- {{ lang.mailbox.template }} --</option>
430
{% for mbox_template in mbox_templates %}
431
<option>
432
{{ mbox_template.template }}
433
</option>
434
{% endfor %}
435
</select>
436
</div>
437
<div class="col-2 p-0 d-flex">
438
<button class="iam_generic_rolemap_del btn btn-sm d-block d-sm-inline btn-secondary ms-auto"><i class="bi bi-x-lg"></i></button>
439
</div>
440
</div>
441
</div>
442
</div>
443
<div class="row mb-2">
444
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
445
<label class="control-label">{{ lang.admin.ignore_ssl_error }}</label>
446
</div>
447
<div class="col-12 col-md-9">
448
<div class="form-check form-switch">
449
<input class="form-check-input" type="checkbox" role="switch" name="ignore_ssl_error" value="1" {% if iam_settings.ignore_ssl_error == 1 %}checked{% endif %}>
450
</div>
451
</div>
452
</div>
453
<div class="row mb-4">
454
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
455
<label class="control-label">{{ lang.admin.iam_login_provisioning }}</label>
456
</div>
457
<div class="col-12 col-md-9">
458
<div class="form-check form-switch">
459
<input class="form-check-input" type="checkbox" role="switch" name="login_provisioning" value="1" {% if iam_settings.login_provisioning == 1 %}checked{% endif %}>
460
</div>
461
</div>
462
</div>
463
<div class="row mt-4 mb-2">
464
<div class="offset-md-3 col-12 col-md-9 d-flex flex-wrap">
465
<div class="btn-group mb-2">
466
<button class="btn btn-sm d-block d-sm-inline btn-secondary iam_test_connection" data-id="iam_generic"><i class="bi bi-play"></i> {{ lang.admin.iam_test_connection }}</button>
467
<button class="btn btn-sm d-block d-sm-inline btn-success" data-item="identity-provider" data-action="edit_selected" data-id="iam_generic" data-api-url='edit/identity-provider' data-api-attr='{}'><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
468
</div>
469
<button class="btn btn-sm d-block d-sm-inline btn-danger ms-auto mb-2" data-item="identity-provider" data-action="delete_selected" data-id="iam_generic" data-api-url='delete/identity-provider'><i class="bi bi-trash"></i> {{ lang.mailbox.remove }}</button>
470
</div>
471
</div>
472
</form>
473
</div>
474
<div id="ldap_settings" class="{% if not iam_settings.authsource or iam_settings.authsource != 'ldap' %}d-none{% endif %}">
475
<form class="form-horizontal" autocapitalize="none" data-id="iam_ldap" autocorrect="off" role="form" method="post">
476
<input type="hidden" name="authsource" value="ldap">
477
<div class="row mb-2">
478
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
479
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill mx-2 ms-0" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.admin.iam_host_info }}"></i>
480
<label class="control-label" for="iam_ldap_host">{{ lang.admin.iam_host }}:</label>
481
</div>
482
<div class="col-12 col-md-9 col-lg-4 d-flex">
483
<input type="text" class="form-control" id="iam_ldap_host" name="host" value="{{ iam_settings.host }}" required>
484
</div>
485
</div>
486
<div class="row mb-2">
487
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
488
<label class="control-label" for="iam_ldap_port">{{ lang.admin.iam_port }}:</label>
489
</div>
490
<div class="col-12 col-md-9 col-lg-4">
491
<input type="number" class="form-control" id="iam_ldap_port" name="port" value="{{ iam_settings.port }}" required>
492
</div>
493
</div>
494
<div class="row mb-2">
495
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
496
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill mx-2 ms-0" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.admin.iam_use_ssl_info }}"></i>
497
<label class="control-label">{{ lang.admin.iam_use_ssl }}</label>
498
</div>
499
<div class="col-12 col-md-9 d-flex align-items-center">
500
<div class="form-check form-switch">
501
<input class="form-check-input"
502
type="checkbox"
503
role="switch"
504
id="use_ssl"
505
name="use_ssl"
506
value="1"
507
onchange="if(this.checked) document.getElementById('use_tls').checked = false"
508
{% if iam_settings.use_ssl == 1 %}checked{% endif %}>
509
</div>
510
</div>
511
</div>
512
<div class="row mb-2">
513
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
514
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill mx-2 ms-0" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.admin.iam_use_tls_info }}"></i>
515
<label class="control-label">{{ lang.admin.iam_use_tls }}</label>
516
</div>
517
<div class="col-12 col-md-9 d-flex align-items-center">
518
<div class="form-check form-switch">
519
<input class="form-check-input"
520
type="checkbox"
521
role="switch"
522
id="use_tls"
523
name="use_tls"
524
value="1"
525
onchange="if(this.checked) document.getElementById('use_ssl').checked = false"
526
{% if iam_settings.use_tls == 1 %}checked{% endif %}>
527
</div>
528
</div>
529
</div>
530
<div class="row mb-4">
531
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
532
<label class="control-label">{{ lang.admin.ignore_ssl_error }}</label>
533
</div>
534
<div class="col-12 col-md-9">
535
<div class="form-check form-switch">
536
<input class="form-check-input" type="checkbox" role="switch" name="ignore_ssl_error" value="1" {% if iam_settings.ignore_ssl_error == 1 %}checked{% endif %}>
537
</div>
538
</div>
539
</div>
540
<div class="row mb-2">
541
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
542
<label class="control-label" for="iam_ldap_basedn">{{ lang.admin.iam_basedn }}:</label>
543
</div>
544
<div class="col-12 col-md-9 col-lg-4">
545
<input type="text" class="form-control" id="iam_ldap_basedn" name="basedn" value="{{ iam_settings.basedn }}" required>
546
</div>
547
</div>
548
<div class="row mb-2">
549
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
550
<label class="control-label" for="iam_ldap_username_field">{{ lang.admin.iam_username_field }}:</label>
551
</div>
552
<div class="col-12 col-md-9 col-lg-4">
553
<input type="text" class="form-control" placeholder="mail" id="iam_ldap_username_field" name="username_field" value="{{ iam_settings.username_field }}">
554
</div>
555
</div>
556
<div class="row mb-2">
557
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
558
<label class="control-label" for="iam_ldap_filter">{{ lang.admin.filter }}:</label>
559
</div>
560
<div class="col-12 col-md-9 col-lg-4">
561
<input type="text" class="form-control" placeholder="" id="iam_ldap_filter" name="filter" value="{{ iam_settings.filter }}">
562
</div>
563
</div>
564
<div class="row mb-2">
565
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
566
<label class="control-label" for="iam_ldap_attribute_field">{{ lang.admin.iam_attribute_field }}:</label>
567
</div>
568
<div class="col-12 col-md-9 col-lg-4">
569
<input type="text" class="form-control" id="iam_ldap_attribute_field" name="attribute_field" value="{{ iam_settings.attribute_field }}" required>
570
</div>
571
</div>
572
<div class="row mb-2">
573
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
574
<label class="control-label" for="iam_ldap_binddn">{{ lang.admin.iam_binddn }}:</label>
575
</div>
576
<div class="col-12 col-md-9 col-lg-4">
577
<input type="text" class="form-control" id="iam_ldap_binddn" name="binddn" value="{{ iam_settings.binddn }}" required>
578
</div>
579
</div>
580
<div class="row mb-4">
581
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
582
<label class="control-label" for="iam_ldap_bindpass">{{ lang.admin.iam_bindpass }}:</label>
583
</div>
584
<div class="col-12 col-md-9 col-lg-4">
585
<div class="reveal-password-input input-group">
586
<input type="password" class="password-field form-control" id="iam_ldap_bindpass" name="bindpass" value="{{ iam_settings.bindpass }}" required>
587
<button class="toggle-password btn btn-secondary" type="button"><i class="bi bi-eye"></i></button>
588
</div>
589
</div>
590
</div>
591
<div class="row mb-2">
592
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
593
<label class="control-label">{{ lang.admin.iam_mapping }}:</label>
594
</div>
595
<div class="col-12 col-md-9 col-lg-4">
596
<div class="row px-2 align-items-center">
597
<span class="col-5 p-0 pe-2">{{ lang.user.attribute }}</span>
598
<span class="col-5 p-0 pe-2">{{ lang.mailbox.template }}</span>
599
<div class="col-2 p-0 d-flex">
600
<button class="btn btn-sm d-block d-sm-inline btn-secondary ms-auto iam_rolemap_add_ldap"><i class="bi bi-plus-lg"></i></button>
601
</div>
602
</div>
603
</div>
604
</div>
605
<div class="row mb-2" id="iam_ldap_mapping_list">
606
<input type="hidden" name="mappers" value="">
607
<input type="hidden" name="templates" value="">
608
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
609
<div class="row px-2">
610
<div class="col-5 p-0 pe-2">
611
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.admin.iam_default_template_description }}"></i>
612
<span>{{ lang.admin.iam_default_template }}</span>
613
</div>
614
<div class="col-5 p-0 pe-2 align-content-end">
615
<select data-live-search="true" name="default_template" class="form-control" title="-- {{ lang.mailbox.template }} --">
616
<option value="" {% if not iam_settings.default_template %}selected{% endif %}>-- {{ lang.mailbox.template }} --</option>
617
{% for mbox_template in mbox_templates %}
618
<option {% if mbox_template.template == iam_settings.default_template %}selected{% endif %}>
619
{{ mbox_template.template }}
620
</option>
621
{% endfor %}
622
</select>
623
</div>
624
<div class="col-2 p-0 d-flex"></div>
625
</div>
626
</div>
627
{% for key, role in iam_settings.mappers %}
628
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
629
<div class="row px-2">
630
<div class="col-5 p-0 pe-2">
631
<input type="text" class="form-control me-2" name="mappers" value="{{ iam_settings.mappers[key] }}" required>
632
</div>
633
<div class="col-5 p-0 pe-2">
634
<select data-live-search="true" name="templates" class="form-control" title="-- {{ lang.mailbox.template }} --" required>
635
{% for mbox_template in mbox_templates %}
636
<option{% if mbox_template.template == iam_settings.templates[key] %} selected{% endif %}>
637
{{ mbox_template.template }}
638
</option>
639
{% endfor %}
640
</select>
641
</div>
642
<div class="col-2 p-0 d-flex">
643
<button class="iam_ldap_rolemap_del btn btn-sm d-block d-sm-inline btn-secondary ms-auto"><i class="bi bi-x-lg"></i></button>
644
</div>
645
</div>
646
</div>
647
{% endfor %}
648
<div class="offset-md-3 col-12 col-md-9 col-lg-4 mb-2">
649
<div class="row px-2">
650
<div class="col-5 p-0 pe-2">
651
<input type="text" class="form-control me-2" name="mappers" value="">
652
</div>
653
<div class="col-5 p-0 pe-2">
654
<select data-live-search="true" name="templates" class="form-control" title="-- {{ lang.mailbox.template }} --">
655
<option value="" selected>-- {{ lang.mailbox.template }} --</option>
656
{% for mbox_template in mbox_templates %}
657
<option>
658
{{ mbox_template.template }}
659
</option>
660
{% endfor %}
661
</select>
662
</div>
663
<div class="col-2 p-0 d-flex">
664
<button class="iam_ldap_rolemap_del btn btn-sm d-block d-sm-inline btn-secondary ms-auto"><i class="bi bi-x-lg"></i></button>
665
</div>
666
</div>
667
</div>
668
</div>
669
<div class="row mb-2">
670
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
671
<label class="control-label">{{ lang.admin.iam_login_provisioning }}</label>
672
</div>
673
<div class="col-12 col-md-9">
674
<div class="form-check form-switch">
675
<input class="form-check-input" type="checkbox" role="switch" name="login_provisioning" value="1" {% if iam_settings.login_provisioning == 1 %}checked{% endif %}>
676
</div>
677
</div>
678
</div>
679
<div class="row mb-2">
680
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
681
<label class="control-label">{{ lang.admin.iam_periodic_full_sync }}</label>
682
</div>
683
<div class="col-12 col-md-9">
684
<div class="form-check form-switch">
685
<input class="form-check-input" type="checkbox" role="switch" name="periodic_sync" value="1" {% if iam_settings.periodic_sync == 1 %}checked{% endif %}>
686
</div>
687
</div>
688
</div>
689
<div class="row mb-2">
690
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
691
<label class="control-label">{{ lang.admin.iam_import_users }}</label>
692
</div>
693
<div class="col-12 col-md-9">
694
<div class="form-check form-switch">
695
<input class="form-check-input" type="checkbox" role="switch" name="import_users" value="1" {% if iam_settings.import_users == 1 %}checked{% endif %}>
696
</div>
697
</div>
698
</div>
699
<div class="row mb-2">
700
<div class="col-md-3 d-flex align-items-center justify-content-md-end">
701
<label class="control-label">{{ lang.admin.iam_sync_interval }}</label>
702
</div>
703
<div class="col-12 col-md-9 col-lg-4">
704
<input class="form-control" type="number" min="1" name="sync_interval" style="width: 80px;" {% if iam_settings.sync_interval %}value="{{ iam_settings.sync_interval }}"{% else %}value="15"{% endif %}>
705
</div>
706
</div>
707
<div class="row mt-4 mb-2">
708
<div class="offset-md-3 col-12 col-md-9 d-flex flex-wrap">
709
<div class="btn-group mb-2">
710
<button class="btn btn-sm d-block d-sm-inline btn-secondary iam_test_connection iam_test_connection" data-id="iam_ldap"><i class="bi bi-play"></i> {{ lang.admin.iam_test_connection }}</button>
711
<button class="btn btn-sm d-block d-sm-inline btn-success" data-item="identity-provider" data-action="edit_selected" data-id="iam_ldap" data-api-url='edit/identity-provider' data-api-attr='{}'><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
712
</div>
713
<button class="btn btn-sm d-block d-sm-inline btn-danger ms-auto mb-2" data-item="identity-provider" data-action="delete_selected" data-id="iam_ldap" data-api-url='delete/identity-provider'><i class="bi bi-trash"></i> {{ lang.mailbox.remove }}</button>
714
</div>
715
</div>
716
</form>
717
</div>
718
</div>
719
</div>
720
</div>