]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/node/Certificates.js
1 Ext
.define('PVE.node.CertificateView', {
2 extend
: 'Ext.container.Container',
3 xtype
: 'pveCertificatesView',
5 onlineHelp
: 'sysadmin_certificate_management',
7 mixins
: ['Proxmox.Mixin.CBind'],
15 nodename
: '{nodename}',
22 nodename
: '{nodename}',
29 Ext
.define('PVE.node.CertificateViewer', {
30 extend
: 'Proxmox.window.Edit',
32 title
: gettext('Certificate'),
45 xtype
: 'displayfield',
46 fieldLabel
: gettext('Name'),
50 xtype
: 'displayfield',
51 fieldLabel
: gettext('Fingerprint'),
55 xtype
: 'displayfield',
56 fieldLabel
: gettext('Issuer'),
60 xtype
: 'displayfield',
61 fieldLabel
: gettext('Subject'),
67 xtype
: 'displayfield',
68 fieldLabel
: gettext('Public Key Type'),
69 name
: 'public-key-type',
72 xtype
: 'displayfield',
73 fieldLabel
: gettext('Public Key Size'),
74 name
: 'public-key-bits',
79 xtype
: 'displayfield',
80 fieldLabel
: gettext('Valid Since'),
81 renderer
: Proxmox
.Utils
.render_timestamp
,
85 xtype
: 'displayfield',
86 fieldLabel
: gettext('Expires'),
87 renderer
: Proxmox
.Utils
.render_timestamp
,
93 xtype
: 'displayfield',
94 fieldLabel
: gettext('Subject Alternative Names'),
96 renderer
: PVE
.Utils
.render_san
,
100 title
: gettext('Raw Certificate'),
110 'white-space': 'pre-wrap',
111 'font-family': 'monospace',
118 initComponent: function() {
122 throw "no cert given";
125 throw "no nodename given";
128 me
.url
= `/nodes/${me.nodename}/certificates/info`;
131 // hide OK/Reset button, because we just want to show data
132 me
.down('toolbar[dock=bottom]').setVisible(false);
135 success: function(response
) {
136 if (Ext
.isArray(response
.result
.data
)) {
137 for (const item
of response
.result
.data
) {
138 if (item
.filename
=== me
.cert
) {
149 Ext
.define('PVE.node.CertUpload', {
150 extend
: 'Proxmox.window.Edit',
151 xtype
: 'pveCertUpload',
153 title
: gettext('Upload Custom Certificate'),
156 submitText
: gettext('Upload'),
160 apiCallDone: function(success
, response
, options
) {
164 let txt
= gettext('API server will be restarted to use new certificates, please reload web-interface!');
165 Ext
.getBody().mask(txt
, ['pve-static-mask']);
166 Ext
.defer(() => window
.location
.reload(true), 10000); // reload after 10 seconds automatically
171 fieldLabel
: gettext('Private Key (Optional)'),
173 emptyText
: gettext('No change'),
179 text
: gettext('From File'),
181 change: function(btn
, e
, value
) {
182 let form
= this.up('form');
183 for (const file
of e
.event
.target
.files
) {
184 PVE
.Utils
.loadFile(file
, res
=> form
.down('field[name=key]').setValue(res
));
195 fieldLabel
: gettext('Certificate Chain'),
198 name
: 'certificates',
203 text
: gettext('From File'),
205 change: function(btn
, e
, value
) {
206 let form
= this.up('form');
207 for (const file
of e
.event
.target
.files
) {
208 PVE
.Utils
.loadFile(file
, res
=> form
.down('field[name=certificates]').setValue(res
));
226 initComponent: function() {
229 throw "no nodename given";
231 me
.url
= `/nodes/${me.nodename}/certificates/custom`;
237 Ext
.define('pve-certificate', {
238 extend
: 'Ext.data.Model',
239 fields
: ['filename', 'fingerprint', 'issuer', 'notafter', 'notbefore', 'subject', 'san', 'public-key-bits', 'public-key-type'],
240 idProperty
: 'filename',
243 Ext
.define('PVE.node.Certificates', {
244 extend
: 'Ext.grid.Panel',
245 xtype
: 'pveCertView',
250 text
: gettext('Upload Custom Certificate'),
251 handler: function() {
252 let view
= this.up('grid');
253 Ext
.create('PVE.node.CertUpload', {
254 nodename
: view
.nodename
,
256 destroy
: () => view
.reload(),
263 xtype
: 'proxmoxStdRemoveButton',
265 text
: gettext('Delete Custom Certificate'),
268 getUrl: function(rec
) {
269 let view
= this.up('grid');
270 return `/nodes/${view.nodename}/certificates/custom?restart=1`;
272 confirmMsg
: gettext('Delete custom certificate and switch to generated one?'),
273 callback: function(options
, success
, response
) {
275 let txt
= gettext('API server will be restarted to use new certificates, please reload web-interface!');
276 Ext
.getBody().mask(txt
, ['pve-static-mask']);
277 // reload after 10 seconds automatically
278 Ext
.defer(() => window
.location
.reload(true), 10000);
284 xtype
: 'proxmoxButton',
287 text
: gettext('View Certificate'),
288 handler: function() {
289 this.up('grid').viewCertificate();
296 header
: gettext('File'),
298 dataIndex
: 'filename',
301 header
: gettext('Issuer'),
306 header
: gettext('Subject'),
308 dataIndex
: 'subject',
311 header
: gettext('Public Key Alogrithm'),
313 dataIndex
: 'public-key-type',
317 header
: gettext('Public Key Size'),
319 dataIndex
: 'public-key-bits',
323 header
: gettext('Valid Since'),
325 dataIndex
: 'notbefore',
326 renderer
: Proxmox
.Utils
.render_timestamp
,
329 header
: gettext('Expires'),
331 dataIndex
: 'notafter',
332 renderer
: Proxmox
.Utils
.render_timestamp
,
335 header
: gettext('Subject Alternative Names'),
338 renderer
: PVE
.Utils
.render_san
,
341 header
: gettext('Fingerprint'),
342 dataIndex
: 'fingerprint',
346 header
: gettext('PEM'),
356 viewCertificate: function() {
358 let selection
= me
.getSelection();
359 if (!selection
|| selection
.length
< 1) {
362 var win
= Ext
.create('PVE.node.CertificateViewer', {
363 cert
: selection
[0].data
.filename
,
364 nodename
: me
.nodename
,
370 itemdblclick
: 'viewCertificate',
373 initComponent: function() {
377 throw "no nodename given";
380 me
.rstore
= Ext
.create('Proxmox.data.UpdateStore', {
381 storeid
: 'certs-' + me
.nodename
,
382 model
: 'pve-certificate',
385 url
: '/api2/json/nodes/' + me
.nodename
+ '/certificates/info',
396 me
.mon(me
.rstore
, 'load', store
=> me
.down('#deletebtn').setDisabled(!store
.getById('pveproxy-ssl.pem')));
397 me
.rstore
.startUpdate();
398 me
.on('destroy', me
.rstore
.stopUpdate
, me
.rstore
);