]> git.proxmox.com Git - pmg-gui.git/blame - js/LDAPConfig.js
fix removal of rules
[pmg-gui.git] / js / LDAPConfig.js
CommitLineData
ff735274 1/*global Proxmox*/
de0ebd99
DC
2/*jslint confusion: true*/
3/*create is function and bool,
4 * reload is function and string,
5 * height is number and string,
6 * hidden is bool and string,
7 * bind is function and object,
8 * callback is function and string
9 */
f6b1b3bf
DM
10Ext.define('pmg-ldap-config', {
11 extend: 'Ext.data.Model',
d045660b 12 fields: [ 'profile', 'server1', 'server2', 'comment',
f6b1b3bf
DM
13 'mode', 'binddn', 'bindpw', 'basedn', 'groupbasedn',
14 'filter', 'accountattr', 'mailattr',
15 { name: 'port', type: 'integer' },
fb896a90
DM
16 { name: 'gcount', type: 'integer' },
17 { name: 'mcount', type: 'integer' },
18 { name: 'ucount', type: 'integer' },
f6b1b3bf
DM
19 { name: 'disable', type: 'boolean' }
20 ],
21 proxy: {
22 type: 'proxmox',
23 url: "/api2/json/config/ldap"
24 },
d045660b 25 idProperty: 'profile'
f6b1b3bf
DM
26});
27
28Ext.define('PMG.LDAPInputPanel', {
29 extend: 'Proxmox.panel.InputPanel',
30 alias: 'widget.pmgLDAPInputPanel',
31
d045660b 32 profileId: undefined,
f6b1b3bf
DM
33
34 onGetValues: function(values) {
35 var me = this;
36
37 values.disable = values.enable ? 0 : 1;
38 delete values.enable;
39
40 return values;
41 },
42
43 initComponent : function() {
44 var me = this;
45
46 me.column1 = [
47 {
d045660b 48 xtype: me.profileId ? 'displayfield' : 'textfield',
f6b1b3bf 49 fieldLabel: gettext('Profile Name'),
d045660b
DM
50 value: me.profileId || '',
51 name: 'profile',
f6b1b3bf
DM
52 vtype: 'StorageId',
53 allowBlank: false
54 },
55 {
56 xtype: 'proxmoxKVComboBox',
57 name: 'mode',
58 comboItems: [
59 ['ldap', PMG.Utils.format_ldap_protocol('ldap')],
60 ['ldaps', PMG.Utils.format_ldap_protocol('ldaps')]
61 ],
62 value: 'ldap',
63 fieldLabel: gettext('Protocol')
64 },
65 {
66 xtype: 'textfield',
67 fieldLabel: gettext('Server'),
68 allowBlank: false,
69 vtype: 'IP64Address',
70 name: 'server1'
71 },
72 {
73 xtype: 'proxmoxtextfield',
74 fieldLabel: gettext('Server'),
75 allowBlank: true,
76 deleteEmpty: me.create ? false : true,
77 vtype: 'IP64Address',
78 name: 'server2'
79 },
80 {
81 xtype: 'proxmoxintegerfield',
82 name: 'port',
83 emptyText: gettext('Default'),
84 deleteEmpty: me.create ? false : true,
85 minValue: 1,
86 maxValue: 65535,
771bd0b9 87 fieldLabel: gettext('Port')
f6b1b3bf
DM
88 },
89 {
90 xtype: 'textfield',
91 name: 'binddn',
92 allowBlank: true,
93 fieldLabel: gettext('User name')
94 },
95 {
96 xtype: 'textfield',
97 inputType: 'password',
98 allowBlank: true,
99 name: 'bindpw',
100 fieldLabel: gettext('Password')
101 }
102 ];
103
104 me.column2 = [
105 {
106 xtype: 'proxmoxcheckbox',
107 name: 'enable',
108 checked: true,
109 uncheckedValue: 0,
110 fieldLabel: gettext('Enable')
111 },
112 {
113 xtype: 'proxmoxtextfield',
114 allowBlank: true,
115 deleteEmpty: me.create ? false : true,
116 name: 'basedn',
117 fieldLabel: gettext('Base DN')
118 },
119 {
120 xtype: 'proxmoxtextfield',
121 allowBlank: true,
122 deleteEmpty: me.create ? false : true,
123 name: 'groupbasedn',
124 fieldLabel: gettext('Base DN for Groups')
125 },
126 {
127 xtype: 'proxmoxtextfield',
128 allowBlank: true,
129 deleteEmpty: me.create ? false : true,
130 name: 'mailattr',
131 fieldLabel: gettext('EMail attribute name(s)')
132 },
133 {
134 xtype: 'proxmoxtextfield',
135 allowBlank: true,
136 deleteEmpty: me.create ? false : true,
137 name: 'accountattr',
138 fieldLabel: gettext('Account attribute name')
139 },
140 {
141 xtype: 'proxmoxtextfield',
142 allowBlank: true,
143 deleteEmpty: me.create ? false : true,
144 name: 'filter',
145 fieldLabel: gettext('LDAP filter')
dd26ba9a
DC
146 },
147 {
148 xtype: 'proxmoxtextfield',
149 allowBlank: true,
150 deleteEmpty: me.create ? false : true,
151 name: 'groupclass',
152 fieldLabel: gettext('Group objectclass')
f6b1b3bf
DM
153 }
154 ];
155
156 me.columnB = [
157 {
158 xtype: 'textfield',
159 fieldLabel: gettext('Comment'),
160 allowBlank: true,
161 name: 'comment'
162 }
163 ];
164
165 me.callParent();
166 }
167});
168
169Ext.define('PMG.LDAPEdit', {
170 extend: 'Proxmox.window.Edit',
171 alias: 'widget.pmgLDAPEdit',
172
173 subject: 'LDAP Profile',
174 isAdd: true,
175
176 initComponent : function() {
177 var me = this;
178
d045660b 179 me.create = me.profileId ? false : true;
f6b1b3bf
DM
180
181 if (me.create) {
182 me.url = '/api2/extjs/config/ldap';
183 me.method = 'POST';
184 } else {
65a2aa68 185 me.url = '/api2/extjs/config/ldap/' + me.profileId + '/config';
f6b1b3bf
DM
186 me.method = 'PUT';
187 }
188
189 var ipanel = Ext.create('PMG.LDAPInputPanel', {
190 create: me.create,
d045660b 191 profileId: me.profileId
f6b1b3bf
DM
192 });
193
194 me.items = [ ipanel ];
195
196 me.fieldDefaults = {
197 labelWidth: 150
198 };
199
200 me.callParent();
201
202 if (!me.create) {
203 me.load({
204 success: function(response, options) {
205 var values = response.result.data;
206
207 values.enable = values.disable ? 0 : 1;
208 ipanel.setValues(values);
209 }
210 });
211 }
212 }
213});
214
78ec45eb
DC
215Ext.define('PMG.LDAPUserGrid', {
216 extend: 'Ext.grid.Panel',
217 xtype: 'pmgLDAPUserGrid',
218
219 emptyText: gettext('No data in database'),
220 store: {
221 autoDestroy: true,
222 fields: [ 'dn', 'account', 'pmail' ],
223 proxy: { type: 'proxmox' },
224 sorters: [ 'dn' ]
225 },
226 columns: [
227 {
228 text: 'DN',
229 dataIndex: 'dn',
230 flex: 1
231 },
232 {
233 text: gettext('Account'),
234 dataIndex: 'account',
235 flex: 1
236 },
237 {
238 text: gettext('Primary E-Mail'),
239 dataIndex: 'pmail',
240 flex: 1
241 }
242 ],
f6b1b3bf 243
78ec45eb 244 initComponent: function() {
f6b1b3bf 245 var me = this;
78ec45eb
DC
246 me.callParent();
247 if (me.url) {
248 me.getStore().getProxy().setUrl(me.url);
249 me.getStore().load();
250 }
251 }
252});
f6b1b3bf 253
78ec45eb
DC
254Ext.define('PMG.LDAPConfig', {
255 extend: 'Ext.panel.Panel',
256 xtype: 'pmgLDAPConfig',
257
258 controller: {
259 xclass: 'Ext.app.ViewController',
260
261 openUserList: function(grid, record) {
262 var name = this.getViewModel().get('name');
263 Ext.create('Ext.window.Window', {
264 title: Ext.String.format(gettext("Users of '{0}'"), record.data.dn),
265 modal: true,
266 width: 600,
267 height: 400,
268 layout: 'fit',
269 items: [{
270 xtype: 'pmgLDAPUserGrid',
271 border: false,
272 url: '/api2/json/config/ldap/' + name + '/groups/' + record.data.gid
273 }]
274 }).show();
275 },
276
277 showUsers: function(button) {
278 var me = this;
279 var view = me.lookup('groupgrid');
280 var record = view.getSelection()[0];
281 me.openUserList(view, record);
282 },
283
284 openUserMails: function(grid, record) {
285 var name = this.getViewModel().get('name');
286 Ext.create('Ext.window.Window', {
287 title: Ext.String.format(gettext("E-Mail addresses of '{0}'"), record.data.dn),
288 modal: true,
289 width: 600,
290 height: 400,
291 layout: 'fit',
292 items: [{
293 xtype: 'grid',
294 border: false,
295 store: {
296 autoLoad: true,
297 field: ['email', 'primary'],
298 proxy: {
299 type: 'proxmox',
300 url: '/api2/json/config/ldap/' + name + '/users/' + record.data.pmail
301 }
302 },
303 columns: [
304 { dataIndex: 'email', text: gettext('E-Mail address'), flex: 1 }
771bd0b9 305 ]
78ec45eb
DC
306 }]
307 }).show();
308 },
309
310 showEmails: function(button) {
311 var me = this;
312 var view = me.lookup('usergrid');
313 var record = view.getSelection()[0];
314 me.openUserMails(view, record);
315 },
316
317 reload: function(grid) {
318 var me = this;
319 var selection = grid.getSelection();
320 me.showInfo(grid, selection);
321 },
322
323 showInfo: function(grid, selected) {
324 var me = this;
325 var viewModel = me.getViewModel();
78ec45eb
DC
326 if (selected[0]) {
327 var name = selected[0].data.profile;
328 viewModel.set('selected', true);
329 viewModel.set('name', name);
330
331 // set grid stores and load them
332 var gstore = me.lookup('groupgrid').getStore();
333 var ustore = me.lookup('usergrid').getStore();
334 gstore.getProxy().setUrl('/api2/json/config/ldap/' + name + '/groups');
335 ustore.getProxy().setUrl('/api2/json/config/ldap/' + name + '/users');
336 gstore.load();
337 ustore.load();
338 } else {
339 viewModel.set('selected', false);
f6b1b3bf 340 }
78ec45eb
DC
341 },
342
343 init: function(view) {
344 var me = this;
345 me.lookup('grid').relayEvents(view, ['activate']);
346 var groupgrid = me.lookup('groupgrid');
347 var usergrid = me.lookup('usergrid');
348
349 Proxmox.Utils.monStoreErrors(groupgrid, groupgrid.getStore(), true);
350 Proxmox.Utils.monStoreErrors(usergrid, usergrid.getStore(), true);
351 },
352
353 control: {
354 'grid[reference=grid]': {
355 selectionchange: 'showInfo',
356 load: 'reload'
357 },
358 'grid[reference=groupgrid]': {
359 itemdblclick: 'openUserList'
360 },
361 'grid[reference=usergrid]': {
362 itemdblclick: 'openUserMails'
363 }
364 }
365 },
f6b1b3bf 366
78ec45eb
DC
367 viewModel: {
368 data: {
369 name: '',
370 selected: false
371 }
372 },
f6b1b3bf 373
de0ebd99 374 layout: 'border',
b6850939 375
78ec45eb
DC
376 items: [
377 {
378 region: 'center',
379 reference: 'grid',
380 xtype: 'pmgLDAPConfigGrid',
771bd0b9 381 border: false
78ec45eb
DC
382 },
383 {
384 xtype: 'tabpanel',
385 reference: 'data',
386 hidden: true,
387 height: '50%',
388 border: false,
389 split: true,
390 region: 'south',
391 bind: {
392 hidden: '{!selected}'
4ada6d22 393 },
78ec45eb
DC
394 items: [
395 {
396 xtype: 'grid',
397 reference: 'groupgrid',
398 border: false,
399 emptyText: gettext('No data in database'),
400 tbar: [{
401 xtype: 'proxmoxButton',
402 text: gettext('Show Users'),
403 handler: 'showUsers',
404 disabled: true
405 }],
406 store: {
407 fields: ['dn', 'gid'],
408 proxy: { type: 'proxmox' },
409 sorters: [ 'dn' ]
410 },
411 bind: {
412 title: Ext.String.format(gettext("Groups of '{0}'"), '{name}')
413 },
414 columns: [
415 {
416 text: 'DN',
417 dataIndex: 'dn',
418 flex: 1
419 }
420 ]
421 },
422 {
423 xtype: 'pmgLDAPUserGrid',
424 reference: 'usergrid',
425 border: false,
426 tbar: [{
427 xtype: 'proxmoxButton',
428 text: gettext('Show E-Mail addresses'),
429 handler: 'showEmails',
430 disabled: true
431 }],
432 bind: {
433 title: Ext.String.format(gettext("Users of '{0}'"), '{name}')
771bd0b9 434 }
78ec45eb
DC
435 }
436 ]
437 }
771bd0b9 438 ]
78ec45eb
DC
439
440});
441
442Ext.define('PMG.LDAPConfigGrid', {
443 extend: 'Ext.grid.GridPanel',
444 alias: 'widget.pmgLDAPConfigGrid',
2c18c2d7 445
78ec45eb
DC
446 controller: {
447 xclass: 'Ext.app.ViewController',
448
449 run_editor: function() {
450 var me = this;
451 var view = me.getView();
452 var rec = view.getSelection()[0];
f6b1b3bf
DM
453 if (!rec) {
454 return;
455 }
456
457 var win = Ext.createWidget('pmgLDAPEdit', {
771bd0b9 458 profileId: rec.data.profile
f6b1b3bf 459 });
78ec45eb 460 win.on('destroy', me.reload, me);
f6b1b3bf 461 win.load();
f6b1b3bf 462 win.show();
78ec45eb 463 },
f6b1b3bf 464
77dab24d 465 newProfile: function() {
78ec45eb
DC
466 var me = this;
467 var win = Ext.createWidget('pmgLDAPEdit', {});
468 win.on('destroy', me.reload, me);
469 win.show();
470 },
471
472
473 reload: function() {
474 var me = this.getView();
475 me.getStore().load();
476 me.fireEvent('load', me);
477 },
478
479 sync: function() {
480 var me = this;
481 var view = me.getView();
482 var rec = view.getSelection()[0];
483 Proxmox.Utils.API2Request({
484 url: '/config/ldap/' + rec.data.profile + '/sync',
485 method: 'POST',
486 waitMsgTarget: view,
487 callback: function() {
488 me.reload();
489 },
490 failure: function (response, opts) {
491 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
f6b1b3bf 492 }
78ec45eb
DC
493 });
494 },
f6b1b3bf 495
78ec45eb
DC
496 init: function(view) {
497 var me = this;
498 Proxmox.Utils.monStoreErrors(view, view.getStore(), true);
499 }
500 },
b6850939 501
78ec45eb
DC
502 store: {
503 model: 'pmg-ldap-config',
de0ebd99 504 sorters: [{
78ec45eb
DC
505 property: 'profile',
506 order: 'DESC'
de0ebd99 507 }]
78ec45eb 508 },
f6b1b3bf 509
78ec45eb
DC
510 tbar: [
511 {
512 xtype: 'proxmoxButton',
513 text: gettext('Edit'),
514 disabled: true,
515 handler: 'run_editor'
516 },
517 {
518 text: gettext('Create'),
77dab24d 519 handler: 'newProfile'
78ec45eb
DC
520 },
521 {
522 xtype: 'proxmoxStdRemoveButton',
523 baseurl: '/config/ldap',
771bd0b9 524 callback: 'reload'
78ec45eb
DC
525 },
526 {
527 xtype: 'proxmoxButton',
528 text: gettext('Synchronize'),
529 enableFn: function(rec) {
530 return !rec.data.disable;
531 },
532 disabled: true,
533 handler: 'sync'
771bd0b9 534 }
78ec45eb
DC
535 ],
536
537 listeners: {
538 itemdblclick: 'run_editor',
539 activate: 'reload'
540 },
541
542 columns: [
543 {
544 header: gettext('Profile Name'),
545 sortable: true,
546 width: 120,
547 dataIndex: 'profile'
548 },
549 {
550 header: gettext('Protocol'),
551 sortable: true,
552 dataIndex: 'mode',
553 renderer: PMG.Utils.format_ldap_protocol
554 },
555 {
556 header: gettext('Server'),
557 sortable: true,
558 dataIndex: 'server1',
559 renderer: function(value, metaData, rec) {
560 if (rec.data.server2) {
561 return value + '<br>' + rec.data.server2;
562 }
563 return value;
f6b1b3bf 564 }
78ec45eb
DC
565 },
566 {
567 header: gettext('Enabled'),
568 width: 80,
569 sortable: true,
570 dataIndex: 'disable',
571 renderer: Proxmox.Utils.format_neg_boolean
572 },
573 {
574 header: gettext('Comment'),
575 sortable: false,
576 renderer: Ext.String.htmlEncode,
577 dataIndex: 'comment',
578 flex: 1
579 },
580 {
581 header: gettext('Accounts'),
582 width: 80,
583 sortable: true,
584 dataIndex: 'ucount'
585 },
586 {
587 header: gettext('Addresses'),
588 width: 80,
589 sortable: true,
590 dataIndex: 'mcount'
591 },
592 {
593 header: gettext('Groups'),
594 width: 80,
595 sortable: true,
596 dataIndex: 'gcount'
771bd0b9
DC
597 }
598 ]
f6b1b3bf 599
f6b1b3bf 600});