expand blackjack

pull/115/head
Aevann 2023-02-07 05:31:49 +02:00
parent 95938ee3ec
commit 88814ee208
11 changed files with 104 additions and 69 deletions

View File

@ -343,55 +343,6 @@ def execute_antispam_submission_check(title, v, url):
return False return False
return True return True
def execute_blackjack(v, target, body, type):
if not blackjack or not body: return True
execute = False
for x in blackjack.split(','):
if all(i in body.lower() for i in x.split()):
execute = True
shadowban = v.truescore < 100
if execute:
if shadowban:
v.shadowbanned = AUTOJANNY_ID
ma = ModAction(
kind="shadowban",
user_id=AUTOJANNY_ID,
target_user_id=v.id,
_note='reason: "Blackjack"'
)
g.db.add(ma)
v.ban_reason = "Blackjack"
g.db.add(v)
elif type in {'submission', 'comment', 'message'}:
target.is_banned = True
notified_ids = [x[0] for x in g.db.query(User.id).filter(User.admin_level >= PERMS['BLACKJACK_NOTIFICATIONS'])]
extra_info = "unknown entity"
if type == 'submission':
extra_info = target.permalink
elif type == 'chat':
extra_info = "chat message"
elif type == 'flag':
extra_info = f"reports on {target.permalink}"
elif type == 'modmail':
extra_info = "modmail"
elif type in {'comment', 'message'}:
for id in notified_ids:
n = Notification(comment_id=target.id, user_id=id)
g.db.add(n)
g.db.flush()
extra_info = None
if extra_info:
for id in notified_ids:
send_repeatable_notification(id, f"Blackjack for @{v.username}: {extra_info}")
return True
def execute_antispam_duplicate_comment_check(v:User, body_html:str): def execute_antispam_duplicate_comment_check(v:User, body_html:str):
''' '''
Sanity check for newfriends Sanity check for newfriends

View File

@ -28,7 +28,7 @@ def send_repeatable_notification(uid, text):
if uid in bots: return if uid in bots: return
text_html = sanitize(text) text_html = sanitize(text, blackjack="notification")
existing_comments = g.db.query(Comment.id).filter_by(author_id=AUTOJANNY_ID, parent_submission=None, body_html=text_html, is_bot=True).order_by(Comment.id).all() existing_comments = g.db.query(Comment.id).filter_by(author_id=AUTOJANNY_ID, parent_submission=None, body_html=text_html, is_bot=True).order_by(Comment.id).all()
@ -53,7 +53,7 @@ def send_notification(uid, text):
def notif_comment(text): def notif_comment(text):
text_html = sanitize(text) text_html = sanitize(text, blackjack="notification")
g.db.flush() g.db.flush()
@ -94,7 +94,7 @@ def notif_comment2(p):
else: else:
text = f"@{p.author.username} has mentioned you: [{p.title}](/post/{p.id})" text = f"@{p.author.username} has mentioned you: [{p.title}](/post/{p.id})"
if p.sub: text += f" in <a href='/h/{p.sub}'>/h/{p.sub}" if p.sub: text += f" in <a href='/h/{p.sub}'>/h/{p.sub}"
text_html = sanitize(text) text_html = sanitize(text, blackjack="notification")
return create_comment(text_html) return create_comment(text_html)

View File

