/*
This file is part of Anastasis
Copyright (C) 2020, 2021 Anastasis SARL
Anastasis is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3, or (at your option) any later version.
Anastasis is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
Anastasis; see the file COPYING.GPL. If not, see
*/
/**
* @file include/anastasis_redux.h
* @brief anastasis reducer api
* @author Christian Grothoff
* @author Dominik Meister
* @author Dennis Neufeld
*/
#ifndef ANASTASIS_REDUX_H
#define ANASTASIS_REDUX_H
#include
#include "anastasis.h"
#include
#include
/**
* Initialize reducer subsystem.
*
* @param ctx context to use for CURL requests.
*/
void
ANASTASIS_redux_init (struct GNUNET_CURL_Context *ctx);
/**
* Terminate reducer subsystem.
*/
void
ANASTASIS_redux_done (void);
/**
* Returns an initial ANASTASIS backup state.
*
* @return NULL on failure
*/
json_t *
ANASTASIS_backup_start (const struct GNUNET_CONFIGURATION_Handle *cfg);
/**
* Returns an initial ANASTASIS recovery state.
*
* @return NULL on failure
*/
json_t *
ANASTASIS_recovery_start (const struct GNUNET_CONFIGURATION_Handle *cfg);
/**
* Signature of the callback passed to #ANASTASIS_redux_action()
*
* @param cls closure
* @param error error code, #TALER_EC_NONE if @a new_bs is the new successful state
* @param new_state the new state of the operation (client should json_incref() to keep an alias)
*/
typedef void
(*ANASTASIS_ActionCallback)(void *cls,
enum TALER_ErrorCode error,
json_t *new_state);
/**
* Handle to an ongoing action. Only valid until the #ANASTASIS_ActionCallback is invoked.
*/
struct ANASTASIS_ReduxAction;
/**
* Operates on a state. The new state is returned by a callback
* function. This function can do network access to talk to Anastasis
* service providers.
*
* @param state input state
* @param action what action to perform
* @param arguments data for the @a action
* @param cb function to call with the result
* @param cb_cls closure for @a cb
* @return failure state or new state
*/
struct ANASTASIS_ReduxAction *
ANASTASIS_redux_action (const json_t *state,
const char *action,
const json_t *arguments,
ANASTASIS_ActionCallback cb,
void *cb_cls);
/**
* Cancel ongoing redux action.
*
* @param ra action to cancel
*/
void
ANASTASIS_redux_action_cancel (struct ANASTASIS_ReduxAction *ra);
/**
* Handle for a policy discovery operation.
*/
struct ANASTASIS_PolicyDiscovery;
/**
* Function called on each discovered recovery policy.
*
* The client can then start a new policy discovery process, using the
* smallest (also most recent) @a version received per @a provider_url
* in the cursor to resume. Note that in this case, the application
* logic is responsible for de-duplication using @a hcpd, or it may show
* policies again if they are at different providers under versions not
* queried up to the cursor.
*
* @param cls closure
* @param hcpd hash of the compressed policy document (unique per policy)
* @param provider_url which provider claims to have this policy
* @param version version of the policy at this provider
* @param attribute_mask combination of optional identity attributes
* present in the state that was used to locate this version
* @param server_time when did the provider receive the upload
* @param secret_name name the user assigned to the backup
* @param providers json array of providers with this policy
*/
typedef void
(*ANASTASIS_PolicyDiscoveryCallback)(void *cls,
const struct GNUNET_HashCode *hcpd,
const char *provider_url,
uint32_t version,
json_int_t attribute_mask,
struct GNUNET_TIME_Timestamp server_time,
const char *secret_name,
const json_t *providers);
/**
* Start requesting providers for available policies for the
* recovery specified in @a state.
*
* @param state state to discover polices in
* @param cursor array containing "provider_url", attribute "mask",
* and "max_version" values (max_version is exclusive).
* Used for incremental discovery, NULL is allowed
* to begin from the latest version(s).
* @param cb function to call with results
* @param cb_cls closure for @a cb
* @return NULL on failure
*/
struct ANASTASIS_PolicyDiscovery *
ANASTASIS_policy_discovery_start (const json_t *state,
const json_t *cursor,
ANASTASIS_PolicyDiscoveryCallback cb,
void *cb_cls);
/**
* Add another provider to the list of providers to do discovery
* on.
*
* @param[in,out] pd policy discovery to expand
* @param provider_url the provider to add to the set of providers
* @param provider_state configuration state for that provider
*/
void
ANASTASIS_policy_discovery_more (struct ANASTASIS_PolicyDiscovery *pd,
const char *provider_url,
json_t *provider_state);
/**
* Stop policy discovery.
*
* @param[in] pd operation to stop
*/
void
ANASTASIS_policy_discovery_stop (struct ANASTASIS_PolicyDiscovery *pd);
/**
* Compute a subset of @a master_id removing optional attributes
* based on the bits set in @a mask.
*
* @param state reducer state (tells us which attributes are optional)
* @param master_id set of identity attributes to mask
* @param mask bitmask to apply
* @return masked copy of the @a master_id
*/
json_t *
ANASTASIS_mask_id_data (const json_t *state,
const json_t *master_id,
json_int_t mask);
/**
* Lookup @a salt of @a provider_url in @a state.
*
* @param state the state to inspect
* @param provider_url provider to look into
* @param[out] salt value to extract
* @return #GNUNET_OK on success
*/
enum GNUNET_GenericReturnValue
ANASTASIS_reducer_lookup_salt (const json_t *state,
const char *provider_url,
struct ANASTASIS_CRYPTO_ProviderSaltP *salt);
#endif /* _ANASTASIS_REDUX_H */