#!/usr/bin/python3 import cgi import cgitb import os 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}." 'Back to the target article.' ).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( """ Webmention

{message}

""".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))