Skip to content

Commit ae641eb

Browse files
committed
Refactor password retrieval
1 parent 3207170 commit ae641eb

File tree

4 files changed

+82
-36
lines changed

4 files changed

+82
-36
lines changed

node_launcher/constants.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,19 @@
33
import platform
44
from typing import Dict
55

6-
NODE_LAUNCHER_RELEASE = '.'.join(map(str, (6, 0, 6)))
6+
NODE_LAUNCHER_RELEASE = '.'.join(
7+
map(
8+
str,
9+
(
10+
6,
11+
0,
12+
7
13+
)
14+
)
15+
)
716

8-
TARGET_BITCOIN_RELEASE = 'v0.18.1'
9-
TARGET_LND_RELEASE = 'v0.7.1-beta'
17+
TARGET_BITCOIN_RELEASE = 'v0.21.1'
18+
TARGET_LND_RELEASE = 'v0.13.1-beta'
1019

1120

1221
class StringConstant(object):
@@ -55,7 +64,6 @@ class OperatingSystem(StringConstant):
5564
APPDATA = os.path.abspath(os.environ.get('APPDATA', ''))
5665
PROGRAMS = os.environ.get('Programw6432', '')
5766

58-
5967
NODE_LAUNCHER_DATA_PATH: Dict[OperatingSystem, str] = {
6068
DARWIN: expanduser('~/Library/Application Support/Node Launcher/'),
6169
LINUX: expanduser('~/.node_launcher'),
@@ -80,22 +88,25 @@ class OperatingSystem(StringConstant):
8088
}
8189

8290
UPGRADE = 'Please download the latest version of the Node Launcher: ' \
83-
'<a href="https://github.com/PierreRochard/node-launcher/releases/">' \
84-
'https://github.com/PierreRochard/node-launcher/releases' \
85-
'</a>'
91+
'<a href="https://github.com/PierreRochard/node-launcher/releases/">' \
92+
'https://github.com/PierreRochard/node-launcher/releases' \
93+
'</a>'
8694

8795
GIGABYTE = 1000000000
8896

8997
if IS_WINDOWS:
9098
from keyring.backends.Windows import WinVaultKeyring
99+
91100
keyring = WinVaultKeyring()
92101

93102
if IS_MACOS:
94-
from keyring.backends.OS_X import Keyring
103+
from keyring.backends.macOS import Keyring
104+
95105
keyring = Keyring()
96106

97107
if IS_LINUX:
98108
from keyring.backends.SecretService import Keyring
109+
99110
keyring = Keyring()
100111

101112
AUTOPRUNE_GB = 150

node_launcher/gui/components/thread_worker.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import time
22

3+
import grpc
34
from PySide2.QtCore import QRunnable, Slot, QThreadPool, Signal, QObject, QTimer
45

56
import traceback, sys
@@ -68,6 +69,8 @@ def run(self):
6869
# Retrieve args/kwargs here; and fire processing using them
6970
try:
7071
result = self.fn(*self.args, **self.kwargs)
72+
except grpc.RpcError as e:
73+
self.signals.error.emit(e.args[0].details)
7174
except:
7275
traceback.print_exc()
7376
exctype, value = sys.exc_info()[:2]

node_launcher/gui/system_tray_widgets/lnd_output_widget.py

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ def process_output_line(self, line: str):
4343
QTimer.singleShot(100, self.auto_unlock_wallet)
4444
elif 'Unable to synchronize wallet to chain' in line:
4545
self.process.terminate()
46+
elif 'Started rescan from block' in line:
47+
self.system_tray.menu.lnd_status_action.setText(
48+
'LND syncing'
49+
)
4650
elif 'Unable to complete chain rescan' in line:
4751
self.process.terminate()
4852
elif 'Starting HTLC Switch' in line:
@@ -75,6 +79,11 @@ def process_output_line(self, line: str):
7579
self.old_height = new_height
7680
self.old_timestamp = new_timestamp
7781

82+
elif 'Shutdown complete' in line:
83+
self.system_tray.menu.lnd_status_action.setText(
84+
'LND has shutdown'
85+
)
86+
7887
def restart_process(self):
7988
QTimer.singleShot(3000, self.process.start)
8089

@@ -90,6 +99,10 @@ def unlock_wallet(lnd, progress_callback, password: str):
9099
details = e.details()
91100
return details
92101

