from twisted.web2 import resource, http, iweb PUBCOOKIE_ROOT = 'https://weblogin.washington.edu/' REDIRECT_HTML = """
""" class PubcookieRedirector(resource.Resource): def locateChild(self, request, segments): return self, () def render(self, ctx): # example g_req: # b25lPW15dXcud2FzaGluZ3Rvbi5lZHUmdHdvPW15dXcmdGhyZWU9MSZmb3VyPWE1JmZpdmU9R0VUJnNpeD1teXV3Lndhc2hpbmd0b24uZWR1JnNldmVuPUwzTmxjblpzWlhRdmRYTmxjZz09JmVpZ2h0PVpHVm1ZblYwUFV4dlp5dHBiaXQzYVhSb0szbHZkWElyVlZjclRtVjBTVVE9Jmhvc3RuYW1lPW15dXcud2FzaGluZ3Rvbi5lZHUmbmluZT0xJmZpbGU9JnJlZmVyZXI9aHR0cDovL215dXcud2FzaGluZ3Rvbi5lZHUvJnNlc3NfcmU9MCZwcmVfc2Vzc190b2s9MTcwODk5MDg3MyZmbGFnPTA= # base64 decoded: # one=myuw.washington.edu&two=myuw&three=1&four=a5&five=GET&six=myuw.washington.edu&seven=L3NlcnZsZXQvdXNlcg==&eight=ZGVmYnV0PUxvZytpbit3aXRoK3lvdXIrVVcrTmV0SUQ=&hostname=myuw.washington.edu&nine=1&file=&referer=http://myuw.washington.edu/&sess_re=0&pre_sess_tok=1708990873&flag=0 # 'seven' field: # /servlet/user # 'eight' field: # defbut=Log+in+with+your+UW+NetID req = iweb.IRequest(ctx) hostname = req.headers.getHeader('Host') g_req_contents = [] g_req_contents.append(('one', hostname)) # application server name g_req_contents.append(('two', "Python appserver test")) # application id g_req_contents.append(('three', "1")) # credential type (1 = password, 2 = securid, 3 = reserved) g_req_contents.append(('four', "a5")) # version g_req_contents.append(('five', req.method)) # request method g_req_contents.append(('six', hostname)) # web server hostname g_req_contents.append(('seven', req.uri.encode('base64').strip())) # return url (relative, base64) g_req_contents.append(('eight', ''.encode('base64').strip())) # arguments (base64) g_req = '&'.join(map('='.join, g_req_contents)) post_stuff = "" relay_url = "" text = REDIRECT_HTML % (PUBCOOKIE_ROOT, g_req, post_stuff, relay_url) return http.Response(stream=text) def renderWrapper(origRender): def render(self, ctx): return PubcookieRedirector.render(self, ctx) return render def locateChildWrapper(origLocateChild): def locateChild(self, request, segments): redirector = PubcookieRedirector() return redirector.locateChild(request, segments) return locateChild def requirePubcookie(): """ Called at the end of a class declaration; adds pubcookie protection to the page Hacky, hacky, but ever so convenient. If only Python supported class decorators. """ import sys locals = sys._getframe(1).f_locals if not 'render' in locals: locals['render'] = resource.Resource.render if not 'locateChild' in locals: locals['locateChild'] = resource.Resource.locateChild locals['render'] = renderWrapper(locals['render']) locals['locateChild'] = locateChildWrapper(locals['locateChild']) if __name__ == '__main__': from twisted.internet import reactor from twisted.web2 import server, channel from twisted.python import log import sys log.startLogging(sys.stdout) class PubcookieTest(resource.Resource): addSlash = True def render(self, ctx): return http.Response(stream='fnord') requirePubcookie() site = server.Site(PubcookieTest()) svc = channel.HTTPFactory(site) reactor.listenTCP(8888, svc) reactor.run()