diff --git a/.env.example b/.env.example index 46a0215..3a312ac 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,10 @@ FLASK_APP=lnbits FLASK_ENV=development +LNBITS_WITH_ONION=0 +LNBITS_DEFAULT_WALLET_NAME="LNbits wallet" +LNBITS_FEE_RESERVE=0 + LND_API_ENDPOINT=https://mylnd.io/rest/ LND_ADMIN_MACAROON=LND_ADMIN_MACAROON LND_INVOICE_MACAROON=LND_INVOICE_MACAROON @@ -15,9 +19,7 @@ OPENNODE_ADMIN_KEY=OPENNODE_ADMIN_KEY OPENNODE_INVOICE_KEY=OPENNODE_INVOICE_KEY LNPAY_API_ENDPOINT=https://lnpay.co/v1/ +LNPAY_API_KEY=LNPAY_API_KEY LNPAY_ADMIN_KEY=LNPAY_ADMIN_KEY LNPAY_INVOICE_KEY=LNPAY_INVOICE_KEY LNPAY_READ_KEY=LNPAY_READ_KEY -LNPAY_API_KEY=LNPAY_API_KEY - -FEE_RESERVE=0 diff --git a/Pipfile b/Pipfile index 4402bde..423ac93 100644 --- a/Pipfile +++ b/Pipfile @@ -12,6 +12,8 @@ lnurl = "*" flask = "*" flask-assets = "*" flask-compress = "*" +flask-limiter = "*" +flask-seasurf = "*" flask-talisman = "*" gevent = "*" greenlet = "*" diff --git a/lnbits/__init__.py b/lnbits/__init__.py index d3179cc..5ac9c04 100644 --- a/lnbits/__init__.py +++ b/lnbits/__init__.py @@ -1,18 +1,14 @@ import importlib -import json -import requests -import uuid -from flask import Flask, redirect, render_template, request, url_for +from flask import Flask from flask_assets import Environment, Bundle from flask_compress import Compress from flask_talisman import Talisman -from lnurl import Lnurl, LnurlWithdrawResponse +from os import getenv from .core import core_app -from .db import init_databases, open_db +from .db import init_databases from .helpers import ExtensionManager, megajson -from .settings import WALLET, DEFAULT_USER_WALLET_NAME app = Flask(__name__) @@ -25,6 +21,7 @@ valid_extensions = [ext for ext in ExtensionManager().extensions if ext.is_valid Compress(app) Talisman( app, + force_https=getenv("LNBITS_WITH_ONION", 0) == 0, content_security_policy={ "default-src": [ "'self'", @@ -81,69 +78,5 @@ def init(): init_databases() -# vvvvvvvvvvvvvvvvvvvvvvvvvvv -# move the rest to `core_app` -# vvvvvvvvvvvvvvvvvvvvvvvvvvv -# vvvvvvvvvvvvvvvvvvvvvvvvvvv - - -@app.route("/lnurl") -def lnurl(): - lnurl = request.args.get("lightning") - return render_template("lnurl.html", lnurl=lnurl) - - -@app.route("/lnurlwallet") -def lnurlwallet(): - lnurl = Lnurl(request.args.get("lightning")) - r = requests.get(lnurl.url) - if not r.ok: - return redirect(url_for("home")) - - data = json.loads(r.text) - if data.get("status") == "ERROR": - return redirect(url_for("home")) - - withdraw_res = LnurlWithdrawResponse(**data) - - _, pay_hash, pay_req = WALLET.create_invoice(withdraw_res.max_sats, "LNbits lnurl funding") - - r = requests.get( - withdraw_res.callback.base, - params={**withdraw_res.callback.query_params, **{"k1": withdraw_res.k1, "pr": pay_req}}, - ) - - if not r.ok: - return redirect(url_for("home")) - data = json.loads(r.text) - - for i in range(10): - r = WALLET.get_invoice_status(pay_hash).raw_response - if not r.ok: - continue - - data = r.json() - break - - with open_db() as db: - wallet_id = uuid.uuid4().hex - user_id = uuid.uuid4().hex - wallet_name = DEFAULT_USER_WALLET_NAME - adminkey = uuid.uuid4().hex - inkey = uuid.uuid4().hex - - db.execute("INSERT INTO accounts (id) VALUES (?)", (user_id,)) - db.execute( - "INSERT INTO wallets (id, name, user, adminkey, inkey) VALUES (?, ?, ?, ?, ?)", - (wallet_id, wallet_name, user_id, adminkey, inkey), - ) - db.execute( - "INSERT INTO apipayments (payhash, amount, wallet, pending, memo) VALUES (?, ?, ?, 0, ?)", - (pay_hash, withdraw_res.max_sats * 1000, wallet_id, "LNbits lnurl funding",), - ) - - return redirect(url_for("wallet", usr=user_id, wal=wallet_id)) - - if __name__ == '__main__': app.run() diff --git a/lnbits/core/__init__.py b/lnbits/core/__init__.py index 2bff1be..a2e89d8 100644 --- a/lnbits/core/__init__.py +++ b/lnbits/core/__init__.py @@ -4,5 +4,6 @@ from flask import Blueprint core_app = Blueprint("core", __name__, template_folder="templates", static_folder="static") -from .views_api import * # noqa -from .views import * # noqa +from .views.api import * # noqa +from .views.generic import * # noqa +from .views.lnurl import * # noqa diff --git a/lnbits/core/crud.py b/lnbits/core/crud.py index 51431c8..7620ed8 100644 --- a/lnbits/core/crud.py +++ b/lnbits/core/crud.py @@ -1,7 +1,7 @@ from uuid import uuid4 from lnbits.db import open_db -from lnbits.settings import DEFAULT_USER_WALLET_NAME, FEE_RESERVE +from lnbits.settings import DEFAULT_WALLET_NAME, FEE_RESERVE from typing import List, Optional from .models import User, Wallet, Payment @@ -71,7 +71,7 @@ def create_wallet(*, user_id: str, wallet_name: Optional[str]) -> Wallet: INSERT INTO wallets (id, name, user, adminkey, inkey) VALUES (?, ?, ?, ?, ?) """, - (wallet_id, wallet_name or DEFAULT_USER_WALLET_NAME, user_id, uuid4().hex, uuid4().hex), + (wallet_id, wallet_name or DEFAULT_WALLET_NAME, user_id, uuid4().hex, uuid4().hex), ) return get_wallet(wallet_id=wallet_id) diff --git a/lnbits/core/migrations/0001_initial.py b/lnbits/core/migrations/0001_initial.py new file mode 100644 index 0000000..e69de29 diff --git a/lnbits/core/migrations/__init__.py b/lnbits/core/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lnbits/core/static/js/lnurl.js b/lnbits/core/static/js/lnurl.js new file mode 100644 index 0000000..0670460 --- /dev/null +++ b/lnbits/core/static/js/lnurl.js @@ -0,0 +1,13 @@ +new Vue({ + el: '#vue', + mixins: [windowMixin], + methods: { + notify: function () { + this.$q.notify({ + timeout: 0, + message: 'Processing...', + icon: null + }); + } + } +}); diff --git a/lnbits/core/templates/core/index.html b/lnbits/core/templates/core/index.html index 434bfbc..5f1bc47 100644 --- a/lnbits/core/templates/core/index.html +++ b/lnbits/core/templates/core/index.html @@ -15,20 +15,22 @@