Browse Source

Black and prettier

adminvar
benarc 4 years ago
parent
commit
533ba36a1b
  1. 90
      lnbits/core/migrations.py
  2. 2
      lnbits/core/models.py
  3. 7
      lnbits/core/services.py
  4. 249
      lnbits/core/templates/core/admin.html
  5. 8
      lnbits/core/views/api.py
  6. 15
      lnbits/core/views/generic.py

90
lnbits/core/migrations.py

@ -1,10 +1,8 @@
import sqlite3
from os import getenv
from lnbits.helpers import urlsafe_short_hash
from .crud import (
create_account,
get_user,
)
from .crud import create_account, get_user
def m000_create_migrations_table(db):
db.execute(
@ -128,7 +126,6 @@ def m002_add_fields_to_apipayments(db):
pass
def m003_create_admin_table(db):
user = None
site_title = None
@ -163,7 +160,6 @@ def m003_create_admin_table(db):
if getenv("LNBITS_SERVICE_FEE"):
service_fee = getenv("LNBITS_SERVICE_FEE")
db.execute(
"""
CREATE TABLE IF NOT EXISTS admin (
@ -186,11 +182,23 @@ def m003_create_admin_table(db):
INSERT INTO admin (user, site_title, tagline, primary_color, secondary_color, allowed_users, default_wallet_name, data_folder, disabled_ext, force_https, service_fee)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
(user, site_title, tagline, primary_color, secondary_color, allowed_users, default_wallet_name, data_folder, disabled_ext, force_https, service_fee),
(
user,
site_title,
tagline,
primary_color,
secondary_color,
allowed_users,
default_wallet_name,
data_folder,
disabled_ext,
force_https,
service_fee,
),
)
def m003_create_funding_table(db):
def m003_create_funding_table(db):
# Make the funding table, if it does not already exist
@ -220,7 +228,7 @@ def m003_create_funding_table(db):
LntxbotWallet = db.fetchall("SELECT * FROM funding WHERE backend_wallet = ?", ("LntxbotWallet",))
OpenNodeWallet = db.fetchall("SELECT * FROM funding WHERE backend_wallet = ?", ("OpenNodeWallet",))
#If the funding source rows do not exist and there is data in env for them, return the data and put it in a row
# If the funding source rows do not exist and there is data in env for them, return the data and put it in a row
if getenv("CLIGHTNING_RPC") and CLightningWallet != None:
db.execute(
@ -228,7 +236,7 @@ def m003_create_funding_table(db):
INSERT INTO funding (id, backend_wallet, endpoint)
VALUES (?, ?, ?)
""",
(urlsafe_short_hash(), "CLightningWallet",getenv("CLIGHTNING_RPC")),
(urlsafe_short_hash(), "CLightningWallet", getenv("CLIGHTNING_RPC")),
)
if getenv("LNBITS_INVOICE_MACAROON") and LnbitsWallet != None:
db.execute(
@ -236,7 +244,13 @@ def m003_create_funding_table(db):
INSERT INTO funding (id, backend_wallet, endpoint, invoice_key, admin_key)
VALUES (?, ?, ?, ?, ?)
""",
(urlsafe_short_hash(), "LnbitsWallet",getenv("LNBITS_ENDPOINT"),getenv("LNBITS_INVOICE_MACAROON"),getenv("LNBITS_ADMIN_MACAROON")),
(
urlsafe_short_hash(),
"LnbitsWallet",
getenv("LNBITS_ENDPOINT"),
getenv("LNBITS_INVOICE_MACAROON"),
getenv("LNBITS_ADMIN_MACAROON"),
),
)
if getenv("LND_GRPC_ENDPOINT") and LndWallet != None:
db.execute(
@ -244,7 +258,16 @@ def m003_create_funding_table(db):
INSERT INTO funding (id, backend_wallet, endpoint, port, read_key, invoice_key, admin_key, cert)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""",
(urlsafe_short_hash(), "LndWallet",getenv("LND_GRPC_ENDPOINT"),getenv("LND_GRPC_PORT"),getenv("LND_READ_MACAROON"),getenv("LND_INVOICE_MACAROON"),getenv("LND_ADMIN_MACAROON"),getenv("LND_CERT")),
(
urlsafe_short_hash(),
"LndWallet",
getenv("LND_GRPC_ENDPOINT"),
getenv("LND_GRPC_PORT"),
getenv("LND_READ_MACAROON"),
getenv("LND_INVOICE_MACAROON"),
getenv("LND_ADMIN_MACAROON"),
getenv("LND_CERT"),
),
)
if getenv("LND_REST_ENDPOINT") and LndRestWallet != None:
@ -253,7 +276,15 @@ def m003_create_funding_table(db):
INSERT INTO funding (id, backend_wallet, endpoint, read_key, invoice_key, admin_key, cert)
VALUES (?, ?, ?, ?, ?, ?, ?)
""",
(urlsafe_short_hash(), "LndRestWallet",getenv("LND_REST_ENDPOINT"),getenv("LND_REST_READ_MACAROON"),getenv("LND_REST_INVOICE_MACAROON"),getenv("LND_REST_ADMIN_MACAROON"),getenv("LND_REST_CERT")),
(
urlsafe_short_hash(),
"LndRestWallet",
getenv("LND_REST_ENDPOINT"),
getenv("LND_REST_READ_MACAROON"),
getenv("LND_REST_INVOICE_MACAROON"),
getenv("LND_REST_ADMIN_MACAROON"),
getenv("LND_REST_CERT"),
),
)
if getenv("LNPAY_INVOICE_KEY") and LNPayWallet != None:
@ -262,7 +293,15 @@ def m003_create_funding_table(db):
INSERT INTO funding (id, backend_wallet, endpoint, read_key, invoice_key, admin_key, cert)
VALUES (?, ?, ?, ?, ?, ?, ?)
""",
(urlsafe_short_hash(), "LNPayWallet",getenv("LNPAY_API_ENDPOINT"),getenv("LNPAY_READ_KEY"),getenv("LNPAY_INVOICE_KEY"),getenv("LNPAY_ADMIN_KEY"),getenv("LNPAY_API_KEY")),
(
urlsafe_short_hash(),
"LNPayWallet",
getenv("LNPAY_API_ENDPOINT"),
getenv("LNPAY_READ_KEY"),
getenv("LNPAY_INVOICE_KEY"),
getenv("LNPAY_ADMIN_KEY"),
getenv("LNPAY_API_KEY"),
),
)
if getenv("LNTXBOT_INVOICE_KEY") and LntxbotWallet != None:
@ -271,7 +310,13 @@ def m003_create_funding_table(db):
INSERT INTO funding (id, backend_wallet, endpoint, invoice_key, admin_key)
VALUES (?, ?, ?, ?, ?)
""",
(urlsafe_short_hash(), "LntxbotWallet",getenv("LNTXBOT_API_ENDPOINT"),getenv("LNTXBOT_INVOICE_KEY"),getenv("LNTXBOT_ADMIN_KEY")),
(
urlsafe_short_hash(),
"LntxbotWallet",
getenv("LNTXBOT_API_ENDPOINT"),
getenv("LNTXBOT_INVOICE_KEY"),
getenv("LNTXBOT_ADMIN_KEY"),
),
)
if getenv("OPENNODE_INVOICE_KEY") and OpenNodeWallet != None:
@ -280,10 +325,15 @@ def m003_create_funding_table(db):
INSERT INTO funding (id, backend_wallet, endpoint, invoice_key, admin_key)
VALUES (?, ?, ?, ?, ?)
""",
(urlsafe_short_hash(), "OpenNodeWallet",getenv("OPENNODE_API_ENDPOINT"),getenv("OPENNODE_INVOICE_KEY"),getenv("OPENNODE_ADMIN_KEY")),
(
urlsafe_short_hash(),
"OpenNodeWallet",
getenv("OPENNODE_API_ENDPOINT"),
getenv("OPENNODE_INVOICE_KEY"),
getenv("OPENNODE_ADMIN_KEY"),
),
)
if getenv("LNBITS_BACKEND_WALLET_CLASS"):
db.execute(
"""
@ -291,7 +341,5 @@ def m003_create_funding_table(db):
SET active = ?
WHERE backend_wallet = ?
""",
(
1, getenv("LNBITS_BACKEND_WALLET_CLASS")
),
)
(1, getenv("LNBITS_BACKEND_WALLET_CLASS")),
)

