]> git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/window/Certificates.js
add certificate panel
[proxmox-widget-toolkit.git] / src / window / Certificates.js
1 Ext.define('Proxmox.window.CertificateViewer', {
2 extend: 'Proxmox.window.Edit',
3 xtype: 'pmxCertViewer',
4
5 title: gettext('Certificate'),
6
7 fieldDefaults: {
8 labelWidth: 120,
9 },
10 width: 800,
11 resizable: true,
12
13 items: [
14 {
15 xtype: 'displayfield',
16 fieldLabel: gettext('Name'),
17 name: 'filename',
18 },
19 {
20 xtype: 'displayfield',
21 fieldLabel: gettext('Fingerprint'),
22 name: 'fingerprint',
23 },
24 {
25 xtype: 'displayfield',
26 fieldLabel: gettext('Issuer'),
27 name: 'issuer',
28 },
29 {
30 xtype: 'displayfield',
31 fieldLabel: gettext('Subject'),
32 name: 'subject',
33 },
34 {
35 xtype: 'displayfield',
36 fieldLabel: gettext('Public Key Type'),
37 name: 'public-key-type',
38 },
39 {
40 xtype: 'displayfield',
41 fieldLabel: gettext('Public Key Size'),
42 name: 'public-key-bits',
43 },
44 {
45 xtype: 'displayfield',
46 fieldLabel: gettext('Valid Since'),
47 renderer: Proxmox.Utils.render_timestamp,
48 name: 'notbefore',
49 },
50 {
51 xtype: 'displayfield',
52 fieldLabel: gettext('Expires'),
53 renderer: Proxmox.Utils.render_timestamp,
54 name: 'notafter',
55 },
56 {
57 xtype: 'displayfield',
58 fieldLabel: gettext('Subject Alternative Names'),
59 name: 'san',
60 renderer: Proxmox.Utils.render_san,
61 },
62 {
63 xtype: 'textarea',
64 editable: false,
65 grow: true,
66 growMax: 200,
67 fieldLabel: gettext('Certificate'),
68 name: 'pem',
69 },
70 ],
71
72 initComponent: function() {
73 var me = this;
74
75 if (!me.cert) {
76 throw "no cert given";
77 }
78
79 if (!me.url) {
80 throw "no url given";
81 }
82
83 me.callParent();
84
85 // hide OK/Reset button, because we just want to show data
86 me.down('toolbar[dock=bottom]').setVisible(false);
87
88 me.load({
89 success: function(response) {
90 if (Ext.isArray(response.result.data)) {
91 Ext.Array.each(response.result.data, function(item) {
92 if (item.filename === me.cert) {
93 me.setValues(item);
94 return false;
95 }
96 return true;
97 });
98 }
99 },
100 });
101 },
102 });
103
104 Ext.define('Proxmox.window.CertificateUpload', {
105 extend: 'Proxmox.window.Edit',
106 xtype: 'pmxCertUpload',
107
108 title: gettext('Upload Custom Certificate'),
109 resizable: false,
110 isCreate: true,
111 submitText: gettext('Upload'),
112 method: 'POST',
113 width: 600,
114
115 // whether the UI needs a reload after this
116 reloadUi: undefined,
117
118 apiCallDone: function(success, response, options) {
119 let me = this;
120
121 if (!success || !me.reloadUi) {
122 return;
123 }
124
125 var txt = gettext('GUI server will be restarted with new certificates, please reload!');
126 Ext.getBody().mask(txt, ['pve-static-mask']);
127 // reload after 10 seconds automatically
128 Ext.defer(function() {
129 window.location.reload(true);
130 }, 10000);
131 },
132
133 items: [
134 {
135 fieldLabel: gettext('Private Key (Optional)'),
136 labelAlign: 'top',
137 emptyText: gettext('No change'),
138 name: 'key',
139 xtype: 'textarea',
140 },
141 {
142 xtype: 'filebutton',
143 text: gettext('From File'),
144 listeners: {
145 change: function(btn, e, value) {
146 let form = this.up('form');
147 e = e.event;
148 Ext.Array.each(e.target.files, function(file) {
149 Proxmox.Utils.loadTextFromFile(
150 file,
151 function(res) {
152 form.down('field[name=key]').setValue(res);
153 },
154 16384,
155 );
156 });
157 btn.reset();
158 },
159 },
160 },
161 {
162 xtype: 'box',
163 autoEl: 'hr',
164 },
165 {
166 fieldLabel: gettext('Certificate Chain'),
167 labelAlign: 'top',
168 allowBlank: false,
169 name: 'certificates',
170 xtype: 'textarea',
171 },
172 {
173 xtype: 'filebutton',
174 text: gettext('From File'),
175 listeners: {
176 change: function(btn, e, value) {
177 let form = this.up('form');
178 e = e.event;
179 Ext.Array.each(e.target.files, function(file) {
180 Proxmox.Utils.loadTextFromFile(
181 file,
182 function(res) {
183 form.down('field[name=certificates]').setValue(res);
184 },
185 16384,
186 );
187 });
188 btn.reset();
189 },
190 },
191 },
192 {
193 xtype: 'hidden',
194 name: 'restart',
195 value: '1',
196 },
197 {
198 xtype: 'hidden',
199 name: 'force',
200 value: '1',
201 },
202 ],
203
204 initComponent: function() {
205 var me = this;
206
207 if (!me.url) {
208 throw "neither url given";
209 }
210
211 me.callParent();
212 },
213 });