]>
Commit | Line | Data |
---|---|---|
cd6bb503 DC |
1 | Ext.define('PMG.LoginView', { |
2 | extend: 'Ext.container.Container', | |
3 | xtype: 'loginview', | |
4 | ||
5 | controller: { | |
6 | xclass: 'Ext.app.ViewController', | |
4bc1cbd8 DM |
7 | |
8 | init: function(view) { | |
28eb60c0 | 9 | let me = this; |
c1e4fa2a | 10 | |
28eb60c0 | 11 | let realmfield = me.lookup('realmfield'); |
c1e4fa2a | 12 | |
83c036b4 DC |
13 | me.lookup('quarantineButton').setVisible(!!Proxmox.QuarantineLink); |
14 | ||
c17f9fe4 DC |
15 | if (view.targetview !== 'quarantineview') { |
16 | return; | |
17 | } | |
c1e4fa2a | 18 | |
31f5e458 DC |
19 | // hide save username field for quarantine view |
20 | me.lookup('saveunField').setVisible(false); | |
21 | ||
ab01cd95 | 22 | realmfield.setValue('quarantine'); |
4bc1cbd8 DM |
23 | |
24 | // try autologin with quarantine ticket from URL | |
25 | ||
28eb60c0 TL |
26 | let qs = Ext.Object.fromQueryString(location.search); |
27 | if (qs.ticket === undefined) { | |
28 | return; | |
29 | } | |
30 | let ticket = decodeURIComponent(qs.ticket); | |
31 | let match = ticket.match(/^PMGQUAR:([^\s:]+):/); | |
32 | if (!match) { | |
33 | return; | |
34 | } | |
35 | let username = match[1]; | |
36 | let loginwin = me.lookup('loginwindow'); | |
216bbcd5 DC |
37 | loginwin.autoShow = false; |
38 | loginwin.setVisible(false); | |
c1e4fa2a | 39 | realmfield.setDisabled(true); |
4bc1cbd8 | 40 | |
99bba12c DC |
41 | me.lookup('usernameField').setValue(username); |
42 | me.lookup('passwordField').setValue(ticket); | |
43 | ||
44 | me.submitForm(); | |
4bc1cbd8 DM |
45 | }, |
46 | ||
77854c16 | 47 | submitForm: async function() { |
28eb60c0 TL |
48 | let me = this; |
49 | let view = me.getView(); | |
50 | let loginForm = me.lookupReference('loginForm'); | |
31f5e458 DC |
51 | var unField = me.lookupReference('usernameField'); |
52 | var saveunField = me.lookupReference('saveunField'); | |
cd6bb503 DC |
53 | |
54 | if (loginForm.isValid()) { | |
99bba12c DC |
55 | if (loginForm.isVisible()) { |
56 | loginForm.mask(gettext('Please wait...'), 'x-mask-loading'); | |
57 | } | |
31f5e458 DC |
58 | |
59 | // set or clear username for admin view | |
60 | if (view.targetview !== 'quarantineview') { | |
61 | var sp = Ext.state.Manager.getProvider(); | |
62 | if (saveunField.getValue() === true) { | |
63 | sp.set(unField.getStateId(), unField.getValue()); | |
64 | } else { | |
65 | sp.clear(unField.getStateId()); | |
66 | } | |
67 | sp.set(saveunField.getStateId(), saveunField.getValue()); | |
68 | } | |
69 | ||
77854c16 WB |
70 | let creds = loginForm.getValues(); |
71 | ||
72 | try { | |
73 | let resp = await Proxmox.Async.api2({ | |
74 | url: '/api2/extjs/access/ticket', | |
75 | params: creds, | |
76 | method: 'POST', | |
77 | }); | |
78 | ||
79 | let data = resp.result.data; | |
80 | if (data.ticket.startsWith('PMG:!tfa!')) { | |
81 | data = await me.performTFAChallenge(data); | |
82 | } | |
83 | PMG.Utils.updateLoginData(data); | |
84 | PMG.app.changeView(view.targetview); | |
85 | } catch (error) { | |
86 | Proxmox.Utils.authClear(); | |
87 | loginForm.unmask(); | |
88 | Ext.MessageBox.alert( | |
89 | gettext('Error'), | |
90 | gettext('Login failed. Please try again'), | |
91 | ); | |
92 | } | |
cd6bb503 DC |
93 | } |
94 | }, | |
95 | ||
77854c16 WB |
96 | performTFAChallenge: async function(data) { |
97 | let me = this; | |
98 | ||
99 | let userid = data.username; | |
100 | let ticket = data.ticket; | |
101 | let challenge = JSON.parse(decodeURIComponent( | |
102 | ticket.split(':')[1].slice("!tfa!".length), | |
103 | )); | |
104 | ||
105 | let resp = await new Promise((resolve, reject) => { | |
106 | Ext.create('Proxmox.window.TfaLoginWindow', { | |
107 | userid, | |
108 | ticket, | |
109 | challenge, | |
110 | onResolve: value => resolve(value), | |
111 | onReject: reject, | |
112 | }).show(); | |
113 | }); | |
114 | ||
115 | return resp.result.data; | |
116 | }, | |
117 | ||
83c036b4 DC |
118 | openQuarantineLinkWindow: function() { |
119 | let me = this; | |
120 | me.lookup('loginwindow').setVisible(false); | |
121 | Ext.create('Proxmox.window.Edit', { | |
122 | title: gettext('Request Quarantine Link'), | |
123 | url: '/quarantine/sendlink', | |
124 | isCreate: true, | |
125 | submitText: gettext('OK'), | |
126 | method: 'POST', | |
127 | items: [ | |
128 | { | |
129 | xtype: 'proxmoxtextfield', | |
130 | name: 'mail', | |
131 | fieldLabel: gettext('Your E-Mail'), | |
132 | }, | |
133 | ], | |
134 | listeners: { | |
135 | destroy: function() { | |
136 | me.lookup('loginwindow').show(true); | |
137 | }, | |
138 | }, | |
139 | }).show(); | |
140 | }, | |
141 | ||
cd6bb503 | 142 | control: { |
775b9a7d DM |
143 | 'field[name=lang]': { |
144 | change: function(f, value) { | |
28eb60c0 | 145 | let dt = Ext.Date.add(new Date(), Ext.Date.YEAR, 10); |
282d45fb | 146 | Ext.util.Cookies.set('PMGLangCookie', value, dt); |
65921b40 | 147 | |
28eb60c0 | 148 | let loginwin = this.lookupReference('loginwindow'); |
65921b40 | 149 | loginwin.mask(gettext('Please wait...'), 'x-mask-loading'); |
775b9a7d | 150 | window.location.reload(); |
c87d46fb | 151 | }, |
775b9a7d | 152 | }, |
83c036b4 DC |
153 | 'button[reference=quarantineButton]': { |
154 | click: 'openQuarantineLinkWindow', | |
155 | }, | |
cd6bb503 | 156 | 'button[reference=loginButton]': { |
c87d46fb TL |
157 | click: 'submitForm', |
158 | }, | |
31f5e458 DC |
159 | 'window[reference=loginwindow]': { |
160 | show: function() { | |
161 | let me = this; | |
162 | let view = me.getView(); | |
163 | if (view.targetview !== 'quarantineview') { | |
164 | var sp = Ext.state.Manager.getProvider(); | |
165 | var checkboxField = this.lookupReference('saveunField'); | |
166 | var unField = this.lookupReference('usernameField'); | |
167 | ||
168 | var checked = sp.get(checkboxField.getStateId()); | |
169 | checkboxField.setValue(checked); | |
170 | ||
171 | if (checked === true) { | |
172 | var username = sp.get(unField.getStateId()); | |
173 | unField.setValue(username); | |
174 | var pwField = this.lookupReference('passwordField'); | |
175 | pwField.focus(); | |
176 | } | |
177 | } | |
178 | }, | |
179 | }, | |
c87d46fb | 180 | }, |
cd6bb503 DC |
181 | }, |
182 | ||
183 | plugins: 'viewport', | |
184 | ||
ea07c9aa | 185 | layout: { |
c87d46fb | 186 | type: 'border', |
ea07c9aa | 187 | }, |
cd6bb503 DC |
188 | |
189 | items: [ | |
190 | { | |
191 | region: 'north', | |
192 | xtype: 'container', | |
193 | layout: { | |
194 | type: 'hbox', | |
c87d46fb | 195 | align: 'middle', |
cd6bb503 | 196 | }, |
c45e23e4 DC |
197 | margin: '2 5 2 5', |
198 | height: 38, | |
cd6bb503 DC |
199 | items: [ |
200 | { | |
c87d46fb | 201 | xtype: 'proxmoxlogo', |
cd6bb503 DC |
202 | }, |
203 | { | |
204 | xtype: 'versioninfo', | |
c87d46fb TL |
205 | makeApiCall: false, |
206 | }, | |
207 | ], | |
cd6bb503 DC |
208 | }, |
209 | { | |
c87d46fb | 210 | region: 'center', |
cd6bb503 DC |
211 | }, |
212 | { | |
213 | xtype: 'window', | |
214 | closable: false, | |
215 | resizable: false, | |
216bbcd5 | 216 | reference: 'loginwindow', |
cd6bb503 DC |
217 | autoShow: true, |
218 | modal: true, | |
31f5e458 | 219 | width: 450, |
cd6bb503 | 220 | |
7d48b138 DC |
221 | defaultFocus: 'usernameField', |
222 | ||
ea07c9aa | 223 | layout: { |
c87d46fb | 224 | type: 'auto', |
ea07c9aa | 225 | }, |
cd6bb503 DC |
226 | |
227 | title: gettext('Proxmox Mail Gateway Login'), | |
228 | ||
229 | items: [ | |
230 | { | |
231 | xtype: 'form', | |
ea07c9aa | 232 | layout: { |
c87d46fb | 233 | type: 'form', |
ea07c9aa | 234 | }, |
cd6bb503 DC |
235 | defaultButton: 'loginButton', |
236 | url: '/api2/extjs/access/ticket', | |
237 | reference: 'loginForm', | |
238 | ||
239 | fieldDefaults: { | |
240 | labelAlign: 'right', | |
c87d46fb | 241 | allowBlank: false, |
cd6bb503 DC |
242 | }, |
243 | ||
244 | items: [ | |
245 | { | |
246 | xtype: 'textfield', | |
247 | fieldLabel: gettext('User name'), | |
248 | name: 'username', | |
249 | itemId: 'usernameField', | |
c87d46fb | 250 | reference: 'usernameField', |
31f5e458 | 251 | stateId: 'login-username', |
cd6bb503 DC |
252 | }, |
253 | { | |
254 | xtype: 'textfield', | |
255 | inputType: 'password', | |
256 | fieldLabel: gettext('Password'), | |
257 | name: 'password', | |
c87d46fb | 258 | reference: 'passwordField', |
cd6bb503 | 259 | }, |
775b9a7d DM |
260 | { |
261 | xtype: 'proxmoxLanguageSelector', | |
262 | fieldLabel: gettext('Language'), | |
282d45fb | 263 | value: Ext.util.Cookies.get('PMGLangCookie') || 'en', |
775b9a7d | 264 | name: 'lang', |
c87d46fb | 265 | submitValue: false, |
ab01cd95 DM |
266 | }, |
267 | { | |
268 | xtype: 'hiddenfield', | |
269 | reference: 'realmfield', | |
270 | name: 'realm', | |
c87d46fb TL |
271 | value: 'pmg', |
272 | }, | |
cd6bb503 DC |
273 | ], |
274 | buttons: [ | |
31f5e458 DC |
275 | { |
276 | xtype: 'checkbox', | |
277 | fieldLabel: gettext('Save User name'), | |
278 | name: 'saveusername', | |
279 | reference: 'saveunField', | |
280 | stateId: 'login-saveusername', | |
281 | labelAlign: 'right', | |
282 | labelWidth: 150, | |
283 | submitValue: false, | |
284 | }, | |
83c036b4 DC |
285 | { |
286 | text: gettext('Request Quarantine Link'), | |
287 | reference: 'quarantineButton', | |
288 | }, | |
cd6bb503 DC |
289 | { |
290 | text: gettext('Login'), | |
291 | reference: 'loginButton', | |
c87d46fb TL |
292 | formBind: true, |
293 | }, | |
294 | ], | |
295 | }, | |
296 | ], | |
297 | }, | |
298 | ], | |
cd6bb503 | 299 | }); |