2018-01-07 05:20:45 +00:00
// Copyright (c) 2014-2018, The Monero Project
2017-08-07 08:48:13 +00:00
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import QtQuick 2.0
import QtQuick . Controls 1.4
import QtQuick . Controls . Styles 1.4
import QtQuick . Layouts 1.1
import QtQuick . Dialogs 1.2
2018-01-27 23:14:42 +00:00
import moneroComponents . Clipboard 1.0
2017-08-07 08:48:13 +00:00
import "../version.js" as Version
import "../components"
2018-01-27 23:14:42 +00:00
import "." 1.0
2017-08-07 08:48:13 +00:00
Rectangle {
property bool viewOnly: false
id: page
2018-11-29 08:42:13 +00:00
property int keysHeight: mainLayout . height + 100 * scaleRatio // Ensure sufficient height for QR code, even in minimum width window case.
2017-08-07 08:48:13 +00:00
2018-01-27 23:14:42 +00:00
color: "transparent"
2017-08-07 08:48:13 +00:00
Clipboard { id: clipboard }
ColumnLayout {
id: mainLayout
2018-01-27 23:14:42 +00:00
2017-08-07 08:48:13 +00:00
anchors.left: parent . left
anchors.top: parent . top
anchors.right: parent . right
2018-01-27 23:14:42 +00:00
2018-12-08 15:55:29 +00:00
anchors.margins: ( isMobile ) ? 17 * scaleRatio : 20 * scaleRatio
2018-01-27 23:14:42 +00:00
anchors.topMargin: 40 * scaleRatio
spacing: 30 * scaleRatio
2017-08-07 08:48:13 +00:00
Layout.fillWidth: true
2018-03-31 12:57:00 +00:00
RowLayout {
// TODO: Move the warning box to its own component, so it can be used in multiple places
visible: warningText . text !== ""
Rectangle {
id: statusRect
Layout.preferredHeight: warningText . height + 26
Layout.fillWidth: true
radius: 2
border.color: Qt . rgba ( 255 , 255 , 255 , 0.25 )
border.width: 1
color: "transparent"
GridLayout {
Layout.fillWidth: true
Layout.preferredHeight: warningText . height + 40
Image {
Layout.alignment: Qt . AlignVCenter
Layout.preferredHeight: 33
Layout.preferredWidth: 33
Layout.leftMargin: 10
Layout.topMargin: 10
source: "../images/warning.png"
}
Text {
id: warningText
Layout.topMargin: 12 * scaleRatio
Layout.preferredWidth: statusRect . width - 80
Layout.leftMargin: 6
2018-06-26 10:28:31 +00:00
text: qsTr ( "WARNING: Do not reuse your Monero keys on another fork, UNLESS this fork has key reuse mitigations built in. Doing so will harm your privacy." ) + translationManager . emptyString
2018-03-31 12:57:00 +00:00
wrapMode: Text . Wrap
font.family: Style . fontRegular . name
font.pixelSize: 15 * scaleRatio
color: Style . defaultFontColor
textFormat: Text . RichText
onLinkActivated: {
appWindow . startDaemon ( appWindow . persistentSettings . daemonFlags ) ;
}
}
}
}
}
2017-08-07 08:48:13 +00:00
//! Manage wallet
ColumnLayout {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
2017-08-07 08:48:13 +00:00
Label {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
fontSize: 22 * scaleRatio
Layout.topMargin: 10 * scaleRatio
2017-08-07 08:48:13 +00:00
text: qsTr ( "Mnemonic seed" ) + translationManager . emptyString
}
2018-12-14 01:05:36 +00:00
2017-08-07 08:48:13 +00:00
Rectangle {
Layout.fillWidth: true
2018-12-14 01:05:36 +00:00
height: 2 * scaleRatio
2018-01-27 23:14:42 +00:00
color: Style . dividerColor
opacity: Style . dividerOpacity
Layout.bottomMargin: 10 * scaleRatio
2017-08-07 08:48:13 +00:00
}
2018-01-27 23:14:42 +00:00
2018-12-14 01:05:36 +00:00
Rectangle {
id: warningTextRec
Layout.preferredHeight: warningTextSeed . height + 26 * scaleRatio
Layout.fillWidth: true
radius: 2 * scaleRatio
border.color: Qt . rgba ( 255 , 255 , 255 , 0.25 )
border.width: 1 * scaleRatio
color: "transparent"
GridLayout {
Layout.fillWidth: true
Layout.preferredHeight: warningTextSeed . height + 40 * scaleRatio
Image {
Layout.alignment: Qt . AlignVCenter
Layout.preferredHeight: 33 * scaleRatio
Layout.preferredWidth: 33 * scaleRatio
Layout.leftMargin: 10 * scaleRatio
Layout.topMargin: 10 * scaleRatio
source: "../images/warning.png"
}
Text {
id: warningTextSeed
Layout.topMargin: 12 * scaleRatio
Layout.preferredWidth: statusRect . width - 80 * scaleRatio
Layout.leftMargin: 6 * scaleRatio
text: qsTr ( "WARNING: Copying your seed to clipboard can expose you to malicious software, which may record your seed and steal your Monero. Please write down your seed manually." ) + translationManager . emptyString
wrapMode: Text . Wrap
font.family: Style . fontRegular . name
font.pixelSize: 15 * scaleRatio
color: Style . defaultFontColor
textFormat: Text . RichText
}
}
}
2018-01-27 23:14:42 +00:00
LineEditMulti {
2017-08-07 08:48:13 +00:00
id: seedText
2018-01-27 23:14:42 +00:00
spacing: 0
copyButton: true
addressValidation: false
2017-08-07 08:48:13 +00:00
readOnly: true
2018-07-18 13:00:53 +00:00
wrapMode: Text . WordWrap
fontColor: "white"
2017-08-07 08:48:13 +00:00
}
}
ColumnLayout {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
2017-08-07 08:48:13 +00:00
Label {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
fontSize: 22 * scaleRatio
Layout.topMargin: 10 * scaleRatio
2017-08-07 08:48:13 +00:00
text: qsTr ( "Keys" ) + translationManager . emptyString
}
Rectangle {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
height: 2
color: Style . dividerColor
opacity: Style . dividerOpacity
Layout.bottomMargin: 10 * scaleRatio
2017-08-07 08:48:13 +00:00
}
2018-06-19 03:58:30 +00:00
LineEdit {
Layout.fillWidth: true
id: secretViewKey
2017-08-07 08:48:13 +00:00
readOnly: true
2018-06-19 03:58:30 +00:00
copyButton: true
labelText: qsTr ( "Secret view key" ) + translationManager . emptyString
fontSize: 16 * scaleRatio
}
LineEdit {
Layout.fillWidth: true
Layout.topMargin: 25 * scaleRatio
id: publicViewKey
readOnly: true
copyButton: true
labelText: qsTr ( "Public view key" ) + translationManager . emptyString
fontSize: 16 * scaleRatio
}
LineEdit {
Layout.fillWidth: true
Layout.topMargin: 25 * scaleRatio
id: secretSpendKey
readOnly: true
copyButton: true
labelText: qsTr ( "Secret spend key" ) + translationManager . emptyString
fontSize: 16 * scaleRatio
}
LineEdit {
Layout.fillWidth: true
Layout.topMargin: 25 * scaleRatio
id: publicSpendKey
readOnly: true
copyButton: true
labelText: qsTr ( "Public spend key" ) + translationManager . emptyString
fontSize: 16 * scaleRatio
2017-08-07 08:48:13 +00:00
}
}
ColumnLayout {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
2017-08-07 08:48:13 +00:00
Label {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
fontSize: 22 * scaleRatio
Layout.topMargin: 10 * scaleRatio
2017-08-07 08:48:13 +00:00
text: qsTr ( "Export wallet" ) + translationManager . emptyString
}
Rectangle {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
height: 2
color: Style . dividerColor
opacity: Style . dividerOpacity
Layout.bottomMargin: 10 * scaleRatio
2017-08-07 08:48:13 +00:00
}
2018-06-06 21:01:30 +00:00
ColumnLayout {
RadioButton {
2017-08-07 08:48:13 +00:00
id: showFullQr
2018-06-06 21:01:30 +00:00
enabled: ! this . checked
checked: fullWalletQRCode . visible
2017-08-07 08:48:13 +00:00
text: qsTr ( "Spendable Wallet" ) + translationManager . emptyString
onClicked: {
viewOnlyQRCode . visible = false
2018-06-06 21:01:30 +00:00
showViewOnlyQr . checked = false
2017-08-07 08:48:13 +00:00
}
}
2018-06-06 21:01:30 +00:00
RadioButton {
enabled: ! this . checked
2017-08-07 08:48:13 +00:00
id: showViewOnlyQr
2018-06-06 21:01:30 +00:00
checked: viewOnlyQRCode . visible
2017-08-07 08:48:13 +00:00
text: qsTr ( "View Only Wallet" ) + translationManager . emptyString
onClicked: {
viewOnlyQRCode . visible = true
2018-06-06 21:01:30 +00:00
showFullQr . checked = false
2017-08-07 08:48:13 +00:00
}
}
Layout.bottomMargin: 30 * scaleRatio
}
Image {
visible: ! viewOnlyQRCode . visible
id: fullWalletQRCode
Layout.fillWidth: true
Layout.minimumHeight: 180 * scaleRatio
smooth: false
fillMode: Image . PreserveAspectFit
}
Image {
visible: false
id: viewOnlyQRCode
Layout.fillWidth: true
Layout.minimumHeight: 180 * scaleRatio
smooth: false
fillMode: Image . PreserveAspectFit
}
Text {
Layout.fillWidth: true
font.bold: true
font.pixelSize: 16 * scaleRatio
2018-03-21 22:58:51 +00:00
color: Style . defaultFontColor
2017-08-07 08:48:13 +00:00
text: ( viewOnlyQRCode . visible ) ? qsTr ( "View Only Wallet" ) + translationManager.emptyString : qsTr ( "Spendable Wallet" ) + translationManager . emptyString
horizontalAlignment: Text . AlignHCenter
}
}
}
// fires on every page load
function onPageCompleted ( ) {
console . log ( "keys page loaded" ) ;
2018-06-19 03:58:30 +00:00
secretViewKey . text = currentWallet . secretViewKey
publicViewKey . text = currentWallet . publicViewKey
secretSpendKey . text = ( ! currentWallet . viewOnly ) ? currentWallet.secretSpendKey : ""
publicSpendKey . text = currentWallet . publicSpendKey
2017-08-07 08:48:13 +00:00
seedText . text = currentWallet . seed
if ( typeof currentWallet != "undefined" ) {
2018-11-29 01:17:15 +00:00
viewOnlyQRCode . source = "image://qrcode/monero_wallet:" + currentWallet . address ( 0 , 0 ) + "?view_key=" + currentWallet . secretViewKey + "&height=" + currentWallet . walletCreationHeight
fullWalletQRCode . source = viewOnlyQRCode . source + "&spend_key=" + currentWallet . secretSpendKey
2017-08-07 08:48:13 +00:00
if ( currentWallet . viewOnly ) {
viewOnlyQRCode . visible = true
showFullQr . visible = false
showViewOnlyQr . visible = false
2018-12-21 00:27:30 +00:00
seedText . text = qsTr ( "(View Only Wallet - No mnemonic seed available)" ) + translationManager . emptyString
secretSpendKey . text = qsTr ( "(View Only Wallet - No secret spend key available)" ) + translationManager . emptyString
2017-08-07 08:48:13 +00:00
}
}
}
// fires only once
Component.onCompleted: {
}
}