// 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) -> ();
};
