| Index: utils/pub/oauth2.dart
|
| diff --git a/utils/pub/oauth2.dart b/utils/pub/oauth2.dart
|
| index b9aa38ed42d42903e628c7ac4226f76ac3883276..616b63891ea8a9b0d21f4eae64454555a9307d20 100644
|
| --- a/utils/pub/oauth2.dart
|
| +++ b/utils/pub/oauth2.dart
|
| @@ -51,12 +51,12 @@ final _scopes = ['https://www.googleapis.com/auth/userinfo.email'];
|
| Credentials _credentials;
|
|
|
| /// Delete the cached credentials, if they exist.
|
| -Future clearCredentials(SystemCache cache) {
|
| +void clearCredentials(SystemCache cache) {
|
| _credentials = null;
|
| var credentialsFile = _credentialsFile(cache);
|
| - return fileExists(credentialsFile).then((exists) {
|
| - if (exists) return deleteFile(credentialsFile);
|
| - });
|
| + if (!fileExists(credentialsFile)) return;
|
| +
|
| + deleteFile(credentialsFile);
|
| }
|
|
|
| /// Asynchronously passes an OAuth2 [Client] to [fn], and closes the client when
|
| @@ -71,7 +71,7 @@ Future withClient(SystemCache cache, Future fn(Client client)) {
|
| return fn(client).whenComplete(() {
|
| client.close();
|
| // Be sure to save the credentials even when an error happens.
|
| - return _saveCredentials(cache, client.credentials);
|
| + _saveCredentials(cache, client.credentials);
|
| });
|
| }).catchError((asyncError) {
|
| if (asyncError.error is ExpirationException) {
|
| @@ -84,7 +84,8 @@ Future withClient(SystemCache cache, Future fn(Client client)) {
|
| message = "$message (${asyncError.error.description})";
|
| }
|
| log.error("$message.");
|
| - return clearCredentials(cache).then((_) => withClient(cache, fn));
|
| + clearCredentials(cache);
|
| + return withClient(cache, fn);
|
| } else {
|
| throw asyncError;
|
| }
|
| @@ -94,58 +95,52 @@ Future withClient(SystemCache cache, Future fn(Client client)) {
|
| /// Gets a new OAuth2 client. If saved credentials are available, those are
|
| /// used; otherwise, the user is prompted to authorize the pub client.
|
| Future<Client> _getClient(SystemCache cache) {
|
| - return _loadCredentials(cache).then((credentials) {
|
| + return defer(() {
|
| + var credentials = _loadCredentials(cache);
|
| if (credentials == null) return _authorize();
|
| - return new Client(_identifier, _secret, credentials,
|
| - httpClient: httpClient);
|
| - }).then((client) {
|
| - return _saveCredentials(cache, client.credentials).then((_) => client);
|
| +
|
| + var client = new Client(_identifier, _secret, credentials,
|
| + httpClient: curlClient);
|
| + _saveCredentials(cache, client.credentials);
|
| + return client;
|
| });
|
| }
|
|
|
| /// Loads the user's OAuth2 credentials from the in-memory cache or the
|
| /// filesystem if possible. If the credentials can't be loaded for any reason,
|
| /// the returned [Future] will complete to null.
|
| -Future<Credentials> _loadCredentials(SystemCache cache) {
|
| +Credentials _loadCredentials(SystemCache cache) {
|
| log.fine('Loading OAuth2 credentials.');
|
|
|
| - if (_credentials != null) {
|
| - log.fine('Using already-loaded credentials.');
|
| - return new Future.immediate(_credentials);
|
| - }
|
| + try {
|
| + if (_credentials != null) return _credentials;
|
|
|
| - var path = _credentialsFile(cache);
|
| - return fileExists(path).then((credentialsExist) {
|
| - if (!credentialsExist) {
|
| - log.fine('No credentials found at $path.');
|
| - return;
|
| - }
|
| + var path = _credentialsFile(cache);
|
| + if (!fileExists(path)) return;
|
|
|
| - return readTextFile(_credentialsFile(cache)).then((credentialsJson) {
|
| - var credentials = new Credentials.fromJson(credentialsJson);
|
| - if (credentials.isExpired && !credentials.canRefresh) {
|
| - log.error("Pub's authorization to upload packages has expired and "
|
| - "can't be automatically refreshed.");
|
| - return null; // null means re-authorize
|
| - }
|
| + var credentials = new Credentials.fromJson(readTextFile(path));
|
| + if (credentials.isExpired && !credentials.canRefresh) {
|
| + log.error("Pub's authorization to upload packages has expired and "
|
| + "can't be automatically refreshed.");
|
| + return null; // null means re-authorize.
|
| + }
|
|
|
| - return credentials;
|
| - });
|
| - }).catchError((e) {
|
| + return credentials;
|
| + } catch (e) {
|
| log.error('Warning: could not load the saved OAuth2 credentials: $e\n'
|
| 'Obtaining new credentials...');
|
| - return null; // null means re-authorize
|
| - });
|
| + return null; // null means re-authorize.
|
| + }
|
| }
|
|
|
| /// Save the user's OAuth2 credentials to the in-memory cache and the
|
| /// filesystem.
|
| -Future _saveCredentials(SystemCache cache, Credentials credentials) {
|
| +void _saveCredentials(SystemCache cache, Credentials credentials) {
|
| log.fine('Saving OAuth2 credentials.');
|
| _credentials = credentials;
|
| var path = _credentialsFile(cache);
|
| - return ensureDir(dirname(path)).then((_) =>
|
| - writeTextFile(path, credentials.toJson(), dontLogContents: true));
|
| + ensureDir(dirname(path));
|
| + writeTextFile(path, credentials.toJson(), dontLogContents: true);
|
| }
|
|
|
| /// The path to the file in which the user's OAuth2 credentials are stored.
|
| @@ -177,7 +172,7 @@ Future<Client> _authorize() {
|
| var server = new HttpServer();
|
| server.addRequestHandler((request) => request.path == "/",
|
| (request, response) {
|
| - chainToCompleter(new Future.immediate(null).then((_) {
|
| + chainToCompleter(defer(() {
|
| log.message('Authorization received, processing...');
|
| var queryString = request.queryString;
|
| if (queryString == null) queryString = '';
|
|
|