diff --git a/lnbits/extensions/admin/crud.py b/lnbits/extensions/admin/crud.py index e14ad1949..dd39e8e42 100644 --- a/lnbits/extensions/admin/crud.py +++ b/lnbits/extensions/admin/crud.py @@ -39,6 +39,18 @@ async def get_admin() -> Admin: row = await db.fetchone("SELECT * FROM admin") return Admin(**row) if row else None +async def update_funding(data: Funding) -> Funding: + await db.execute( + """ + UPDATE funding + SET backend_wallet = ?, endpoint = ?, port = ?, read_key = ?, invoice_key = ?, admin_key = ?, cert = ?, balance = ?, selected = ? + WHERE id = ? + """, + (data.backend_wallet, data.endpoint, data.port, data.read_key, data.invoice_key, data.admin_key, data.cert, data.balance, data.selected, data.id,), + ) + row = await db.fetchone('SELECT * FROM funding WHERE "id" = ?', (data.id,)) + assert row, "Newly updated settings couldn't be retrieved" + return Funding(**row) if row else None async def get_funding() -> List[Funding]: rows = await db.fetchall("SELECT * FROM funding") diff --git a/lnbits/extensions/admin/templates/admin/index.html b/lnbits/extensions/admin/templates/admin/index.html index 9aa4f12a8..d56b3d793 100644 --- a/lnbits/extensions/admin/templates/admin/index.html +++ b/lnbits/extensions/admin/templates/admin/index.html @@ -31,11 +31,11 @@ - - - -
Wallets Management
-
+ + + +
Wallets Management
+
@@ -62,43 +62,96 @@
-

TopUp a wallet

-
-
- -
-
-
- -
+

TopUp a wallet

+
+
+ +
-
- +
+
+
+
+ +

Funding Sources

- + {% raw %} + + + + + + + + + + + + + + {% endraw %} + +
+ + + + +
User Management
+
+

+ Super Admin: {% raw %}{{this.data.admin.user}}{% endraw %} +

+

Admin Users

+ hint="Users with admin privileges" + >
{% raw %} -
-
-
-

Allowed Users

- - - +
- {% raw %} - Allowed Users

+ - {{ user }} -
- {% endraw %} + + +
+ {% raw %} + + {{ user }} + + {% endraw %} +
+
+
+
+

Admin Extensions

+ +
+
+
+

Disabled Extensions

+ +
+
+
+
+ Save +
+ + + + +
Server Management

-
-
-
-

Admin Extensions

- -
-
-
-

Disabled Extensions

- -
-
-
-
- Save -
-
-
- - -
Server Management
-

Server Info

    {%raw%} -
  • SQlite: {{data.admin.data_folder}}
  • -
  • Postgres: {{data.admin.database_url}}
  • +
  • + SQlite: {{data.admin.data_folder}} +
  • +
  • + Postgres: {{data.admin.database_url}} +
  • {%endraw%}

@@ -520,7 +576,10 @@ Hide API - Hides wallet api, extensions can choose to honor + Hides wallet api, extensions can choose to + honor
-
- -
- Save -
-
-
- - -
UI Management
-
+
+ +
+ Save +
+ + + + +
UI Management
+
@@ -575,15 +629,15 @@
-

Site Description

- -
-
+

Site Description

+ +
+

Default Wallet Name

@@ -628,12 +682,15 @@ @keydown.enter="addAdSpace" type="text" label="Ad image URL" - hint="Ad image filepaths or urls, extensions can choose to honor"> + hint="Ad image filepaths or urls, extensions can choose to honor" + >
{% raw %} -
-
- -
- Save -
-
-
- - +
+ +
+ Save +
+
+
+
+
- - -

Admin

-