2
lnbits/core/models.py

@ -18,6 +18,7 @@ class User(NamedTuple):
w = [wallet for wallet in self.wallets if wallet.id == wallet_id]
return w[0] if w else None
class Admin(NamedTuple):
user: str
site_title: str
@ -31,6 +32,7 @@ class Admin(NamedTuple):
force_https: bool
service_fee: int
class Funding(NamedTuple):
id: str
backend_wallet: str

7
lnbits/core/services.py

@ -15,12 +15,7 @@ from .crud import get_wallet, create_payment, delete_payment, check_internal, up
def create_invoice(
*,
wallet_id: str,
amount: int,
memo: str,
description_hash: Optional[bytes] = None,
extra: Optional[Dict] = None,
*, wallet_id: str, amount: int, memo: str, description_hash: Optional[bytes] = None, extra: Optional[Dict] = None
) -> Tuple[str, str]:
invoice_memo = None if description_hash else memo
storeable_memo = memo

249
lnbits/core/templates/core/admin.html

@ -18,7 +18,11 @@ context %} {% block page %}
-->
<div class="q-pa-md">
<q-form @submit="LaunchLNbits" @reset="cancelAdmin" class="q-gutter-md">
<q-form
@submit="LaunchLNbits"
@reset="cancelAdmin"
class="q-gutter-md"
>
<h6 class="q-my-md">Branding</h6>
<div class="row">
<div class="col">
@ -124,7 +128,12 @@ context %} {% block page %}
></q-select>
</div>
</div>
<h6 class="q-my-md">Funding source information (at least one required)<small><br/>*if installed through RaspiBlitz, MyNode, etc, details should be filled in for you</small></h6>
<h6 class="q-my-md">
Funding source information (at least one required)<small
><br />*if installed through RaspiBlitz, MyNode, etc, details
should be filled in for you</small
>
</h6>
<q-list bordered class="rounded-borders">
<q-expansion-item
@ -318,7 +327,11 @@ context %} {% block page %}
</q-card>
</q-expansion-item>
<q-expansion-item expand-separator icon="payments" :label="data.lnpay.label">
<q-expansion-item
expand-separator
icon="payments"
:label="data.lnpay.label"
>
<q-card>
<q-card-section>
<div class="row">
@ -361,7 +374,11 @@ context %} {% block page %}
</q-card>
</q-expansion-item>
<q-expansion-item expand-separator icon="payments" :label="data.lnbits.label">
<q-expansion-item
expand-separator
icon="payments"
:label="data.lnbits.label"
>
<q-card>
<q-card-section>
<div class="row">
@ -435,7 +452,7 @@ context %} {% block page %}
color="deep-purple"
></q-btn>
<q-btn
v-if="cancel.on"
v-if="cancel.on"
label="Cancel"
type="reset"
color="primary"
@ -471,16 +488,16 @@ context %} {% block page %}
</div>
{% endblock %} {% block scripts %} {{ window_vars(funding) }}
<script>
const queryString = window.location.search
const urlParams = new URLSearchParams(queryString)
const usr = urlParams.get('usr')
const queryString = window.location.search
const urlParams = new URLSearchParams(queryString)
const usr = urlParams.get('usr')
new Vue({
el: '#vue',
mixins: [windowMixin],
data: function () {
return {
cancel: {},
data: {
cancel: {},
data: {
admin: {},
clightning: {endpoint: ''},
lndrest: {endpoint: '', invoice: '', read: '', admin: '', cert: ''},
@ -496,7 +513,7 @@ const usr = urlParams.get('usr')
lnpay: {endpoint: '', invoice: '', read: '', admin: '', cert: ''},
lnbits: {endpoint: '', invoice: '', read: '', admin: ''},
opennode: {invoice: '', read: '', admin: ''}
},
},
options: [
'lnurlw',
@ -513,122 +530,120 @@ const usr = urlParams.get('usr')
},
created: function () {
var self = this
self.data.admin.user = '{{ admin_user }}',
self.data.admin.allowed_users ='',
self.data.admin.site_title ='{{admin.site_title}}',
self.data.admin.tagline = '{{admin.tagline}}',
self.data.admin.primary_color = '{{admin.primary_color}}',
self.data.admin.secondary_color = '{{admin.secondary_color}}',
self.data.admin.service_fee = parseInt('{{admin.service_fee}}'),
self.data.admin.default_wallet_name = '{{admin.default_wallet_name}}',
self.data.admin.data_folder = '{{admin.data_folder}}',
self.data.admin.disabled_ext = '{{admin.disabled_ext}}'.split(",")
;(self.data.admin.user = '{{ admin_user }}'),
(self.data.admin.allowed_users = ''),
(self.data.admin.site_title = '{{admin.site_title}}'),
(self.data.admin.tagline = '{{admin.tagline}}'),
(self.data.admin.primary_color = '{{admin.primary_color}}'),
(self.data.admin.secondary_color = '{{admin.secondary_color}}'),
(self.data.admin.service_fee = parseInt('{{admin.service_fee}}')),
(self.data.admin.default_wallet_name = '{{admin.default_wallet_name}}'),
(self.data.admin.data_folder = '{{admin.data_folder}}'),
(self.data.admin.disabled_ext = '{{admin.disabled_ext}}'.split(','))
if (usr != null){
self.cancel.on = true
}
if (usr != null) {
self.cancel.on = true
}
funding = JSON.parse('{{ funding | tojson }}')
self.data.lndrest.label = 'LND REST'
self.data.clightning.label = 'CLightning GRPC'
self.data.lndgrpc.label = 'LND GRPC'
self.data.lntxbot.label = 'LNTXBOT'
self.data.lnpay.label = 'LNpay'
self.data.lnbits.label = 'LNbits'
self.data.opennode.label = 'Opennode'
var i;
for (i = 0; i < funding.length; i++) {
if (funding[i][1] == "CLightningWallet"){
self.data.clightning.endpoint = funding[i][2]
if(funding[i][8] == 1){
self.data.clightning.label = 'CLightning GRPC (main funding source)'
}
}
if (funding[i][1] == "LndRestWallet"){
self.data.lndrest.endpoint = funding[i][2]
self.data.lndrest.read = funding[i][4]
self.data.lndrest.invoice = funding[i][5]
self.data.lndrest.admin = funding[i][6]
self.data.lndrest.cert = funding[i][7]
if(funding[i][8] == 1){
self.data.lndrest.label = 'LND REST (main funding source)'
}
}
if (funding[i][1] == "LndWallet"){
self.data.lndgrpc.endpoint = funding[i][2]
self.data.lndgrpc.port = funding[i][3]
self.data.lndgrpc.read = funding[i][4]
self.data.lndgrpc.invoice = funding[i][5]
self.data.lndgrpc.admin = funding[i][6]
self.data.lndgrpc.cert = funding[i][7]
if(funding[i][8] == 1){
self.data.lndgrpc.label = 'LND GRPC (main funding source)'
}
}
if (funding[i][1] == "LntxbotWallet"){
self.data.lntxbot.invoice = funding[i][5]
self.data.lntxbot.admin = funding[i][6]
if(funding[i][8] == 1){
self.data.lntxbot.label = 'LNTXBOT (main funding source)'
}
}
if (funding[i][1] == "LNPayWallet"){
self.data.lnpay.read = funding[i][4]
self.data.lnpay.invoice = funding[i][5]
self.data.lnpay.admin = funding[i][6]
self.data.lnpay.cert = funding[i][7]
if(funding[i][8] == 1){
self.data.lnpay.label = 'LNpay (main funding source)'
}
}
if (funding[i][1] == "LnbitsWallet"){
self.data.lnbits.endpoint = funding[i][2]
self.data.lnbits.read = funding[i][4]
self.data.lnbits.invoice = funding[i][5]
self.data.lnbits.admin = funding[i][6]
if(funding[i][8] == 1){
self.data.lnbits.label = 'LNbits (main funding source)'
}
}
if (funding[i][1] == "OpenNodeWallet"){
self.data.opennode.read = funding[i][4]
self.data.opennode.invoice = funding[i][5]
self.data.opennode.admin = funding[i][6]
if(funding[i][8] == 1){
self.data.opennode.label = 'Opennode (main funding source)'
}
}
self.data.clightning.label = 'CLightning GRPC'
self.data.lndgrpc.label = 'LND GRPC'
self.data.lntxbot.label = 'LNTXBOT'
self.data.lnpay.label = 'LNpay'
self.data.lnbits.label = 'LNbits'
self.data.opennode.label = 'Opennode'
var i
for (i = 0; i < funding.length; i++) {
if (funding[i][1] == 'CLightningWallet') {
self.data.clightning.endpoint = funding[i][2]
if (funding[i][8] == 1) {
self.data.clightning.label = 'CLightning GRPC (main funding source)'
}
}
if (funding[i][1] == 'LndRestWallet') {
self.data.lndrest.endpoint = funding[i][2]
self.data.lndrest.read = funding[i][4]
self.data.lndrest.invoice = funding[i][5]
self.data.lndrest.admin = funding[i][6]
self.data.lndrest.cert = funding[i][7]
if (funding[i][8] == 1) {
self.data.lndrest.label = 'LND REST (main funding source)'
}
}
if (funding[i][1] == 'LndWallet') {
self.data.lndgrpc.endpoint = funding[i][2]
self.data.lndgrpc.port = funding[i][3]
self.data.lndgrpc.read = funding[i][4]
self.data.lndgrpc.invoice = funding[i][5]
self.data.lndgrpc.admin = funding[i][6]
self.data.lndgrpc.cert = funding[i][7]
if (funding[i][8] == 1) {
self.data.lndgrpc.label = 'LND GRPC (main funding source)'
}
}
if (funding[i][1] == 'LntxbotWallet') {
self.data.lntxbot.invoice = funding[i][5]
self.data.lntxbot.admin = funding[i][6]
if (funding[i][8] == 1) {
self.data.lntxbot.label = 'LNTXBOT (main funding source)'
}
}
if (funding[i][1] == 'LNPayWallet') {
self.data.lnpay.read = funding[i][4]
self.data.lnpay.invoice = funding[i][5]
self.data.lnpay.admin = funding[i][6]
self.data.lnpay.cert = funding[i][7]
if (funding[i][8] == 1) {
self.data.lnpay.label = 'LNpay (main funding source)'
}
}
if (funding[i][1] == 'LnbitsWallet') {
self.data.lnbits.endpoint = funding[i][2]
self.data.lnbits.read = funding[i][4]
self.data.lnbits.invoice = funding[i][5]
self.data.lnbits.admin = funding[i][6]
}
if (funding[i][8] == 1) {
self.data.lnbits.label = 'LNbits (main funding source)'
}
}
if (funding[i][1] == 'OpenNodeWallet') {
self.data.opennode.read = funding[i][4]
self.data.opennode.invoice = funding[i][5]
self.data.opennode.admin = funding[i][6]
if (funding[i][8] == 1) {
self.data.opennode.label = 'Opennode (main funding source)'
}
}
}
},
methods: {
createWallet: function () {
LNbits.href.createWallet(this.walletName)
},
LaunchLNbits: function () {
var self = this
var data = self.data
data.admin.disabled_ext = data.admin.disabled_ext.toString()
console.log(data.admin.disabled_ext)
LNbits.api
.request('POST', '/api/v1/admin', "wallet.inkey",
data.admin)
.then(function (response) {
console.log(response.data)
window.location.href = "/wallet?usr=" + response.data[0]
})
.catch(function (error) {
LNbits.utils.notifyApiError(error)
})
},
cancelAdmin: function () {
if (usr != null){
window.location.href = "/wallet?usr=" + usr
}
},
var self = this
var data = self.data
data.admin.disabled_ext = data.admin.disabled_ext.toString()
console.log(data.admin.disabled_ext)
LNbits.api
.request('POST', '/api/v1/admin', 'wallet.inkey', data.admin)
.then(function (response) {
console.log(response.data)
window.location.href = '/wallet?usr=' + response.data[0]
})
.catch(function (error) {
LNbits.utils.notifyApiError(error)
})
},
cancelAdmin: function () {
if (usr != null) {
window.location.href = '/wallet?usr=' + usr
}
},
processing: function () {
this.$q.notify({

8
lnbits/core/views/api.py

@ -135,8 +135,7 @@ def api_update_balance():
@core_app.route("/api/v1/admin", methods=["POST"])
@api_validate_post_request(
schema={
schema={
"user": {"type": "string", "empty": False, "required": True},
"site_title": {"type": "string", "empty": False, "required": True},
"tagline": {"type": "string", "empty": False, "required": True},
@ -147,7 +146,8 @@ def api_update_balance():
"data_folder": {"type": "string", "empty": False, "required": True},
"disabled_ext": {"type": "string", "empty": False, "required": True},
"service_fee": {"type": "integer", "min": 0, "max": 90, "required": True},
})
}
)
def api_admin():
admin = get_admin(None)
@ -159,4 +159,4 @@ def api_admin():
if not account:
return jsonify({"message": "Admin doesnt exist and neither do you!"}), HTTPStatus.FORBIDDEN
admin = get_admin(**g.data)
return jsonify(admin)
return jsonify(admin)

15
lnbits/core/views/generic.py

@ -6,15 +6,7 @@ from lnbits.core import core_app
from lnbits.decorators import check_user_exists, validate_uuids
from lnbits.settings import LNBITS_ALLOWED_USERS, SERVICE_FEE, LNBITS_ADMIN_USERS
from ..crud import (
create_account,
get_user,
get_admin,
get_funding,
update_user_extension,
create_wallet,
delete_wallet,
)
from ..crud import create_account, get_user, get_admin, get_funding, update_user_extension, create_wallet, delete_wallet
@core_app.route("/favicon.ico")
@ -103,6 +95,7 @@ def deletewallet():
return redirect(url_for("core.home"))
@core_app.route("/admin")
def admin_setup():
user_id = request.args.get("usr", type=str)
@ -114,8 +107,8 @@ def admin_setup():
admin_user = get_user(create_account().id).id
else:
admin_user = admin[0]
if admin.user != None and admin.user != user_id:
abort(HTTPStatus.FORBIDDEN, "Admin only")
return render_template("core/admin.html", admin=admin, funding=funding, admin_user=admin_user)
return render_template("core/admin.html", admin=admin, funding=funding, admin_user=admin_user)

Loading…
Cancel
Save