]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/ACLView.js
3e66386bc4600075cffc27192ea187615811a0c0
[pve-manager.git] / www / manager6 / dc / ACLView.js
1 Ext.define('PVE.dc.ACLAdd', {
2 extend: 'Proxmox.window.Edit',
3 alias: ['widget.pveACLAdd'],
4 url: '/access/acl',
5 method: 'PUT',
6 isAdd: true,
7 initComponent: function() {
8 var me = this;
9
10 me.isCreate = true;
11
12 var items = [
13 {
14 xtype: me.path ? 'hiddenfield' : 'pvePermPathSelector',
15 name: 'path',
16 value: me.path,
17 allowBlank: false,
18 fieldLabel: gettext('Path'),
19 },
20 ];
21
22 if (me.aclType === 'group') {
23 me.subject = gettext("Group Permission");
24 items.push({
25 xtype: 'pveGroupSelector',
26 name: 'groups',
27 fieldLabel: gettext('Group'),
28 });
29 } else if (me.aclType === 'user') {
30 me.subject = gettext("User Permission");
31 items.push({
32 xtype: 'pveUserSelector',
33 name: 'users',
34 fieldLabel: gettext('User'),
35 });
36 } else if (me.aclType === 'token') {
37 me.subject = gettext("API Token Permission");
38 items.push({
39 xtype: 'pveTokenSelector',
40 name: 'tokens',
41 fieldLabel: gettext('API Token'),
42 });
43 } else {
44 throw "unknown ACL type";
45 }
46
47 items.push({
48 xtype: 'pmxRoleSelector',
49 name: 'roles',
50 value: 'NoAccess',
51 fieldLabel: gettext('Role'),
52 });
53
54 if (!me.path) {
55 items.push({
56 xtype: 'proxmoxcheckbox',
57 name: 'propagate',
58 checked: true,
59 uncheckedValue: 0,
60 fieldLabel: gettext('Propagate'),
61 });
62 }
63
64 var ipanel = Ext.create('Proxmox.panel.InputPanel', {
65 items: items,
66 onlineHelp: 'pveum_permission_management',
67 });
68
69 Ext.apply(me, {
70 items: [ipanel],
71 });
72
73 me.callParent();
74 },
75 });
76
77 Ext.define('PVE.dc.ACLView', {
78 extend: 'Ext.grid.GridPanel',
79
80 alias: ['widget.pveACLView'],
81
82 onlineHelp: 'chapter_user_management',
83
84 stateful: true,
85 stateId: 'grid-acls',
86
87 // use fixed path
88 path: undefined,
89
90 initComponent: function() {
91 var me = this;
92
93 var store = Ext.create('Ext.data.Store', {
94 model: 'pve-acl',
95 proxy: {
96 type: 'proxmox',
97 url: "/api2/json/access/acl",
98 },
99 sorters: {
100 property: 'path',
101 order: 'DESC',
102 },
103 });
104
105 if (me.path) {
106 store.addFilter(Ext.create('Ext.util.Filter', {
107 filterFn: function(item) {
108 if (item.data.path === me.path) {
109 return true;
110 }
111 },
112 }));
113 }
114
115 var render_ugid = function(ugid, metaData, record) {
116 if (record.data.type == 'group') {
117 return '@' + ugid;
118 }
119
120 return Ext.String.htmlEncode(ugid);
121 };
122
123 var columns = [
124 {
125 header: gettext('User') + '/' + gettext('Group') + '/' + gettext('API Token'),
126 flex: 1,
127 sortable: true,
128 renderer: render_ugid,
129 dataIndex: 'ugid',
130 },
131 {
132 header: gettext('Role'),
133 flex: 1,
134 sortable: true,
135 dataIndex: 'roleid',
136 },
137 ];
138
139 if (!me.path) {
140 columns.unshift({
141 header: gettext('Path'),
142 flex: 1,
143 sortable: true,
144 dataIndex: 'path',
145 });
146 columns.push({
147 header: gettext('Propagate'),
148 width: 80,
149 sortable: true,
150 dataIndex: 'propagate',
151 });
152 }
153
154 var sm = Ext.create('Ext.selection.RowModel', {});
155
156 var reload = function() {
157 store.load();
158 };
159
160 var remove_btn = new Proxmox.button.Button({
161 text: gettext('Remove'),
162 disabled: true,
163 selModel: sm,
164 confirmMsg: gettext('Are you sure you want to remove this entry'),
165 handler: function(btn, event, rec) {
166 var params = {
167 'delete': 1,
168 path: rec.data.path,
169 roles: rec.data.roleid,
170 };
171 if (rec.data.type === 'group') {
172 params.groups = rec.data.ugid;
173 } else if (rec.data.type === 'user') {
174 params.users = rec.data.ugid;
175 } else if (rec.data.type === 'token') {
176 params.tokens = rec.data.ugid;
177 } else {
178 throw 'unknown data type';
179 }
180
181 Proxmox.Utils.API2Request({
182 url: '/access/acl',
183 params: params,
184 method: 'PUT',
185 waitMsgTarget: me,
186 callback: function() {
187 reload();
188 },
189 failure: function(response, opts) {
190 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
191 },
192 });
193 },
194 });
195
196 Proxmox.Utils.monStoreErrors(me, store);
197
198 Ext.apply(me, {
199 store: store,
200 selModel: sm,
201 tbar: [
202 {
203 text: gettext('Add'),
204 menu: {
205 xtype: 'menu',
206 items: [
207 {
208 text: gettext('Group Permission'),
209 iconCls: 'fa fa-fw fa-group',
210 handler: function() {
211 var win = Ext.create('PVE.dc.ACLAdd', {
212 aclType: 'group',
213 path: me.path,
214 });
215 win.on('destroy', reload);
216 win.show();
217 },
218 },
219 {
220 text: gettext('User Permission'),
221 iconCls: 'fa fa-fw fa-user',
222 handler: function() {
223 var win = Ext.create('PVE.dc.ACLAdd', {
224 aclType: 'user',
225 path: me.path,
226 });
227 win.on('destroy', reload);
228 win.show();
229 },
230 },
231 {
232 text: gettext('API Token Permission'),
233 iconCls: 'fa fa-fw fa-user-o',
234 handler: function() {
235 var win = Ext.create('PVE.dc.ACLAdd', {
236 aclType: 'token',
237 path: me.path,
238 });
239 win.on('destroy', reload);
240 win.show();
241 },
242 },
243 ],
244 },
245 },
246 remove_btn,
247 ],
248 viewConfig: {
249 trackOver: false,
250 },
251 columns: columns,
252 listeners: {
253 activate: reload,
254 },
255 });
256
257 me.callParent();
258 },
259 }, function() {
260 Ext.define('pve-acl', {
261 extend: 'Ext.data.Model',
262 fields: [
263 'path', 'type', 'ugid', 'roleid',
264 {
265 name: 'propagate',
266 type: 'boolean',
267 },
268 ],
269 });
270 });