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