From 67944aa4f57c44ea0997789f8da7b966c452fdc3 Mon Sep 17 00:00:00 2001
From: Oliver Hader <oliver@typo3.org>
Date: Wed, 13 May 2020 16:29:48 +0200
Subject: [PATCH] [BUGFIX] Check for existence of `t3js-login-url` id in Login
 dialog

HTML element with identifier `t3js-login-url` is used to check whether
referrer handling is activated and suported. In case the `Login.html`
template has been overridden, mentioned element might not be given at
all - which leads to a corresponding JavaScript error.

Resolves: #91385
Releases: master, 9.5
Change-Id: Ie986a94209809c32cdfb217aa00b42f4369c525a
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64484
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Susanne Moog <look@susi.dev>
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Susanne Moog <look@susi.dev>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
---
 .../TypeScript/backend/Resources/Public/TypeScript/Login.ts  | 5 ++++-
 typo3/sysext/backend/Resources/Public/JavaScript/Login.js    | 2 +-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/Login.ts b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/Login.ts
index bb8641c1e3b8..72e60ef4274d 100644
--- a/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/Login.ts
+++ b/Build/Sources/TypeScript/backend/Resources/Public/TypeScript/Login.ts
@@ -114,7 +114,10 @@ class BackendLogin {
     const referrerRefresh = '#referrer-refresh';
     const referrerRefreshed = document.location.hash === referrerRefresh;
     const loginUrlWrapper = document.getElementById(this.options.loginUrlWrapper) as HTMLAnchorElement;
-    if (typeof loginUrlWrapper.dataset.referrerCheckEnabled === 'undefined' || parseInt(loginUrlWrapper.dataset.referrerCheckEnabled, 10) !== 1) {
+    if (loginUrlWrapper === null
+      || typeof loginUrlWrapper.dataset.referrerCheckEnabled === 'undefined'
+      || loginUrlWrapper.dataset.referrerCheckEnabled !== '1'
+    ) {
       return;
     }
 
diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/Login.js b/typo3/sysext/backend/Resources/Public/JavaScript/Login.js
index 339a070a7ac2..3c48ea98521e 100644
--- a/typo3/sysext/backend/Resources/Public/JavaScript/Login.js
+++ b/typo3/sysext/backend/Resources/Public/JavaScript/Login.js
@@ -10,4 +10,4 @@
  *
  * The TYPO3 project - inspiring people to share!
  */
-define(["require","exports","jquery","bootstrap","TYPO3/CMS/Backend/Input/Clearable"],(function(e,o,t){"use strict";return new class{constructor(){this.ready=!0,this.options={error:".t3js-login-error",errorNoCookies:".t3js-login-error-nocookies",errorNoReferrer:".t3js-login-error-noreferrer",formFields:".t3js-login-formfields",interfaceField:".t3js-login-interface-field",loginForm:"#typo3-login-form",loginUrlWrapper:"t3js-login-url",submitButton:".t3js-login-submit",submitHandler:null,useridentField:".t3js-login-userident-field"},this.checkCookieSupport(),this.checkForInterfaceCookie(),this.checkDocumentReferrerSupport(),this.initializeEvents(),top.location.href!==location.href&&(this.ready=!1,top.location.href=location.href),this.ready&&document.body.setAttribute("data-typo3-login-ready","true")}showLoginProcess(){this.showLoadingIndicator(),t(this.options.error).addClass("hidden"),t(this.options.errorNoCookies).addClass("hidden")}showLoadingIndicator(){t(this.options.submitButton).button("loading")}handleSubmit(e){this.showLoginProcess(),"function"==typeof this.options.submitHandler&&this.options.submitHandler(e)}interfaceSelectorChanged(){const e=new Date,o=new Date(e.getTime()+31536e6);document.cookie="typo3-login-interface="+t(this.options.interfaceField).val()+"; expires="+o.toUTCString()+";"}checkForInterfaceCookie(){if(t(this.options.interfaceField).length){const e=document.cookie.indexOf("typo3-login-interface=");if(-1!==e){let o=document.cookie.substr(e+22);o=o.substr(0,o.indexOf(";")),t(this.options.interfaceField).val(o)}}}checkDocumentReferrerSupport(){const e="#referrer-refresh"===document.location.hash,o=document.getElementById(this.options.loginUrlWrapper);void 0!==o.dataset.referrerCheckEnabled&&1===parseInt(o.dataset.referrerCheckEnabled,10)&&("string"!=typeof document.referrer||""===document.referrer?e?document.querySelectorAll(this.options.errorNoReferrer).forEach(e=>e.classList.remove("hidden")):(this.ready=!1,o.href+="#referrer-refresh",o.click()):e&&(this.ready=!1,document.location.href=document.location.href.replace(/#[^#]*$/,"")))}showCookieWarning(){t(this.options.formFields).addClass("hidden"),t(this.options.errorNoCookies).removeClass("hidden")}hideCookieWarning(){t(this.options.formFields).removeClass("hidden"),t(this.options.errorNoCookies).addClass("hidden")}checkCookieSupport(){const e=navigator.cookieEnabled;!1===e?this.showCookieWarning():document.cookie||null!==e||(document.cookie="typo3-login-cookiecheck=1",document.cookie?document.cookie="typo3-login-cookiecheck=; expires="+new Date(0).toUTCString():this.showCookieWarning())}initializeEvents(){t(document).ajaxStart(this.showLoadingIndicator.bind(this)),t(this.options.loginForm).on("submit",this.handleSubmit.bind(this)),t(this.options.interfaceField).length>0&&t(document).on("change blur",this.options.interfaceField,this.interfaceSelectorChanged.bind(this)),document.querySelectorAll(".t3js-clearable").forEach(e=>e.clearable()),t(".t3js-login-news-carousel").on("slide.bs.carousel",e=>{const o=t(e.relatedTarget).height();t(e.target).find("div.active").parent().animate({height:o},500)})}}}));
\ No newline at end of file
+define(["require","exports","jquery","bootstrap","TYPO3/CMS/Backend/Input/Clearable"],(function(e,o,t){"use strict";return new class{constructor(){this.ready=!0,this.options={error:".t3js-login-error",errorNoCookies:".t3js-login-error-nocookies",errorNoReferrer:".t3js-login-error-noreferrer",formFields:".t3js-login-formfields",interfaceField:".t3js-login-interface-field",loginForm:"#typo3-login-form",loginUrlWrapper:"t3js-login-url",submitButton:".t3js-login-submit",submitHandler:null,useridentField:".t3js-login-userident-field"},this.checkCookieSupport(),this.checkForInterfaceCookie(),this.checkDocumentReferrerSupport(),this.initializeEvents(),top.location.href!==location.href&&(this.ready=!1,top.location.href=location.href),this.ready&&document.body.setAttribute("data-typo3-login-ready","true")}showLoginProcess(){this.showLoadingIndicator(),t(this.options.error).addClass("hidden"),t(this.options.errorNoCookies).addClass("hidden")}showLoadingIndicator(){t(this.options.submitButton).button("loading")}handleSubmit(e){this.showLoginProcess(),"function"==typeof this.options.submitHandler&&this.options.submitHandler(e)}interfaceSelectorChanged(){const e=new Date,o=new Date(e.getTime()+31536e6);document.cookie="typo3-login-interface="+t(this.options.interfaceField).val()+"; expires="+o.toUTCString()+";"}checkForInterfaceCookie(){if(t(this.options.interfaceField).length){const e=document.cookie.indexOf("typo3-login-interface=");if(-1!==e){let o=document.cookie.substr(e+22);o=o.substr(0,o.indexOf(";")),t(this.options.interfaceField).val(o)}}}checkDocumentReferrerSupport(){const e="#referrer-refresh"===document.location.hash,o=document.getElementById(this.options.loginUrlWrapper);null!==o&&void 0!==o.dataset.referrerCheckEnabled&&"1"===o.dataset.referrerCheckEnabled&&("string"!=typeof document.referrer||""===document.referrer?e?document.querySelectorAll(this.options.errorNoReferrer).forEach(e=>e.classList.remove("hidden")):(this.ready=!1,o.href+="#referrer-refresh",o.click()):e&&(this.ready=!1,document.location.href=document.location.href.replace(/#[^#]*$/,"")))}showCookieWarning(){t(this.options.formFields).addClass("hidden"),t(this.options.errorNoCookies).removeClass("hidden")}hideCookieWarning(){t(this.options.formFields).removeClass("hidden"),t(this.options.errorNoCookies).addClass("hidden")}checkCookieSupport(){const e=navigator.cookieEnabled;!1===e?this.showCookieWarning():document.cookie||null!==e||(document.cookie="typo3-login-cookiecheck=1",document.cookie?document.cookie="typo3-login-cookiecheck=; expires="+new Date(0).toUTCString():this.showCookieWarning())}initializeEvents(){t(document).ajaxStart(this.showLoadingIndicator.bind(this)),t(this.options.loginForm).on("submit",this.handleSubmit.bind(this)),t(this.options.interfaceField).length>0&&t(document).on("change blur",this.options.interfaceField,this.interfaceSelectorChanged.bind(this)),document.querySelectorAll(".t3js-clearable").forEach(e=>e.clearable()),t(".t3js-login-news-carousel").on("slide.bs.carousel",e=>{const o=t(e.relatedTarget).height();t(e.target).find("div.active").parent().animate({height:o},500)})}}}));
\ No newline at end of file
-- 
GitLab