commit f9701df16d8f7fc02fd6a1f80ffd73f64c131ef4 Author: Alexandre Allaire alexandre.allaire@mail.mcgill.ca Date: Thu Jan 17 20:37:42 2013 -0500
Add handling of URL registrations to facilitator.cgi.
Modify facilitator.cgi to accept client registrations through HTTP GET requests. The addresses are encrypted and base64 encoded, and are passed in using extra path info of the form /reg/<address>. The registrations are handed off to a daemon for precessing. --- facilitator/facilitator.cgi | 48 ++++++++++++++++++++++++++++++++++-------- 1 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/facilitator/facilitator.cgi b/facilitator/facilitator.cgi index c21e67d..28c1606 100755 --- a/facilitator/facilitator.cgi +++ b/facilitator/facilitator.cgi @@ -5,10 +5,12 @@ import os import socket import sys import urllib +import subprocess
import fac
FACILITATOR_ADDR = ("127.0.0.1", 9002) +FACILITATOR_REG_URL_ADDR = ("127.0.0.1", 9003)
def exit_error(status): print """\ @@ -16,6 +18,19 @@ Status: %d\r \r""" % status sys.exit()
+# Send a client registration to the helper daemon, +# which handles decryption and registration. +def url_reg(reg): + sock = socket.create_connection(FACILITATOR_REG_URL_ADDR) + sock.sendall(reg) + sock.shutdown(socket.SHUT_WR) + response = sock.recv(4096) + sock.close() + if response == "\x00": + return True + else: + return False + method = os.environ.get("REQUEST_METHOD") remote_addr = (os.environ.get("REMOTE_ADDR"), None) path_info = os.environ.get("PATH_INFO") or "/" @@ -26,20 +41,35 @@ if not method or not remote_addr[0]: fs = cgi.FieldStorage()
def do_get(): - if path_info != "/": - exit_error(400) - try: - reg = fac.get_reg(FACILITATOR_ADDR, remote_addr) or "" - except: - exit_error(500) - # Allow XMLHttpRequest from any domain. http://www.w3.org/TR/cors/. - print """\ + args = [arg for arg in path_info.split("/") if arg] + # Check if we have a URL registration or a request for a client. + if len(args) == 2: + if args[0] != "reg": + exit_error(400) + reg = args[1] + # 256 byte RSA encryption, base64-encoded, should be no longer than 344 bytes. + if len(reg) > 350: + exit_error(400) + if not url_reg(reg): + exit_error(500) + print """\ +Status: 200\r +\r""" + elif len(args) == 0: + try: + reg = fac.get_reg(FACILITATOR_ADDR, remote_addr) or "" + except: + exit_error(500) + # Allow XMLHttpRequest from any domain. http://www.w3.org/TR/cors/. + print """\ Status: 200\r Content-Type: application/x-www-form-urlencoded\r Cache-Control: no-cache\r Access-Control-Allow-Origin: *\r \r""" - sys.stdout.write(urllib.urlencode(reg)) + sys.stdout.write(urllib.urlencode(reg)) + else: + exit_error(400)
def do_post(): if path_info != "/":