+ + - -
- - -
Wallet topup
-
-
- -
-
- -
-
-
- -
-
-
-
{% endblock %} {% block scripts %} {{ window_vars(user) }} @@ -1100,14 +1114,22 @@ 'LnbitsWallet', 'OpenNodeWallet' ], - + admin: { edited: [], - funding: {}, + funding: [], senddata: {} } }, - themes: ['classic', 'bitcoin', 'flamingo', 'mint', 'autumn', 'monochrome', 'salvador'], + themes: [ + 'classic', + 'bitcoin', + 'flamingo', + 'mint', + 'autumn', + 'monochrome', + 'salvador' + ], options: [ 'bleskomat', 'captcha', @@ -1139,10 +1161,13 @@ self.cancel.on = true } funding = JSON.parse(String('{{ funding | tojson|safe }}')) - var i + funding.map(f => { + this.data.admin.funding.push(f) + }) + /*var i for (i = 0; i < funding.length; i++) { self.data.admin.funding[funding[i].backend_wallet] = funding[i] - } + }*/ let settings = JSON.parse('{{ settings | tojson|safe }}') settings.balance = '{{ balance }}' this.data.admin = {...this.data.admin, ...settings} @@ -1150,42 +1175,42 @@ console.log(settings) }, methods: { - addAdminUser(){ + addAdminUser() { let addUser = this.data.admin_users_add let admin_users = this.data.admin.admin_users - if(addUser.length && !admin_users.includes(addUser)){ + if (addUser.length && !admin_users.includes(addUser)) { admin_users.push(addUser) this.data.admin.admin_users = admin_users - this.data.admin_users_add = "" + this.data.admin_users_add = '' } }, - removeAdminUser(user){ + removeAdminUser(user) { let admin_users = this.data.admin.admin_users this.data.admin.admin_users = admin_users.filter(u => u !== user) }, - addAllowedUser(){ + addAllowedUser() { let addUser = this.data.allowed_users_add let allowed_users = this.data.admin.allowed_users - if(addUser.length && !allowed_users.includes(addUser)){ + if (addUser.length && !allowed_users.includes(addUser)) { allowed_users.push(addUser) this.data.admin.allowed_users = allowed_users - this.data.allowed_users_add = "" + this.data.allowed_users_add = '' } }, - removeAllowedUser(user){ + removeAllowedUser(user) { let allowed_users = this.data.admin.allowed_users this.data.admin.allowed_users = allowed_users.filter(u => u !== user) }, - addAdSpace(){ + addAdSpace() { let adSpace = this.data.ad_space_add let spaces = this.data.admin.ad_space - if(adSpace.length && !spaces.includes(adSpace)){ + if (adSpace.length && !spaces.includes(adSpace)) { spaces.push(adSpace) this.data.admin.ad_space = spaces - this.data.ad_space_add = "" + this.data.ad_space_add = '' } }, - removeAdSpace(ad){ + removeAdSpace(ad) { let spaces = this.data.admin.ad_space this.data.admin.ad_space = spaces.filter(s => s !== ad) }, @@ -1199,14 +1224,14 @@ this.wallet.data.amount, this.g.user.wallets[0].adminkey ) - .then((response) => { + .then(response => { this.$q.notify({ type: 'positive', message: - 'Success! Added ' + - this.wallet.data.amount + - ' to ' + - this.wallet.data.id, + 'Success! Added ' + + this.wallet.data.amount + + ' to ' + + this.wallet.data.id, icon: null }) this.wallet.data = {} @@ -1224,6 +1249,29 @@ self.data.admin.edited.push(source) console.log(self.data.admin.edited) }, + updateFunding(fund) { + let data = this.data.admin.funding.find(v => v.backend_wallet == fund) + + LNbits.api + .request( + 'POST', + '/admin/api/v1/admin/funding', + this.g.user.wallets[0].adminkey, + data + ) + .then(response => { + //let wallet = response.data.backend_wallet + //this.data.admin.funding[wallet] = response.data + //this.data.admin.funding[wallet].endpoint = response.data.endpoint + //console.log(this.data.admin.funding) + //console.log(this.data.admin) + this.$q.notify({ + type: 'positive', + message: `Success! ${response.data.backend_wallet} changed!`, + icon: null + }) + }) + }, UpdateLNbits() { let { admin_users, @@ -1272,8 +1320,7 @@ console.log(response.data) this.$q.notify({ type: 'positive', - message: - 'Success! Settings changed!', + message: 'Success! Settings changed!', icon: null }) }) diff --git a/lnbits/extensions/admin/views.py b/lnbits/extensions/admin/views.py index 105f05a10..24b8ca859 100644 --- a/lnbits/extensions/admin/views.py +++ b/lnbits/extensions/admin/views.py @@ -21,8 +21,7 @@ async def index(request: Request, user: User = Depends(check_user_exists)): admin = await get_admin() funding = [f.dict() for f in await get_funding()] error, balance = await g().WALLET.status() - print("ADMIN", admin.dict()) - print(g().admin_conf) + return admin_renderer().TemplateResponse( "admin/index.html", { "request": request, diff --git a/lnbits/extensions/admin/views_api.py b/lnbits/extensions/admin/views_api.py index 1d4e6a9c7..b797dc2d1 100644 --- a/lnbits/extensions/admin/views_api.py +++ b/lnbits/extensions/admin/views_api.py @@ -7,11 +7,11 @@ from starlette.exceptions import HTTPException from lnbits.core.crud import get_wallet from lnbits.decorators import WalletTypeInfo, require_admin_key from lnbits.extensions.admin import admin_ext -from lnbits.extensions.admin.models import Admin, UpdateAdminSettings +from lnbits.extensions.admin.models import Admin, Funding, UpdateAdminSettings from lnbits.helpers import removeEmptyString from lnbits.requestvars import g -from .crud import get_admin, update_admin, update_wallet_balance +from .crud import get_admin, update_admin, update_funding, update_wallet_balance @admin_ext.get("/api/v1/admin/{wallet_id}/{topup_amount}", status_code=HTTPStatus.OK) @@ -53,3 +53,18 @@ async def api_update_admin( print(g().admin_conf) return {"status": "Success"} + +@admin_ext.post("/api/v1/admin/funding/", status_code=HTTPStatus.OK) +async def api_update_funding( + request: Request, + data: Funding = Body(...), + w: WalletTypeInfo = Depends(require_admin_key) + ): + admin = await get_admin() + + if not admin.user == w.wallet.user: + raise HTTPException( + status_code=HTTPStatus.FORBIDDEN, detail="Not allowed: not an admin" + ) + funding = await update_funding(data=data) + return funding