]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/AuthEditLDAP.js
ui: ldap: add 'Check connection' checkbox as advanced option
[pve-manager.git] / www / manager6 / dc / AuthEditLDAP.js
1 Ext.define('PVE.panel.LDAPInputPanel', {
2 extend: 'PVE.panel.AuthBase',
3 xtype: 'pveAuthLDAPPanel',
4
5 initComponent: function() {
6 let me = this;
7
8 if (me.type !== 'ldap') {
9 throw 'invalid type';
10 }
11
12 me.column1 = [
13 {
14 xtype: 'textfield',
15 name: 'base_dn',
16 fieldLabel: gettext('Base Domain Name'),
17 emptyText: 'CN=Users,DC=Company,DC=net',
18 allowBlank: false,
19 },
20 {
21 xtype: 'textfield',
22 name: 'user_attr',
23 emptyText: 'uid / sAMAccountName',
24 fieldLabel: gettext('User Attribute Name'),
25 allowBlank: false,
26 },
27 ];
28
29 me.column2 = [
30 {
31 xtype: 'textfield',
32 fieldLabel: gettext('Server'),
33 name: 'server1',
34 allowBlank: false,
35 },
36 {
37 xtype: 'proxmoxtextfield',
38 fieldLabel: gettext('Fallback Server'),
39 deleteEmpty: !me.isCreate,
40 name: 'server2',
41 },
42 {
43 xtype: 'proxmoxintegerfield',
44 name: 'port',
45 fieldLabel: gettext('Port'),
46 minValue: 1,
47 maxValue: 65535,
48 emptyText: gettext('Default'),
49 submitEmptyText: false,
50 },
51 {
52 xtype: 'proxmoxcheckbox',
53 fieldLabel: 'SSL',
54 name: 'secure',
55 uncheckedValue: 0,
56 listeners: {
57 change: function(field, newValue) {
58 let verifyCheckbox = field.nextSibling('proxmoxcheckbox[name=verify]');
59 if (newValue === true) {
60 verifyCheckbox.enable();
61 } else {
62 verifyCheckbox.disable();
63 verifyCheckbox.setValue(0);
64 }
65 },
66 },
67 },
68 {
69 xtype: 'proxmoxcheckbox',
70 fieldLabel: gettext('Verify Certificate'),
71 name: 'verify',
72 unceckedValue: 0,
73 disabled: true,
74 checked: false,
75 autoEl: {
76 tag: 'div',
77 'data-qtip': gettext('Verify SSL certificate of the server'),
78 },
79 },
80 ];
81
82 me.advancedItems = [
83 {
84 xtype: 'proxmoxcheckbox',
85 fieldLabel: gettext('Check connection'),
86 name: 'check-connection',
87 uncheckedValue: 0,
88 checked: true,
89 autoEl: {
90 tag: 'div',
91 'data-qtip':
92 gettext('Verify connection parameters and bind credentials on save'),
93 },
94 },
95 ];
96
97 me.callParent();
98 },
99 onGetValues: function(values) {
100 let me = this;
101
102 if (!values.verify) {
103 if (!me.isCreate) {
104 Proxmox.Utils.assemble_field_data(values, { 'delete': 'verify' });
105 }
106 delete values.verify;
107 }
108
109 return me.callParent([values]);
110 },
111 });
112
113 Ext.define('PVE.panel.LDAPSyncInputPanel', {
114 extend: 'Proxmox.panel.InputPanel',
115 xtype: 'pveAuthLDAPSyncPanel',
116
117 editableAttributes: ['email'],
118 editableDefaults: ['scope', 'enable-new'],
119 default_opts: {},
120 sync_attributes: {},
121
122 // (de)construct the sync-attributes from the list above,
123 // not touching all others
124 onGetValues: function(values) {
125 let me = this;
126 me.editableDefaults.forEach((attr) => {
127 if (values[attr]) {
128 me.default_opts[attr] = values[attr];
129 delete values[attr];
130 } else {
131 delete me.default_opts[attr];
132 }
133 });
134 let vanished_opts = [];
135 ['acl', 'entry', 'properties'].forEach((prop) => {
136 if (values[`remove-vanished-${prop}`]) {
137 vanished_opts.push(prop);
138 }
139 delete values[`remove-vanished-${prop}`];
140 });
141 me.default_opts['remove-vanished'] = vanished_opts.join(';');
142
143 values['sync-defaults-options'] = PVE.Parser.printPropertyString(me.default_opts);
144 me.editableAttributes.forEach((attr) => {
145 if (values[attr]) {
146 me.sync_attributes[attr] = values[attr];
147 delete values[attr];
148 } else {
149 delete me.sync_attributes[attr];
150 }
151 });
152 values.sync_attributes = PVE.Parser.printPropertyString(me.sync_attributes);
153
154 PVE.Utils.delete_if_default(values, 'sync-defaults-options');
155 PVE.Utils.delete_if_default(values, 'sync_attributes');
156
157 // Force values.delete to be an array
158 if (typeof values.delete === 'string') {
159 values.delete = values.delete.split(',');
160 }
161
162 if (me.isCreate) {
163 delete values.delete; // on create we cannot delete values
164 }
165
166 return values;
167 },
168
169 setValues: function(values) {
170 let me = this;
171 if (values.sync_attributes) {
172 me.sync_attributes = PVE.Parser.parsePropertyString(values.sync_attributes);
173 delete values.sync_attributes;
174 me.editableAttributes.forEach((attr) => {
175 if (me.sync_attributes[attr]) {
176 values[attr] = me.sync_attributes[attr];
177 }
178 });
179 }
180 if (values['sync-defaults-options']) {
181 me.default_opts = PVE.Parser.parsePropertyString(values['sync-defaults-options']);
182 delete values.default_opts;
183 me.editableDefaults.forEach((attr) => {
184 if (me.default_opts[attr]) {
185 values[attr] = me.default_opts[attr];
186 }
187 });
188
189 if (me.default_opts['remove-vanished']) {
190 let opts = me.default_opts['remove-vanished'].split(';');
191 for (const opt of opts) {
192 values[`remove-vanished-${opt}`] = 1;
193 }
194 }
195 }
196 return me.callParent([values]);
197 },
198
199 column1: [
200 {
201 xtype: 'proxmoxtextfield',
202 name: 'bind_dn',
203 deleteEmpty: true,
204 emptyText: Proxmox.Utils.noneText,
205 fieldLabel: gettext('Bind User'),
206 },
207 {
208 xtype: 'proxmoxtextfield',
209 inputType: 'password',
210 name: 'password',
211 emptyText: gettext('Unchanged'),
212 fieldLabel: gettext('Bind Password'),
213 },
214 {
215 xtype: 'proxmoxtextfield',
216 name: 'email',
217 fieldLabel: gettext('E-Mail attribute'),
218 },
219 {
220 xtype: 'proxmoxtextfield',
221 name: 'group_name_attr',
222 deleteEmpty: true,
223 fieldLabel: gettext('Groupname attr.'),
224 },
225 {
226 xtype: 'displayfield',
227 value: gettext('Default Sync Options'),
228 },
229 {
230 xtype: 'proxmoxKVComboBox',
231 name: 'scope',
232 emptyText: Proxmox.Utils.NoneText,
233 fieldLabel: gettext('Scope'),
234 value: '__default__',
235 deleteEmpty: false,
236 comboItems: [
237 ['__default__', Proxmox.Utils.NoneText],
238 ['users', gettext('Users')],
239 ['groups', gettext('Groups')],
240 ['both', gettext('Users and Groups')],
241 ],
242 },
243 ],
244
245 column2: [
246 {
247 xtype: 'proxmoxtextfield',
248 name: 'user_classes',
249 fieldLabel: gettext('User classes'),
250 deleteEmpty: true,
251 emptyText: 'inetorgperson, posixaccount, person, user',
252 },
253 {
254 xtype: 'proxmoxtextfield',
255 name: 'group_classes',
256 fieldLabel: gettext('Group classes'),
257 deleteEmpty: true,
258 emptyText: 'groupOfNames, group, univentionGroup, ipausergroup',
259 },
260 {
261 xtype: 'proxmoxtextfield',
262 name: 'filter',
263 fieldLabel: gettext('User Filter'),
264 deleteEmpty: true,
265 },
266 {
267 xtype: 'proxmoxtextfield',
268 name: 'group_filter',
269 fieldLabel: gettext('Group Filter'),
270 deleteEmpty: true,
271 },
272 {
273 // fake for spacing
274 xtype: 'displayfield',
275 value: ' ',
276 },
277 {
278 xtype: 'proxmoxKVComboBox',
279 value: '__default__',
280 deleteEmpty: false,
281 comboItems: [
282 [
283 '__default__',
284 Ext.String.format(
285 gettext("{0} ({1})"),
286 Proxmox.Utils.yesText,
287 Proxmox.Utils.defaultText,
288 ),
289 ],
290 ['1', Proxmox.Utils.yesText],
291 ['0', Proxmox.Utils.noText],
292 ],
293 name: 'enable-new',
294 fieldLabel: gettext('Enable new users'),
295 },
296 ],
297
298 columnB: [
299 {
300 xtype: 'fieldset',
301 title: gettext('Remove Vanished Options'),
302 items: [
303 {
304 xtype: 'proxmoxcheckbox',
305 fieldLabel: gettext('ACL'),
306 name: 'remove-vanished-acl',
307 boxLabel: gettext('Remove ACLs of vanished users and groups.'),
308 },
309 {
310 xtype: 'proxmoxcheckbox',
311 fieldLabel: gettext('Entry'),
312 name: 'remove-vanished-entry',
313 boxLabel: gettext('Remove vanished user and group entries.'),
314 },
315 {
316 xtype: 'proxmoxcheckbox',
317 fieldLabel: gettext('Properties'),
318 name: 'remove-vanished-properties',
319 boxLabel: gettext('Remove vanished properties from synced users.'),
320 },
321 ],
322 },
323 ],
324 });