]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/node/Certificates.js
fix #2265: enable discard for virtio-blk
[pve-manager.git] / www / manager6 / node / Certificates.js
CommitLineData
c287e233
DC
1Ext.define('PVE.node.CertificateView', {
2 extend: 'Ext.container.Container',
3 xtype: 'pveCertificatesView',
4
16dedd0f
DC
5 onlineHelp: 'sysadmin_certificate_management',
6
c287e233
DC
7 mixins: ['Proxmox.Mixin.CBind' ],
8
9 items: [
10 {
11 xtype: 'pveCertView',
12 border: 0,
13 cbind: {
14 nodename: '{nodename}'
15 }
16 },
17 {
18 xtype: 'pveACMEView',
19 border: 0,
20 cbind: {
21 nodename: '{nodename}'
22 }
23 }
24 ]
25
26});
27
28Ext.define('PVE.node.CertificateViewer', {
29 extend: 'Proxmox.window.Edit',
30
31 title: gettext('Certificate'),
32
33 fieldDefaults: {
34 labelWidth: 120
35 },
36 width: 800,
37 resizable: true,
38
39 items: [
40 {
41 xtype: 'displayfield',
42 fieldLabel: gettext('Name'),
43 name: 'filename'
44 },
45 {
46 xtype: 'displayfield',
47 fieldLabel: gettext('Fingerprint'),
48 name: 'fingerprint'
49 },
50 {
51 xtype: 'displayfield',
52 fieldLabel: gettext('Issuer'),
53 name: 'issuer'
54 },
55 {
56 xtype: 'displayfield',
57 fieldLabel: gettext('Subject'),
58 name: 'subject'
59 },
60 {
61 xtype: 'displayfield',
62 fieldLabel: gettext('Valid Since'),
63 renderer: Proxmox.Utils.render_timestamp,
64 name: 'notbefore'
65 },
66 {
67 xtype: 'displayfield',
68 fieldLabel: gettext('Expires'),
69 renderer: Proxmox.Utils.render_timestamp,
70 name: 'notafter'
71 },
72 {
73 xtype: 'displayfield',
74 fieldLabel: gettext('Subject Alternative Names'),
75 name: 'san',
76 renderer: PVE.Utils.render_san
77 },
78 {
79 xtype: 'textarea',
80 editable: false,
81 grow: true,
82 growMax: 200,
83 fieldLabel: gettext('Certificate'),
84 name: 'pem'
85 }
86 ],
87
88 initComponent: function() {
89 var me = this;
90
91 if (!me.cert) {
92 throw "no cert given";
93 }
94
95 if (!me.nodename) {
96 throw "no nodename given";
97 }
98
99 me.url = '/nodes/' + me.nodename + '/certificates/info';
100 me.callParent();
101
102 // hide OK/Reset button, because we just want to show data
103 me.down('toolbar[dock=bottom]').setVisible(false);
104
105 me.load({
106 success: function(response) {
107 if (Ext.isArray(response.result.data)) {
108 Ext.Array.each(response.result.data, function(item) {
109 if (item.filename === me.cert) {
110 me.setValues(item);
111 return false;
112 }
113 });
114 }
115 }
116 });
117 }
118});
119
120Ext.define('PVE.node.CertUpload', {
121 extend: 'Proxmox.window.Edit',
122 xtype: 'pveCertUpload',
123
124 title: gettext('Upload Custom Certificate'),
125 resizable: false,
126 isCreate: true,
127 submitText: gettext('Upload'),
128 method: 'POST',
129 width: 600,
130
131 apiCallDone: function(success, response, options) {
132 if (!success) {
133 return;
134 }
135
136 var txt = gettext('pveproxy will be restarted with new certificates, please reload the GUI!');
137 Ext.getBody().mask(txt, ['pve-static-mask']);
138 // reload after 10 seconds automatically
139 Ext.defer(function() {
140 window.location.reload(true);
141 }, 10000);
142 },
143
144 items: [
145 {
146 fieldLabel: gettext('Private Key (Optional)'),
147 labelAlign: 'top',
148 emptyText: gettext('No change'),
149 name: 'key',
150 xtype: 'textarea'
151 },
152 {
153 xtype: 'filebutton',
154 text: gettext('From File'),
155 listeners: {
156 change: function(btn, e, value) {
157 var me = this.up('form');
158 e = e.event;
159 Ext.Array.each(e.target.files, function(file) {
160 PVE.Utils.loadSSHKeyFromFile(file, function(res) {
161 me.down('field[name=key]').setValue(res);
162 });
163 });
164 btn.reset();
165 }
166 }
167 },
168 {
169 xtype: 'box',
170 autoEl: 'hr'
171 },
172 {
173 fieldLabel: gettext('Certificate Chain'),
174 labelAlign: 'top',
175 allowBlank: false,
176 name: 'certificates',
177 xtype: 'textarea'
178 },
179 {
180 xtype: 'filebutton',
181 text: gettext('From File'),
182 listeners: {
183 change: function(btn, e, value) {
184 var me = this.up('form');
185 e = e.event;
186 Ext.Array.each(e.target.files, function(file) {
187 PVE.Utils.loadSSHKeyFromFile(file, function(res) {
188 me.down('field[name=certificates]').setValue(res);
189 });
190 });
191 btn.reset();
192 }
193 }
194 },
195 {
196 xtype: 'hidden',
197 name: 'restart',
198 value: '1'
199 },
200 {
201 xtype: 'hidden',
202 name: 'force',
203 value: '1'
204 }
205 ],
206
207 initComponent: function() {
208 var me = this;
209
210 if (!me.nodename) {
211 throw "no nodename given";
212 }
213
214 me.url = '/nodes/' + me.nodename + '/certificates/custom';
215
216 me.callParent();
217 }
218});
219
220Ext.define('pve-certificate', {
221 extend: 'Ext.data.Model',
222
223 fields: [ 'filename', 'fingerprint', 'issuer', 'notafter', 'notbefore', 'subject', 'san' ],
224 idProperty: 'filename'
225});
226
227Ext.define('PVE.node.Certificates', {
228 extend: 'Ext.grid.Panel',
229 xtype: 'pveCertView',
230
231 tbar: [
232 {
233 xtype: 'button',
234 text: gettext('Upload Custom Certificate'),
235 handler: function() {
236 var me = this.up('grid');
237 var win = Ext.create('PVE.node.CertUpload', {
238 nodename: me.nodename
239 });
240 win.show();
241 win.on('destroy', me.reload, me);
242 }
243 },
244 {
245 xtype: 'button',
246 itemId: 'deletebtn',
247 text: gettext('Delete Custom Certificate'),
248 handler: function() {
249 var me = this.up('grid');
250 Proxmox.Utils.API2Request({
251 url: '/nodes/' + me.nodename + '/certificates/custom?restart=1',
252 method: 'DELETE',
253 success: function(response, opt) {
254 var txt = gettext('pveproxy will be restarted with new certificates, please reload the GUI!');
255 Ext.getBody().mask(txt, ['pve-static-mask']);
256 // reload after 10 seconds automatically
257 Ext.defer(function() {
258 window.location.reload(true);
259 }, 10000);
260 },
261 failure: function(response, opt) {
262 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
263 }
264 });
265 }
266 },
267 '-',
268 {
269 xtype: 'proxmoxButton',
270 itemId: 'viewbtn',
271 disabled: true,
272 text: gettext('View Certificate'),
273 handler: function() {
274 var me = this.up('grid');
275 me.view_certificate();
276 }
277 }
278 ],
279
280 columns: [
281 {
282 header: gettext('File'),
283 width: 150,
284 dataIndex: 'filename'
285 },
286 {
287 header: gettext('Issuer'),
288 flex: 1,
289 dataIndex: 'issuer'
290 },
291 {
292 header: gettext('Subject'),
293 flex: 1,
294 dataIndex: 'subject'
295 },
296 {
297 header: gettext('Valid Since'),
298 width: 150,
299 dataIndex: 'notbefore',
300 renderer: Proxmox.Utils.render_timestamp
301 },
302 {
303 header: gettext('Expires'),
304 width: 150,
305 dataIndex: 'notafter',
306 renderer: Proxmox.Utils.render_timestamp
307 },
308 {
309 header: gettext('Subject Alternative Names'),
310 flex: 1,
311 dataIndex: 'san',
312 renderer: PVE.Utils.render_san
313 },
314 {
315 header: gettext('Fingerprint'),
316 dataIndex: 'fingerprint',
317 hidden: true
318 },
319 {
320 header: gettext('PEM'),
321 dataIndex: 'pem',
322 hidden: true
323 }
324 ],
325
326 reload: function() {
327 var me = this;
328 me.rstore.load();
329 },
330
331 set_button_status: function() {
332 var me = this;
333 var rec = me.rstore.getById('pveproxy-ssl.pem');
334
335 me.down('#deletebtn').setDisabled(!rec);
336 },
337
338 view_certificate: function() {
339 var me = this;
340 var selection = me.getSelection();
341 if (!selection || selection.length < 1) {
342 return;
343 }
344 var win = Ext.create('PVE.node.CertificateViewer', {
345 cert: selection[0].data.filename,
346 nodename : me.nodename
347 });
348 win.show();
349 },
350
351 listeners: {
352 itemdblclick: 'view_certificate'
353 },
354
355 initComponent: function() {
356 var me = this;
357
358 if (!me.nodename) {
359 throw "no nodename given";
360 }
361
362 me.rstore = Ext.create('Proxmox.data.UpdateStore', {
363 storeid: 'certs-' + me.nodename,
364 model: 'pve-certificate',
365 proxy: {
366 type: 'proxmox',
367 url: '/api2/json/nodes/' + me.nodename + '/certificates/info'
368 }
369 });
370
371 me.store = {
372 type: 'diff',
373 rstore: me.rstore
374 };
375
376 me.callParent();
377
378 me.mon(me.rstore, 'load', me.set_button_status, me);
379 me.rstore.startUpdate();
380 }
381});