NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Deutsche Bank Auto-Login // @name:de Deutsche Bank Auto-Login // @namespace https://windowsfreak.de // @version 2.5 // @description Help Google Chrome and Mozilla Firefox auto-save account information. Supports multiple credentials. // @description:de Google Chrome und Mozilla Firefox helfen, das Benutzerkonto zu speichern. Unterstützt mehrere Konten. // @author Björn Eberhardt // @license MIT; https://opensource.org/licenses/MIT // @icon https://www.deutsche-bank.de/dam/deutschebank/de/shared/logo/deutsche_bank_logo_retina.gif // @include https://meine.deutsche-bank.de/trxm/db/ // @include https://meine.deutsche-bank.de/trxm/db/init.do // @grant none // ==/UserScript== // MIT license used to import to OpenUserJS // Help Google Chrome and Mozilla Firefox auto-save account information (function () { 'use strict'; if (window.location.href.indexOf('https://meine.deutsche-bank.de/trxm/db/') > -1) { const hasPasswordStore = typeof PasswordCredential === "function" const $ = name => document.getElementsByName(name)[0] const $c = (name, pos = 0) => document.getElementsByClassName(name)[pos] const submit = () => // Caps-Lock is a hidden error message (document.getElementsByClassName('errorMsg').length < 2) ? $c('nextStep').click() : $c('nextStep').focus() const regex = /^(\d+)\/(\d+) (\d+)$/ const toUser = d => `${d[0]}/${d[1]} ${d[2]}` const fromUser = d => regex.exec(d).slice(1) const fillForm = d => ['branch', 'account', 'subaccount', 'pin'].forEach((name, index) => $(name).value = d[index]) || true const promptUser = (d, field) => { d[field] = '<EINGABE>' d[field] = prompt(`Bitte das mit Eingabe markierte Feld ausfüllen:\n\nFiliale: ${d[0]}\nKonto: ${d[1]}\nUnterkonto: ${d[2]}\nPIN: ${d[3]}`) return d[field] !== null } const createUser = () => { let d = ['', '', '', ''], field = 0 while (field < 4 && promptUser(d, field++)) ; const user = toUser(d) if (!regex.test(user)) { return alert('Fehler: Die eingegebenen Felder dürfen nur aus Ziffern bestehen.'); } fillForm(d) if (hasPasswordStore) { return navigator.credentials.create({ password: { id: user, password: d[3], iconURL: new URL('https://www.deutsche-bank.de/dam/deutschebank/de/shared/logo/deutsche_bank_logo_retina.gif', document.baseURI).href } }) .then(p => navigator.credentials.store(p)) .then(submit) } else { localStorage.setItem(`wf_user_${user}`, d[3]) submit() } } const login = async () => { if (hasPasswordStore) { let p = await navigator.credentials.get({password: true}) return await p && fillForm([...fromUser(p.id), p.password]) && submit() } else { if ($c('acct-choice')) { alert('Bitte das gewünschte Konto oben auswählen.') return } const accts = []; for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i) let match if (!!(match = key.match(/wf_user_(.*)/))) { if (regex.test(match[1])) { accts.push(match[1]) } } } const t = $c('roll layout'); if (accts.length > 0) { const getAcctData = value => [...fromUser(value), localStorage.getItem(`wf_user_${value}`)] const x = document.createElement('div') x.innerHTML = `Gewünschtes Konto: <select id="acct" class="acct-choice"> ${accts.map(k => `<option value="${k}">${k}</option>`)} </select>` t.parentNode.insertBefore(x, t) x.style.cssText = 'font-weight: bold; font-size: 1.4em' const a = $c('acct-choice') a.onchange = () => { fillForm(getAcctData(a.value)) && submit() } fillForm(getAcctData(a.value)) } const y = document.createElement('div') y.innerHTML = `Hinweis: Ihr Browser unterstützt die Credentials API nicht, diese würde die Sicherheit des Auto-Logins erhöhen.` t.parentNode.insertBefore(y, t) y.style.cssText = 'color: salmon' } } const load = () => { $c('nextStep').parentNode.innerHTML += '<input type="button" value="Konto auswählen" class="button nextStep">' + '<input type="button" value="Konto hinzufügen" class="button nextStep">' $c('nextStep', 1).onclick = login $c('nextStep', 2).onclick = createUser login() } window.setTimeout(load, 0) } })()