| OLD | NEW | 
|    1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file |    1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
|    2 // for details. All rights reserved. Use of this source code is governed by a |    2 // for details. All rights reserved. Use of this source code is governed by a | 
|    3 // BSD-style license that can be found in the LICENSE file. |    3 // BSD-style license that can be found in the LICENSE file. | 
|    4  |    4  | 
|    5 library oauth2; |    5 library oauth2; | 
|    6  |    6  | 
|    7 import 'dart:async'; |    7 import 'dart:async'; | 
|    8 import 'dart:io'; |    8 import 'dart:io'; | 
|    9 import 'dart:uri'; |    9 import 'dart:uri'; | 
|   10  |   10  | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
|   28 /// secret. |   28 /// secret. | 
|   29 final _secret = 'SWeqj8seoJW0w7_CpEPFLX0K'; |   29 final _secret = 'SWeqj8seoJW0w7_CpEPFLX0K'; | 
|   30  |   30  | 
|   31 /// The URL to which the user will be directed to authorize the pub client to |   31 /// The URL to which the user will be directed to authorize the pub client to | 
|   32 /// get an OAuth2 access token. |   32 /// get an OAuth2 access token. | 
|   33 /// |   33 /// | 
|   34 /// `access_type=offline` and `approval_prompt=force` ensures that we always get |   34 /// `access_type=offline` and `approval_prompt=force` ensures that we always get | 
|   35 /// a refresh token from the server. See the [Google OAuth2 documentation][]. |   35 /// a refresh token from the server. See the [Google OAuth2 documentation][]. | 
|   36 /// |   36 /// | 
|   37 /// [Google OAuth2 documentation]: https://developers.google.com/accounts/docs/O
     Auth2WebServer#offline |   37 /// [Google OAuth2 documentation]: https://developers.google.com/accounts/docs/O
     Auth2WebServer#offline | 
|   38 final _authorizationEndpoint = Uri.parse( |   38 final authorizationEndpoint = Uri.parse( | 
|   39     'https://accounts.google.com/o/oauth2/auth?access_type=offline' |   39     'https://accounts.google.com/o/oauth2/auth?access_type=offline' | 
|   40     '&approval_prompt=force'); |   40     '&approval_prompt=force'); | 
|   41  |   41  | 
|   42 /// The URL from which the pub client will request an access token once it's |   42 /// The URL from which the pub client will request an access token once it's | 
|   43 /// been authorized by the user. |   43 /// been authorized by the user. This can be controlled externally by setting | 
|   44 final _tokenEndpoint = Uri.parse( |   44 /// the _PUB_TEST_TOKEN_ENDPOINT environment variable. | 
|   45     'https://accounts.google.com/o/oauth2/token'); |   45 Uri get tokenEndpoint { | 
 |   46   var tokenEndpoint = Platform.environment['_PUB_TEST_TOKEN_ENDPOINT']; | 
 |   47   if (tokenEndpoint != null) { | 
 |   48     return Uri.parse(tokenEndpoint); | 
 |   49   } else { | 
 |   50     return _tokenEndpoint; | 
 |   51   } | 
 |   52 } | 
 |   53  | 
 |   54 final _tokenEndpoint = Uri.parse('https://accounts.google.com/o/oauth2/token'); | 