@ -11,7 +11,7 @@ import files.helpers.config.const as const
from files.classes.badges import Badge from files.classes.badges import Badge
from files.classes.comment import Comment from files.classes.comment import Comment
from files.classes.user import User from files.classes.user import User
from files.helpers.sanitize import sanitize from files.helpers.sanitize import *
from files.classes.notifications import Notification from files.classes.notifications import Notification
# Note: while https://api.pushshift.io/meta provides the key # Note: while https://api.pushshift.io/meta provides the key
@ -94,7 +94,7 @@ def notify_mentions(mentions, send_to=None, mention_str='site mention'):
for m in mentions: for m in mentions:
author = m['author'] author = m['author']
permalink = m['permalink'] permalink = m['permalink']
text = sanitize(m['text'], golden=False) text = sanitize(m['text'], blackjack="reddit mention", golden=False)
notif_text = ( notif_text = (
f'<p>New {mention_str} by <a href="https://old.reddit.com/u/{author}" ' f'<p>New {mention_str} by <a href="https://old.reddit.com/u/{author}" '
f'rel="nofollow noopener" target="_blank">/u/{author}</a></p>' f'rel="nofollow noopener" target="_blank">/u/{author}</a></p>'

View File

@ -13,6 +13,8 @@ from bleach.linkifier import LinkifyFilter
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from mistletoe import markdown from mistletoe import markdown
from files.classes.domains import BannedDomain from files.classes.domains import BannedDomain
from files.classes.mod_logs import ModAction
from files.classes.notifications import Notification
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.const_stateful import * from files.helpers.const_stateful import *
@ -148,6 +150,85 @@ def callback(attrs, new=False):
return attrs return attrs
def create_comment_duplicated(text_html):
new_comment = Comment(author_id=AUTOJANNY_ID,
parent_submission=None,
body_html=text_html,
distinguish_level=6,
is_bot=True)
g.db.add(new_comment)
g.db.flush()
new_comment.top_comment_id = new_comment.id
return new_comment.id
def send_repeatable_notification_duplicated(uid, text):
if uid in bots: return
text_html = sanitize(text)
existing_comments = g.db.query(Comment.id).filter_by(author_id=AUTOJANNY_ID, parent_submission=None, body_html=text_html, is_bot=True).order_by(Comment.id).all()
for c in existing_comments:
existing_notif = g.db.query(Notification.user_id).filter_by(user_id=uid, comment_id=c.id).one_or_none()
if not existing_notif:
notif = Notification(comment_id=c.id, user_id=uid)
g.db.add(notif)
return
cid = create_comment_duplicated(text_html)
notif = Notification(comment_id=cid, user_id=uid)
g.db.add(notif)
def execute_blackjack(v, target, body, type):
if not blackjack or not body: return False
execute = False
for x in blackjack.split(','):
if all(i in body.lower() for i in x.split()):
execute = True
shadowban = v.truescore < 100 or not target
if not execute: return False
if shadowban:
v.shadowbanned = AUTOJANNY_ID
ma = ModAction(
kind="shadowban",
user_id=AUTOJANNY_ID,
target_user_id=v.id,
_note='reason: "Blackjack"'
)
g.db.add(ma)
v.ban_reason = "Blackjack"
g.db.add(v)
elif target and type in {'submission', 'comment', 'message'}:
target.is_banned = True
notified_ids = [x[0] for x in g.db.query(User.id).filter(User.admin_level >= PERMS['BLACKJACK_NOTIFICATIONS'])]
extra_info = type
if target:
if type == 'submission':
extra_info = target.permalink
elif type == 'flag':
extra_info = f"reports on {target.permalink}"
elif type in {'comment', 'message'}:
for id in notified_ids:
n = Notification(comment_id=target.id, user_id=id)
g.db.add(n)
g.db.flush()
extra_info = None
if extra_info:
for id in notified_ids:
send_repeatable_notification_duplicated(id, f"Blackjack for @{v.username}: {extra_info}")
return True
def render_emoji(html, regexp, golden, marseys_used, b=False): def render_emoji(html, regexp, golden, marseys_used, b=False):
emojis = list(regexp.finditer(html)) emojis = list(regexp.finditer(html))
@ -270,9 +351,12 @@ def handle_youtube_links(url):
return html return html
@with_sigalrm_timeout(10) @with_sigalrm_timeout(10)
def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys=False, torture=False, sidebar=False, snappy=False, chat=False): def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys=False, torture=False, snappy=False, blackjack=None):
sanitized = sanitized.strip() sanitized = sanitized.strip()
if blackjack and execute_blackjack(g.v, None, sanitized, blackjack):
sanitized = 'g'
sanitized = utm_regex.sub('', sanitized) sanitized = utm_regex.sub('', sanitized)
sanitized = utm_regex2.sub('', sanitized) sanitized = utm_regex2.sub('', sanitized)
@ -431,7 +515,7 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys
domain_list.add(d.lower()) domain_list.add(d.lower())
def error(error): def error(error):
if chat: if blackjack == "chat":
return error, 403 return error, 403
else: else:
abort(403, error) abort(403, error)
@ -445,7 +529,7 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys
if discord_username_regex.match(sanitized): if discord_username_regex.match(sanitized):
return error("Stop grooming!") return error("Stop grooming!")
if '<pre>' not in sanitized and not sidebar: if '<pre>' not in sanitized and blackjack != "rules":
sanitized = sanitized.replace('\n','') sanitized = sanitized.replace('\n','')
if showmore: if showmore:

