fdfdf
This commit is contained in:
parent
5751741622
commit
d0e380b755
8 changed files with 40 additions and 149 deletions
|
@ -319,21 +319,15 @@ def after_request(response):
|
||||||
print(e)
|
print(e)
|
||||||
abort(500)
|
abort(500)
|
||||||
|
|
||||||
response.headers.add('Access-Control-Allow-Headers',
|
response.headers.add('Access-Control-Allow-Headers', "Origin, X-Requested-With, Content-Type, Accept, x-auth")
|
||||||
"Origin, X-Requested-With, Content-Type, Accept, x-auth"
|
|
||||||
)
|
|
||||||
response.headers.remove("Cache-Control")
|
response.headers.remove("Cache-Control")
|
||||||
response.headers.add("Cache-Control", "public, max-age=31536000")
|
response.headers.add("Cache-Control", "public, max-age=31536000")
|
||||||
response.headers.add("Access-Control-Allow-Origin", app.config["SERVER_NAME"])
|
response.headers.add("Access-Control-Allow-Origin", app.config["SERVER_NAME"])
|
||||||
|
|
||||||
response.headers.add("Strict-Transport-Security", "max-age=31536000")
|
response.headers.add("Strict-Transport-Security", "max-age=31536000")
|
||||||
response.headers.add("Referrer-Policy", "same-origin")
|
response.headers.add("Referrer-Policy", "same-origin")
|
||||||
# response.headers.add("X-Content-Type-Options","nosniff")
|
response.headers.add("Feature-Policy", "geolocation 'none'; midi 'none'; notifications 'none'; push 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; vibrate 'none'; fullscreen 'none'; payment 'none';")
|
||||||
response.headers.add("Feature-Policy",
|
if not request.path.startswith("/embed/"): response.headers.add("X-Frame-Options", "deny")
|
||||||
"geolocation 'none'; midi 'none'; notifications 'none'; push 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; vibrate 'none'; fullscreen 'none'; payment 'none';")
|
|
||||||
if not request.path.startswith("/embed/"):
|
|
||||||
response.headers.add("X-Frame-Options",
|
|
||||||
"deny")
|
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
|
@ -11,21 +11,18 @@ reasons = {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Domain(Base):
|
class BannedDomain(Base):
|
||||||
|
|
||||||
__tablename__ = "domains"
|
__tablename__ = "domains"
|
||||||
id = Column(Integer, primary_key=True)
|
id = Column(Integer, primary_key=True)
|
||||||
domain = Column(String)
|
domain = Column(String)
|
||||||
can_submit = Column(Boolean, default=True)
|
|
||||||
reason = Column(Integer, default=0)
|
reason = Column(Integer, default=0)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def reason_text(self):
|
def reason_text(self): return reasons.get(self.reason)
|
||||||
return reasons.get(self.reason)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def permalink(self):
|
def permalink(self): return f"/admin/domain/{self.domain}"
|
||||||
return f"/admin/domain/{self.domain}"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,80 +0,0 @@
|
||||||
import re
|
|
||||||
from urllib.parse import *
|
|
||||||
import requests
|
|
||||||
from os import environ
|
|
||||||
from drama.__main__ import app
|
|
||||||
|
|
||||||
youtube_regex = re.compile("^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|shorts\/|\&v=)([^#\&\?]*).*")
|
|
||||||
|
|
||||||
drama_regex = re.compile("^.*rdrama.net/post/+\w+/(\w+)(/\w+/(\w+))?")
|
|
||||||
|
|
||||||
twitter_regex=re.compile("/status/(\d+)")
|
|
||||||
|
|
||||||
FACEBOOK_TOKEN=environ.get("FACEBOOK_TOKEN","").strip()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def youtube_embed(url):
|
|
||||||
|
|
||||||
try:
|
|
||||||
yt_id = re.match(youtube_regex, url).group(2)
|
|
||||||
except AttributeError:
|
|
||||||
return "error"
|
|
||||||
|
|
||||||
if not yt_id or len(yt_id) != 11:
|
|
||||||
return "error"
|
|
||||||
|
|
||||||
x = urlparse(url)
|
|
||||||
params = parse_qs(x.query)
|
|
||||||
t = params.get('t', params.get('start', [0]))[0]
|
|
||||||
if t:
|
|
||||||
return f"https://youtube.com/embed/{yt_id}?start={t}"
|
|
||||||
else:
|
|
||||||
return f"https://youtube.com/embed/{yt_id}"
|
|
||||||
|
|
||||||
|
|
||||||
def drama_embed(url):
|
|
||||||
|
|
||||||
matches = re.match(drama_regex, url)
|
|
||||||
|
|
||||||
post_id = matches.group(1)
|
|
||||||
comment_id = matches.group(3)
|
|
||||||
|
|
||||||
if comment_id:
|
|
||||||
return f"https://{app.config['SERVER_NAME']}/embed/comment/{comment_id}"
|
|
||||||
else:
|
|
||||||
return f"https://{app.config['SERVER_NAME']}/embed/post/{post_id}"
|
|
||||||
|
|
||||||
|
|
||||||
def bitchute_embed(url):
|
|
||||||
|
|
||||||
return url.replace("/video/", "/embed/")
|
|
||||||
|
|
||||||
def twitter_embed(url):
|
|
||||||
|
|
||||||
|
|
||||||
oembed_url=f"https://publish.twitter.com/oembed"
|
|
||||||
params={
|
|
||||||
"url":url,
|
|
||||||
"omit_script":"t"
|
|
||||||
}
|
|
||||||
x=requests.get(oembed_url, params=params)
|
|
||||||
|
|
||||||
return x.json()["html"]
|
|
||||||
|
|
||||||
def instagram_embed(url):
|
|
||||||
|
|
||||||
oembed_url=f"https://graph.facebook.com/v9.0/instagram_oembed"
|
|
||||||
params={
|
|
||||||
"url":url,
|
|
||||||
"access_token":FACEBOOK_TOKEN,
|
|
||||||
"omitscript":'true'
|
|
||||||
}
|
|
||||||
|
|
||||||
headers={
|
|
||||||
"User-Agent":"Instagram embedder for Drama"
|
|
||||||
}
|
|
||||||
|
|
||||||
x=requests.get(oembed_url, params=params, headers=headers)
|
|
||||||
|
|
||||||
return x.json()["html"]
|
|
|
@ -30,10 +30,7 @@ def filter_comment_html(html_text):
|
||||||
|
|
||||||
# search db for domain rules that prohibit commenting
|
# search db for domain rules that prohibit commenting
|
||||||
bans = [
|
bans = [
|
||||||
x for x in g.db.query(Domain).filter_by(
|
x for x in g.db.query(Domain).filter(Domain.domain.in_(list(domain_list))).all()]
|
||||||
can_submit=False).filter(
|
|
||||||
Domain.domain.in_(
|
|
||||||
list(domain_list))).all()]
|
|
||||||
|
|
||||||
if bans:
|
if bans:
|
||||||
return bans
|
return bans
|
||||||
|
|
|
@ -967,27 +967,17 @@ def admin_ban_domain(v):
|
||||||
|
|
||||||
domain=request.form.get("domain",'').strip()
|
domain=request.form.get("domain",'').strip()
|
||||||
|
|
||||||
if not domain:
|
if not domain: abort(400)
|
||||||
abort(400)
|
|
||||||
|
|
||||||
reason=int(request.form.get("reason",0))
|
reason=int(request.form.get("reason",0))
|
||||||
if not reason:
|
if not reason: abort(400)
|
||||||
abort(400)
|
|
||||||
|
|
||||||
d_query=domain.replace("_","\_")
|
d_query=domain.replace("_","\_")
|
||||||
d=g.db.query(Domain).filter_by(domain=d_query).first()
|
d=g.db.query(Domain).filter_by(domain=d_query).first()
|
||||||
if d:
|
if d: d.reason=reason
|
||||||
d.can_submit=False
|
else: d=Domain(domain=domain, reason=reason)
|
||||||
d.reason=reason
|
|
||||||
else:
|
|
||||||
d=Domain(
|
|
||||||
domain=domain,
|
|
||||||
can_submit=False,
|
|
||||||
reason=reason,
|
|
||||||
)
|
|
||||||
|
|
||||||
g.db.add(d)
|
g.db.add(d)
|
||||||
g.db.commit()
|
|
||||||
return redirect(d.permalink)
|
return redirect(d.permalink)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ import gevent
|
||||||
from drama.helpers.wrappers import *
|
from drama.helpers.wrappers import *
|
||||||
from drama.helpers.sanitize import *
|
from drama.helpers.sanitize import *
|
||||||
from drama.helpers.filters import *
|
from drama.helpers.filters import *
|
||||||
from drama.helpers.embed import *
|
|
||||||
from drama.helpers.markdown import *
|
from drama.helpers.markdown import *
|
||||||
from drama.helpers.session import *
|
from drama.helpers.session import *
|
||||||
from drama.helpers.thumbs import *
|
from drama.helpers.thumbs import *
|
||||||
|
@ -595,27 +594,37 @@ def submit_post(v):
|
||||||
# check ban status
|
# check ban status
|
||||||
domain_obj = get_domain(domain)
|
domain_obj = get_domain(domain)
|
||||||
if domain_obj:
|
if domain_obj:
|
||||||
if not domain_obj.can_submit:
|
if domain_obj.reason==4:
|
||||||
|
v.ban(days=30, reason="Digitally malicious content")
|
||||||
|
elif domain_obj.reason==7:
|
||||||
|
v.ban(reason="Sexualizing minors")
|
||||||
|
|
||||||
if domain_obj.reason==4:
|
if request.headers.get("Authorization"): return {"error":"ToS violation"}, 400
|
||||||
v.ban(days=30, reason="Digitally malicious content")
|
else: return render_template("submit.html", v=v, error="ToS Violation", title=title, url=url, body=request.form.get("body", "")), 400
|
||||||
elif domain_obj.reason==7:
|
|
||||||
v.ban(reason="Sexualizing minors")
|
|
||||||
|
|
||||||
if request.headers.get("Authorization"): return {"error":"ToS violation"}, 400
|
if "twitter.com" in domain:
|
||||||
else: return render_template("submit.html", v=v, error="ToS Violation", title=title, url=url, body=request.form.get("body", "")), 400
|
embed = requests.get("https://publish.twitter.com/oembed", params={"url":url, "omit_script":"t"}).json()["html"]
|
||||||
|
|
||||||
# check for embeds
|
elif "youtu" in domain:
|
||||||
if domain_obj.embed_function:
|
yt_id = re.match(re.compile("^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|shorts\/|\&v=)([^#\&\?]*).*"), url).group(2)
|
||||||
try:
|
if not yt_id or len(yt_id) != 11: embed = None
|
||||||
embed = eval(domain_obj.embed_function)(url)
|
|
||||||
except BaseException:
|
|
||||||
embed = None
|
|
||||||
else:
|
else:
|
||||||
embed = None
|
params = parse_qs(urlparse(url).query)
|
||||||
else:
|
t = params.get('t', params.get('start', [0]))[0]
|
||||||
|
if t: embed = f"https://youtube.com/embed/{yt_id}?start={t}"
|
||||||
|
else: embed = f"https://youtube.com/embed/{yt_id}"
|
||||||
|
|
||||||
embed = None
|
elif "instagram.com" in domain:
|
||||||
|
embed = requests.get("https://graph.facebook.com/v9.0/instagram_oembed", params={"url":url,"access_token":environ.get("FACEBOOK_TOKEN","").strip(),"omitscript":'true'}, headers={"User-Agent":"Instagram embedder for Drama"}).json()["html"]
|
||||||
|
|
||||||
|
elif app.config['SERVER_NAME'] in domain:
|
||||||
|
matches = re.match(re.compile("^.*rdrama.net/post/+\w+/(\w+)(/\w+/(\w+))?"), url)
|
||||||
|
post_id = matches.group(1)
|
||||||
|
comment_id = matches.group(3)
|
||||||
|
if comment_id: embed = f"https://{app.config['SERVER_NAME']}/embed/comment/{comment_id}"
|
||||||
|
else: embed = f"https://{app.config['SERVER_NAME']}/embed/post/{post_id}"
|
||||||
|
|
||||||
|
else: embed = None
|
||||||
|
|
||||||
# similarity check
|
# similarity check
|
||||||
now = int(time.time())
|
now = int(time.time())
|
||||||
|
|
|
@ -14,9 +14,6 @@
|
||||||
|
|
||||||
<h2>Current</h2>
|
<h2>Current</h2>
|
||||||
|
|
||||||
<h3 class="h5 pt-2">can_submit</h3>
|
|
||||||
<p>{{domain.can_submit}}</p>
|
|
||||||
|
|
||||||
<h3 class="h5 pt-2">reason</h3>
|
<h3 class="h5 pt-2">reason</h3>
|
||||||
<p>{{domain.reason_text}}</p>
|
<p>{{domain.reason_text}}</p>
|
||||||
|
|
||||||
|
|
|
@ -390,19 +390,6 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{% elif b %}
|
|
||||||
<div class="row no-gutters">
|
|
||||||
<div class="col">
|
|
||||||
<div class="text-center py-7">
|
|
||||||
<div class="h4 p-2">+{{b.name}} is barren and needs posts!</div>
|
|
||||||
{% if v and b and b.can_submit(v) %}
|
|
||||||
<div class="p-2"><a href="/submit" class="btn btn-primary">Be the first to post</a></div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
{% elif u %}
|
{% elif u %}
|
||||||
{% if v and v.id == u.id %}
|
{% if v and v.id == u.id %}
|
||||||
<div class="row no-gutters">
|
<div class="row no-gutters">
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue