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-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
anchors.margins: ( isMobile ) ? 17 : 20
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
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 )
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
}
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-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-01-27 23:14:42 +00:00
wrapAnywhere: false
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
}
TextEdit {
id: keysText
wrapMode: TextEdit . Wrap
Layout.fillWidth: true ;
font.pixelSize: 14 * scaleRatio
textFormat: TextEdit . RichText
readOnly: true
2018-01-27 23:14:42 +00:00
color: Style . defaultFontColor
2017-08-07 08:48:13 +00:00
MouseArea {
anchors.fill: parent
onClicked: {
2017-11-02 06:51:15 +00:00
appWindow . showStatusMessage ( qsTr ( "Double tap to copy" ) , 3 )
}
onDoubleClicked: {
2017-08-07 08:48:13 +00:00
parent . selectAll ( )
parent . copy ( )
parent . deselect ( )
console . log ( "copied to clipboard" ) ;
2017-11-02 06:51:15 +00:00
appWindow . showStatusMessage ( qsTr ( "Keys copied to clipboard" ) , 3 )
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
}
RowLayout {
StandardButton {
enabled: ! fullWalletQRCode . visible
id: showFullQr
2018-01-27 23:14:42 +00:00
small: true
2017-08-07 08:48:13 +00:00
text: qsTr ( "Spendable Wallet" ) + translationManager . emptyString
onClicked: {
viewOnlyQRCode . visible = false
}
}
StandardButton {
enabled: fullWalletQRCode . visible
id: showViewOnlyQr
2018-01-27 23:14:42 +00:00
small: true
2017-08-07 08:48:13 +00:00
text: qsTr ( "View Only Wallet" ) + translationManager . emptyString
onClicked: {
viewOnlyQRCode . visible = true
}
}
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" ) ;
keysText . text = "<b>" + qsTr ( "Secret view key" ) + ":</b> " + currentWallet . secretViewKey
keysText . text += "<br><br><b>" + qsTr ( "Public view key" ) + ":</b> " + currentWallet . publicViewKey
keysText . text += ( ! currentWallet . viewOnly ) ? "<br><br><b>" + qsTr ( "Secret spend key" ) + ":</b> " + currentWallet.secretSpendKey : ""
keysText . text += "<br><br><b>" + qsTr ( "Public spend key" ) + ":</b> " + currentWallet . publicSpendKey
seedText . text = currentWallet . seed
if ( typeof currentWallet != "undefined" ) {
viewOnlyQRCode . source = "image://qrcode/monero:" + currentWallet . address + "?secret_view_key=" + currentWallet . secretViewKey + "&restore_height=" + currentWallet . restoreHeight
fullWalletQRCode . source = viewOnlyQRCode . source + "&secret_spend_key=" + currentWallet . secretSpendKey
if ( currentWallet . viewOnly ) {
viewOnlyQRCode . visible = true
showFullQr . visible = false
showViewOnlyQr . visible = false
seedText . text = qsTr ( "(View Only Wallet - No mnemonic seed available)" ) + translationManager . emptyString
}
}
}
// fires only once
Component.onCompleted: {
}
}