View File

@ -67,7 +67,7 @@ def edit_rules_get(v):
@admin_level_required(PERMS['EDIT_RULES']) @admin_level_required(PERMS['EDIT_RULES'])
def edit_rules_post(v): def edit_rules_post(v):
rules = request.values.get('rules', '').strip() rules = request.values.get('rules', '').strip()
rules = sanitize(rules, sidebar=True, showmore=False) rules = sanitize(rules, blackjack="rules", showmore=False)
with open(f'files/templates/rules_{SITE_NAME}.html', 'w+', encoding="utf-8") as f: with open(f'files/templates/rules_{SITE_NAME}.html', 'w+', encoding="utf-8") as f:
f.write(rules) f.write(rules)

View File

@ -9,7 +9,7 @@ from files.helpers.alerts import *
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.regex import * from files.helpers.regex import *
from files.helpers.media import process_image from files.helpers.media import process_image
from files.helpers.sanitize import sanitize from files.helpers.sanitize import *
from files.helpers.alerts import push_notif from files.helpers.alerts import push_notif
from files.routes.wrappers import * from files.routes.wrappers import *
@ -113,7 +113,7 @@ def speak(data, v):
emit("online", [online, muted], broadcast=True) emit("online", [online, muted], broadcast=True)
self_only = True self_only = True
if self_only or v.shadowbanned or not execute_blackjack(v, None, text, "chat"): if self_only or v.shadowbanned or execute_blackjack(v, None, text, "chat"):
emit('speak', data) emit('speak', data)
else: else:
emit('speak', data, broadcast=True) emit('speak', data, broadcast=True)

View File

