1 line
53 KiB
Plaintext
1 line
53 KiB
Plaintext
{"version":3,"sources":["webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/components/monkeys/password.ts"],"names":["passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","append","element","passwordInputField","label","name","getStateInterval","input","inputWrapper","container","state","getState","window","setInterval","then","_state","hint","wrapEmojiText","setLabel","onSubmit","e","value","length","classList","add","toggle","update","preloader","check","response","_","clearInterval","m","default","mount","monkey","remove","removeAttribute","catch","err","type","select","addEventListener","this","size","isMobile","imageDiv","Promise","all","load","focus","pushToState","replaceContent","elem","node","innerHTML","firstChild","lastChild","replaceWith","textContent","init","document","target","preventDefault","text","originalEvent","clipboardData","getData","entities","parseEntities","filter","wrapRichText","noLinks","wrappingDraft","execCommand","InputState","options","createElement","required","validate","maxLength","showLengthOn","Math","min","round","placeholder","plainText","processInput","labelText","firstElementChild","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","wasInputFakeClientHeight","setAttribute","undefined","border","labelEl","lastElementChild","showingLength","wasError","contains","inputLength","diff","isError","labelOptions","scrollHeight","clientHeight","style","height","setValueSilently","fireFakeInput","originalValue","isChanged","silent","wrapDraftText","Error","Valid","setState","toggleDisability","elements","disable","forEach","el","getRichValue","field","withEntities","lines","line","push","join","replace","combineSameEntities","passwordManager","invokeApi","result","settings","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","resolve","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","saveApiUser","user","setUserAuth","id","code","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","getRichElementValue","selNode","selOffset","offset","nodeType","nodeValue","substr","trim","parentNode","parentElement","tag","closest","getAttribute","url","href","user_id","dataset","follow","isSelected","isBlock","tagName","splice","alt","curChild","nextSibling","findUpAttribute","attribute","isInputEmpty","hasAttribute","LoginPage","body","querySelector","title","subtitle","prefixes","Map","maxPrefixLength","setPrefix","country","prefix","country_code","max","formatPhoneNumber","originalStr","countriesList","country_codes","prefixCountry","str","phoneCode","slice","i","get","formatted","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","split","symbol","idx","PasswordInputField","super","passwordVisible","onVisibilityClick","toggleVisible","onVisibilityClickAdditional","autocomplete","stealthy","tabIndex","prepend","insertBefore","cloneNode","PasswordMonkey","needFrame","loadPromise","loadAnimationFromURL","loop","autoplay","width","noCache","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame"],"mappings":"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","file":"16.8377866d290ed556ab9b.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise<any> => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n //console.log('document paste');\r\n\r\n //console.log('messageInput paste');\r\n\r\n e.preventDefault();\r\n // @ts-ignore\r\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n\r\n let entities = RichTextProcessor.parseEntities(text);\r\n //console.log('messageInput paste', text, entities);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n //text = RichTextProcessor.wrapEmojiText(text);\r\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\r\n\r\n // console.log('messageInput paste after', text);\r\n\r\n // @ts-ignore\r\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\r\n\r\n // @ts-ignore\r\n //console.log('paste text', text, );\r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: true,\r\n required?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n <div contenteditable=\"true\" class=\"input-field-input\"></div>\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n <input type=\"text\" ${name ? `name=\"${name}\"` : ''} autocomplete=\"off\" ${label ? 'required=\"\"' : ''} class=\"input-field-input\">\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if((this.input as HTMLInputElement).value) { // * avoid selecting whole empty field on iOS devices\r\n (this.input as HTMLInputElement).select(); // * select text\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput() {\r\n const {scrollHeight, clientHeight} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.height = scrollHeight ? scrollHeight + 'px' : '';\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n this.isChanged() && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean) {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport appUsersManager from '../appManagers/appUsersManager';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise<AccountPassword> {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise<InputCheckPasswordSRP>;\r\n let newHashPromise: Promise<Uint8Array>;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n appUsersManager.saveApiUser(auth.user);\r\n apiManager.setUserAuth(auth.user.id);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName';\r\n};\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"font-weight\"], b',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n }\r\n};\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n const nodeValue = node.nodeValue;\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.trim()) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest && closest.getAttribute('contenteditable') === null) {\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (parentElement as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: +parentElement.dataset.follow\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = (selNode === node);\r\n const isBlock = node.tagName === 'DIV' || node.tagName === 'P';\r\n if(isBlock && line.length || node.tagName === 'BR') {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n } else if(node.tagName === 'IMG') {\r\n const alt = (node as HTMLImageElement).alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map<string, PrefixCountry> = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n /* input.readOnly = true;\r\n\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true}); */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: Promise<void>;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationFromURL({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n"],"sourceRoot":""} |