| // Copyright 2018 The Fuchsia Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | library fuchsia.identity.account; | 
 |  | 
 | using fuchsia.auth; | 
 |  | 
 | /// AccountManager manages the overall state of Fuchsia accounts and personae on | 
 | /// a Fuchsia device, installation of the AuthProviders that are used to obtain | 
 | /// authentication tokens for these accounts, and access to TokenManagers for | 
 | /// these accounts. | 
 | /// | 
 | /// The AccountManager is the most powerful protocol in the authentication | 
 | /// system and is intended only for use by the most trusted parts of the system. | 
 | [Discoverable] | 
 | protocol AccountManager { | 
 |     /// Returns a vector of all accounts provisioned on the current device. | 
 |     GetAccountIds() | 
 |         -> (vector<LocalAccountId>:MAX_ACCOUNTS_PER_DEVICE account_ids); | 
 |  | 
 |     /// Returns a vector of all accounts provisioned on the current | 
 |     /// device and the current authentication state for each. | 
 |     /// | 
 |     /// `scenario` The scenario to produce authentication states for. | 
 |     /// | 
 |     /// Returns: `account_auth_states` The current authentication state for each | 
 |     ///                                account given the provided scenario. | 
 |     GetAccountAuthStates(Scenario scenario) | 
 |         -> (vector<AccountAuthState>:MAX_ACCOUNTS_PER_DEVICE | 
 |             account_auth_states) error Error; | 
 |  | 
 |     /// Connects a channel to read properties of and perform operations on | 
 |     /// one account. If the account is locked, an interactive authentication | 
 |     /// attempt will be invoked as part of this call. | 
 |     /// | 
 |     /// `id` The account's identifier as returned by GetAccountIds() | 
 |     /// `context_provider` An `AuthenticationContextProvider` capable of | 
 |     ///                    supplying UI contexts used for interactive | 
 |     ///                    authentication on this account | 
 |     /// `account` The server end of an `Account` channel | 
 |     GetAccount( | 
 |         LocalAccountId id, | 
 |         fuchsia.auth.AuthenticationContextProvider context_provider, | 
 |         request<Account> account) | 
 |         -> () error Error; | 
 |  | 
 |     // TODO(dnordstrom): Add option to retrieve an account non-interactively. | 
 |  | 
 |     /// Connects a channel that will receive changes in the provisioned | 
 |     /// accounts and their authentication state. Optionally this channel will | 
 |     /// also receive the initial set of accounts and authentication states onto | 
 |     /// which changes may be applied. | 
 |     /// | 
 |     /// `listener` The client end of an `AccountListener` channel | 
 |     /// `options` An `AccountListenerOptions` that defines the set of events to | 
 |     ///           be sent to the listener. | 
 |     RegisterAccountListener( | 
 |         AccountListener listener, | 
 |         AccountListenerOptions options) | 
 |         -> () error Error; | 
 |  | 
 |     // TODO(fxbug.dev/561): Define methods to managed locked accounts, i.e. those | 
 |     // where data decryption keys are not currently available. | 
 |  | 
 |     /// Removes a provisioned Fuchsia account from the current device, revoking | 
 |     /// any credentials that are held for the account. | 
 |     /// | 
 |     /// `id` The account's identifier as returned by GetAccountIds() | 
 |     /// `force` If true, continues removing the account even if revocation of | 
 |     ///         credentials fails. If false, any revocation failure will result | 
 |     ///         in an error and the account will remain. In this case, a subset | 
 |     ///         of the credentials may have been deleted. | 
 |     RemoveAccount(LocalAccountId id, bool force) -> () error Error; | 
 |  | 
 |     /// Adds a Fuchsia account to the current device based on authenticating | 
 |     /// to a service provider (such as Google). If the service provider account | 
 |     /// is not already a recovery account for any Fuchsia account, a new Fuchsia | 
 |     /// account will be created with its recovery account set to the service | 
 |     /// provider account. If a storage unlock-capable authentication mechanism | 
 |     /// is provided, a single enrollment will be created of that mecahnism. | 
 |     /// | 
 |     /// `auth_context_provider` An `AuthenticationContextProvider` capable of | 
 |     ///                         supplying UI contexts used for interactive | 
 |     ///                         authentication | 
 |     /// `auth_provider_type` A unique identifier for an installed `AuthProvider` | 
 |     ///                      that should be used to authenticate with the | 
 |     ///                      service provider | 
 |     /// `lifetime` The lifetime of the account | 
 |     /// `auth_mechanism_id` An `AuthMechanismId` for a storage | 
 |     ///                     unlock-capable authentication mechanism. If | 
 |     ///                     provided, a single enrollment of that | 
 |     ///                     mechanism will be created for storage | 
 |     ///                     unlock. | 
 |     /// | 
 |     /// Returns: `account_id` The identifier of the newly added account | 
 |     ProvisionFromAuthProvider( | 
 |         fuchsia.auth.AuthenticationContextProvider auth_context_provider, | 
 |         string:MAX_AUTH_PROVIDER_TYPE_SIZE auth_provider_type, | 
 |         Lifetime lifetime, | 
 |         AuthMechanismId? auth_mechanism_id) | 
 |         -> (LocalAccountId account_id) error Error; | 
 |  | 
 |     /// Adds a new, initially empty, Fuchsia account to the current device. If a | 
 |     /// storage unlock-capable authentication mechanism is provided, a single | 
 |     /// enrollment will be created of that mecahnism. | 
 |     /// | 
 |     /// `lifetime` The lifetime of the account | 
 |     /// `auth_mechanism_id` An `AuthMechanismId` for a storage | 
 |     ///                     unlock-capable authentication mechanism. If | 
 |     ///                     provided, a single enrollment of that | 
 |     ///                     mechanism will be created for storage | 
 |     ///                     unlock. | 
 |     /// | 
 |     /// Returns: `account_id` The identifier of the newly added account | 
 |     ProvisionNewAccount( | 
 |         Lifetime lifetime, | 
 |         AuthMechanismId? auth_mechanism_id) | 
 |         -> (LocalAccountId account_id) error Error; | 
 |  | 
 |     /// Returns all available authentication mechanisms. | 
 |     GetAuthenticationMechanisms() | 
 |         -> (vector<AuthMechanismProperties>:MAX_AUTH_MECHANISMS auth_mechanisms) error Error; | 
 | }; | 
 |  | 
 | /// An `AuthState` along with the account that it applies to. | 
 | [MaxHandles = "0"] | 
 | struct AccountAuthState { | 
 |     /// A unique identifier for the Fuchsia account on the current device. | 
 |     LocalAccountId account_id; | 
 |     /// An authentication state for the Fuchsia account. | 
 |     AuthState auth_state; | 
 | }; | 
 |  | 
 | /// The initial state of an account, reported through an `AccountListener`. | 
 | [MaxHandles = "0"] | 
 | struct InitialAccountState { | 
 |     /// A unique identifier for the Fuchsia account on the current device. | 
 |     LocalAccountId account_id; | 
 |     /// An authentication state for the Fuchsia account. It is only populated if | 
 |     /// `AccountListenerOptions.scenario` was specified when the listener was | 
 |     /// created. | 
 |     AuthState? auth_state; | 
 | }; | 
 |  | 
 | /// The configuration for an AccountListener, defining the set of events that it | 
 | /// will receive. | 
 | [MaxHandles = "0"] | 
 | struct AccountListenerOptions { | 
 |     /// If true, the listener will receive an event containing the initial state | 
 |     /// for all accounts. The initial auth states will be populated in this | 
 |     /// event iff the scenario option is set. | 
 |     bool initial_state; | 
 |     /// If true, the listener will receive events when a new account is added | 
 |     /// to the device. | 
 |     bool add_account; | 
 |     /// If true, the listener will receive events when an account is removed | 
 |     /// from the device. | 
 |     bool remove_account; | 
 |     /// The scenario to use for all AuthState data sent to the listener. If | 
 |     /// scenario is not supplied no AuthState data will be populated. | 
 |     Scenario? scenario; | 
 |     /// An `AuthChangeGranularity` expressing the magnitude of change in | 
 |     /// authentication state that will lead to AuthStateChange events. | 
 |     /// If granularity is not populated AuthStateChange events will not be | 
 |     /// sent. May only be populated if a scenario is provided. | 
 |     AuthChangeGranularity? granularity; | 
 | }; | 
 |  | 
 | /// A protocol to receive events when the set of accounts on a device or the | 
 | /// authentication states of these accounts change. | 
 | /// | 
 | /// AccountListeners may be registered through the AccountManager protocol | 
 | /// and this registration also defines which types of event should be sent to | 
 | /// the listener. Optionally, the AccountListener will receive an initial state | 
 | /// event onto which the change events may be safely accumulated. | 
 | /// | 
 | /// All methods include an empty response to follow the "Throttle push using | 
 | /// acknowledgements" FIDL design pattern. | 
 | protocol AccountListener { | 
 |     /// A method that is called to communicate the initial set of accounts and | 
 |     /// their authentication states. OnInitialize is called exactly once if and | 
 |     /// only if AccountListenerOptions.initial_state was set when creating the | 
 |     /// AccountListener. When called, it will always be the first call on the | 
 |     /// channel. If no accounts are present on the device the vector will be | 
 |     /// empty. | 
 |     /// | 
 |     /// `account_states` The set of initial states. | 
 |     OnInitialize( | 
 |         vector<InitialAccountState>:MAX_ACCOUNTS_PER_DEVICE account_states) | 
 |         -> (); | 
 |  | 
 |     /// A method that is called when a new account is added to the device. | 
 |     /// This method is only called if AccountListenerOptions.add_account was | 
 |     /// set when creating the AccountListener. | 
 |     /// | 
 |     /// `account_state` The initial state for the newly added account. | 
 |     OnAccountAdded(InitialAccountState account_state) -> (); | 
 |  | 
 |     /// A method that is called when a provisioned account is removed. | 
 |     /// This method is only called if AccountListenerOptions.remove_account was | 
 |     /// set when creating the AccountListener. | 
 |     OnAccountRemoved(LocalAccountId account_id) -> (); | 
 |  | 
 |     /// A method that is called when the authentication state of any provisioned | 
 |     /// account changes. | 
 |     OnAuthStateChanged(AccountAuthState account_auth_state) -> (); | 
 | }; |