// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// The Mojo interfaces and enums contained in this file use a file-global
// versioning scheme, as opposed to individual interface / enum level
// versioning. Bump this value before making a change to any of the following
// interfaces / enums.
//
// Next MinVersion: 15
module crosapi.mojom;
import "mojo/public/mojom/base/time.mojom";
// Types of accounts which can be stored in Account Manager.
// This must be kept in sync with
// //components/account_manager_core/chromeos/tokens.proto.
//
// The enums values should match the aforementioned proto too.
[Stable, Extensible]
enum AccountType {
[Default] kUnspecified = 0,
kGaia = 1,
kActiveDirectory = 2,
};
// Uniquely identifies an account in Account Manager.
//
// Next id: 2
[Stable]
struct AccountKey {
// `id` is obfuscated Gaia id for Gaia accounts.
// `id` is the object GUID for Microsoft Active Directory accounts.
string id@0;
// Type of the account - such as Gaia, or Microsoft Active Directory.
AccountType account_type@1;
};
// Information about an account in Account Manager.
//
// Next id: 2
[Stable]
struct Account {
// A unique identifier for this account.
AccountKey key@0;
// The raw, un-canonicalized email id ([email protected], as opposed to
// [email protected]) for this account.
string raw_email@1;
};
// See google_apis/gaia/google_service_auth_error.h
//
// IMPORTANT: Do NOT send these values from Lacros to Ash without thinking about
// version skew. Specifically, newer Lacros versions may send values which are
// unknown to Ash. See the implementation of
// `account_manager::FromMojoGoogleServiceAuthError`.
// Note while fixing this - this enum needs to be trivially compatible with
// google_apis/gaia/google_service_auth_error.h - which does not have an
// "unknown" value.
//
// Next id: 5
[Stable]
struct GoogleServiceAuthError {
// Next value: 16
[Stable, Extensible]
enum State {
kNone = 0,
kInvalidGaiaCredentials = 1,
kUserNotSignedUp = 2,
kConnectionFailed = 3,
// DEPRECATED kCaptchaRequired = 4,
// DEPRECATED kAccountDeleted = 5,
// DEPRECATED kAccountDisabled = 6,
kServiceUnavailable = 7,
// DEPRECATED kTwoFactor = 8,
kRequestCanceled = 9,
// DEPRECATED kHostedNotAllowedDeprecated = 10,
kUnexpectedServiceResponse = 11,
kServiceError = 12,
// DEPRECATED kWebLoginRequired = 13,
[MinVersion=10] kScopeLimitedUnrecoverableError = 14,
[MinVersion=14] kChallengeResponseRequired = 15,
};
// Next value: 4
[Stable, Extensible]
enum InvalidGaiaCredentialsReason {
[Default] kUnknown = 0,
kCredentialsRejectedByServer = 1,
kCredentialsRejectedByClient = 2,
kCredentialsMissing = 3,
};
State state@0;
// Network error is set only if `state` is set to `kConnectionFailed`.
// In case of no network error, `network_error` is set to 0.
int64 network_error@1;
string error_message@2;
InvalidGaiaCredentialsReason invalid_gaia_credentials_reason@3;
// Challenge is set only if `state` is set to `kChallengeResponseRequired`.
[MinVersion=14] string? token_binding_challenge@4;
};
// See components/account_manager_core/account_addition_options.h
//
// Next id: 2
[Stable]
struct AccountAdditionOptions {
bool is_available_in_arc@0;
bool show_arc_availability_picker@1;
};
// Next id: 3
[Stable, RenamedFrom="crosapi.mojom.AccountAdditionResult"]
struct AccountUpsertionResult {
// The result of account addition or reauthentication request, sent from Ash
// to Lacros.
// Note: The default value of this enum is `kUnexpectedResponse = 4`, not
// `kSuccess = 0`. This was changed in MinVersion 11.
//
// Next value: 6
[Stable, Extensible]
enum Status {
kSuccess = 0,
kAlreadyInProgress = 1,
kCancelledByUser = 2,
kNetworkError = 3,
[Default] kUnexpectedResponse = 4,
[MinVersion = 9] kBlockedByPolicy = 5,
};
Status status@0;
// The account that was added or updated.
Account? account@1;
// The error is set only if `status` is set to `kNetworkError`.
GoogleServiceAuthError? error@2;
};
// Next id: 3
[Stable]
struct AccessTokenInfo {
// OAuth2 access token.
string access_token@0;
// Expiration time of `access_token`. This value has a built-in safety margin
// so it can be used as-is.
mojo_base.mojom.Time expiration_time@1;
// Contains extra information regarding the user's currently registered
// services.
string id_token@2;
};
[Stable]
union AccessTokenResult {
AccessTokenInfo access_token_info;
GoogleServiceAuthError error;
};
// Interface for observers of Chrome OS Account Manager.
// This interface is implemented by lacros-chrome, and is used by ash-chrome to
// send account update notifications.
//
// Next id: 4
[Stable, Uuid="f75c4963-497b-411f-97ab-c53c7f6b46ed"]
interface AccountManagerObserver {
// Called when the token for `account` is updated/inserted.
// Note: Observers which register with `AccountManager` before its
// initialization is complete will get notified when `AccountManager` is fully
// initialized.
// Note: Observers which register with `AccountManager` after its
// initialization is complete will not get an immediate
// notification-on-registration.
OnTokenUpserted@0(Account account);
// Called when an account has been removed from Account Manager.
// Note: Observers that may have cached access tokens for `account` must clear
// their cache entry for this `account` on receiving this callback.
OnAccountRemoved@1(Account account);
// Called when an `account`'s `error` status changes. See `ReportAuthError` in
// `AccountManager` interface for details.
// Note: Observers that may have cached access tokens for `account` must clear
// their cache entries for this `account` on receiving this callback. They may
// short-circuit future access token requests with an immediate `error` for a
// given `account` as appropriate (e.g. if the error is a non-transient
// error).
// Note: Observers must reset their cached error states (if any) for
// `account` - if the `state` of `error` is `kNone`.
[MinVersion = 1]
OnAuthErrorChanged@2(AccountKey account, GoogleServiceAuthError error);
// Called when Ash's signin dialog is closed, regardless of the reason, e.g.:
// - For account additions as well as re-authentication.
// - For successful completion of the flow, as well as cancellation by the
// user. etc.
[MinVersion = 12]
OnSigninDialogClosed@3();
};
// Interface for Chrome OS Account Manager.
// Chrome OS Account Manager is the source of truth for accounts on Chrome OS -
// including ARC, and Chrome content area. It supports Google accounts and
// Microsoft Active Directory accounts, as of this writing.
// This interface is implemented by ash-chrome, and is used by lacros-chrome to
// query accounts residing in the Chrome OS Account Manager.
// ARC++ uses components/arc/mojom/auth.mojom to talk to the Chrome OS Account
// Manager.
//
// Next id: 9
[Stable, Uuid="85b9a674-9d8e-497f-98d5-22c8dca6f2b8"]
interface AccountManager {
// Returns `true` if Chrome OS Account Manager has been fully initialized, and
// `false` otherwise.
IsInitialized@0() => (bool is_initialized);
// Creates and returns a new receiver for `AccountManagerObserver`.
// This API is supposed to be called by lacros-chrome, fairly early during its
// initialization, to receive updates related to accounts stored in Account
// Manager.
// The connection, and the corresponding remote, is destroyed when `receiver`
// is destroyed. This will happen automatically when lacros is shut down.
[MinVersion = 1]
AddObserver@1() => (pending_receiver<AccountManagerObserver> receiver);
// Returns the list of accounts in AccountManager. Can be invoked before the
// initialization is completed (in this case the callback will be invoked
// after the initialization is done).
[MinVersion = 2]
GetAccounts@2() => (array<Account> accounts);
// Launches account addition dialog and returns `result` with the added
// account.
[MinVersion = 3]
ShowAddAccountDialog@3(
[MinVersion=8] AccountAdditionOptions? add_account_options) =>
(AccountUpsertionResult result);
// Launches account reauthentication dialog for provided `email` and returns
// `result` with the reauthenticated/added account.
[MinVersion = 3]
ShowReauthAccountDialog@4(string email) =>
([MinVersion=13]AccountUpsertionResult? result);
// Launches OS Settings > Accounts.
[MinVersion = 4]
ShowManageAccountsSettings@5();
// Returns a persistent error state for `account`. If `account` doesn't have
// a persistent error or AccountManager doesn't have such an account -
// `GoogleServiceAuthError` with `kNone` state will be returned.
[MinVersion = 5]
GetPersistentErrorForAccount@6(AccountKey account) =>
(GoogleServiceAuthError error);
// Returns a remote to an interface to fetch an access token for
// `account_key`, to be used by `oauth_consumer_name` OAuth2 client.
// `account_key` must be a Gaia account. If `account_key` is invalid or not
// known to Chrome OS Account Manager, fetching an access token via
// `AccessTokenFetcher` will result in an error (`kUserNotSignedUp`). If the
// account's refresh token is no longer valid, it will result in
// `kInvalidGaiaCredentials` error. See `GoogleServiceAuthError` for all error
// types.
[MinVersion = 6]
CreateAccessTokenFetcher@7(AccountKey account_key,
string oauth_consumer_name) =>
(pending_remote<AccessTokenFetcher> access_token_fetcher);
// Reports an `error` for `account`.
// The implementation uses a pubsub model to propagate errors for accounts.
// Any application can report (Publish) account errors. These errors will be
// fanned out to `AccountManagerObserver`s (Subscribers).
// A typical use-case is sharing of account error information between Ash and
// Lacros. Since these errors are OAuth errors, they can be discovered by any
// application (or the OS) - and must be communicated to other applications
// (or the OS).
// `account` must be a valid account known to Account Manager.
// Setting the error `state` as `kNone` resets the error state for `account`.
// Note: Transient errors (`GoogleServiceAuthError::IsTransientError()`)
// reported through this API will be silently ignored.
[MinVersion = 9]
ReportAuthError@8(AccountKey account, GoogleServiceAuthError error);
};
// Interface for fetching OAuth2 access tokens.
//
// Next id: 1
[Stable, Uuid="71476f25-fb77-414f-848e-3e5368a9ee35"]
interface AccessTokenFetcher {
// Starts the request for fetching an access token with the provided `scopes`.
// If `scopes` is empty, `access_token` will have the same scope as the
// underlying refresh token - login scope.
// Don't call this method multiple times - create a new `AccessTokenFetcher`
// instead.
Start@0(array<string> scopes) => (AccessTokenResult result);
};