0
-from twisted.internet import reactor
0
-from twisted.python import usage
0
-from twisted.web import proxy
0
-class Options(usage.Options):
0
- synopsis = "Usage: oauth_reverse proxy --remote-host <remote host> [--remote-port <remote port>] [--path-prefix <path prefix>] [-p <proxy port>] [--ssl] [--ssl-private-key <private key] [--ssl-certificate <certificate>]"
0
- longdesc = "Makes an OAuth reverse HTTP proxy server.."
0
- ['path-prefix', None, '', "Path prefix"],
0
- ['port', 'p', 8080, "Proxy port", int],
0
- ['remote-host', None, None, "Remote host"],
0
- ['remote-port', None, 80, "Remote port"],
0
- ['ssl-certificate', None, None, "SSL certificate"],
0
- ['ssl-private-key', None, None, "SSL private key"],
0
- optFlags = [['ssl', 's']]
0
- """Validate an OAuth request"""
0
-class OAuthReverseProxyRequest(proxy.ReverseProxyRequest):
0
- # TODO this class may be unnecessary if header rewriting can occur in OAuthReverseProxyResource
0
- proxyClientFactoryClass = ProxyClientFactory
0
- def __init__(self, validator, *args):
0
- self.validator = validator
0
- proxy.ReverseProxyRequest.__init__(self, *args)
0
- # This logic either goes here or in OAuthReverseProxyResource.render
0
- # filter querystring from self.uri
0
- # filter headers from self.getAllHeaders()
0
- # validate oauth params
0
- proxy.ReverseProxyRequest.process(self)
0
- # self.received_headers['host'] = self.factory.host
0
- # clientFactory = self.proxyClientFactoryClass(
0
- # self.method, self.uri, self.clientproto, self.getAllHeaders(),
0
- # self.content.read(), self)
0
- # self.reactor.connectTCP(self.factory.host, self.factory.port,
0
- # return an error message
0
-class OAuthReverseProxy(proxy.ReverseProxy):
0
- # TODO this may be the only required line, if validation occurs in OAuthReverseProxyResource
0
- # requestFactory = OAuthReverseProxyRequest
0
- def __init__(self, validator):
0
- self.validator = validator
0
- proxy.ReverseProxy.__init__(self)
0
- def requestFactory(self, *args):
0
- return OAuthReverseProxyRequest(self.validator, *args)
0
-class OAuthReverseProxyResource(proxy.ReverseProxyResource):
0
- def __init__(self, host, port, path, reactor=reactor, validator=OAuthValidator):
0
- self.validator = validator
0
- proxy.ReverseProxyResource(self, host, port, path, reactor)
0
- def getChild(self, path, request):
0
- return OAuthReverseProxyResource(
0
- self.host, self.port, self.path + '/' + urlquote(path, safe="", validator=self.validator))
0
- def render(self, request):
0
- # get OAuth headers from request.received_headers['authorization']
0
- # remove OAuth headers
0
- # parse querystring and POST body for OAuth params
0
- qs = urlparse.urlparse(request.uri)[4]
0
- # rewrite the path w/o OAuth params
0
- valid = self.validator.validate()
0
- response = proxy.ReverseProxyResource.render(self, request)
0
- # render an error message
0
- # TODO return NOT_DONE_YET in order to write headers
0
- response = "Invalid signature"
Comments
No one has commented yet.