Merge branch 'frost' into blitzen

master
kek7198 2021-12-20 19:22:21 -06:00
commit 0be64ffa76
29 changed files with 61 additions and 46 deletions

3
.gitignore vendored
View File

@ -8,4 +8,5 @@ disablesignups
**/.pytest_cache/
venv/
.vscode/
.sass-cache/
.sass-cache/
flask_session/

View File

@ -13,7 +13,6 @@ services:
- DOMAIN=localhost
- SITE_NAME=Drama
- GIPHY_KEY=3435tdfsdudebussylmaoxxt43
- FORCE_HTTPS=0
- DISCORD_SERVER_ID=3435tdfsdudebussylmaoxxt43
- DISCORD_CLIENT_ID=3435tdfsdudebussylmaoxxt43
- DISCORD_CLIENT_SECRET=3435tdfsdudebussylmaoxxt43

1
env
View File

@ -3,7 +3,6 @@ export MASTER_KEY="XuxGqp5NyygJrM24b5gt3YgyvFVGdQnwVDwLzLwpu3eQwY"
export DOMAIN="localhost"
export SITE_NAME="Drama"
export GIPHY_KEY="3435tdfsdudebussylmaoxxt43"
export FORCE_HTTPS="0"
export DISCORD_SERVER_ID="3435tdfsdudebussylmaoxxt43"
export DISCORD_CLIENT_ID="3435tdfsdudebussylmaoxxt43"
export DISCORD_CLIENT_SECRET="3435tdfsdudebussylmaoxxt43"

View File