@ -63,7 +63,7 @@ def request_api_keys(v):
g.db.add(new_app) g.db.add(new_app)
body = f"@{v.username} has requested API keys for `{request.values.get('name')}`. You can approve or deny the request [here](/admin/apps)." body = f"@{v.username} has requested API keys for `{request.values.get('name')}`. You can approve or deny the request [here](/admin/apps)."
body_html = sanitize(body) body_html = sanitize(body, blackjack="app description")
new_comment = Comment(author_id=AUTOJANNY_ID, new_comment = Comment(author_id=AUTOJANNY_ID,
parent_submission=None, parent_submission=None,

View File

@ -312,7 +312,7 @@ def edit_post(pid, v):
execute_under_siege(v, p, p.body, 'submission') execute_under_siege(v, p, p.body, 'submission')
for text in [p.body, p.title, p.url]: for text in [p.body, p.title, p.url]:
if not execute_blackjack(v, p, text, 'submission'): break if execute_blackjack(v, p, text, 'submission'): break
if len(body_html) > POST_BODY_HTML_LENGTH_LIMIT: if len(body_html) > POST_BODY_HTML_LENGTH_LIMIT:
abort(400, f"Submission body_html too long!") abort(400, f"Submission body_html too long!")
@ -708,7 +708,7 @@ def submit_post(v:User, sub=None):
g.db.flush() g.db.flush()
for text in {post.body, post.title, post.url}: for text in {post.body, post.title, post.url}:
if not execute_blackjack(v, post, text, 'submission'): break if execute_blackjack(v, post, text, 'submission'): break
process_poll_options(post, SubmissionOption, bets, 2, "Bet", g.db) process_poll_options(post, SubmissionOption, bets, 2, "Bet", g.db)
process_poll_options(post, SubmissionOption, options, 0, "Poll", g.db) process_poll_options(post, SubmissionOption, options, 0, "Poll", g.db)

View File

@ -227,7 +227,7 @@ def settings_personal_post(v):
elif not updated and v.patron and request.values.get("sig"): elif not updated and v.patron and request.values.get("sig"):
sig = request.values.get("sig")[:200].replace('\n','').replace('\r','') sig = request.values.get("sig")[:200].replace('\n','').replace('\r','')
sig_html = sanitize(sig) sig_html = sanitize(sig, blackjack="signature")
if len(sig_html) > 1000: if len(sig_html) > 1000:
return render_template("settings/personal.html", return render_template("settings/personal.html",
v=v, v=v,
@ -243,7 +243,7 @@ def settings_personal_post(v):
elif not updated and FEATURES['USERS_PROFILE_BODYTEXT'] and request.values.get("friends"): elif not updated and FEATURES['USERS_PROFILE_BODYTEXT'] and request.values.get("friends"):
friends = request.values.get("friends")[:1000] friends = request.values.get("friends")[:1000]
friends_html = sanitize(friends) friends_html = sanitize(friends, blackjack="friends")
if len(friends_html) > 5000: if len(friends_html) > 5000:
return render_template("settings/personal.html", return render_template("settings/personal.html",
@ -268,7 +268,7 @@ def settings_personal_post(v):
elif not updated and FEATURES['USERS_PROFILE_BODYTEXT'] and request.values.get("enemies"): elif not updated and FEATURES['USERS_PROFILE_BODYTEXT'] and request.values.get("enemies"):
enemies = request.values.get("enemies")[:1000] enemies = request.values.get("enemies")[:1000]
enemies_html = sanitize(enemies) enemies_html = sanitize(enemies, blackjack="enemies")
if len(enemies_html) > 5000: if len(enemies_html) > 5000:
return render_template("settings/personal.html", return render_template("settings/personal.html",
@ -294,7 +294,7 @@ def settings_personal_post(v):
bio = request.values.get("bio")[:1500] bio = request.values.get("bio")[:1500]
bio += process_files(request.files, v) bio += process_files(request.files, v)
bio = bio.strip() bio = bio.strip()
bio_html = sanitize(bio) bio_html = sanitize(bio, blackjack="bio")
if len(bio_html) > 10000: if len(bio_html) > 10000:
return render_template("settings/personal.html", return render_template("settings/personal.html",

View File

@ -406,7 +406,7 @@ def post_sub_sidebar(v:User, sub):
if v.shadowbanned: return redirect(f'/h/{sub}/settings') if v.shadowbanned: return redirect(f'/h/{sub}/settings')
sub.sidebar = request.values.get('sidebar', '').strip()[:10000] sub.sidebar = request.values.get('sidebar', '').strip()[:10000]
sub.sidebar_html = sanitize(sub.sidebar, showmore=False) sub.sidebar_html = sanitize(sub.sidebar, blackjack=f"/h/{sub} sidebar", showmore=False)
if len(sub.sidebar_html) > 20000: abort(400, "Sidebar is too big!") if len(sub.sidebar_html) > 20000: abort(400, "Sidebar is too big!")
g.db.add(sub) g.db.add(sub)

View File

@ -13,7 +13,7 @@ from files.classes import *
from files.classes.leaderboard import Leaderboard from files.classes.leaderboard import Leaderboard
from files.classes.transactions import * from files.classes.transactions import *
from files.classes.views import * from files.classes.views import *
from files.helpers.actions import execute_blackjack, execute_under_siege from files.helpers.actions import execute_under_siege
from files.helpers.alerts import * from files.helpers.alerts import *
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.mail import * from files.helpers.mail import *