]>
Commit | Line | Data |
---|---|---|
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 | Ext.getBody().mask( | |
126 | gettext('API server will be restarted to use new certificates, please reload web-interface!'), | |
127 | ['pve-static-mask'], | |
128 | ); | |
129 | // try to reload after 10 seconds automatically | |
130 | Ext.defer(() => window.location.reload(true), 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 | }); |