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
+
+
+
+ this.closeSetScreenLockPass()}">${translate("login.lp4")}
+ this.checkPass()}">${translate("login.lp5")}
+
+
+
+
+
+ UI
+ ${translate("login.lp9")}
+ ${translate("login.lp10")}
+
+
+
password
+
+
+ ${this.helperMessage}
+
+
+
+
+ this.closeLockScreenActive()}">
+
+
`
}
@@ -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
+
+
+
+ this.closewAutoSetScreenLockPass()}">${translate("login.lp4")}
+ this.autoCheckPass()}">${translate("login.lp5")}
+
+
+
+
+
+ ${translate("tradepage.tchange46")}
+ ${translate("login.lp9")}
+ ${translate("login.lp10")}
+
+
+
password
+
+
+ ${this.autoHelperMessage}
+
+
+
+
+ this.closeAutoLockScreenActive()}">
+
+
`
}
@@ -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
+
+
+
+ this.closewTradeSetScreenLockPass()}">${translate("login.lp4")}
+ this.tradeCheckPass()}">${translate("login.lp5")}
+
+
+
+
+
+ ${translate("sidemenu.tradeportal")}
+ ${translate("login.lp9")}
+ ${translate("login.lp10")}
+
+
+
password
+
+
+ ${this.tradeHelperMessage}
+
+
+
+
+ this.closeTradeLockScreenActive()}">
+
+
`
}
@@ -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`
@@ -2627,6 +2720,59 @@ class MultiWallet extends LitElement {
+
+
+
Qortal ${translate("tabmenu.tm5")} ${translate("login.lp1")}
+
+
+
+
${translate("login.lp2")}
+ ${translate("login.lp3")}
+
+
+ password
+
+
+
+ password
+
+
+
+ this.closewWalletSetScreenLockPass()}">${translate("login.lp4")}
+ this.walletCheckPass()}">${translate("login.lp5")}
+
+
+
+
+
+ ${translate("sidemenu.wallets")}
+ ${translate("login.lp9")}
+ ${translate("login.lp10")}
+
+
+
password
+
+
+ ${this.walletHelperMessage}
+
+
+
+
+ this.closeWalletLockScreenActive()}">
+
+
`
}
@@ -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`
}