|   46  |   55  | 
|   47 /// The OAuth2 scopes that the pub client needs. Currently the client only needs |   56 /// The OAuth2 scopes that the pub client needs. Currently the client only needs | 
|   48 /// the user's email so that the server can verify their identity. |   57 /// the user's email so that the server can verify their identity. | 
|   49 final _scopes = ['https://www.googleapis.com/auth/userinfo.email']; |   58 final _scopes = ['https://www.googleapis.com/auth/userinfo.email']; | 
|   50  |   59  | 
|   51 /// An in-memory cache of the user's OAuth2 credentials. This should always be |   60 /// An in-memory cache of the user's OAuth2 credentials. This should always be | 
|   52 /// the same as the credentials file stored in the system cache. |   61 /// the same as the credentials file stored in the system cache. | 
|   53 Credentials _credentials; |   62 Credentials _credentials; | 
|   54  |   63  | 
|   55 /// Delete the cached credentials, if they exist. |   64 /// Delete the cached credentials, if they exist. | 
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  145   writeTextFile(credentialsPath, credentials.toJson(), dontLogContents: true); |  154   writeTextFile(credentialsPath, credentials.toJson(), dontLogContents: true); | 
|  146 } |  155 } | 
|  147  |  156  | 
|  148 /// The path to the file in which the user's OAuth2 credentials are stored. |  157 /// The path to the file in which the user's OAuth2 credentials are stored. | 
|  149 String _credentialsFile(SystemCache cache) => |  158 String _credentialsFile(SystemCache cache) => | 
|  150     path.join(cache.rootDir, 'credentials.json'); |  159     path.join(cache.rootDir, 'credentials.json'); | 
|  151  |  160  | 
|  152 /// Gets the user to authorize pub as a client of pub.dartlang.org via oauth2. |  161 /// Gets the user to authorize pub as a client of pub.dartlang.org via oauth2. | 
|  153 /// Returns a Future that will complete to a fully-authorized [Client]. |  162 /// Returns a Future that will complete to a fully-authorized [Client]. | 
|  154 Future<Client> _authorize() { |  163 Future<Client> _authorize() { | 
|  155   // Allow the tests to inject their own token endpoint URL. |  | 
|  156   var tokenEndpoint = Platform.environment['_PUB_TEST_TOKEN_ENDPOINT']; |  | 
|  157   if (tokenEndpoint != null) { |  | 
|  158     tokenEndpoint = Uri.parse(tokenEndpoint); |  | 
|  159   } else { |  | 
|  160     tokenEndpoint = _tokenEndpoint; |  | 
|  161   } |  | 
|  162  |  | 
|  163   var grant = new AuthorizationCodeGrant( |  164   var grant = new AuthorizationCodeGrant( | 
|  164       _identifier, |  165       _identifier, | 
|  165       _secret, |  166       _secret, | 
|  166       _authorizationEndpoint, |  167       authorizationEndpoint, | 
|  167       tokenEndpoint, |  168       tokenEndpoint, | 
|  168       httpClient: httpClient); |  169       httpClient: httpClient); | 
|  169  |  170  | 
|  170   // Spin up a one-shot HTTP server to receive the authorization code from the |  171   // Spin up a one-shot HTTP server to receive the authorization code from the | 
|  171   // Google OAuth2 server via redirect. This server will close itself as soon as |  172   // Google OAuth2 server via redirect. This server will close itself as soon as | 
|  172   // the code is received. |  173   // the code is received. | 
|  173   return HttpServer.bind('127.0.0.1', 0).then((server) { |  174   return HttpServer.bind('127.0.0.1', 0).then((server) { | 
|  174     var authUrl = grant.getAuthorizationUrl( |  175     var authUrl = grant.getAuthorizationUrl( | 
|  175         Uri.parse('http://localhost:${server.port}'), scopes: _scopes); |  176         Uri.parse('http://localhost:${server.port}'), scopes: _scopes); | 
|  176  |  177  | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
|  198         response.statusCode = 404; |  199         response.statusCode = 404; | 
|  199         response.close(); |  200         response.close(); | 
|  200       } |  201       } | 
|  201     }); |  202     }); | 
|  202   }) |  203   }) | 
|  203   .then((client) { |  204   .then((client) { | 
|  204     log.message('Successfully authorized.\n'); |  205     log.message('Successfully authorized.\n'); | 
|  205     return client; |  206     return client; | 
|  206   }); |  207   }); | 
|  207 } |  208 } | 
| OLD | NEW |