mirror of
https://git.wownero.com/lza_menace/wowstash.git
synced 2024-08-15 00:33:15 +00:00
refactor container start process, setup wallet secrets
This commit is contained in:
parent
d018d375bc
commit
bb6997e7a4
4 changed files with 69 additions and 21 deletions
|
@ -39,6 +39,10 @@ def dashboard():
|
|||
username=current_user.id,
|
||||
password=current_user.wallet_password
|
||||
)
|
||||
if not docker.container_exists(current_user.wallet_container):
|
||||
current_user.clear_wallet_data()
|
||||
return redirect(url_for('wallet.loading'))
|
||||
|
||||
if not wallet.connected:
|
||||
return redirect(url_for('wallet.loading'))
|
||||
|
||||
|
@ -51,6 +55,9 @@ def dashboard():
|
|||
qr_uri = f'wownero:{address}?tx_description={current_user.email}'
|
||||
address_qr = qrcode_make(qr_uri).save(_address_qr)
|
||||
qrcode = b64encode(_address_qr.getvalue()).decode()
|
||||
seed = wallet.seed()
|
||||
spend_key = wallet.spend_key()
|
||||
view_key = wallet.view_key()
|
||||
return render_template(
|
||||
'wallet/dashboard.html',
|
||||
transfers=all_transfers,
|
||||
|
@ -58,7 +65,10 @@ def dashboard():
|
|||
address=address,
|
||||
qrcode=qrcode,
|
||||
send_form=send_form,
|
||||
user=current_user
|
||||
user=current_user,
|
||||
seed=seed,
|
||||
spend_key=spend_key,
|
||||
view_key=view_key,
|
||||
)
|
||||
|
||||
@wallet_bp.route('/wallet/connect')
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
from docker import from_env, APIClient
|
||||
from docker.errors import NotFound
|
||||
from docker.errors import NotFound, NullResource, APIError
|
||||
from socket import socket
|
||||
from wowstash import config
|
||||
from wowstash.models import User
|
||||
|
@ -42,6 +42,7 @@ class Docker(object):
|
|||
|
||||
def start_wallet(self, user_id):
|
||||
u = User.query.get(user_id)
|
||||
container_name = f'start_wallet_{u.id}'
|
||||
command = f"""wownero-wallet-rpc \
|
||||
--non-interactive \
|
||||
--rpc-bind-port {self.listen_port} \
|
||||
|
@ -54,24 +55,29 @@ class Docker(object):
|
|||
--daemon-login {config.DAEMON_USER}:{config.DAEMON_PASS} \
|
||||
--log-file /wallet/{u.id}-rpc.log
|
||||
"""
|
||||
container = self.client.containers.run(
|
||||
self.wownero_image,
|
||||
command=command,
|
||||
auto_remove=True,
|
||||
name=f'start_wallet_{u.id}',
|
||||
remove=True,
|
||||
detach=True,
|
||||
ports={
|
||||
f'{self.listen_port}/tcp': ('127.0.0.1', None)
|
||||
},
|
||||
volumes={
|
||||
f'{self.wallet_dir}/{u.id}': {
|
||||
'bind': '/wallet',
|
||||
'mode': 'rw'
|
||||
try:
|
||||
container = self.client.containers.run(
|
||||
self.wownero_image,
|
||||
command=command,
|
||||
auto_remove=True,
|
||||
name=container_name,
|
||||
remove=True,
|
||||
detach=True,
|
||||
ports={
|
||||
f'{self.listen_port}/tcp': ('127.0.0.1', None)
|
||||
},
|
||||
volumes={
|
||||
f'{self.wallet_dir}/{u.id}': {
|
||||
'bind': '/wallet',
|
||||
'mode': 'rw'
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
return container.short_id
|
||||
)
|
||||
return container.short_id
|
||||
except APIError as e:
|
||||
if str(e).startswith('409'):
|
||||
container = self.client.containers.get(container_name)
|
||||
return container.short_id
|
||||
|
||||
def get_port(self, container_id):
|
||||
client = APIClient()
|
||||
|
@ -85,6 +91,8 @@ class Docker(object):
|
|||
return True
|
||||
except NotFound:
|
||||
return False
|
||||
except NullResource:
|
||||
return False
|
||||
|
||||
def stop_container(self, container_id):
|
||||
if self.container_exists(container_id):
|
||||
|
|
|
@ -49,6 +49,15 @@ class Wallet(JSONRPC):
|
|||
def height(self):
|
||||
return self.make_rpc('get_height', {})
|
||||
|
||||
def spend_key(self):
|
||||
return self.make_rpc('query_key', {'key_type': 'spend_key'})['key']
|
||||
|
||||
def view_key(self):
|
||||
return self.make_rpc('query_key', {'key_type': 'view_key'})['key']
|
||||
|
||||
def seed(self):
|
||||
return self.make_rpc('query_key', {'key_type': 'mnemonic'})['key']
|
||||
|
||||
def new_address(self, account_index=0, label=None):
|
||||
data = {'account_index': account_index, 'label': label}
|
||||
_address = self.make_rpc('create_address', data)
|
||||
|
|
|
@ -20,10 +20,13 @@
|
|||
<p class="inline">{{ balances[1] | from_atomic }} WOW ({{ balances[0] | from_atomic }} locked)</p>
|
||||
<span class="dashboard-buttons">
|
||||
<div class="col-sm-6 dashboard-button">
|
||||
<a class="btn btn-lg btn-link btn-outline btn-xl js-scroll-trigger" href="#transfers">List</a>
|
||||
<a class="btn btn-lg btn-link btn-outline btn-xl js-scroll-trigger" href="#transfers">See Txes</a>
|
||||
</div>
|
||||
<div class="col-sm-6 dashboard-button">
|
||||
<a class="btn btn-lg btn-link btn-outline btn-xl js-scroll-trigger" href="#send">Send</a>
|
||||
<a class="btn btn-lg btn-link btn-outline btn-xl js-scroll-trigger" href="#send">Send Tx</a>
|
||||
</div>
|
||||
<div class="col-sm-6 dashboard-button">
|
||||
<a class="btn btn-lg btn-link btn-outline btn-xl js-scroll-trigger" href="#secrets">See Secrets</a>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
|
@ -96,6 +99,24 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class="section1" id="secrets">
|
||||
<div class="container">
|
||||
<div class="section-heading text-center">
|
||||
<h2>Secrets</h2>
|
||||
<p>You need to save the secrets below; write them down on a physical medium and keep it in a safe location. These can be used to restore your funds to another device in the future.</p>
|
||||
<hr><br>
|
||||
<h3>Mnemonic Seed</h3>
|
||||
<p class="small">{{ seed }}</p>
|
||||
<br>
|
||||
<h3>Spend Key</h3>
|
||||
<p class="small">{{ spend_key }}</p>
|
||||
<br>
|
||||
<h3>View Key</h3>
|
||||
<p class="small">{{ view_key }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{% include 'footer.html' %}
|
||||
|
||||
{% include 'scripts.html' %}
|
||||
|
|
Loading…
Reference in a new issue