1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- #!/usr/bin/python3
- import os
- import cgi
- import cgitb
- cgitb.enable()
- import subprocess
- import urllib.request
-
- 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 not target 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))
|