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