12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- #!/usr/bin/python3
- import os
- import cgi
- import cgitb
- import subprocess
- import urllib.request
-
- cgitb.enable()
- form = cgi.FieldStorage()
- source = form.getvalue("source", None)
- target = form.getvalue("target", None)
- server = os.environ.get("SERVER_NAME", None)
- method = os.environ.get("REQUEST_METHOD", "GET")
-
-
- def validate(source, target, server, method):
- status = 400
- if method != "POST":
- message = "Webmention MUST be performed through a POST request."
- elif source is None or target is None:
- message = "Please fill in the source and target fields."
- elif "://" not in source or "://" not in target:
- message = "Source and target fields should be URLs."
- elif not target.split("://", 1)[1].startswith(server):
- message = "Target should be a link to this domain: {0}".format(server)
- elif target not in urllib.request.urlopen(source).read().decode("utf-8"):
- message = "Source should have a link to the target: {0}".format(target)
- else:
- message = (
- "Success! With source={source} and target={target}."
- '<a href="{target}">Back to the target article</a>.'
- ).format(
- source=source,
- target=target,
- )
- status = 202
- return status, message, source, target
-
-
- def send_response(callback, status, message, source, target):
- print("Content-type: text/html")
- print("Status: {0}".format(status))
- print()
- print(
- """<!doctype html><html lang=en>
- <head><meta charset=utf-8><title>Webmention</title></head>
- <body><p>{message}</p></body></html>""".format(
- message=message
- )
- )
- if status == 202:
- callback(source, target)
-
-
- def on_valid_submission(source, target):
- commands = [
- "cd /home/larlet/www",
- "source /home/larlet/.virtualenvs/webmention/bin/activate",
- "fab --hide=everything add_webmention:{source},{target}".format(
- source=source,
- target=target,
- ),
- ]
- subprocess.call(" && ".join(commands), shell=True)
-
-
- send_response(on_valid_submission, *validate(source, target, server, method))
|