@@ -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 );
0 commit comments