@ -8,6 +8,7 @@ from flask_limiter import Limiter
from flask_compress import Compress
from flask_limiter.util import get_ipaddr
from flask_mail import Mail
from flask_session import Session
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
@ -17,6 +18,8 @@ from werkzeug.middleware.proxy_fix import ProxyFix
import redis
app = Flask(__name__, template_folder='templates')
app.config["SESSION_TYPE"] = "redis"
Session(app)
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=3)
app.url_map.strict_slashes = False
@ -24,6 +27,7 @@ app.jinja_env.cache = {}
app.jinja_env.auto_reload = True
import faulthandler
faulthandler.enable()
app.config["SITE_NAME"]=environ.get("SITE_NAME").strip()
app.config["COINS_NAME"]=environ.get("COINS_NAME").strip()
@ -36,14 +40,13 @@ app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 86400
app.config["SESSION_COOKIE_NAME"] = f'session_{environ.get("DOMAIN")}'.strip().lower()
app.config["VERSION"] = "1.0.0"
app.config['MAX_CONTENT_LENGTH'] = 8 * 1024 * 1024
app.config["SESSION_COOKIE_SECURE"] = bool(int(environ.get("FORCE_HTTPS", 1)))
app.config["SESSION_COOKIE_SECURE"] = True
app.config["SESSION_COOKIE_SAMESITE"] = "Lax"
app.config["PERMANENT_SESSION_LIFETIME"] = 60 * 60 * 24 * 365
app.config["SESSION_REFRESH_EACH_REQUEST"] = True
app.config["SLOGAN"] = environ.get("SLOGAN", "").strip()
app.config["DEFAULT_COLOR"] = environ.get("DEFAULT_COLOR", "ff0000").strip()
app.config["DEFAULT_THEME"] = environ.get("DEFAULT_THEME", "midnight").strip()
app.config["FORCE_HTTPS"] = int(environ.get("FORCE_HTTPS", 1)) if ("localhost" not in app.config["SERVER_NAME"] and "localhost" not in app.config["SERVER_NAME"]) else 0
app.config["FORCE_HTTPS"] = True
app.config["UserAgent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
app.config["HCAPTCHA_SITEKEY"] = environ.get("HCAPTCHA_SITEKEY","").strip()
app.config["HCAPTCHA_SECRET"] = environ.get("HCAPTCHA_SECRET","").strip()
@ -59,7 +62,7 @@ app.config["RATELIMIT_ENABLED"] = True
app.config["RATELIMIT_DEFAULTS_DEDUCT_WHEN"]=lambda:True
app.config["RATELIMIT_DEFAULTS_EXEMPT_WHEN"]=lambda:False
app.config["RATELIMIT_HEADERS_ENABLED"]=True
app.config["CACHE_TYPE"] = "filesystem"
app.config["CACHE_TYPE"] = "redis"
app.config["CACHE_DIR"] = "cache"
app.config["RATELIMIT_STORAGE_URL"] = environ.get("REDIS_URL", "redis://localhost")
app.config['MAIL_SERVER'] = 'smtp.gmail.com'
@ -68,6 +71,10 @@ app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = environ.get("MAIL_USERNAME", "").strip()
app.config['MAIL_PASSWORD'] = environ.get("MAIL_PASSWORD", "").strip()
app.config["SESSION_USE_SIGNER"] = True
app.config["SESSION_COOKIE_DOMAIN"] = app.config["SERVER_NAME"]
r=redis.Redis(host=environ.get("REDIS_URL", "redis://localhost"), decode_responses=True, ssl_cert_reqs=None)
limiter = Limiter(
@ -101,9 +108,9 @@ def before_request():
if not request.path.startswith("/assets") and not request.path.startswith("/images") and not request.path.startswith("/hostedimages"):
session.permanent = True
if not session.get("session_id"): session["session_id"] = secrets.token_hex(16)
if not session.get("session_id"): session["session_id"] = secrets.token_hex(50)
if app.config["FORCE_HTTPS"] and request.url.startswith("http://") and "localhost" not in app.config["SERVER_NAME"]:
if request.url.startswith("http://") and "localhost" not in app.config["SERVER_NAME"]:
url = request.url.replace("http://", "https://", 1)
return redirect(url, code=301)

View File

@ -302,7 +302,7 @@ class User(Base):
def formkey(self):
if "session_id" not in session:
session["session_id"] = token_hex(16)
session["session_id"] = token_hex(50)
msg = f"{session['session_id']}+{self.id}+{self.login_nonce}"
@ -377,6 +377,10 @@ class User(Base):
def post_notifications_count(self):
return g.db.query(Notification.id).join(Comment).filter(Notification.user_id == self.id, Notification.read == False, Comment.author_id == AUTOJANNY_ID).count()
@property
@lazy
def not_post_notifications_count(self):
return self.notifications_count - self.post_notifications_count
@property
@lazy

View File

@ -1030,8 +1030,12 @@ def api_sticky_post(post_id, v):
else: post.stickied = None
else:
pins = g.db.query(Submission.id).filter(Submission.stickied != None, Submission.is_banned == False).count()
if pins > 2: return {"error": "Can't exceed 3 pinned posts limit!"}, 403
post.stickied = v.username
if pins > 2:
if v.admin_level > 2:
t = int(time.time()) + 3600
post.stickied = f"t:{t}"
else: return {"error": "Can't exceed 3 pinned posts limit!"}, 403
else: post.stickied = v.username
g.db.add(post)
ma=ModAction(

View File

@ -136,7 +136,7 @@ def login_post():
session["user_id"] = account.id
session["logged_in"] = account.id
session["session_id"] = token_hex(16)
session["session_id"] = token_hex(50)
session["login_nonce"] = account.login_nonce
session.permanent = True
@ -343,7 +343,7 @@ def sign_up_post(v):
session["user_id"] = new_user.id
session["logged_in"] = new_user.id
session["session_id"] = token_hex(16)
session["session_id"] = token_hex(50)
g.db.commit()

View File

@ -104,10 +104,10 @@ def cached_chart(days):
days = int((nowstamp - firstsignup) / 86400)
if days > 31:
file = "/weekly_chart.webp"
file = "/weekly_chart.png"
day_cutoffs = [today_cutoff - 86400 * 7 * i for i in range(31)][1:]
else:
file = "/daily_chart.webp"
file = "/daily_chart.png"
day_cutoffs = [today_cutoff - 86400 * i for i in range(31)][1:]
day_cutoffs.insert(0, calendar.timegm(now))

View File

@ -14,11 +14,11 @@
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=438"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{v.theme}}.css?v=200">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=439"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{v.theme}}.css?v=200">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/CHRISTMAS/css/agendaposter.css?v=200">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=438"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=439"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
{% endif %}
</head>

View File

@ -186,9 +186,9 @@
{% block stylesheets %}
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=438">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=439">
<link rel="stylesheet" href="/static/dist/main.css?v=438">
<link rel="stylesheet" href="/static/dist/main.css?v=439">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/mistletoe.css?v=400">

View File

@ -13,9 +13,9 @@
<title>Login - {{'SITE_NAME' | app_config}}</title>
{% endblock %}
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=438">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=439">
<link rel="stylesheet" href="/static/dist/main.css?v=438">
<link rel="stylesheet" href="/static/dist/main.css?v=439">
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>

View File

@ -13,7 +13,7 @@
<title>2-Step Login - {{'SITE_NAME' | app_config}}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=438"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=439"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
</head>

View File

@ -28,9 +28,9 @@
{% block stylesheets %}
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=438">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=439">
<link rel="stylesheet" href="/static/dist/main.css?v=438">
<link rel="stylesheet" href="/static/dist/main.css?v=439">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/mistletoe.css?v=400">

View File

@ -26,9 +26,9 @@
<title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}Sign up - {{'SITE_NAME' | app_config}}{% endif %}</title>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=438">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=439">
<link rel="stylesheet" href="/static/dist/main.css?v=438">
<link rel="stylesheet" href="/static/dist/main.css?v=439">
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>

View File

@ -31,7 +31,7 @@
<title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}{{'SITE_NAME' | app_config}}{% endif %}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=438"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
<link rel="stylesheet" href="/assets/CHRISTMAS/css/main.css?v=439"><link rel="stylesheet" href="/assets/CHRISTMAS/css/{{'DEFAULT_THEME' | app_config}}.css?v=200">
</head>

View File

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/static/dist/main.css?v=438">
<link rel="stylesheet" href="/static/dist/main.css?v=439">
<title>Flask + Tailwind CSS</title>
</head>

View File

@ -14,11 +14,11 @@
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
{% endif %}
</head>

View File

@ -297,7 +297,7 @@
<a href="javascript:void(0)" form="comment-edit-form-{{c.id}}" class="btn btn-primary ml-2 fl-r commentmob" onclick="comment_edit('{{c.id}}')">Save Edit</a>
<a id="cancel-edit-{{c.id}}" href="javascript:void(0)" onclick="toggleEdit('{{c.id}}')" class="btn btn-link text-muted ml-auto cancel-form fl-r commentmob">Cancel</a>
</form>
<div id="preview-edit-{{c.id}}" class="mb-3 mt-5"></div>
<div id="preview-edit-{{c.id}}" class="preview-edit mb-3 mt-5"></div>
<div class="form-text text-small p-0 m-0"><a href="/formatting" {% if v and v.newtab %}target="_blank"{% endif %}>Formatting help</a></div>
</div>
{% endif %}

View File

@ -6,12 +6,12 @@
<script src="/assets/js/bootstrap.js?v=190"></script>
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438">
<link rel="stylesheet" href="/assets/css/main.css?v=439">
<link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
{% endif %}
<link href="/assets/css/fa.css?v=193" rel="stylesheet">

View File

@ -6,11 +6,11 @@
{% block content %}
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
{% endif %}
<div class="row justify-content-around">

View File

@ -17,7 +17,7 @@
{% endblock %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438">
<link rel="stylesheet" href="/assets/css/main.css?v=439">
<link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
<link href="/assets/css/fa.css?v=193" rel="stylesheet">

View File

@ -13,7 +13,7 @@
<title>2-Step Login - {{'SITE_NAME' | app_config}}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
</head>

View File

@ -17,7 +17,7 @@
<ul class="nav settings-nav" style="padding:0 30px;">
<li class="nav-item">
<a class="nav-link py-3{% if not '=true' in request.full_path %} active{% endif %}" href="/notifications">
All
All{% if v.not_post_notifications_count %} <span class="text-primary font-weight-bold">({{v.not_post_notifications_count}})</span>{% endif %}
</a>
</li>
<li class="nav-item">

View File

@ -33,7 +33,7 @@
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
<link href="/assets/css/fa.css?v=193" rel="stylesheet">

View File

@ -38,10 +38,10 @@
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
{% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
{% endif %}
<link href="/assets/css/fa.css?v=193" rel="stylesheet">

View File

@ -30,7 +30,7 @@
<title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}Sign up - {{'SITE_NAME' | app_config}}{% endif %}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
</head>

View File

@ -31,7 +31,7 @@
<title>{% if ref_user %}{{ref_user.username}} invites you to {{'SITE_NAME' | app_config}}{% else %}{{'SITE_NAME' | app_config}}{% endif %}</title>
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
</head>

View File

@ -25,11 +25,11 @@
{% block stylesheets %}
{% if v %}
<style>:root{--primary:#{{v.themecolor}}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
<link rel="stylesheet" href="/assets/css/main.css?v=439"><link rel="stylesheet" href="/assets/css/{{v.theme}}.css?v=191">
{% if v.agendaposter %}<link rel="stylesheet" href="/assets/css/agendaposter.css?v=190">{% elif v.css %}<link rel="stylesheet" href="/@{{v.username}}/css">{% endif %}
{% else %}
<style>:root{--primary:#{{'DEFAULT_COLOR' | app_config}}</style>
<link rel="stylesheet" href="/assets/css/main.css?v=438">
<link rel="stylesheet" href="/assets/css/main.css?v=439">
<link rel="stylesheet" href="/assets/css/{{'DEFAULT_THEME' | app_config}}.css?v=191">
{% endif %}
{% endblock %}

View File

@ -6,6 +6,7 @@ Flask-Caching
Flask-Compress
Flask-Limiter==1.1.0
Flask-Mail==0.9.1
Flask-Session
gevent
greenlet
gunicorn