102+
@property
103+
def keyring_service_name(self):
104+
return f'lnd_{self.node_set.bitcoin.network}_wallet_password'
105+
93106
def generate_seed(self, new_seed_password: str):
94107
try:
95108
generate_seed_response = self.node_set.lnd_client.generate_seed(
@@ -134,15 +147,14 @@ def handle_unlock_wallet(self, details: str):
134147
# User needs to create a new wallet
135148
elif 'wallet not found' in details:
136149
new_wallet_password = get_random_password()
137-
keyring_service_name = keyring_user_name = f'lnd_wallet_password'
138150
log.info(
139151
'create_wallet',
140-
keyring_service_name=keyring_service_name,
141-
keyring_user_name=keyring_user_name
152+
keyring_service_name=self.keyring_service_name,
153+
keyring_user_name=self.keyring_service_name
142154
)
143155
keyring.set_password(
144-
service=keyring_service_name,
145-
username=keyring_user_name,
156+
service=self.keyring_service_name,
157+
username=self.keyring_service_name,
146158
password=new_wallet_password
147159
)
148160
seed = self.generate_seed(new_wallet_password)
@@ -160,32 +172,49 @@ def handle_unlock_wallet(self, details: str):
160172
username=self.node_set.bitcoin.file['rpcuser'],
161173
password=new_wallet_password
162174
)
175+
elif 'invalid passphrase for master public key' in details:
176+
self.system_tray.menu.lnd_status_action.setText(
177+
'Invalid LND Password'
178+
)
163179
else:
164180
log.warning(
165181
'unlock_wallet failed',
166182
details=details,
167183
exc_info=True
168184
)
169185

186+
def get_password(self):
187+
passwords = []
188+
for service_name in [self.keyring_service_name, 'lnd_wallet_password']:
189+
for user_name in [self.keyring_service_name, self.node_set.bitcoin.file['rpcuser'], 'lnd_wallet_password']:
190+
log.info(
191+
'auto_unlock_wallet_get_password',
192+
keyring_service_name=service_name,
193+
keyring_user_name=user_name
194+
)
195+
password = keyring.get_password(
196+
service=service_name,
197+
username=user_name,
198+
)
199+
if password is not None:
200+
log.info(
201+
'Successfully got password from',
202+
keyring_service_name=service_name,
203+
keyring_user_name=user_name
204+
)
205+
passwords += [password]
206+
return passwords
207+
170208
def auto_unlock_wallet(self):
171-
keyring_service_name = f'lnd_{self.node_set.bitcoin.network}_wallet_password'
172-
keyring_user_name = self.node_set.bitcoin.file['rpcuser']
173-
log.info(
174-
'auto_unlock_wallet_get_password',
175-
keyring_service_name=keyring_service_name,
176-
keyring_user_name=keyring_user_name
177-
)
178-
password = keyring.get_password(
179-
service=keyring_service_name,
180-
username=keyring_user_name,
181-
)
182-
worker = Worker(
183-
fn=self.unlock_wallet,
184-
lnd=self.node_set.lnd,
185-
password=password
186-
)
187-
worker.signals.result.connect(self.handle_unlock_wallet)
188-
self.threadpool.start(worker)
209+
for password in self.get_password():
210+
worker = Worker(
211+
fn=self.unlock_wallet,
212+
lnd=self.node_set.lnd,
213+
password=password
214+
)
215+
worker.signals.result.connect(self.handle_unlock_wallet)
216+
worker.signals.error.connect(self.handle_unlock_wallet)
217+
self.threadpool.start(worker)
189218

190219
def show(self):
191220
self.showMaximized()

node_launcher/gui/system_tray_widgets/output_widget.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@ def __init__(self):
1919
self.setLayout(self.layout)
2020

2121
def handle_output(self):
22-
while self.process.canReadLine():
23-
line_bytes: QByteArray = self.process.readLine()
24-
line_str = line_bytes.data().decode('utf-8').strip()
25-
self.output.append(line_str)
26-
self.process_output_line(line_str)
22+
try:
23+
while self.process.canReadLine():
24+
line_bytes: QByteArray = self.process.readLine()
25+
line_str = line_bytes.data().decode('utf-8').strip()
26+
self.output.append(line_str)
27+
self.process_output_line(line_str)
28+
except RuntimeError:
29+
return None
2730

2831
def handle_error(self):
2932
output: QByteArray = self.process.readAllStandardError()

0 commit comments

Comments
 (0)