blob: 15c4fce77f872eec9f9748af94ce135c10354e4a [file] [log] [blame]
// Copyright 2017 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 COMPONENTS_SIGNIN_CORE_BROWSER_ACCOUNT_RECONCILOR_DELEGATE_H_
#define COMPONENTS_SIGNIN_CORE_BROWSER_ACCOUNT_RECONCILOR_DELEGATE_H_
#include <string>
#include <vector>
#include "base/time/time.h"
#include "components/signin/core/browser/gaia_cookie_manager_service.h"
#include "google_apis/gaia/gaia_auth_fetcher.h"
#include "google_apis/gaia/gaia_auth_util.h"
#include "google_apis/gaia/google_service_auth_error.h"
class AccountReconcilor;
namespace signin {
// Base class for AccountReconcilorDelegate.
class AccountReconcilorDelegate {
public:
// Options for revoking refresh tokens.
enum class RevokeTokenOption {
// Do not revoke the token.
kDoNotRevoke,
// Revoke the token if it is in auth error state.
kRevokeIfInError,
// Revoke the token.
// TODO(droger): remove this when Dice is launched.
kRevoke
};
virtual ~AccountReconcilorDelegate() {}
// Returns true if the reconcilor should reconcile the profile. Defaults to
// false.
virtual bool IsReconcileEnabled() const;
// Returns true if account consistency is enforced (Mirror or Dice).
// If this is false, reconcile is done, but its results are discarded and no
// changes to the accounts are made. Defaults to false.
virtual bool IsAccountConsistencyEnforced() const;
// Returns the value to set in the "source" parameter for Gaia API calls.
virtual gaia::GaiaSource GetGaiaApiSource() const;
// Returns true if Reconcile should be aborted when the primary account is in
// error state. Defaults to false.
virtual bool ShouldAbortReconcileIfPrimaryHasError() const;
// Returns the first account to add in the Gaia cookie.
// If this returns an empty string, the user must be logged out of all
// accounts.
// |first_execution| is true for the first reconciliation after startup.
// |will_logout| is true if the reconcilor will perform a logout no matter
// what is returned by this function.
// Only used with MergeSession.
virtual std::string GetFirstGaiaAccountForReconcile(
const std::vector<std::string>& chrome_accounts,
const std::vector<gaia::ListedAccount>& gaia_accounts,
const std::string& primary_account,
bool first_execution,
bool will_logout) const;
// Returns a pair of mode and accounts to send to Mutilogin endpoint.
MultiloginParameters CalculateParametersForMultilogin(
const std::vector<std::string>& chrome_accounts,
const std::string& primary_account,
const std::vector<gaia::ListedAccount>& gaia_accounts,
bool first_execution,
bool primary_has_error) const;
// Returns whether secondary accounts should be revoked at the beginning of
// the reconcile.
virtual RevokeTokenOption ShouldRevokeSecondaryTokensBeforeReconcile(
const std::vector<gaia::ListedAccount>& gaia_accounts);
// Returns whether tokens should be revoked when the Gaia cookie has been
// explicitly deleted by the user.
// If this returns false, tokens will not be revoked. If this returns true,
// secondary tokens will be deleted ; and the primary token will be
// invalidated unless it has to be kept for critical Sync operations.
virtual bool ShouldRevokeTokensOnCookieDeleted();
// Called when reconcile is finished.
// |OnReconcileFinished| is always called at the end of reconciliation, even
// when there is an error (except in cases where reconciliation times out
// before finishing, see |GetReconcileTimeout|).
virtual void OnReconcileFinished(const std::string& first_account,
bool reconcile_is_noop) {}
// Returns the desired timeout for account reconciliation. If reconciliation
// does not happen within this time, it is aborted and |this| delegate is
// informed via |OnReconcileError|, with the 'most severe' error that occurred
// during this time (see |AccountReconcilor::error_during_last_reconcile_|).
// If a delegate does not wish to set a timeout for account reconciliation, it
// should not override this method. Default: |base::TimeDelta::Max()|.
virtual base::TimeDelta GetReconcileTimeout() const;
// Called when account reconciliation ends in an error.
// |OnReconcileError| is called before |OnReconcileFinished|.
virtual void OnReconcileError(const GoogleServiceAuthError& error);
void set_reconcilor(AccountReconcilor* reconcilor) {
reconcilor_ = reconcilor;
}
AccountReconcilor* reconcilor() { return reconcilor_; }
protected:
// Computes a new ordering for chrome_accounts. |first_account| must be in
// |chrome_accounts|. The returned order has the following properties:
// - first_account will be first.
// - if a chrome account is also in gaia_accounts, the function tries to keep
// it at the same index. The function mimimizes account re-numbering.
// - if there are too many accounts, some accounts will be discarded.
// |first_account| and accounts already in cookies will be kept in priority.
// Aplhabetical order is used to break ties.
// Note: the input order of the accounts in |chrome_accounts| does not matter
// (different orders yield to the same result).
std::vector<std::string> ReorderChromeAccountsForReconcile(
const std::vector<std::string>& chrome_accounts,
const std::string& first_account,
const std::vector<gaia::ListedAccount>& gaia_accounts) const;
private:
// Reorders chrome accounts in the order they should appear in cookies with
// respect to existing cookies.
virtual std::vector<std::string> GetChromeAccountsForReconcile(
const std::vector<std::string>& chrome_accounts,
const std::string& primary_account,
const std::vector<gaia::ListedAccount>& gaia_accounts,
const gaia::MultiloginMode mode) const;
// Returns Mode which shows if it is allowed to change the order of the gaia
// accounts (e.g. on mobile or on stratup). Default is UPDATE.
virtual gaia::MultiloginMode CalculateModeForReconcile(
const std::vector<gaia::ListedAccount>& gaia_accounts,
const std::string primary_account,
bool first_execution,
bool primary_has_error) const;
AccountReconcilor* reconcilor_;
};
} // namespace signin
#endif // COMPONENTS_SIGNIN_CORE_BROWSER_ACCOUNT_RECONCILOR_DELEGATE_H_