]> git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/window/AuthEditLDAP.js
43d2234d3ab4163d2fc9a2fe8c0d26443cd87027
[proxmox-widget-toolkit.git] / src / window / AuthEditLDAP.js
1
2 Ext.define('Proxmox.panel.LDAPInputPanelViewModel', {
3 extend: 'Ext.app.ViewModel',
4
5 alias: 'viewmodel.pmxAuthLDAPPanel',
6
7 data: {
8 mode: 'ldap',
9 anonymous_search: 1,
10 },
11
12 formulas: {
13 tls_enabled: function(get) {
14 return get('mode') !== 'ldap';
15 },
16 },
17
18 });
19
20
21 Ext.define('Proxmox.panel.LDAPInputPanel', {
22 extend: 'Proxmox.panel.InputPanel',
23 xtype: 'pmxAuthLDAPPanel',
24 mixins: ['Proxmox.Mixin.CBind'],
25
26 viewModel: {
27 type: 'pmxAuthLDAPPanel',
28 },
29
30 type: 'ldap',
31
32 onlineHelp: 'user-realms-ldap',
33
34 onGetValues: function(values) {
35 if (this.isCreate) {
36 values.type = this.type;
37 }
38
39 if (values.anonymous_search) {
40 if (!values.delete) {
41 values.delete = [];
42 }
43
44 if (!Array.isArray(values.delete)) {
45 let tmp = values.delete;
46 values.delete = [];
47 values.delete.push(tmp);
48 }
49
50 values.delete.push("bind-dn");
51 values.delete.push("password");
52 }
53
54 delete values.anonymous_search;
55
56 return values;
57 },
58
59 onSetValues: function(values) {
60 values.anonymous_search = values["bind-dn"] ? 0 : 1;
61
62 return values;
63 },
64
65
66 column1: [
67 {
68 xtype: 'pmxDisplayEditField',
69 name: 'realm',
70 cbind: {
71 value: '{realm}',
72 editable: '{isCreate}',
73 },
74 fieldLabel: gettext('Realm'),
75 allowBlank: false,
76 },
77 {
78 xtype: 'proxmoxtextfield',
79 fieldLabel: gettext('Base Domain Name'),
80 name: 'base-dn',
81 allowBlank: false,
82 emptyText: 'cn=Users,dc=company,dc=net',
83 },
84 {
85 xtype: 'proxmoxtextfield',
86 fieldLabel: gettext('User Attribute Name'),
87 name: 'user-attr',
88 allowBlank: false,
89 emptyText: 'uid / sAMAccountName',
90 },
91 {
92 xtype: 'proxmoxcheckbox',
93 fieldLabel: gettext('Anonymous Search'),
94 name: 'anonymous_search',
95 bind: {
96 value: '{anonymous_search}',
97 },
98 },
99 {
100 xtype: 'proxmoxtextfield',
101 fieldLabel: gettext('Bind Domain Name'),
102 name: 'bind-dn',
103 allowBlank: false,
104 emptyText: 'cn=user,dc=company,dc=net',
105 bind: {
106 disabled: "{anonymous_search}",
107 },
108 },
109 {
110 xtype: 'proxmoxtextfield',
111 inputType: 'password',
112 fieldLabel: gettext('Bind Password'),
113 name: 'password',
114 allowBlank: true,
115 cbind: {
116 emptyText: get => !get('isCreate') ? gettext('Unchanged') : '',
117 },
118 bind: {
119 disabled: "{anonymous_search}",
120 },
121 },
122 ],
123
124 column2: [
125 {
126 xtype: 'proxmoxtextfield',
127 name: 'server1',
128 fieldLabel: gettext('Server'),
129 allowBlank: false,
130 },
131 {
132 xtype: 'proxmoxtextfield',
133 name: 'server2',
134 fieldLabel: gettext('Fallback Server'),
135 submitEmpty: false,
136 cbind: {
137 deleteEmpty: '{!isCreate}',
138 },
139 },
140 {
141 xtype: 'proxmoxintegerfield',
142 name: 'port',
143 fieldLabel: gettext('Port'),
144 minValue: 1,
145 maxValue: 65535,
146 emptyText: gettext('Default'),
147 submitEmptyText: false,
148 deleteEmpty: true,
149 },
150 {
151 xtype: 'proxmoxKVComboBox',
152 name: 'mode',
153 fieldLabel: gettext('Mode'),
154 editable: false,
155 comboItems: [
156 ['ldap', 'LDAP'],
157 ['ldap+starttls', 'STARTTLS'],
158 ['ldaps', 'LDAPS'],
159 ],
160 bind: "{mode}",
161 cbind: {
162 deleteEmpty: '{!isCreate}',
163 value: get => get('isCreate') ? 'ldap' : 'LDAP',
164 },
165 },
166 {
167 xtype: 'proxmoxcheckbox',
168 fieldLabel: gettext('Verify Certificate'),
169 name: 'verify',
170 value: 0,
171 cbind: {
172 deleteEmpty: '{!isCreate}',
173 },
174
175 bind: {
176 disabled: '{!tls_enabled}',
177 },
178 autoEl: {
179 tag: 'div',
180 'data-qtip': gettext('Verify TLS certificate of the server'),
181 },
182
183 },
184 ],
185
186 columnB: [
187 {
188 xtype: 'textfield',
189 name: 'comment',
190 fieldLabel: gettext('Comment'),
191 cbind: {
192 deleteEmpty: '{!isCreate}',
193 },
194 },
195 ],
196
197 });
198
199
200 Ext.define('Proxmox.panel.LDAPSyncInputPanel', {
201 extend: 'Proxmox.panel.InputPanel',
202 xtype: 'pmxAuthLDAPSyncPanel',
203 mixins: ['Proxmox.Mixin.CBind'],
204
205 editableAttributes: ['firstname', 'lastname', 'email'],
206 editableDefaults: ['scope', 'enable-new'],
207 default_opts: {},
208 sync_attributes: {},
209
210 type: 'ldap',
211
212 // (de)construct the sync-attributes from the list above,
213 // not touching all others
214 onGetValues: function(values) {
215 let me = this;
216
217 me.editableDefaults.forEach((attr) => {
218 if (values[attr]) {
219 me.default_opts[attr] = values[attr];
220 delete values[attr];
221 } else {
222 delete me.default_opts[attr];
223 }
224 });
225 let vanished_opts = [];
226 ['acl', 'entry', 'properties'].forEach((prop) => {
227 if (values[`remove-vanished-${prop}`]) {
228 vanished_opts.push(prop);
229 }
230 delete values[`remove-vanished-${prop}`];
231 });
232 me.default_opts['remove-vanished'] = vanished_opts.join(';');
233
234 values['sync-defaults-options'] = Proxmox.Utils.printPropertyString(me.default_opts);
235 me.editableAttributes.forEach((attr) => {
236 if (values[attr]) {
237 me.sync_attributes[attr] = values[attr];
238 delete values[attr];
239 } else {
240 delete me.sync_attributes[attr];
241 }
242 });
243 values['sync-attributes'] = Proxmox.Utils.printPropertyString(me.sync_attributes);
244
245 Proxmox.Utils.delete_if_default(values, 'sync-defaults-options');
246 Proxmox.Utils.delete_if_default(values, 'sync-attributes');
247
248 // Force values.delete to be an array
249 if (typeof values.delete === 'string') {
250 values.delete = values.delete.split(',');
251 }
252
253 if (me.isCreate) {
254 delete values.delete; // on create we cannot delete values
255 }
256
257 return values;
258 },
259
260 setValues: function(values) {
261 let me = this;
262
263 if (values['sync-attributes']) {
264 me.sync_attributes = Proxmox.Utils.parsePropertyString(values['sync-attributes']);
265 delete values['sync-attributes'];
266 me.editableAttributes.forEach((attr) => {
267 if (me.sync_attributes[attr]) {
268 values[attr] = me.sync_attributes[attr];
269 }
270 });
271 }
272 if (values['sync-defaults-options']) {
273 me.default_opts = Proxmox.Utils.parsePropertyString(values['sync-defaults-options']);
274 delete values.default_opts;
275 me.editableDefaults.forEach((attr) => {
276 if (me.default_opts[attr]) {
277 values[attr] = me.default_opts[attr];
278 }
279 });
280
281 if (me.default_opts['remove-vanished']) {
282 let opts = me.default_opts['remove-vanished'].split(';');
283 for (const opt of opts) {
284 values[`remove-vanished-${opt}`] = 1;
285 }
286 }
287 }
288 return me.callParent([values]);
289 },
290
291 column1: [
292 {
293 xtype: 'proxmoxtextfield',
294 name: 'firstname',
295 fieldLabel: gettext('First Name attribute'),
296 },
297 {
298 xtype: 'proxmoxtextfield',
299 name: 'lastname',
300 fieldLabel: gettext('Last Name attribute'),
301 },
302 {
303 xtype: 'proxmoxtextfield',
304 name: 'email',
305 fieldLabel: gettext('E-Mail attribute'),
306 },
307 {
308 xtype: 'displayfield',
309 value: gettext('Default Sync Options'),
310 },
311 {
312 xtype: 'proxmoxKVComboBox',
313 value: '__default__',
314 deleteEmpty: false,
315 comboItems: [
316 [
317 '__default__',
318 Ext.String.format(
319 gettext("{0} ({1})"),
320 Proxmox.Utils.yesText,
321 Proxmox.Utils.defaultText,
322 ),
323 ],
324 ['true', Proxmox.Utils.yesText],
325 ['false', Proxmox.Utils.noText],
326 ],
327 name: 'enable-new',
328 fieldLabel: gettext('Enable new users'),
329 },
330 ],
331
332 column2: [
333 {
334 xtype: 'proxmoxtextfield',
335 name: 'user-classes',
336 fieldLabel: gettext('User classes'),
337 deleteEmpty: true,
338 emptyText: 'inetorgperson, posixaccount, person, user',
339 autoEl: {
340 tag: 'div',
341 'data-qtip': gettext('Default user classes: inetorgperson, posixaccount, person, user'),
342 },
343 },
344 {
345 xtype: 'proxmoxtextfield',
346 name: 'filter',
347 fieldLabel: gettext('User Filter'),
348 deleteEmpty: true,
349 },
350 ],
351
352 columnB: [
353 {
354 xtype: 'fieldset',
355 title: gettext('Remove Vanished Options'),
356 items: [
357 {
358 xtype: 'proxmoxcheckbox',
359 fieldLabel: gettext('ACL'),
360 name: 'remove-vanished-acl',
361 boxLabel: gettext('Remove ACLs of vanished users'),
362 },
363 {
364 xtype: 'proxmoxcheckbox',
365 fieldLabel: gettext('Entry'),
366 name: 'remove-vanished-entry',
367 boxLabel: gettext('Remove vanished user'),
368 },
369 {
370 xtype: 'proxmoxcheckbox',
371 fieldLabel: gettext('Properties'),
372 name: 'remove-vanished-properties',
373 boxLabel: gettext('Remove vanished properties from synced users.'),
374 },
375 ],
376 },
377 ],
378 });