From bdf68eeea2816ec96f457f371f7d0ad8442e50b2 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 27 Jun 2023 17:53:44 +0200 Subject: [PATCH] Add lock screens --- core/src/components/app-view.js | 314 +++++++++++++- core/src/lockScreen.js | 11 + .../core/trade-bot/trade-bot-portal.src.js | 313 +++++++++++++- .../core/trade-portal/trade-portal.src.js | 395 ++++++++++++++++-- plugins/plugins/core/wallet/wallet-app.src.js | 342 ++++++++++++++- 5 files changed, 1305 insertions(+), 70 deletions(-) create mode 100644 core/src/lockScreen.js diff --git a/core/src/components/app-view.js b/core/src/components/app-view.js index b9b35dd1..412f9a47 100644 --- a/core/src/components/app-view.js +++ b/core/src/components/app-view.js @@ -4,20 +4,26 @@ import { store } from '../store.js' import { Epml } from '../epml.js' import { addTradeBotRoutes } from '../tradebot/addTradeBotRoutes.js' import { get, translate, translateUnsafeHTML } from 'lit-translate' -import localForage from "localforage"; +import localForage from 'localforage' +import { encryptData, decryptData } from '../lockScreen.js' +import { setChatLastSeen } from '../redux/app/app-actions.js' const chatLastSeen = localForage.createInstance({ name: "chat-last-seen", }) +import '@material/mwc-button' +import '@material/mwc-icon' import '@polymer/paper-icon-button/paper-icon-button.js' import '@polymer/paper-progress/paper-progress.js' +import '@polymer/paper-dialog/paper-dialog.js' import '@polymer/iron-icons/iron-icons.js' import '@polymer/app-layout/app-layout.js' import '@polymer/paper-ripple' import '@vaadin/button' import '@vaadin/icon' import '@vaadin/icons' +import '@vaadin/password-field' import '@vaadin/text-field' import '@vaadin/tooltip' @@ -35,7 +41,6 @@ import '../functional-components/side-menu.js' import '../functional-components/side-menu-item.js' import './start-minting.js' import './notification-view/notification-bell.js' -import { setChatLastSeen } from '../redux/app/app-actions.js' const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) @@ -111,7 +116,16 @@ class AppView extends connect(store)(LitElement) { botDgbBuyAtAddress: { type: String }, botRvnBuyAtAddress: { type: String }, botArrrBuyAtAddress: { type: String }, - balanceTicker: { type: String } + balanceTicker: { type: String }, + salt: { type: String }, + storageData: { type: String }, + lockScreenPass: { type: String }, + lockScreenSet: { type: String }, + lockPass: { type: String }, + lockSet: { type: String }, + myLockScreenPass: { type: String }, + myLockScreenSet: { type: String }, + helperMessage: { type: String } } } @@ -347,6 +361,65 @@ class AppView extends connect(store)(LitElement) { padding-top: 5px; padding-bottom: 5px; } + + .red { + --mdc-theme-primary: #C6011F; + } + + .setpass-wrapper { + width: 100%; + min-width: 400px; + max-width: 450px; + text-align: center; + background: var(--white); + border: 1px solid var(--black); + border-radius: 15px; + padding: 10px 10px 0px; + box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1); + } + + .lock-wrapper { + width: 100%; + height: 100%; + min-width: 600px; + max-width: 600px; + min-height: 400px; + max-height: 400px; + text-align: center; + background: url("/img/qortal-lock.jpg"); + border: 1px solid var(--black); + border-radius: 25px; + padding: 10px 10px 0px; + } + + .text-wrapper { + width: 100%; + height: 100%; + min-width: 280px; + max-width: 280px; + min-height: 64px; + max-height: 64px; + text-align: center; + margin-left: 35px; + margin-top: 125px; + overflow: hidden; + } + + .lock-title-white { + font-family: 'magistralbold'; + font-weight: 700; + font-size: 26px; + line-height: 32px; + color: #ffffff; + } + + .lock-title-red { + font-family: 'magistralbold'; + font-weight: 700; + font-size: 26px; + line-height: 32px; + color: #df3636; + } ` ] } @@ -426,6 +499,15 @@ class AppView extends connect(store)(LitElement) {
` + this.salt = '' + this.storageData = '' + this.lockScreenPass = '' + this.lockScreenSet = '' + this.lockPass = '' + this.lockSet = '' + this.myLockScreenPass = '' + this.myLockScreenSet = '' + this.helperMessage = '' } render() { @@ -484,6 +566,8 @@ class AppView extends connect(store)(LitElement) {
    
  
+ ${this.renderLockButton()} +
  
  
@@ -504,6 +588,59 @@ class AppView extends connect(store)(LitElement) { + +
+

Qortal UI ${translate("login.lp1")}

+
+
+
+

${translate("login.lp2")}

+

${translate("login.lp3")}

+
+
+ password + +
+
+ password + +
+
+ ${translate("login.lp4")} + ${translate("login.lp5")} +
+
+ +
+

Qortal UI ${translate("login.lp1")}

+
+
+
+

${translate("login.lessthen8")}

+
+
+ ${translate("login.lp4")} + ${translate("login.lp5")} +
+
+ +
+ UI
+ ${translate("login.lp9")} + ${translate("login.lp10")} +
+
+ password + +
+ ${this.helperMessage} +
+
+
+
+ +
+
` } @@ -512,6 +649,44 @@ class AppView extends connect(store)(LitElement) { addTradeBotRoutes(parentEpml) parentEpml.imReady() + this.helperMessage = this.renderHelperPass() + + this.salt = '' + this.salt = Base58.encode(store.getState().app.wallet._addresses[0].keyPair.privateKey) + + this.storageData = '' + this.storageData = store.getState().app.selectedAddress.address + + this.lockScreenPass = '' + this.lockScreenPass = 'lockScreenPass-' + this.storageData + + this.lockScreenSet = '' + this.lockScreenSet = 'lockScreenSet-' + this.storageData + + this.lockPass = '' + this.lockPass = encryptData(false, this.salt) + + this.lockSet = '' + this.lockSet = encryptData(false, this.salt) + + if (localStorage.getItem(this.lockScreenPass) === null && localStorage.getItem(this.lockScreenSet) === null) { + localStorage.setItem(this.lockScreenPass, this.lockPass) + localStorage.setItem(this.lockScreenSet, this.lockSet) + this.myLockScreenPass = '' + this.myLockScreenPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) + this.myLockScreenSet = '' + this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) + } else { + this.myLockScreenPass = '' + this.myLockScreenPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) + this.myLockScreenSet = '' + this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) + } + + if (this.myLockScreenSet === true) { + this.shadowRoot.getElementById('lockScreenActive').open() + } + var drawerTog = this.shadowRoot.getElementById("mb") var drawerOut = this.shadowRoot.getElementById("appsidebar") @@ -1566,6 +1741,139 @@ class AppView extends connect(store)(LitElement) { } } + renderLockButton() { + if (this.myLockScreenPass === false && this.myLockScreenSet === false) { + return html` +
+ this.openSetScreenLockPass()} title="${translate("login.lp11")}"> +
+ ` + } else if (this.myLockScreenSet === false) { + return html` +
+ this.setLockQortal()} title="${translate("login.lp11")}"> +
+ ` + } else if (this.myLockScreenSet === true) { + return html` +
+ +
+ ` + } + } + + openSetScreenLockPass() { + this.shadowRoot.getElementById('lockPassword').value = '' + this.shadowRoot.getElementById('lockPasswordConfirm').value = '' + this.shadowRoot.getElementById('setLockScreenPass').open() + } + + closeSetScreenLockPass() { + this.shadowRoot.getElementById('setLockScreenPass').close() + } + + checkPass() { + const password = this.shadowRoot.getElementById('lockPassword').value + const rePassword = this.shadowRoot.getElementById('lockPasswordConfirm').value + + if (password === '') { + let snackbar1string = get("login.pleaseenter") + parentEpml.request('showSnackBar', `${snackbar1string}`) + return + } + + if (password != rePassword) { + let snackbar2string = get("login.notmatch") + parentEpml.request('showSnackBar', `${snackbar2string}`) + return + } + + if (password.length < 8) { + let snackbar3string = get("login.lessthen8") + parentEpml.request('showSnackBar', `${snackbar3string}`) + this.lowPass = '' + this.lowPass = password + this.extraConfirm() + } + + if (password.length >= 8) { + this.setNewScreenPass() + let snackbar4string = get("login.lp6") + parentEpml.request('showSnackBar', `${snackbar4string}`) + } + } + + extraConfirm() { + this.shadowRoot.getElementById('setLockScreenPass').close() + this.shadowRoot.getElementById('extraConfirmPass').open() + } + + closExtraConfirmPass() { + this.shadowRoot.getElementById('extraConfirmPass').close() + this.shadowRoot.getElementById('lockPassword').value = '' + this.shadowRoot.getElementById('lockPasswordConfirm').value = '' + } + + setNewScreenPass() { + const rawPassword = this.shadowRoot.getElementById('lockPassword').value + const cryptPassword = encryptData(rawPassword, this.salt) + localStorage.setItem(this.lockScreenPass, cryptPassword) + this.myLockScreenPass = '' + this.myLockScreenPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) + this.shadowRoot.getElementById('setLockScreenPass').close() + this.shadowRoot.getElementById('extraConfirmPass').close() + this.shadowRoot.getElementById('lockPassword').value = '' + this.shadowRoot.getElementById('lockPasswordConfirm').value = '' + } + + setLockQortal() { + this.helperMessage = this.renderHelperPass() + this.lockSet = '' + this.lockSet = encryptData(true, this.salt) + localStorage.setItem(this.lockScreenSet, this.lockSet) + this.myLockScreenSet = '' + this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) + this.shadowRoot.getElementById('lockScreenActive').open() + } + + passKeyListener(e) { + if (e.key === 'Enter') { + this.closeLockScreenActive() + } + } + + async closeLockScreenActive() { + const myPass = decryptData(localStorage.getItem(this.lockScreenPass), this.salt) + const checkPass = this.shadowRoot.getElementById('unlockPassword').value + const errDelay = ms => new Promise(res => setTimeout(res, ms)) + + if (checkPass === myPass) { + this.lockSet = '' + this.lockSet = encryptData(false, this.salt) + localStorage.setItem(this.lockScreenSet, this.lockSet) + this.myLockScreenSet = '' + this.myLockScreenSet = decryptData(localStorage.getItem(this.lockScreenSet), this.salt) + this.shadowRoot.getElementById('lockScreenActive').close() + this.shadowRoot.getElementById('unlockPassword').value = '' + this.helperMessage = this.renderHelperPass() + } else { + this.shadowRoot.getElementById('unlockPassword').value = '' + this.helperMessage = this.renderHelperErr() + await errDelay(3000) + this.helperMessage = this.renderHelperPass() + return + } + } + + renderHelperPass() { + return html`${translate("login.pleaseenter")}` + } + + renderHelperErr() { + return html`${translate("login.lp8")}` + } + renderNodeManagement() { const checkNodeManagement = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] if ((checkNodeManagement.enableManagement = true)) { diff --git a/core/src/lockScreen.js b/core/src/lockScreen.js new file mode 100644 index 00000000..e552c879 --- /dev/null +++ b/core/src/lockScreen.js @@ -0,0 +1,11 @@ +import CryptoJS from 'crypto-js' + +export const encryptData = (data, salt) => CryptoJS.AES.encrypt(JSON.stringify(data), salt).toString() +export const decryptData = (ciphertext, salt) => { + const bytes = CryptoJS.AES.decrypt(ciphertext, salt) + try { + return JSON.parse(bytes.toString(CryptoJS.enc.Utf8)) + } catch(err) { + return null + } +} \ No newline at end of file diff --git a/plugins/plugins/core/trade-bot/trade-bot-portal.src.js b/plugins/plugins/core/trade-bot/trade-bot-portal.src.js index 51928947..3b3c0802 100644 --- a/plugins/plugins/core/trade-bot/trade-bot-portal.src.js +++ b/plugins/plugins/core/trade-bot/trade-bot-portal.src.js @@ -3,6 +3,8 @@ import { render } from 'lit/html.js' import { Epml } from '../../../epml.js' import isElectron from 'is-electron' import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate' +import Base58 from '../../../../crypto/api/deps/Base58.js' +import { encryptData, decryptData } from '../../../../core/src/lockScreen.js' registerTranslateConfig({ loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) @@ -24,6 +26,7 @@ import '@polymer/paper-icon-button/paper-icon-button.js' import '@polymer/paper-spinner/paper-spinner-lite.js' import '@vaadin/grid' import '@vaadin/grid/vaadin-grid-sorter' +import '@vaadin/password-field' const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) @@ -76,7 +79,16 @@ class TradeBotPortal extends LitElement { tradeBotDogeBook: { type: Array }, tradeBotDgbBook: { type: Array }, tradeBotRvnBook: { type: Array }, - tradeBotArrrBook: { type: Array } + tradeBotArrrBook: { type: Array }, + autoSalt: { type: String }, + autoStorageData: { type: String }, + autoLockScreenPass: { type: String }, + autoLockScreenSet: { type: String }, + autoLockPass: { type: String }, + autoLockSet: { type: String }, + myAutoLockScreenPass: { type: String }, + myAutoLockScreenSet: { type: String }, + autoHelperMessage: { type: String } } } @@ -86,17 +98,17 @@ class TradeBotPortal extends LitElement { --mdc-theme-primary: rgb(3, 169, 244); --mdc-theme-secondary: var(--mdc-theme-primary); --mdc-theme-error: rgb(255, 89, 89); - --mdc-text-field-outlined-idle-border-color: var(--txtfieldborder); + --mdc-text-field-outlined-idle-border-color: var(--txtfieldborder); --mdc-text-field-outlined-hover-border-color: var(--txtfieldhoverborder); --mdc-text-field-label-ink-color: var(--black); --mdc-text-field-ink-color: var(--black); - --mdc-select-outlined-idle-border-color: var(--txtfieldborder); + --mdc-select-outlined-idle-border-color: var(--txtfieldborder); --mdc-select-outlined-hover-border-color: var(--txtfieldhoverborder); --mdc-select-label-ink-color: var(--black); --mdc-select-ink-color: var(--black); --mdc-theme-surface: var(--white); --mdc-dialog-content-ink-color: var(--black); - --mdc-dialog-shape-radius: 25px; + --mdc-dialog-shape-radius: 25px; --paper-input-container-focus-color: var(--mdc-theme-primary); --lumo-primary-text-color: rgb(0, 167, 245); --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5); @@ -569,6 +581,56 @@ class TradeBotPortal extends LitElement { .close-icon:hover { cursor: pointer; opacity: .6; + } + .setpass-wrapper { + width: 100%; + min-width: 400px; + max-width: 450px; + text-align: center; + background: var(--white); + border: 1px solid var(--black); + border-radius: 15px; + padding: 10px 10px 0px; + box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1); + } + .lock-wrapper { + width: 100%; + height: 100%; + min-width: 600px; + max-width: 600px; + min-height: 400px; + max-height: 400px; + text-align: center; + background: url("/img/qortal-lock.jpg"); + border: 1px solid var(--black); + border-radius: 25px; + padding: 10px 10px 0px; + } + .text-wrapper { + width: 100%; + height: 100%; + min-width: 280px; + max-width: 280px; + min-height: 64px; + max-height: 64px; + text-align: center; + margin-left: 35px; + margin-top: 125px; + overflow: hidden; + } + .lock-title-white { + font-family: 'magistralbold'; + font-weight: 700; + font-size: 26px; + line-height: 32px; + color: #ffffff; + } + .lock-title-red { + font-family: 'magistralbold'; + font-weight: 700; + font-size: 26px; + line-height: 32px; + color: #df3636; } @media (min-width: 701px) { * { @@ -827,6 +889,15 @@ class TradeBotPortal extends LitElement { this.tradeBotDgbBook = [] this.tradeBotRvnBook = [] this.tradeBotArrrBook = [] + this.autoSalt = '' + this.autoStorageData = '' + this.autoLockScreenPass = '' + this.autoLockScreenSet = '' + this.autoLockPass = '' + this.autoLockSet = '' + this.myAutoLockScreenPass = '' + this.myAutoLockScreenSet = '' + this.autoHelperMessage = '' } openTradesTemplate() { @@ -1470,11 +1541,14 @@ class TradeBotPortal extends LitElement { DOGE / QORT DGB / QORT RVN / QORT - ARRR / QORT + ARRR / QORT -
- this.shadowRoot.getElementById('buyInfoDialog').open()}> -
+
+ this.shadowRoot.getElementById('buyInfoDialog').open()}> +
+
+ ${this.renderAutoLockButton()} +
@@ -1969,6 +2043,59 @@ class TradeBotPortal extends LitElement {

${translate("info.inf12")}

+ +
+

Qortal ${translate("tabmenu.tm6")} ${translate("login.lp1")}

+
+
+
+

${translate("login.lp2")}

+

${translate("login.lp3")}

+
+
+ password + +
+
+ password + +
+
+ ${translate("login.lp4")} + ${translate("login.lp5")} +
+
+ +
+

Qortal ${translate("tabmenu.tm6")} ${translate("login.lp1")}

+
+
+
+

${translate("login.lessthen8")}

+
+
+ ${translate("login.lp4")} + ${translate("login.lp5")} +
+
+ +
+ ${translate("tradepage.tchange46")}
+ ${translate("login.lp9")} + ${translate("login.lp10")} +
+
+ password + +
+ ${this.autoHelperMessage} +
+
+
+
+ +
+
` } @@ -1978,6 +2105,45 @@ class TradeBotPortal extends LitElement { this.changeTheme() this.changeLanguage() + + this.autoHelperMessage = this.renderAutoHelperPass() + + this.autoSalt = '' + this.autoSalt = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey) + + this.autoStorageData = '' + this.autoStorageData = window.parent.reduxStore.getState().app.selectedAddress.address + + this.autoLockScreenPass = '' + this.autoLockScreenPass = 'autoLockScreenPass-' + this.autoStorageData + + this.autoLockScreenSet = '' + this.autoLockScreenSet = 'autoLockScreenSet-' + this.autoStorageData + + this.autoLockPass = '' + this.autoLockPass = encryptData(false, this.autoSalt) + + this.autoLockSet = '' + this.autoLockSet = encryptData(false, this.autoSalt) + + if (localStorage.getItem(this.autoLockScreenPass) === null && localStorage.getItem(this.autoLockScreenSet) === null) { + localStorage.setItem(this.autoLockScreenPass, this.autoLockPass) + localStorage.setItem(this.autoLockScreenSet, this.autoLockSet) + this.myAutoLockScreenPass = '' + this.myAutoLockScreenPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) + this.myAutoLockScreenSet = '' + this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) + } else { + this.myAutoLockScreenPass = '' + this.myAutoLockScreenPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) + this.myAutoLockScreenSet = '' + this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) + } + + if (this.myAutoLockScreenSet === true) { + this.shadowRoot.getElementById('autoLockScreenActive').open() + } + this.updateWalletBalance() this.fetchWalletAddress(this.selectedCoin) @@ -2117,6 +2283,137 @@ class TradeBotPortal extends LitElement { this.arrrTradebook() } + renderAutoLockButton() { + if (this.myAutoLockScreenPass === false && this.myAutoLockScreenSet === false) { + return html` +
+ this.openAutoSetScreenLockPass()} title="${translate("login.lp11")}"> +
+ ` + } else if (this.myAutoLockScreenSet === false) { + return html` +
+ this.setAutoLockQortal()} title="${translate("login.lp11")}"> +
+ ` + } else if (this.myAutoLockScreenSet === true) { + return html` +
+ +
+ ` + } + } + + openAutoSetScreenLockPass() { + this.shadowRoot.getElementById('autoLockPassword').value = '' + this.shadowRoot.getElementById('autoLockPasswordConfirm').value = '' + this.shadowRoot.getElementById('setAutoLockScreenPass').open() + } + + closewAutoSetScreenLockPass() { + this.shadowRoot.getElementById('setAutoLockScreenPass').close() + } + + autoCheckPass() { + const autoPassword = this.shadowRoot.getElementById('autoLockPassword').value + const autoRePassword = this.shadowRoot.getElementById('autoLockPasswordConfirm').value + + if (autoPassword === '') { + let snackbar1string = get("login.pleaseenter") + parentEpml.request('showSnackBar', `${snackbar1string}`) + return + } + + if (autoPassword != autoRePassword) { + let snackbar2string = get("login.notmatch") + parentEpml.request('showSnackBar', `${snackbar2string}`) + return + } + + if (autoPassword.length < 8) { + let snackbar3string = get("login.lessthen8") + parentEpml.request('showSnackBar', `${snackbar3string}`) + this.autoExtraConfirm() + } + + if (autoPassword.length >= 8) { + this.setAutoNewScreenPass() + let snackbar4string = get("login.lp6") + parentEpml.request('showSnackBar', `${snackbar4string}`) + } + } + + autoExtraConfirm() { + this.shadowRoot.getElementById('setAutoLockScreenPass').close() + this.shadowRoot.getElementById('autoExtraConfirmPass').open() + } + + closAutoExtraConfirmPass() { + this.shadowRoot.getElementById('autoExtraConfirmPass').close() + this.shadowRoot.getElementById('autoLockPassword').value = '' + this.shadowRoot.getElementById('autoLockPasswordConfirm').value = '' + } + + setAutoNewScreenPass() { + const autoRawPassword = this.shadowRoot.getElementById('autoLockPassword').value + const autoCryptPassword = encryptData(autoRawPassword, this.autoSalt) + localStorage.setItem(this.autoLockScreenPass, autoCryptPassword) + this.myAutoLockScreenPass = '' + this.myAutoLockScreenPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) + this.shadowRoot.getElementById('setAutoLockScreenPass').close() + this.shadowRoot.getElementById('autoExtraConfirmPass').close() + this.shadowRoot.getElementById('autoLockPassword').value = '' + this.shadowRoot.getElementById('autoLockPasswordConfirm').value = '' + } + + setAutoLockQortal() { + this.autoHelperMessage = this.renderAutoHelperPass() + this.autoLockSet = '' + this.autoLockSet = encryptData(true, this.autoSalt) + localStorage.setItem(this.autoLockScreenSet, this.autoLockSet) + this.myAutoLockScreenSet = '' + this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) + this.shadowRoot.getElementById('autoLockScreenActive').open() + } + + autoPassKeyListener(e) { + if (e.key === 'Enter') { + this.closeAutoLockScreenActive() + } + } + + async closeAutoLockScreenActive() { + const myAutoPass = decryptData(localStorage.getItem(this.autoLockScreenPass), this.autoSalt) + const autoCheckPass = this.shadowRoot.getElementById('autoUnlockPassword').value + const errDelay = ms => new Promise(res => setTimeout(res, ms)) + + if (autoCheckPass === myAutoPass) { + this.autoLockSet = '' + this.autoLockSet = encryptData(false, this.autoSalt) + localStorage.setItem(this.autoLockScreenSet, this.autoLockSet) + this.myAutoLockScreenSet = '' + this.myAutoLockScreenSet = decryptData(localStorage.getItem(this.autoLockScreenSet), this.autoSalt) + this.shadowRoot.getElementById('autoLockScreenActive').close() + this.shadowRoot.getElementById('autoUnlockPassword').value = '' + this.autoHelperMessage = this.renderAutoHelperPass() + } else { + this.shadowRoot.getElementById('autoUnlockPassword').value = '' + this.autoHelperMessage = this.renderAutoHelperErr() + await errDelay(3000) + this.autoHelperMessage = this.renderAutoHelperPass() + return + } + } + + renderAutoHelperPass() { + return html`${translate("login.pleaseenter")}` + } + + renderAutoHelperErr() { + return html`${translate("login.lp8")}` + } + changeTheme() { const checkTheme = localStorage.getItem('qortalTheme') this.theme = (checkTheme === 'dark') ? 'dark' : 'light' diff --git a/plugins/plugins/core/trade-portal/trade-portal.src.js b/plugins/plugins/core/trade-portal/trade-portal.src.js index a7f7c460..4743f480 100644 --- a/plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/plugins/plugins/core/trade-portal/trade-portal.src.js @@ -3,6 +3,8 @@ import { render } from 'lit/html.js' import { Epml } from '../../../epml.js' import isElectron from 'is-electron' import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate' +import Base58 from '../../../../crypto/api/deps/Base58.js' +import { encryptData, decryptData } from '../../../../core/src/lockScreen.js' registerTranslateConfig({ loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) @@ -24,6 +26,7 @@ import '@polymer/paper-icon-button/paper-icon-button.js' import '@polymer/paper-spinner/paper-spinner-lite.js' import '@vaadin/grid' import '@vaadin/grid/vaadin-grid-sorter' +import '@vaadin/password-field' import chartsbtc from './charts/btc-charts.js' import chartsltc from './charts/ltc-charts.js' import chartsdoge from './charts/doge-charts.js' @@ -78,7 +81,16 @@ class TradePortal extends LitElement { dgbqort: { type: Number }, rvnqort: { type: Number }, arrrqort: { type: Number }, - qortRatio: {type: Number} + qortRatio: {type: Number}, + tradeSalt: { type: String }, + tradeStorageData: { type: String }, + tradeLockScreenPass: { type: String }, + tradeLockScreenSet: { type: String }, + tradeLockPass: { type: String }, + tradeLockSet: { type: String }, + myTradeLockScreenPass: { type: String }, + myTradeLockScreenSet: { type: String }, + tradeHelperMessage: { type: String } } } @@ -88,17 +100,17 @@ class TradePortal extends LitElement { --mdc-theme-primary: rgb(3, 169, 244); --mdc-theme-secondary: var(--mdc-theme-primary); --mdc-theme-error: rgb(255, 89, 89); - --mdc-text-field-outlined-idle-border-color: var(--txtfieldborder); + --mdc-text-field-outlined-idle-border-color: var(--txtfieldborder); --mdc-text-field-outlined-hover-border-color: var(--txtfieldhoverborder); --mdc-text-field-label-ink-color: var(--black); --mdc-text-field-ink-color: var(--black); - --mdc-select-outlined-idle-border-color: var(--txtfieldborder); + --mdc-select-outlined-idle-border-color: var(--txtfieldborder); --mdc-select-outlined-hover-border-color: var(--txtfieldhoverborder); --mdc-select-label-ink-color: var(--black); --mdc-select-ink-color: var(--black); --mdc-theme-surface: var(--white); --mdc-dialog-content-ink-color: var(--black); - --mdc-dialog-shape-radius: 25px; + --mdc-dialog-shape-radius: 25px; --paper-input-container-focus-color: var(--mdc-theme-primary); --lumo-primary-text-color: rgb(0, 167, 245); --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5); @@ -585,41 +597,97 @@ class TradePortal extends LitElement { cursor: pointer; opacity: .6; } - @media (min-width: 701px) { - * { - } - #trade-portal {} - #first-trade-section { - display: grid; - grid-template-columns:1fr 1fr 2fr; - grid-auto-rows: max(450px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 10px; - } - #second-trade-section { - display: grid; - grid-template-columns: 2fr 1fr; - grid-auto-rows: max(450px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 10px; - } - #third-trade-section { - display: grid; - grid-template-columns: 1fr 2fr 1fr; - grid-auto-rows: max(200px); - column-gap: 0.5em; - row-gap: 0.4em; - justify-items: stretch; - align-items: stretch; - margin-bottom: 10px; - } - } + + .setpass-wrapper { + width: 100%; + min-width: 400px; + max-width: 450px; + text-align: center; + background: var(--white); + border: 1px solid var(--black); + border-radius: 15px; + padding: 10px 10px 0px; + box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1); + } + + .lock-wrapper { + width: 100%; + height: 100%; + min-width: 600px; + max-width: 600px; + min-height: 400px; + max-height: 400px; + text-align: center; + background: url("/img/qortal-lock.jpg"); + border: 1px solid var(--black); + border-radius: 25px; + padding: 10px 10px 0px; + } + + .text-wrapper { + width: 100%; + height: 100%; + min-width: 280px; + max-width: 280px; + min-height: 64px; + max-height: 64px; + text-align: center; + margin-left: 35px; + margin-top: 125px; + overflow: hidden; + } + + .lock-title-white { + font-family: 'magistralbold'; + font-weight: 700; + font-size: 26px; + line-height: 32px; + color: #ffffff; + } + + .lock-title-red { + font-family: 'magistralbold'; + font-weight: 700; + font-size: 26px; + line-height: 32px; + color: #df3636; + } + + @media (min-width: 701px) { + * { + } + #trade-portal {} + #first-trade-section { + display: grid; + grid-template-columns:1fr 1fr 2fr; + grid-auto-rows: max(450px); + column-gap: 0.5em; + row-gap: 0.4em; + justify-items: stretch; + align-items: stretch; + margin-bottom: 10px; + } + #second-trade-section { + display: grid; + grid-template-columns: 2fr 1fr; + grid-auto-rows: max(450px); + column-gap: 0.5em; + row-gap: 0.4em; + justify-items: stretch; + align-items: stretch; + margin-bottom: 10px; + } + #third-trade-section { + display: grid; + grid-template-columns: 1fr 2fr 1fr; + grid-auto-rows: max(200px); + column-gap: 0.5em; + row-gap: 0.4em; + justify-items: stretch; + align-items: stretch; + margin-bottom: 10px; + } + } ` } @@ -817,6 +885,15 @@ class TradePortal extends LitElement { this.displayTradeAddress = '' this.displayTradeLevel = '' this.displayTradeBalance = '' + this.tradeSalt = '' + this.tradeStorageData = '' + this.tradeLockScreenPass = '' + this.tradeLockScreenSet = '' + this.tradeLockPass = '' + this.tradeLockSet = '' + this.myTradeLockScreenPass = '' + this.myTradeLockScreenSet = '' + this.tradeHelperMessage = '' } historicTradesTemplate() { @@ -1211,13 +1288,16 @@ class TradePortal extends LitElement { QORT / RVN QORT / ARRR -
- this.shadowRoot.getElementById('tradeInfoDialog').open()}> -
-
- ${this.chartShowCoin()} -
- +
+ this.shadowRoot.getElementById('tradeInfoDialog').open()}> +
+
+ ${this.chartShowCoin()} +
+
+ ${this.renderTradeLockButton()} +
+
@@ -1269,6 +1349,59 @@ class TradePortal extends LitElement {

${translate("info.inf6")}

+ +
+

Qortal ${translate("tabmenu.tm4")} ${translate("login.lp1")}

+
+
+
+

${translate("login.lp2")}

+

${translate("login.lp3")}

+
+
+ password + +
+
+ password + +
+
+ ${translate("login.lp4")} + ${translate("login.lp5")} +
+
+ +
+

Qortal ${translate("tabmenu.tm4")} ${translate("login.lp1")}

+
+
+
+

${translate("login.lessthen8")}

+
+
+ ${translate("login.lp4")} + ${translate("login.lp5")} +
+
+ +
+ ${translate("sidemenu.tradeportal")}
+ ${translate("login.lp9")} + ${translate("login.lp10")} +
+
+ password + +
+ ${this.tradeHelperMessage} +
+
+
+
+ +
+
` } @@ -1279,6 +1412,45 @@ class TradePortal extends LitElement { this.changeTheme() this.changeLanguage() + + this.tradeHelperMessage = this.renderTradeHelperPass() + + this.tradeSalt = '' + this.tradeSalt = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey) + + this.tradeStorageData = '' + this.tradeStorageData = window.parent.reduxStore.getState().app.selectedAddress.address + + this.tradeLockScreenPass = '' + this.tradeLockScreenPass = 'tradeLockScreenPass-' + this.tradeStorageData + + this.tradeLockScreenSet = '' + this.tradeLockScreenSet = 'tradeLockScreenSet-' + this.tradeStorageData + + this.tradeLockPass = '' + this.tradeLockPass = encryptData(false, this.tradeSalt) + + this.tradeLockSet = '' + this.tradeLockSet = encryptData(false, this.tradeSalt) + + if (localStorage.getItem(this.tradeLockScreenPass) === null && localStorage.getItem(this.tradeLockScreenSet) === null) { + localStorage.setItem(this.tradeLockScreenPass, this.tradeLockPass) + localStorage.setItem(this.tradeLockScreenSet, this.tradeLockSet) + this.myTradeLockScreenPass = '' + this.myTradeLockScreenPass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) + this.myTradeLockScreenSet = '' + this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) + } else { + this.myTradeLockScreenPass = '' + this.myTradeLockScreenPass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) + this.myTradeLockScreenSet = '' + this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) + } + + if (this.myTradeLockScreenSet === true) { + this.shadowRoot.getElementById('tradeLockScreenActive').open() + } + this.updateWalletBalance() this.fetchWalletAddress(this.selectedCoin) @@ -1434,6 +1606,137 @@ class TradePortal extends LitElement { setTimeout(() => this.shadowRoot.querySelector('[slot="vaadin-grid-cell-content-3"]').setAttribute('title', 'Last Seen'), 3000) } + renderTradeLockButton() { + if (this.myTradeLockScreenPass === false && this.myTradeLockScreenSet === false) { + return html` +
+ this.openTradeSetScreenLockPass()} title="${translate("login.lp11")}"> +
+ ` + } else if (this.myTradeLockScreenSet === false) { + return html` +
+ this.setTradeLockQortal()} title="${translate("login.lp11")}"> +
+ ` + } else if (this.myTradeLockScreenSet === true) { + return html` +
+ +
+ ` + } + } + + openTradeSetScreenLockPass() { + this.shadowRoot.getElementById('tradeLockPassword').value = '' + this.shadowRoot.getElementById('tradeLockPasswordConfirm').value = '' + this.shadowRoot.getElementById('setTradeLockScreenPass').open() + } + + closewTradeSetScreenLockPass() { + this.shadowRoot.getElementById('setTradeLockScreenPass').close() + } + + tradeCheckPass() { + const tradePassword = this.shadowRoot.getElementById('tradeLockPassword').value + const tradeRePassword = this.shadowRoot.getElementById('tradeLockPasswordConfirm').value + + if (tradePassword === '') { + let snackbar1string = get("login.pleaseenter") + parentEpml.request('showSnackBar', `${snackbar1string}`) + return + } + + if (tradePassword != tradeRePassword) { + let snackbar2string = get("login.notmatch") + parentEpml.request('showSnackBar', `${snackbar2string}`) + return + } + + if (tradePassword.length < 8) { + let snackbar3string = get("login.lessthen8") + parentEpml.request('showSnackBar', `${snackbar3string}`) + this.tradeExtraConfirm() + } + + if (tradePassword.length >= 8) { + this.setTradeNewScreenPass() + let snackbar4string = get("login.lp6") + parentEpml.request('showSnackBar', `${snackbar4string}`) + } + } + + tradeExtraConfirm() { + this.shadowRoot.getElementById('setTradeLockScreenPass').close() + this.shadowRoot.getElementById('tradeExtraConfirmPass').open() + } + + closTradeExtraConfirmPass() { + this.shadowRoot.getElementById('tradeExtraConfirmPass').close() + this.shadowRoot.getElementById('tradeLockPassword').value = '' + this.shadowRoot.getElementById('tradeLockPasswordConfirm').value = '' + } + + setTradeNewScreenPass() { + const tradeRawPassword = this.shadowRoot.getElementById('tradeLockPassword').value + const tradeCryptPassword = encryptData(tradeRawPassword, this.tradeSalt) + localStorage.setItem(this.tradeLockScreenPass, tradeCryptPassword) + this.myTradeLockScreenPass = '' + this.myTradeLockScreenPass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) + this.shadowRoot.getElementById('setTradeLockScreenPass').close() + this.shadowRoot.getElementById('tradeExtraConfirmPass').close() + this.shadowRoot.getElementById('tradeLockPassword').value = '' + this.shadowRoot.getElementById('tradeLockPasswordConfirm').value = '' + } + + setTradeLockQortal() { + this.tradeHelperMessage = this.renderTradeHelperPass() + this.tradeLockSet = '' + this.tradeLockSet = encryptData(true, this.tradeSalt) + localStorage.setItem(this.tradeLockScreenSet, this.tradeLockSet) + this.myTradeLockScreenSet = '' + this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) + this.shadowRoot.getElementById('tradeLockScreenActive').open() + } + + tradePassKeyListener(e) { + if (e.key === 'Enter') { + this.closeTradeLockScreenActive() + } + } + + async closeTradeLockScreenActive() { + const myTradePass = decryptData(localStorage.getItem(this.tradeLockScreenPass), this.tradeSalt) + const tradeCheckPass = this.shadowRoot.getElementById('tradeUnlockPassword').value + const errDelay = ms => new Promise(res => setTimeout(res, ms)) + + if (tradeCheckPass === myTradePass) { + this.tradeLockSet = '' + this.tradeLockSet = encryptData(false, this.tradeSalt) + localStorage.setItem(this.tradeLockScreenSet, this.tradeLockSet) + this.myTradeLockScreenSet = '' + this.myTradeLockScreenSet = decryptData(localStorage.getItem(this.tradeLockScreenSet), this.tradeSalt) + this.shadowRoot.getElementById('tradeLockScreenActive').close() + this.shadowRoot.getElementById('tradeUnlockPassword').value = '' + this.tradeHelperMessage = this.renderTradeHelperPass() + } else { + this.shadowRoot.getElementById('tradeUnlockPassword').value = '' + this.tradeHelperMessage = this.renderTradeHelperErr() + await errDelay(3000) + this.tradeHelperMessage = this.renderTradeHelperPass() + return + } + } + + renderTradeHelperPass() { + return html`${translate("login.pleaseenter")}` + } + + renderTradeHelperErr() { + return html`${translate("login.lp8")}` + } + requestTraderInfo(traderAddress) { let getAddress = traderAddress const theInfoView = this.shadowRoot.querySelector('trader-info-view') diff --git a/plugins/plugins/core/wallet/wallet-app.src.js b/plugins/plugins/core/wallet/wallet-app.src.js index ceedf181..a6829ceb 100644 --- a/plugins/plugins/core/wallet/wallet-app.src.js +++ b/plugins/plugins/core/wallet/wallet-app.src.js @@ -3,6 +3,8 @@ import { render } from 'lit/html.js' import { Epml } from '../../../epml.js' import isElectron from 'is-electron' import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate' +import Base58 from '../../../../crypto/api/deps/Base58.js' +import { encryptData, decryptData } from '../../../../core/src/lockScreen.js' registerTranslateConfig({ loader: lang => fetch(`/language/${lang}.json`).then(res => res.json()) @@ -21,6 +23,7 @@ import '@material/mwc-icon' import '@material/mwc-icon-button' import '@material/mwc-tab-bar' import '@material/mwc-textfield' +import '@polymer/paper-dialog/paper-dialog.js' import '@polymer/paper-progress/paper-progress.js' import '@polymer/paper-slider/paper-slider.js' import '@polymer/paper-spinner/paper-spinner-lite.js' @@ -30,6 +33,7 @@ import '@vaadin/button' import '@vaadin/grid' import '@vaadin/icon' import '@vaadin/icons' +import '@vaadin/password-field' const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) @@ -97,7 +101,16 @@ class MultiWallet extends LitElement { dgbBookAddress: { type: String }, rvnBookAddress: { type: String }, arrrBookAddress: { type: String }, - myElementId: { type: String } + myElementId: { type: String }, + walletSalt: { type: String }, + walletStorageData: { type: String }, + walletLockScreenPass: { type: String }, + walletLockScreenSet: { type: String }, + walletLockPass: { type: String }, + walletLockSet: { type: String }, + myWalletLockScreenPass: { type: String }, + myWalletLockScreenSet: { type: String }, + walletHelperMessage: { type: String } } } @@ -112,6 +125,7 @@ class MultiWallet extends LitElement { --mdc-theme-primary: rgb(3, 169, 244); --mdc-theme-secondary: var(--mdc-theme-primary); --mdc-theme-surface: var(--white); + --mdc-theme-error: rgb(255, 89, 89); --mdc-dialog-content-ink-color: var(--black); --mdc-dialog-min-width: 400px; --mdc-dialog-max-width: 1024px; @@ -121,6 +135,8 @@ class MultiWallet extends LitElement { --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1); --lumo-primary-color: hsl(199, 100%, 48%); --lumo-base-color: var(--white); + --lumo-secondary-text-color: var(--sectxt); + --lumo-contrast-60pct: var(--vdicon); --lumo-body-text-color: var(--black); --_lumo-grid-border-color: var(--border); --_lumo-grid-secondary-border-color: var(--border2); @@ -219,6 +235,18 @@ class MultiWallet extends LitElement { font-family: 'Open Sans', sans-serif; } + .magistral { + font-family: 'magistralbold'; + } + + .montserrat { + font-family: 'Montserrat', sans-serif; + } + + .maven { + font-family: 'MavenPro', sans-serif; + } + .weight-100 { font-weight: 100; } @@ -318,6 +346,7 @@ class MultiWallet extends LitElement { } .header-title { + display: inlinr; font-size: 32px; color: var(--black); font-weight: 600; @@ -592,18 +621,18 @@ class MultiWallet extends LitElement { cursor: pointer; } - .warning-text { - animation: blinker 1.5s linear infinite; - text-align: center; - margin-top: 10px; - color: rgb(255, 89, 89); - } + .warning-text { + animation: blinker 1.5s linear infinite; + text-align: center; + margin-top: 10px; + color: rgb(255, 89, 89); + } - @keyframes blinker { - 50% { - opacity: 0; - } - } + @keyframes blinker { + 50% { + opacity: 0; + } + } @media (max-width: 764px) { .wallet { @@ -641,6 +670,61 @@ class MultiWallet extends LitElement { font: 18px/24px 'Open Sans', sans-serif; } } + + .setpass-wrapper { + width: 100%; + min-width: 400px; + max-width: 450px; + text-align: center; + background: var(--white); + border: 1px solid var(--black); + border-radius: 15px; + padding: 10px 10px 0px; + box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1); + } + + .lock-wrapper { + width: 100%; + height: 100%; + min-width: 600px; + max-width: 600px; + min-height: 400px; + max-height: 400px; + text-align: center; + background: url("/img/qortal-lock.jpg"); + border: 1px solid var(--black); + border-radius: 25px; + padding: 10px 10px 0px; + } + + .text-wrapper { + width: 100%; + height: 100%; + min-width: 280px; + max-width: 280px; + min-height: 64px; + max-height: 64px; + text-align: center; + margin-left: 35px; + margin-top: 125px; + overflow: hidden; + } + + .lock-title-white { + font-family: 'magistralbold'; + font-weight: 700; + font-size: 26px; + line-height: 32px; + color: #ffffff; + } + + .lock-title-red { + font-family: 'magistralbold'; + font-weight: 700; + font-size: 26px; + line-height: 32px; + color: #df3636; + } ` } @@ -719,6 +803,15 @@ class MultiWallet extends LitElement { this.rvnFeePerByte = 1125 this.rvnSatMinFee = 1000 this.rvnSatMaxFee = 10000 + this.walletSalt = '' + this.walletStorageData = '' + this.walletLockScreenPass = '' + this.walletLockScreenSet = '' + this.walletLockPass = '' + this.walletLockSet = '' + this.myWalletLockScreenPass = '' + this.myWalletLockScreenSet = '' + this.walletHelperMessage = '' this.wallets = new Map() @@ -764,7 +857,7 @@ class MultiWallet extends LitElement { return html`
- ${translate("walletpage.wchange22")} + ${translate("walletpage.wchange22")} ${this.renderWalletLockButton()}
@@ -2627,6 +2720,59 @@ class MultiWallet extends LitElement {
+ +
+

Qortal ${translate("tabmenu.tm5")} ${translate("login.lp1")}

+
+
+
+

${translate("login.lp2")}

+

${translate("login.lp3")}

+
+
+ password + +
+
+ password + +
+
+ ${translate("login.lp4")} + ${translate("login.lp5")} +
+
+ +
+

Qortal ${translate("tabmenu.tm5")} ${translate("login.lp1")}

+
+
+
+

${translate("login.lessthen8")}

+
+
+ ${translate("login.lp4")} + ${translate("login.lp5")} +
+
+ +
+ ${translate("sidemenu.wallets")}
+ ${translate("login.lp9")} + ${translate("login.lp10")} +
+
+ password + +
+ ${this.walletHelperMessage} +
+
+
+
+ +
+
` } @@ -2634,6 +2780,45 @@ class MultiWallet extends LitElement { this.changeTheme() this.changeLanguage() + + this.walletHelperMessage = this.renderWalletHelperPass() + + this.walletSalt = '' + this.walletSalt = Base58.encode(window.parent.reduxStore.getState().app.wallet._addresses[0].keyPair.privateKey) + + this.walletStorageData = '' + this.walletStorageData = window.parent.reduxStore.getState().app.selectedAddress.address + + this.walletLockScreenPass = '' + this.walletLockScreenPass = 'walletLockScreenPass-' + this.walletStorageData + + this.walletLockScreenSet = '' + this.walletLockScreenSet = 'walletLockScreenSet-' + this.walletStorageData + + this.walletLockPass = '' + this.walletLockPass = encryptData(false, this.walletSalt) + + this.walletLockSet = '' + this.walletLockSet = encryptData(false, this.walletSalt) + + if (localStorage.getItem(this.walletLockScreenPass) === null && localStorage.getItem(this.walletLockScreenSet) === null) { + localStorage.setItem(this.walletLockScreenPass, this.walletLockPass) + localStorage.setItem(this.walletLockScreenSet, this.walletLockSet) + this.myWalletLockScreenPass = '' + this.myWalletLockScreenPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) + this.myWalletLockScreenSet = '' + this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) + } else { + this.myWalletLockScreenPass = '' + this.myWalletLockScreenPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) + this.myWalletLockScreenSet = '' + this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) + } + + if (this.myWalletLockScreenSet === true) { + this.shadowRoot.getElementById('walletLockScreenActive').open() + } + this.qortAddressbook() this.btcAddressbook() this.ltcAddressbook() @@ -2669,6 +2854,137 @@ class MultiWallet extends LitElement { } } + renderWalletLockButton() { + if (this.myWalletLockScreenPass === false && this.myWalletLockScreenSet === false) { + return html` +
+ this.openWalletSetScreenLockPass()} title="${translate("login.lp11")}"> +
+ ` + } else if (this.myWalletLockScreenSet === false) { + return html` +
+ this.setWalletLockQortal()} title="${translate("login.lp11")}"> +
+ ` + } else if (this.myWalletLockScreenSet === true) { + return html` +
+ +
+ ` + } + } + + openWalletSetScreenLockPass() { + this.shadowRoot.getElementById('walletLockPassword').value = '' + this.shadowRoot.getElementById('walletLockPasswordConfirm').value = '' + this.shadowRoot.getElementById('setWalletLockScreenPass').open() + } + + closewWalletSetScreenLockPass() { + this.shadowRoot.getElementById('setWalletLockScreenPass').close() + } + + walletCheckPass() { + const walletPassword = this.shadowRoot.getElementById('walletLockPassword').value + const walletRePassword = this.shadowRoot.getElementById('walletLockPasswordConfirm').value + + if (walletPassword === '') { + let snackbar1string = get("login.pleaseenter") + parentEpml.request('showSnackBar', `${snackbar1string}`) + return + } + + if (walletPassword != walletRePassword) { + let snackbar2string = get("login.notmatch") + parentEpml.request('showSnackBar', `${snackbar2string}`) + return + } + + if (walletPassword.length < 8) { + let snackbar3string = get("login.lessthen8") + parentEpml.request('showSnackBar', `${snackbar3string}`) + this.walletExtraConfirm() + } + + if (walletPassword.length >= 8) { + this.setWalletNewScreenPass() + let snackbar4string = get("login.lp6") + parentEpml.request('showSnackBar', `${snackbar4string}`) + } + } + + walletExtraConfirm() { + this.shadowRoot.getElementById('setWalletLockScreenPass').close() + this.shadowRoot.getElementById('walletExtraConfirmPass').open() + } + + closWalletExtraConfirmPass() { + this.shadowRoot.getElementById('walletExtraConfirmPass').close() + this.shadowRoot.getElementById('walletLockPassword').value = '' + this.shadowRoot.getElementById('walletLockPasswordConfirm').value = '' + } + + setWalletNewScreenPass() { + const walletRawPassword = this.shadowRoot.getElementById('walletLockPassword').value + const walletCryptPassword = encryptData(walletRawPassword, this.walletSalt) + localStorage.setItem(this.walletLockScreenPass, walletCryptPassword) + this.myWalletLockScreenPass = '' + this.myWalletLockScreenPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) + this.shadowRoot.getElementById('setWalletLockScreenPass').close() + this.shadowRoot.getElementById('walletExtraConfirmPass').close() + this.shadowRoot.getElementById('walletLockPassword').value = '' + this.shadowRoot.getElementById('walletLockPasswordConfirm').value = '' + } + + setWalletLockQortal() { + this.walletHelperMessage = this.renderWalletHelperPass() + this.walletLockSet = '' + this.walletLockSet = encryptData(true, this.walletSalt) + localStorage.setItem(this.walletLockScreenSet, this.walletLockSet) + this.myWalletLockScreenSet = '' + this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) + this.shadowRoot.getElementById('walletLockScreenActive').open() + } + + walletPassKeyListener(e) { + if (e.key === 'Enter') { + this.closeWalletLockScreenActive() + } + } + + async closeWalletLockScreenActive() { + const myWalletPass = decryptData(localStorage.getItem(this.walletLockScreenPass), this.walletSalt) + const walletCheckPass = this.shadowRoot.getElementById('walletUnlockPassword').value + const errDelay = ms => new Promise(res => setTimeout(res, ms)) + + if (walletCheckPass === myWalletPass) { + this.walletLockSet = '' + this.walletLockSet = encryptData(false, this.walletSalt) + localStorage.setItem(this.walletLockScreenSet, this.walletLockSet) + this.myWalletLockScreenSet = '' + this.myWalletLockScreenSet = decryptData(localStorage.getItem(this.walletLockScreenSet), this.walletSalt) + this.shadowRoot.getElementById('walletLockScreenActive').close() + this.shadowRoot.getElementById('walletUnlockPassword').value = '' + this.walletHelperMessage = this.renderWalletHelperPass() + } else { + this.shadowRoot.getElementById('walletUnlockPassword').value = '' + this.walletHelperMessage = this.renderWalletHelperErr() + await errDelay(3000) + this.walletHelperMessage = this.renderWalletHelperPass() + return + } + } + + renderWalletHelperPass() { + return html`${translate("login.pleaseenter")}` + } + + renderWalletHelperErr() { + return html`${translate("login.lp8")}` + } + renderWarning() { return html`${translate("tradepage.tchange48")} QORT` }