Index: remoting/webapp/me2mom/oauth2.js |
diff --git a/remoting/webapp/me2mom/oauth2.js b/remoting/webapp/me2mom/oauth2.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9b34129338a38ed35565562b43ad3aa491f8722a |
--- /dev/null |
+++ b/remoting/webapp/me2mom/oauth2.js |
@@ -0,0 +1,138 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Declare an OAuth2 class to handle retrieval/storage of an OAuth2 token. |
+// |
+// Ideally, this should implement the OAuth2 PostMessage flow to avoid needing |
+// to copy and paste a code, but that does not support extension URL schemes |
+// quite yet. Instead, we currently use the native app flow with an |
+// authorization code that the user must cut/paste. |
+function OAuth2() { |
+ this.OAUTH2_REFRESH_TOKEN_NAME = 'oauth2_refresh_token'; |
+ |
+ this.client_id = encodeURIComponent( |
+ '440925447803-m890isgsr23kdkcu2erd4mirnrjalf98.' + |
+ 'apps.googleusercontent.com'); |
+ this.client_secret = encodeURIComponent('TgKrL73H2kJe6Ir0ufp7bf6e'); |
+ this.scope = encodeURIComponent( |
+ 'https://www.googleapis.com/auth/chromoting ' + |
+ 'https://www.googleapis.com/auth/googletalk'); |
+ this.redirect_uri = encodeURIComponent('urn:ietf:wg:oauth:2.0:oob'); |
+} |
+ |
+OAuth2.prototype.isAuthenticated = function() { |
+ if(this.getRefreshToken()) { |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+OAuth2.prototype.clear = function() { |
+ remoting.removeItem(this.OAUTH2_REFRESH_TOKEN_NAME); |
+ delete this.access_token; |
+ delete this.access_token_expiration; |
+} |
+ |
+OAuth2.prototype.setRefreshToken = function(token) { |
+ remoting.setItem(this.OAUTH2_REFRESH_TOKEN_NAME, token); |
+} |
+ |
+OAuth2.prototype.getRefreshToken = function(token) { |
+ return remoting.getItem(this.OAUTH2_REFRESH_TOKEN_NAME); |
+} |
+ |
+OAuth2.prototype.setAccessToken = function(token, expiration) { |
+ this.access_token = token; |
+ // Offset by 30 seconds to account for RTT issues. |
+ // TODO(ajwong): See if this is necessary, or of the protocol already |
+ // accounts for RTT. |
+ this.access_token_expiration = expiration - 30000; |
+} |
+ |
+OAuth2.prototype.needsNewAccessToken = function() { |
+ if (!this.isAuthenticated()) { |
+ throw "Not Authenticated."; |
+ } |
+ if (!this.access_token) { |
+ return true; |
+ } |
+ if (Date.now() > this.access_token_expiration) { |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+OAuth2.prototype.getAccessToken = function() { |
+ if (this.needsNewAccessToken()) { |
+ throw "Access Token expired."; |
+ } |
+ return this.access_token; |
+} |
+ |
+OAuth2.prototype.refreshAccessToken = function(on_done) { |
+ if (!this.isAuthenticated()) { |
+ throw "Not Authenticated."; |
+ } |
+ var xhr = new XMLHttpRequest(); |
+ var that = this; |
+ xhr.onreadystatechange = function() { |
+ if (xhr.readyState != 4) { |
+ return; |
+ } |
+ if (xhr.status == 200) { |
+ tokens = JSON.parse(xhr.responseText); |
+ that.setAccessToken(tokens['access_token'], |
+ tokens['expires_in'] * 1000 + Date.now()); |
+ } else { |
+ console.log("Refresh access token failed. Status: " + xhr.status + |
+ " response: " + xhr.responseText); |
+ } |
+ on_done(); |
+ }; |
+ xhr.open('POST', 'https://accounts.google.com/o/oauth2/token', true); |
+ xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); |
+ var post_data = 'client_id=' + this.client_id |
+ + '&client_secret=' + this.client_secret |
+ + '&refresh_token=' + encodeURIComponent(this.getRefreshToken()) |
+ + '&grant_type=refresh_token'; |
+ xhr.send(post_data); |
+} |
+ |
+OAuth2.prototype.openOAuth2Window = function() { |
+ var GET_CODE_URL = 'https://accounts.google.com/o/oauth2/auth?' |
+ + 'client_id=' + this.client_id |
+ + '&redirect_uri=' + this.redirect_uri |
+ + '&scope=' + this.scope |
+ + '&response_type=code'; |
+ window.open(GET_CODE_URL); |
+} |
+ |
+OAuth2.prototype.exchangeCodeForToken = function(code, on_done) { |
+ var xhr = new XMLHttpRequest(); |
+ var that = this; |
+ xhr.onreadystatechange = function() { |
+ if (xhr.readyState != 4) { |
+ return; |
+ } |
+ if (xhr.status == 200) { |
+ tokens = JSON.parse(xhr.responseText); |
+ that.setRefreshToken(tokens['refresh_token']); |
+ that.setAccessToken(tokens['access_token'], |
+ tokens['expires_in'] + Date.now()); |
+ } else { |
+ console.log("Code exchnage failed. Status: " + xhr.status + |
+ " response: " + xhr.responseText); |
+ } |
+ on_done(); |
+ }; |
+ xhr.open('POST', 'https://accounts.google.com/o/oauth2/token', true); |
+ xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); |
+ var post_data = 'client_id=' + this.client_id |
+ + '&client_secret=' + this.client_secret |
+ + '&redirect_uri=' + this.redirect_uri |
+ + '&code=' + encodeURIComponent(code) |
+ + '&grant_type=authorization_code'; |
+ xhr.send(post_data); |
+} |
+ |