Commit 072e8522 authored by rsimha@chromium.org's avatar rsimha@chromium.org

[sync] Serve fake OAuth2 tokens from python sync server

This CL adds a new handler to the python sync server so it can serve
fake OAuth2 tokens to chrome. It is meant to be used for manual testing
with the python sync server, using the workflow described below:

- Build the "run_sync_testserver" target.
- Run the python sync server: "out/Debug/run_sync_testserver --port=8010"
- Launch chrome, sign in, and set up sync
- Re-launch chrome with "--lso-url=http://127.0.0.1:8010"

Chrome will now fetch OAuth2 tokens from the fake gaia server.

You may change the fake OAuth2 token returned by the python sync server
on the fly via the setfakeoauth2token handler like so:
http://127.0.0.1:8010/setfakeoauth2token?response_code=200&expires_in=2400&request_token=rt&access_token=at&token_type=Bearer

You may skip or include any of the query params. Params that are skipped
will remain unchanged.

BUG=none
TEST=Build and run the "run_sync_testserver" target. Test the /o/oauth2/token and /setfakeoauth2token handlers.
R=pavely@chromium.org

Review URL: https://codereview.chromium.org/58093002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@233271 0039d316-1c4b-4281-b951-d872f2087c98
parent 5e6ae79b
...@@ -1158,6 +1158,13 @@ class TestServer(object): ...@@ -1158,6 +1158,13 @@ class TestServer(object):
for times in xrange(0, sys.maxint) for c in xrange(ord('A'), ord('Z'))) for times in xrange(0, sys.maxint) for c in xrange(ord('A'), ord('Z')))
self.transient_error = False self.transient_error = False
self.sync_count = 0 self.sync_count = 0
# Gaia OAuth2 Token fields and their default values.
self.response_code = 200
self.request_token = 'rt1'
self.access_token = 'at1'
self.expires_in = 3600
self.token_type = 'Bearer'
def GetShortClientName(self, query): def GetShortClientName(self, query):
parsed = cgi.parse_qs(query[query.find('?')+1:]) parsed = cgi.parse_qs(query[query.find('?')+1:])
...@@ -1482,3 +1489,35 @@ class TestServer(object): ...@@ -1482,3 +1489,35 @@ class TestServer(object):
if update_request.need_encryption_key or sending_nigori_node: if update_request.need_encryption_key or sending_nigori_node:
update_response.encryption_keys.extend(self.account.GetKeystoreKeys()) update_response.encryption_keys.extend(self.account.GetKeystoreKeys())
def HandleGetOauth2Token(self):
return (int(self.response_code),
'{\n'
' \"refresh_token\": \"' + self.request_token + '\",\n'
' \"access_token\": \"' + self.access_token + '\",\n'
' \"expires_in\": ' + str(self.expires_in) + ',\n'
' \"token_type\": \"' + self.token_type +'\"\n'
'}')
def HandleSetOauth2Token(self, response_code, request_token, access_token,
expires_in, token_type):
if response_code != 0:
self.response_code = response_code
if request_token != '':
self.request_token = request_token
if access_token != '':
self.access_token = access_token
if expires_in != 0:
self.expires_in = expires_in
if token_type != '':
self.token_type = token_type
return (200,
'<html><title>Set OAuth2 Token</title>'
'<H1>This server will now return the OAuth2 Token:</H1>'
'<p>response_code: ' + str(self.response_code) + '</p>'
'<p>request_token: ' + self.request_token + '</p>'
'<p>access_token: ' + self.access_token + '</p>'
'<p>expires_in: ' + str(self.expires_in) + '</p>'
'<p>token_type: ' + self.token_type + '</p>'
'</html>')
...@@ -151,10 +151,14 @@ class SyncPageHandler(testserver_base.BasePageHandler): ...@@ -151,10 +151,14 @@ class SyncPageHandler(testserver_base.BasePageHandler):
self.ChromiumSyncEnableKeystoreEncryptionOpHandler, self.ChromiumSyncEnableKeystoreEncryptionOpHandler,
self.ChromiumSyncRotateKeystoreKeysOpHandler, self.ChromiumSyncRotateKeystoreKeysOpHandler,
self.ChromiumSyncEnableManagedUserAcknowledgementHandler, self.ChromiumSyncEnableManagedUserAcknowledgementHandler,
self.ChromiumSyncEnablePreCommitGetUpdateAvoidanceHandler] self.ChromiumSyncEnablePreCommitGetUpdateAvoidanceHandler,
self.GaiaOAuth2TokenHandler,
self.GaiaSetOAuth2TokenResponseHandler]
post_handlers = [self.ChromiumSyncCommandHandler, post_handlers = [self.ChromiumSyncCommandHandler,
self.ChromiumSyncTimeHandler] self.ChromiumSyncTimeHandler,
self.GaiaOAuth2TokenHandler,
self.GaiaSetOAuth2TokenResponseHandler]
testserver_base.BasePageHandler.__init__(self, request, client_address, testserver_base.BasePageHandler.__init__(self, request, client_address,
sync_http_server, [], get_handlers, sync_http_server, [], get_handlers,
[], post_handlers, []) [], post_handlers, [])
...@@ -441,6 +445,60 @@ class SyncPageHandler(testserver_base.BasePageHandler): ...@@ -441,6 +445,60 @@ class SyncPageHandler(testserver_base.BasePageHandler):
self.wfile.write(raw_reply) self.wfile.write(raw_reply)
return True return True
def GaiaOAuth2TokenHandler(self):
test_name = "/o/oauth2/token"
if not self._ShouldHandleRequest(test_name):
return False
if self.headers.getheader('content-length'):
length = int(self.headers.getheader('content-length'))
_raw_request = self.rfile.read(length)
result, raw_reply = (
self.server._sync_handler.HandleGetOauth2Token())
self.send_response(result)
self.send_header('Content-Type', 'application/json')
self.send_header('Content-Length', len(raw_reply))
self.end_headers()
self.wfile.write(raw_reply)
return True
def GaiaSetOAuth2TokenResponseHandler(self):
test_name = "/setfakeoauth2token"
if not self._ShouldHandleRequest(test_name):
return False
# The index of 'query' is 4.
# See http://docs.python.org/2/library/urlparse.html
query = urlparse.urlparse(self.path)[4]
query_params = urlparse.parse_qs(query)
response_code = 0
request_token = ''
access_token = ''
expires_in = 0
token_type = ''
if 'response_code' in query_params:
response_code = query_params['response_code'][0]
if 'request_token' in query_params:
request_token = query_params['request_token'][0]
if 'access_token' in query_params:
access_token = query_params['access_token'][0]
if 'expires_in' in query_params:
expires_in = query_params['expires_in'][0]
if 'token_type' in query_params:
token_type = query_params['token_type'][0]
result, raw_reply = (
self.server._sync_handler.HandleSetOauth2Token(
response_code, request_token, access_token, expires_in, token_type))
self.send_response(result)
self.send_header('Content-Type', 'text/html')
self.send_header('Content-Length', len(raw_reply))
self.end_headers()
self.wfile.write(raw_reply)
return True
class SyncServerRunner(testserver_base.TestServerRunner): class SyncServerRunner(testserver_base.TestServerRunner):
"""TestServerRunner for the net test servers.""" """TestServerRunner for the net test servers."""
...@@ -452,8 +510,12 @@ class SyncServerRunner(testserver_base.TestServerRunner): ...@@ -452,8 +510,12 @@ class SyncServerRunner(testserver_base.TestServerRunner):
host = self.options.host host = self.options.host
xmpp_port = self.options.xmpp_port xmpp_port = self.options.xmpp_port
server = SyncHTTPServer((host, port), xmpp_port, SyncPageHandler) server = SyncHTTPServer((host, port), xmpp_port, SyncPageHandler)
print 'Sync HTTP server started on port %d...' % server.server_port print ('Sync HTTP server started at %s:%d/chromiumsync...' %
print 'Sync XMPP server started on port %d...' % server.xmpp_port (host, server.server_port))
print ('Fake OAuth2 Token server started at %s:%d/o/oauth2/token...' %
(host, server.server_port))
print ('Sync XMPP server started at %s:%d...' %
(host, server.xmpp_port))
server_data['port'] = server.server_port server_data['port'] = server.server_port
server_data['xmpp_port'] = server.xmpp_port server_data['xmpp_port'] = server.xmpp_port
return server return server
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment