From 08eb38dc5713419330b21fc3b53c01d2d4179941 Mon Sep 17 00:00:00 2001
From: forest
Date: Wed, 21 Jul 2021 16:45:53 -0500
Subject: [PATCH 1/3] correctly enforce affordable_vm_sizes post form
submission
---
.gitignore | 1 +
capsulflask/console.py | 17 ++++++++++-------
2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/.gitignore b/.gitignore
index bb022e9..c9bb7c2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
notes.txt
.env
+.env.bak
.vscode
*.pyc
diff --git a/capsulflask/console.py b/capsulflask/console.py
index 5da18e9..d15155d 100644
--- a/capsulflask/console.py
+++ b/capsulflask/console.py
@@ -199,6 +199,14 @@ def create():
capacity_avaliable = current_app.config["HUB_MODEL"].capacity_avaliable(512*1024*1024)
errors = list()
+ affordable_vm_sizes = dict()
+ for key, vm_size in vm_sizes.items():
+ # if a user deposits $7.50 and then creates an f1-s vm which costs 7.50 a month,
+ # then they have to delete the vm and re-create it, they will not be able to, they will have to pay again.
+ # so for UX it makes a lot of sense to give a small margin of 25 cents for usability sake
+ if vm_size["dollars_per_month"] <= account_balance+0.25:
+ affordable_vm_sizes[key] = vm_size
+
if request.method == "POST":
if "csrf-token" not in request.form or request.form['csrf-token'] != session['csrf-token']:
return abort(418, f"u want tea")
@@ -209,6 +217,8 @@ def create():
errors.append("Size is required")
elif size not in vm_sizes:
errors.append(f"Invalid size {size}")
+ elif size not in affordable_vm_sizes:
+ errors.append(f"Your account must have enough credit to run an {size} for 1 month before you will be allowed to create it")
if not os:
errors.append("OS is required")
@@ -260,13 +270,6 @@ def create():
return redirect(f"{url_for('console.index')}?created={id}")
- affordable_vm_sizes = dict()
- for key, vm_size in vm_sizes.items():
- # if a user deposits $7.50 and then creates an f1-s vm which costs 7.50 a month,
- # then they have to delete the vm and re-create it, they will not be able to, they will have to pay again.
- # so for UX it makes a lot of sense to give a small margin of 25 cents for usability sake
- if vm_size["dollars_per_month"] <= account_balance+0.25:
- affordable_vm_sizes[key] = vm_size
for error in errors:
flash(error)
From 5bb76173dd5599b9e3ea3475f1f69eb2293eb597 Mon Sep 17 00:00:00 2001
From: 3wordchant <3wordchant@noreply.git.autonomic.zone>
Date: Thu, 22 Jul 2021 01:15:39 +0200
Subject: [PATCH 2/3] Add custom themes, THEME setting, basic "yolocolo" theme
(#7)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Specify `THEME=yourtheme`, add some HTML files in `capsulflask/theme/yourtheme` 👌
We probably want to reduce copypasta in the current `yolocolo` theme by using template inheritance, at some point.
Reviewed-on: https://git.autonomic.zone/3wordchant/capsul-flask/pulls/7
Co-authored-by: 3wordchant <3wordchant@noreply.git.autonomic.zone>
Co-committed-by: 3wordchant <3wordchant@noreply.git.autonomic.zone>
---
capsulflask/__init__.py | 13 ++-
capsulflask/static/favicon.yolocolo.ico | Bin 0 -> 1758 bytes
capsulflask/static/icon.yolocolo.png | Bin 0 -> 1209 bytes
capsulflask/static/style.yolocolo.css | 35 +++++++
.../theme/yolocolo/account-balance.html | 94 ++++++++++++++++++
capsulflask/theme/yolocolo/base.html | 60 +++++++++++
capsulflask/theme/yolocolo/capsuls.html | 68 +++++++++++++
capsulflask/theme/yolocolo/faq.html | 46 +++++++++
capsulflask/theme/yolocolo/index.html | 28 ++++++
capsulflask/theme/yolocolo/pricing.html | 23 +++++
capsulflask/theme/yolocolo/support.html | 21 ++++
11 files changed, 387 insertions(+), 1 deletion(-)
create mode 100644 capsulflask/static/favicon.yolocolo.ico
create mode 100644 capsulflask/static/icon.yolocolo.png
create mode 100644 capsulflask/static/style.yolocolo.css
create mode 100644 capsulflask/theme/yolocolo/account-balance.html
create mode 100644 capsulflask/theme/yolocolo/base.html
create mode 100644 capsulflask/theme/yolocolo/capsuls.html
create mode 100644 capsulflask/theme/yolocolo/faq.html
create mode 100644 capsulflask/theme/yolocolo/index.html
create mode 100644 capsulflask/theme/yolocolo/pricing.html
create mode 100644 capsulflask/theme/yolocolo/support.html
diff --git a/capsulflask/__init__.py b/capsulflask/__init__.py
index 55643bb..7aabe3f 100644
--- a/capsulflask/__init__.py
+++ b/capsulflask/__init__.py
@@ -2,6 +2,7 @@ import logging
from logging.config import dictConfig as logging_dict_config
import atexit
+import jinja2
import os
import hashlib
import requests
@@ -71,7 +72,9 @@ app.config.from_mapping(
#STRIPE_WEBHOOK_SECRET=os.environ.get("STRIPE_WEBHOOK_SECRET", default="")
BTCPAY_PRIVATE_KEY=os.environ.get("BTCPAY_PRIVATE_KEY", default="").replace("\\n", "\n"),
- BTCPAY_URL=os.environ.get("BTCPAY_URL", default="")
+ BTCPAY_URL=os.environ.get("BTCPAY_URL", default=""),
+
+ THEME=os.environ.get("THEME", default="")
)
app.config['HUB_URL'] = os.environ.get("HUB_URL", default=app.config['BASE_URL'])
@@ -154,6 +157,14 @@ is_running_server = ('flask run' in command_line) or ('gunicorn' in command_line
app.logger.info(f"is_running_server: {is_running_server}")
+if app.config['THEME'] != "":
+ my_loader = jinja2.ChoiceLoader([
+ jinja2.FileSystemLoader(
+ [os.path.join('capsulflask', 'theme', app.config['THEME']),
+ 'capsulflask/templates']),
+ ])
+ app.jinja_loader = my_loader
+
if app.config['HUB_MODE_ENABLED']:
if app.config['HUB_MODEL'] == "capsul-flask":
diff --git a/capsulflask/static/favicon.yolocolo.ico b/capsulflask/static/favicon.yolocolo.ico
new file mode 100644
index 0000000000000000000000000000000000000000..bb2e8850fa0c99ebdfa1e36bb22eab929911bfd5
GIT binary patch
literal 1758
zcmeIyOGs2v7{KxWJgO-tn_gx$HPiHR%*vUXM^;l!Wjdvk&CF>dxNsu~f-6DY=)#TY
z&b5Mqf*VmmS1!cG-~)Vt2#O%$V=FW4Vh7=%8848i94AqYdjYfl3t3{{Nq1Wp%8jYAtCd_6t7K;U|)r!q#!)~|Za5!)}
zow!^s+-^4>j|Z>Ui_ho7@Anf5g$Rek6c!dzR8&N9aWN$&C6tzyQdU+*d3iY%6%|xg
zR#H_}MRj#GH8nNV*49#2S4Vw)Jq-;FG&VNU)YL?Cb2BY1Ewr|_($>~SdwV+_9UXLb
zcGA_=MR#{MJv}}2_V&`(*GGSUKLY~;3=R%5G&Dps8fAERn30hYMn^{(8yjPMe4L4i
z2_`2enVOnndU~3fnHgqhXPKLuV}5>~g@pwc7Z+JtT4H&5nU$3lR##V9TU%p&eVvVs
z4K_D7iN#`UZEdl=z0J;SRCqa
z|KfR?o}TU&vIib09f(u6KFa>)qWY=kPr=WUe@IgKdj9hZ_Y%F}n##O$YmnR%=koSOJDMYT)cbE{i?AzM&L1?KbAA&cAp%zExxuq9
zl-k|T5~AR?ls_es{V@Awj?4b_mE;y-CryNs@xPbcl$V>4D@2wfXX=w!d-%kgGD%6RrRkdc@tqHNO72nQ1P<(D3=>i_Vk!2jm#
E2RYs=b^rhX
literal 0
HcmV?d00001
diff --git a/capsulflask/static/icon.yolocolo.png b/capsulflask/static/icon.yolocolo.png
new file mode 100644
index 0000000000000000000000000000000000000000..987ea74fa0fc2c3429eaca6c6b21a2ba3460c2bb
GIT binary patch
literal 1209
zcmV;q1V;ObP)EX>4Tx04R}tkv&MmKpe$iQ>7vm1q(`X$WWauh>AFB6^c+H)C#RSm|XfHG-*gu
zTpR`0f`cE6RRL;k>@Q#C4iONMZqtkRU=q6&onSMx0ii6botEPx$zwu3sXTLaq%k
za?GOw4YKP8|AXJ%T7`*mFDaY=I$s>;V;BhS0*#vEd>=bb;{*sk16O*>U#SDrpQP7X
zTI>ku-3BhMTbi;5TeSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00NOoL_t(Y$HkV5E4k{`tK79MU7KsSCT<%93zP`S4cX#(K@Apb7rReMHV{L7X
zs;Vk%+veuxhKGj-bX_M92oMYgsjjZ(;NSq;wwa!u_EwNjP)dp8IAWTn0HW)<0G{!W
zTUl8VrIaY8K5r+!Vis7I#mLAA;cyrLUDxU9>7lo`7fsWOTIerCE-o%IK0c0N7`U!W
zB9XwdEE*ab060B8Wq5eFu)=p1wYIiOE|-%`CL^&}Ofs2F-iD*2BZkV
zO-&6;OG~8FX=-b0IXgT1oxtJYAtxs%ghC-kM@IqJ-rlCYy`8qUwtP`;ZEaCmSy}oS
zn5HRpb#=0{vm=j>kD`ooF=b
z{e#cPohervAerVOG``X&F+09lSzq0B41{~%*>3W(`j)WN3O50ORIy=k
+
Account Balance: ${{ account_balance }}
+
+
+
+ {% if has_vms and has_payments and warning_text != "" %}
+
Cyberia, the authors of this platform, run the canonical instance, Capsul.org, on hardware they own. Please
+ send them your money! (cash, crypto, or card accepted).