Skip to content

Commit 488049e

Browse files
committed
wizard: support key-based monero-wallet restore QR codes
1 parent 6026e0a commit 488049e

3 files changed

Lines changed: 47 additions & 2 deletions

File tree

components/QRCodeScanner.qml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,41 @@ Rectangle {
4545
state: "Stopped"
4646

4747
signal qrcode_decoded(string address, string payment_id, string amount, string tx_description, string recipient_name, var extra_parameters)
48+
property bool walletRestoreMode: false
49+
50+
function parseWalletRestoreUri(data) {
51+
var prefix = ""
52+
if (data.indexOf("monero-wallet:") === 0)
53+
prefix = "monero-wallet:"
54+
else if (data.indexOf("monero_wallet:") === 0)
55+
prefix = "monero_wallet:"
56+
else
57+
return null
58+
59+
var queryOffset = data.indexOf("?")
60+
var address = data.substring(prefix.length, queryOffset < 0 ? data.length : queryOffset)
61+
if (!walletManager.addressValid(address, appWindow.persistentSettings.nettype))
62+
return null
63+
64+
var params = {}
65+
if (queryOffset >= 0) {
66+
var items = data.substring(queryOffset + 1).split("&")
67+
for (var index = 0; index < items.length; ++index) {
68+
var separator = items[index].indexOf("=")
69+
if (separator < 0)
70+
continue
71+
var name = decodeURIComponent(items[index].substring(0, separator))
72+
var value = decodeURIComponent(items[index].substring(separator + 1))
73+
if (name === "view_key")
74+
params.secret_view_key = value
75+
else if (name === "spend_key")
76+
params.secret_spend_key = value
77+
else if (name === "height")
78+
params.restore_height = value
79+
}
80+
}
81+
return { "address": address, "extra_parameters": params }
82+
}
4883

4984
states: [
5085
State {
@@ -67,6 +102,7 @@ Rectangle {
67102
root.visible = false
68103
finder.enabled = false
69104
camera.cameraState = Camera.UnloadedState
105+
root.walletRestoreMode = false
70106
}
71107
}
72108
}
@@ -86,6 +122,12 @@ Rectangle {
86122
id : finder
87123
objectName: "QrFinder"
88124
onDecoded : {
125+
var walletRestore = root.walletRestoreMode ? root.parseWalletRestoreUri(data) : null
126+
if (walletRestore !== null) {
127+
root.qrcode_decoded(walletRestore.address, "", "", "", "", walletRestore.extra_parameters)
128+
root.state = "Stopped"
129+
return
130+
}
89131
const parsed = walletManager.parse_uri_to_object(data);
90132
if (!parsed.error) {
91133
root.qrcode_decoded(parsed.address, parsed.payment_id, parsed.amount, parsed.tx_description, parsed.recipient_name, parsed.extra_parameters);

pages/Keys.qml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ Rectangle {
281281
seedText.text = currentWallet.seed === "" ? qsTr("Mnemonic seed protected by hardware device.") + translationManager.emptyString : currentWallet.seed
282282

283283
if(typeof currentWallet != "undefined") {
284-
viewOnlyQRCode.source = "image://qrcode/monero_wallet:" + currentWallet.address(0, 0) + "?view_key="+currentWallet.secretViewKey+"&height="+currentWallet.walletCreationHeight
284+
viewOnlyQRCode.source = "image://qrcode/monero-wallet:" + currentWallet.address(0, 0) + "?view_key="+currentWallet.secretViewKey+"&height="+currentWallet.walletCreationHeight
285285
fullWalletQRCode.source = viewOnlyQRCode.source +"&spend_key="+currentWallet.secretSpendKey
286286

287287
if(currentWallet.viewOnly) {

wizard/WizardRestoreWallet1.qml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ Rectangle {
7575
restoreHeight.text = typeof params.restore_height != "undefined" ? params.restore_height : "";
7676

7777
cameraUi.qrcode_decoded.disconnect(updateFromQrCode);
78+
cameraUi.walletRestoreMode = false;
7879
}
7980

8081
function verifyFromKeys() {
@@ -172,8 +173,10 @@ Rectangle {
172173
seedRadioButton.checked = false;
173174
keysRadioButton.checked = false;
174175
wizardController.walletRestoreMode = 'qr';
175-
cameraUi.state = "Capture";
176+
cameraUi.walletRestoreMode = true;
177+
cameraUi.qrcode_decoded.disconnect(updateFromQrCode);
176178
cameraUi.qrcode_decoded.connect(updateFromQrCode);
179+
cameraUi.state = "Capture";
177180
}
178181
}
179182
}

0 commit comments

Comments
 (0)