[BUGFIX] Prevent loading jsfunc.inline.js twice
[Packages/TYPO3.CMS.git] / typo3 / sysext / backend / Resources / Private / TypeScript / UserPassLogin.ts
1 /*
2  * This file is part of the TYPO3 CMS project.
3  *
4  * It is free software; you can redistribute it and/or modify it under
5  * the terms of the GNU General Public License, either version 2
6  * of the License, or any later version.
7  *
8  * For the full copyright and license information, please read the
9  * LICENSE.txt file that was distributed with this source code.
10  *
11  * The TYPO3 project - inspiring people to share!
12  */
13
14 import * as $ from 'jquery';
15 import Login = require('./Login');
16
17 /**
18  * Module: TYPO3/CMS/Backend/UserPassLogin
19  * JavaScript module for the UsernamePasswordLoginProvider
20  * @exports TYPO3/CMS/Backend/UserPassLogin
21  */
22 class UserPassLogin {
23
24   protected options: any;
25
26   /**
27    * Checks whether capslock is enabled (returns TRUE if enabled, false otherwise)
28    * thanks to http://24ways.org/2007/capturing-caps-lock
29    *
30    * @param {Event} e
31    * @returns {boolean}
32    */
33   public static isCapslockEnabled(e: any): boolean {
34     const ev = e ? e : window.event;
35     if (!ev) {
36       return false;
37     }
38     // get key pressed
39     let pressedKeyAsciiCode = -1;
40     if (ev.which) {
41       pressedKeyAsciiCode = ev.which;
42     } else if (ev.keyCode) {
43       pressedKeyAsciiCode = ev.keyCode;
44     }
45     // get shift status
46     let shiftPressed = false;
47     if (ev.shiftKey) {
48       shiftPressed = ev.shiftKey;
49     } else if (ev.modifiers) {
50       /* tslint:disable:no-bitwise */
51       shiftPressed = !!(ev.modifiers & 4);
52     }
53     return (pressedKeyAsciiCode >= 65 && pressedKeyAsciiCode <= 90 && !shiftPressed)
54       || (pressedKeyAsciiCode >= 97 && pressedKeyAsciiCode <= 122 && shiftPressed);
55   }
56
57   constructor() {
58     this.options = {
59       passwordField: '.t3js-login-password-field',
60       usernameField: '.t3js-login-username-field',
61     };
62
63     // register submit handler
64     Login.options.submitHandler = this.resetPassword;
65
66     const $usernameField = $(this.options.usernameField);
67     const $passwordField = $(this.options.passwordField);
68
69     $usernameField.on('keypress', this.showCapsLockWarning);
70     $passwordField.on('keypress', this.showCapsLockWarning);
71
72     // if the login screen is shown in the login_frameset window for re-login,
73     // then try to get the username of the current/former login from opening windows main frame:
74     try {
75       if (parent.opener
76         && parent.opener.TYPO3
77         && parent.opener.TYPO3.configuration
78         && parent.opener.TYPO3.configuration.username
79       ) {
80         $usernameField.val(parent.opener.TYPO3.configuration.username);
81       }
82     } catch (error) {
83       // continue
84     }
85
86     if ($usernameField.val() === '') {
87       $usernameField.focus();
88     } else {
89       $passwordField.focus();
90     }
91   }
92
93   /**
94    * Reset user password field to prevent it from being submitted
95    */
96   public resetPassword = (): void => {
97     const $passwordField = $(this.options.passwordField);
98     if ($passwordField.val()) {
99       $(Login.options.useridentField).val($passwordField.val());
100       $passwordField.val('');
101     }
102   }
103
104   public showCapsLockWarning = (event: Event): void => {
105     $(event.target)
106       .parent()
107       .parent()
108       .find('.t3js-login-alert-capslock')
109       .toggleClass('hidden', !UserPassLogin.isCapslockEnabled(event));
110   }
111 }
112
113 export = new UserPassLogin();