1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
// Copyright 2013 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.
#ifndef CHROME_BROWSER_SIGNIN_ANDROID_PROFILE_OAUTH2_TOKEN_SERVICE_H_
#define CHROME_BROWSER_SIGNIN_ANDROID_PROFILE_OAUTH2_TOKEN_SERVICE_H_
#include <jni.h>
#include <string>
#include "base/android/jni_weak_ref.h"
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/time/time.h"
#include "components/signin/core/browser/profile_oauth2_token_service.h"
#include "google_apis/gaia/google_service_auth_error.h"
// A specialization of ProfileOAuth2TokenService that will be returned by
// ProfileOAuth2TokenServiceFactory for OS_ANDROID. This instance uses
// native Android features to lookup OAuth2 tokens.
//
// See |ProfileOAuth2TokenService| for usage details.
//
// Note: requests should be started from the UI thread. To start a
// request from other thread, please use OAuth2TokenServiceRequest.
class AndroidProfileOAuth2TokenService : public ProfileOAuth2TokenService {
public:
// Registers the AndroidProfileOAuth2TokenService's native methods through
// JNI.
static bool Register(JNIEnv* env);
// Creates a new instance of the AndroidProfileOAuth2TokenService.
static AndroidProfileOAuth2TokenService* Create();
// Returns a reference to the Java instance of this service.
static jobject GetForProfile(
JNIEnv* env, jclass clazz, jobject j_profile_android);
// Called by the TestingProfile class to disable account validation in
// tests. This prevents the token service from trying to look up system
// accounts which requires special permission.
static void set_is_testing_profile() {
is_testing_profile_ = true;
}
// ProfileOAuth2TokenService overrides:
virtual void Initialize(
SigninClient* client,
SigninErrorController* signin_error_controller) override;
virtual bool RefreshTokenIsAvailable(
const std::string& account_id) const override;
virtual void UpdateAuthError(
const std::string& account_id,
const GoogleServiceAuthError& error) override;
virtual std::vector<std::string> GetAccounts() override;
// Lists account at the OS level.
std::vector<std::string> GetSystemAccounts();
void ValidateAccounts(JNIEnv* env,
jobject obj,
jstring current_account,
jboolean force_notifications);
// Takes a the signed in sync account as well as all the other
// android account ids and check the token status of each. If
// |force_notifications| is true, TokenAvailable notifications will
// be sent anyway, even if the account was already known.
void ValidateAccounts(const std::string& signed_in_account,
bool force_notifications);
// Triggers a notification to all observers of the OAuth2TokenService that a
// refresh token is now available. This may cause observers to retry
// operations that require authentication.
virtual void FireRefreshTokenAvailableFromJava(JNIEnv* env,
jobject obj,
const jstring account_name);
// Triggers a notification to all observers of the OAuth2TokenService that a
// refresh token is now available.
virtual void FireRefreshTokenRevokedFromJava(JNIEnv* env,
jobject obj,
const jstring account_name);
// Triggers a notification to all observers of the OAuth2TokenService that all
// refresh tokens have now been loaded.
virtual void FireRefreshTokensLoadedFromJava(JNIEnv* env, jobject obj);
// Overridden from OAuth2TokenService to complete signout of all
// OA2TService aware accounts.
virtual void RevokeAllCredentials() override;
protected:
friend class ProfileOAuth2TokenServiceFactory;
AndroidProfileOAuth2TokenService();
virtual ~AndroidProfileOAuth2TokenService();
virtual OAuth2AccessTokenFetcher* CreateAccessTokenFetcher(
const std::string& account_id,
net::URLRequestContextGetter* getter,
OAuth2AccessTokenConsumer* consumer) override;
// Overridden from OAuth2TokenService to intercept token fetch requests and
// redirect them to the Account Manager.
virtual void InvalidateOAuth2Token(const std::string& account_id,
const std::string& client_id,
const ScopeSet& scopes,
const std::string& access_token) override;
// Called to notify observers when a refresh token is available.
virtual void FireRefreshTokenAvailable(
const std::string& account_id) override;
// Called to notify observers when a refresh token has been revoked.
virtual void FireRefreshTokenRevoked(const std::string& account_id) override;
// Called to notify observers when refresh tokans have been loaded.
virtual void FireRefreshTokensLoaded() override;
private:
// Return whether |signed_in_account| is valid and we have access
// to all the tokens in |curr_account_ids|. If |force_notifications| is true,
// TokenAvailable notifications will be sent anyway, even if the account was
// already known.
bool ValidateAccounts(const std::string& signed_in_account,
const std::vector<std::string>& prev_account_ids,
const std::vector<std::string>& curr_account_ids,
std::vector<std::string>& refreshed_ids,
std::vector<std::string>& revoked_ids,
bool force_notifications);
base::android::ScopedJavaGlobalRef<jobject> java_ref_;
static bool is_testing_profile_;
DISALLOW_COPY_AND_ASSIGN(AndroidProfileOAuth2TokenService);
};
#endif // CHROME_BROWSER_SIGNIN_ANDROID_PROFILE_OAUTH2_TOKEN_SERVICE_H_
|