Initialer Commit

This commit is contained in:
Clemens Klug 2018-10-17 16:45:35 +02:00
commit 9ec7d6fe8c
6 changed files with 203 additions and 0 deletions

10
Dockerfile Normal file
View File

@ -0,0 +1,10 @@
FROM alpine:3.8
ADD src /app
RUN apk add --update --no-cache python3 && \
pip3 --no-cache-dir install -r /app/requirements.txt && \
adduser -D app
USER app
EXPOSE 5000
ENV FLASK_APP=spammer.py
WORKDIR /app
CMD ["flask", "run", "-h", "0.0.0.0"]

6
docker-compose.yml Normal file
View File

@ -0,0 +1,6 @@
version: "3"
services:
rzspam:
build: .
image: docker.wiai.de/fswiai/rzspam:0.1

28
src/config.json Normal file
View File

@ -0,0 +1,28 @@
{
"placeholders": {
"port": {
"type": "text",
"desc": "Portnummer/Dienst"
},
"raum": {
"desc": "Raumnummer"
},
"wlan": {
"type": "text",
"desc": "Wlan-name",
"default": "eduroam"
},
"anzahl": {
"type": "number",
"desc": "Anzahl"
}
},
"RZ": {
"mail": "fachschaft.wiai@uni-bamberg.de",
"templates": {
"Portsperre": "liebes RZ, Port {port} ist zu. das ist doof :(",
"WLAN": "hallo RZ, in Raum {raum} funkt das WLAN {wlan} nicht. das ist doof :(",
"test": "ich bin ein test mit einer zahl: {anzahl}"
}
}
}

2
src/requirements.txt Normal file
View File

@ -0,0 +1,2 @@
Flask==1.0.2
Flask-Mail==0.9.1

81
src/spammer.py Normal file
View File

@ -0,0 +1,81 @@
import json
from collections import namedtuple
from string import Formatter
from flask import Flask
from flask import request
from flask_mail import Mail, Message
import templates
Placeholder = namedtuple("Placeholder", ["name", "type", "desc", "default"])
def load_config(conf="config.json"):
config = json.load(open(conf))
placeholders = []
for i in config["placeholders"]:
p_h = config["placeholders"][i]
p = Placeholder(
name=i,
type=p_h.get("type", "text"),
desc=p_h["desc"],
default=p_h.get("default"))
placeholders.append(p)
config.pop("placeholders")
flat = {}
for org in config:
target = config[org]
templates = []
for issue_name in target["templates"]:
text = target["templates"][issue_name]
fields = [name for _, name, _, _ in Formatter().parse(text)]
flat[f"{org}: {issue_name}"] = {
"org": org,
"name": issue_name,
"mail": config[org]["mail"],
"text": text,
"placeholders": [i._asdict() for i in placeholders if i.name in fields]
}
return flat
MAIL_SERVER = "smtp.uni-bamberg.de"
MAIL_PORT = 587
#TESTING=True
#MAIL_USE_TLS=True
#MAIL_USE_SSL=True
MAIL_DEBUG=True
app = Flask(__name__)
app.config.from_object(__name__)
mail = Mail(app)
issues = load_config()
@app.route("/")
def index():
return templates.format_index(issues)
@app.route("/send", methods=["POST"])
def send():
if all([field in request.form for field in ("text", "sender", "target")]):
text = request.form["text"]
print("all fields present")
fields = [name for _, name, _, _ in Formatter().parse(text)]
if None in fields:
fields.remove(None)
if all([field in request.form for field in fields]):
values = {field: request.form[field] for field in fields}
text = text.format(**values)
sender = request.form["sender"]
recipients = [request.form["target"]]
msg = Message("Störungsmeldung", body=text, sender=sender, recipients=recipients)
print(msg)
return str(mail.send(msg))
print([(field,field in request.form) for field in fields])
return "2"
print([(field,field in request.form) for field in ("text", "sender", "target")])
print(request.form)
return "1"

76
src/templates.py Normal file
View File

@ -0,0 +1,76 @@
import json
BASE = """<!doctype html>
<html>
<head>
<title>spammer</title>
<script>
function selection() {
var x = document.getElementById("issue").value;
var data = JSON.parse(x)
console.log(data);
var textarea = document.getElementById("text");
var emailfield = document.getElementById("sender");
textarea.value = data.text;
textarea.readOnly = false;
emailfield.readOnly = false;
var placeholders = document.getElementById("placeholders");
placeholders.innerHTML = "";
var target = document.createElement("input");
target.setAttribute("name", "target");
target.setAttribute("value", data.mail);
target.setAttribute("hidden", "true");
placeholders.appendChild(target);
for (i in data.placeholders) {
var placeholder = data.placeholders[i];
var x = document.createElement("input");
x.setAttribute("type", placeholder.type);
x.setAttribute("placeholder", placeholder.desc);
x.setAttribute("name", placeholder.name);
x.setAttribute("id", placeholder.name);
x.setAttribute("required", "true");
if (placeholder.default !== null){
x.setAttribute("value", placeholder.default);
}
var y = document.createElement("label");
y.setAttribute("for", placeholder.name);
y.innerHTML = placeholder.desc;
var z = document.createElement("p");
z.appendChild(y);
z.appendChild(x);
placeholders.appendChild(z);
}
}
</script>
</head>
<body>
"""
INDEX = """<h1>Welcome</h1>
<p>choose an issue, fill the placeholders, enter your uni-mail, then hit send</p>
<form action="send" method="post">
<p>
<select name="issue" required onchange="selection()" id="issue">
<option selected disabled="true">---</option>
{issues}
</select>
</p>
<p><textarea id="text" readonly required name="text"></textarea></p>
<p>
<label for="sender">absender:</label>
<input type="email" required="true" name="sender" id="sender" placeholder="sender email" readonly>
</p>
<div id="placeholders" ></div>
<input type="submit">
</form>
"""
def format_page(body):
return BASE + str(body) + "</body>\n</html>"
def format_index(issues):
html = ""
for issue in issues:
html+=f"<option value='{json.dumps(issues[issue])}'>{issue}</option>\n"
index = INDEX.format(issues=html)
return format_page(index)