]>
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 onGetValues: function(values
) {
181 fieldLabel
: gettext('Private Key (Optional)'),
183 emptyText
: gettext('No change'),
189 text
: gettext('From File'),
191 change: function(btn
, e
, value
) {
192 let form
= this.up('form');
193 for (const file
of e
.event
.target
.files
) {
194 PVE
.Utils
.loadFile(file
, res
=> form
.down('field[name=key]').setValue(res
));
201 fieldLabel
: gettext('Certificate Chain'),
204 name
: 'certificates',
209 text
: gettext('From File'),
211 change: function(btn
, e
, value
) {
212 let form
= this.up('form');
213 for (const file
of e
.event
.target
.files
) {
214 PVE
.Utils
.loadFile(file
, res
=> form
.down('field[name=certificates]').setValue(res
));
223 initComponent: function() {
226 throw "no nodename given";
228 me
.url
= `/nodes/${me.nodename}/certificates/custom`;
234 Ext
.define('pve-certificate', {
235 extend
: 'Ext.data.Model',
236 fields
: ['filename', 'fingerprint', 'issuer', 'notafter', 'notbefore', 'subject', 'san', 'public-key-bits', 'public-key-type'],
237 idProperty
: 'filename',
240 Ext
.define('PVE.node.Certificates', {
241 extend
: 'Ext.grid.Panel',
242 xtype
: 'pveCertView',
247 text
: gettext('Upload Custom Certificate'),
248 handler: function() {
249 let view
= this.up('grid');
250 Ext
.create('PVE.node.CertUpload', {
251 nodename
: view
.nodename
,
253 destroy
: () => view
.reload(),
260 xtype
: 'proxmoxStdRemoveButton',
262 text
: gettext('Delete Custom Certificate'),
265 getUrl: function(rec
) {
266 let view
= this.up('grid');
267 return `/nodes/${view.nodename}/certificates/custom?restart=1`;
269 confirmMsg
: gettext('Delete custom certificate and switch to generated one?'),
270 callback: function(options
, success
, response
) {
272 let txt
= gettext('API server will be restarted to use new certificates, please reload web-interface!');
273 Ext
.getBody().mask(txt
, ['pve-static-mask']);
274 // reload after 10 seconds automatically
275 Ext
.defer(() => window
.location
.reload(true), 10000);
281 xtype
: 'proxmoxButton',
284 text
: gettext('View Certificate'),
285 handler: function() {
286 this.up('grid').viewCertificate();
293 header
: gettext('File'),
295 dataIndex
: 'filename',
298 header
: gettext('Issuer'),
303 header
: gettext('Subject'),
305 dataIndex
: 'subject',
308 header
: gettext('Public Key Alogrithm'),
310 dataIndex
: 'public-key-type',
314 header
: gettext('Public Key Size'),
316 dataIndex
: 'public-key-bits',
320 header
: gettext('Valid Since'),
322 dataIndex
: 'notbefore',
323 renderer
: Proxmox
.Utils
.render_timestamp
,
326 header
: gettext('Expires'),
328 dataIndex
: 'notafter',
329 renderer
: Proxmox
.Utils
.render_timestamp
,
332 header
: gettext('Subject Alternative Names'),
335 renderer
: PVE
.Utils
.render_san
,
338 header
: gettext('Fingerprint'),
339 dataIndex
: 'fingerprint',
343 header
: gettext('PEM'),
353 viewCertificate: function() {
355 let selection
= me
.getSelection();
356 if (!selection
|| selection
.length
< 1) {
359 var win
= Ext
.create('PVE.node.CertificateViewer', {
360 cert
: selection
[0].data
.filename
,
361 nodename
: me
.nodename
,
367 itemdblclick
: 'viewCertificate',
370 initComponent: function() {
374 throw "no nodename given";
377 me
.rstore
= Ext
.create('Proxmox.data.UpdateStore', {
378 storeid
: 'certs-' + me
.nodename
,
379 model
: 'pve-certificate',
382 url
: '/api2/json/nodes/' + me
.nodename
+ '/certificates/info',
393 me
.mon(me
.rstore
, 'load', store
=> me
.down('#deletebtn').setDisabled(!store
.getById('pveproxy-ssl.pem')));
394 me
.rstore
.startUpdate();
395 me
.on('destroy', me
.rstore
.stopUpdate
, me
.rstore
);