/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2018 Red Hat, Inc. (www.redhat.com)
*
* This library is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This library 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*/
#if !defined (__LIBEDATASERVER_H_INSIDE__) && !defined (LIBEDATASERVER_COMPILATION)
#error "Only should be included directly."
#endif
#ifndef E_OAUTH2_SERVICE_H
#define E_OAUTH2_SERVICE_H
#include
#include
#include
/* Standard GObject macros */
#define E_TYPE_OAUTH2_SERVICE \
(e_oauth2_service_get_type ())
#define E_OAUTH2_SERVICE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST \
((obj), E_TYPE_OAUTH2_SERVICE, EOAuth2Service))
#define E_IS_OAUTH2_SERVICE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE \
((obj), E_TYPE_OAUTH2_SERVICE))
#define E_OAUTH2_SERVICE_GET_INTERFACE(obj) \
(G_TYPE_INSTANCE_GET_INTERFACE \
((obj), E_TYPE_OAUTH2_SERVICE, EOAuth2ServiceInterface))
/* Secret key names, saved by the code; not the names returned by the OAuth2 server */
#define E_OAUTH2_SECRET_REFRESH_TOKEN "refresh_token"
#define E_OAUTH2_SECRET_ACCESS_TOKEN "access_token"
#define E_OAUTH2_SECRET_EXPIRES_AFTER "expires_after"
G_BEGIN_DECLS
/**
* EOAuth2ServiceFlags:
* @E_OAUTH2_SERVICE_FLAG_NONE: No flag set
* @E_OAUTH2_SERVICE_FLAG_EXTRACT_REQUIRES_PAGE_CONTENT: the service requires also page
* content to be passed to e_oauth2_service_extract_authorization_code()
*
* Flags of the OAuth2 service.
*
* Since: 3.28
**/
typedef enum {
E_OAUTH2_SERVICE_FLAG_NONE = 0,
E_OAUTH2_SERVICE_FLAG_EXTRACT_REQUIRES_PAGE_CONTENT = (1 << 1)
} EOAuth2ServiceFlags;
/**
* EOAuth2ServiceNavigationPolicy:
* @E_OAUTH2_SERVICE_NAVIGATION_POLICY_DENY: Deny navigation to the given web resource
* @E_OAUTH2_SERVICE_NAVIGATION_POLICY_ALLOW: Allow navigation to the given web resource
* @E_OAUTH2_SERVICE_NAVIGATION_POLICY_ABORT: Abort authentication processing
*
* A value used during querying authentication URI, to decide whether certain
* resource can be used or not. The @E_OAUTH2_SERVICE_NAVIGATION_POLICY_ABORT
* can be used to abort the authentication query, like when user cancelled it.
*
* Since: 3.28
**/
typedef enum {
E_OAUTH2_SERVICE_NAVIGATION_POLICY_DENY,
E_OAUTH2_SERVICE_NAVIGATION_POLICY_ALLOW,
E_OAUTH2_SERVICE_NAVIGATION_POLICY_ABORT
} EOAuth2ServiceNavigationPolicy;
/**
* EOAuth2ServiceRefSourceFunc:
* @user_data: user data, as passed to e_oauth2_service_get_access_token_sync()
* or e_oauth2_service_receive_and_store_token_sync(),
* or e_oauth2_service_refresh_and_store_token_sync()
* @uid: an #ESource UID to return
*
* Returns: (transfer full) (nullable): an #ESource with UID @uid, or %NULL, if not found.
* Dereference the returned non-NULL #ESource with g_object_unref(), when no longer needed.
*
* Since: 3.28
**/
typedef ESource * (* EOAuth2ServiceRefSourceFunc) (gpointer user_data,
const gchar *uid);
typedef struct _EOAuth2Service EOAuth2Service;
typedef struct _EOAuth2ServiceInterface EOAuth2ServiceInterface;
/**
* EOAuth2Service:
*
* Contains only private data that should be read and manipulated using the
* functions below.
*
* Since: 3.28
**/
struct _EOAuth2ServiceInterface {
GTypeInterface parent_interface;
gboolean (* can_process) (EOAuth2Service *service,
ESource *source);
gboolean (* guess_can_process) (EOAuth2Service *service,
const gchar *protocol,
const gchar *hostname);
guint32 (* get_flags) (EOAuth2Service *service);
const gchar * (* get_name) (EOAuth2Service *service);
const gchar * (* get_display_name) (EOAuth2Service *service);
const gchar * (* get_client_id) (EOAuth2Service *service,
ESource *source);
const gchar * (* get_client_secret) (EOAuth2Service *service,
ESource *source);
const gchar * (* get_authentication_uri) (EOAuth2Service *service,
ESource *source);
const gchar * (* get_refresh_uri) (EOAuth2Service *service,
ESource *source);
const gchar * (* get_redirect_uri) (EOAuth2Service *service,
ESource *source);
void (* prepare_authentication_uri_query)
(EOAuth2Service *service,
ESource *source,
GHashTable *uri_query);
EOAuth2ServiceNavigationPolicy
(* get_authentication_policy) (EOAuth2Service *service,
ESource *source,
const gchar *uri);
gboolean (* extract_authorization_code) (EOAuth2Service *service,
ESource *source,
const gchar *page_title,
const gchar *page_uri,
const gchar *page_content,
gchar **out_authorization_code);
void (* prepare_get_token_form) (EOAuth2Service *service,
ESource *source,
const gchar *authorization_code,
GHashTable *form);
void (* prepare_get_token_message) (EOAuth2Service *service,
ESource *source,
SoupMessage *message);
void (* prepare_refresh_token_form) (EOAuth2Service *service,
ESource *source,
const gchar *refresh_token,
GHashTable *form);
void (* prepare_refresh_token_message)
(EOAuth2Service *service,
ESource *source,
SoupMessage *message);
gboolean (* extract_error_message) (EOAuth2Service *service,
ESource *source,
const gchar *page_title,
const gchar *page_uri,
const gchar *page_content,
gchar **out_error_message);
/* Padding for future expansion */
gpointer reserved[9];
};
GType e_oauth2_service_get_type (void) G_GNUC_CONST;
gboolean e_oauth2_service_can_process (EOAuth2Service *service,
ESource *source);
gboolean e_oauth2_service_guess_can_process (EOAuth2Service *service,
const gchar *protocol,
const gchar *hostname);
guint32 e_oauth2_service_get_flags (EOAuth2Service *service);
const gchar * e_oauth2_service_get_name (EOAuth2Service *service);
const gchar * e_oauth2_service_get_display_name (EOAuth2Service *service);
const gchar * e_oauth2_service_get_client_id (EOAuth2Service *service,
ESource *source);
const gchar * e_oauth2_service_get_client_secret (EOAuth2Service *service,
ESource *source);
const gchar * e_oauth2_service_get_authentication_uri (EOAuth2Service *service,
ESource *source);
const gchar * e_oauth2_service_get_refresh_uri (EOAuth2Service *service,
ESource *source);
const gchar * e_oauth2_service_get_redirect_uri (EOAuth2Service *service,
ESource *source);
void e_oauth2_service_prepare_authentication_uri_query
(EOAuth2Service *service,
ESource *source,
GHashTable *uri_query);
EOAuth2ServiceNavigationPolicy
e_oauth2_service_get_authentication_policy
(EOAuth2Service *service,
ESource *source,
const gchar *uri);
gboolean e_oauth2_service_extract_authorization_code
(EOAuth2Service *service,
ESource *source,
const gchar *page_title,
const gchar *page_uri,
const gchar *page_content,
gchar **out_authorization_code);
gboolean e_oauth2_service_extract_error_message (EOAuth2Service *service,
ESource *source,
const gchar *page_title,
const gchar *page_uri,
const gchar *page_content,
gchar **out_error_message);
void e_oauth2_service_prepare_get_token_form (EOAuth2Service *service,
ESource *source,
const gchar *authorization_code,
GHashTable *form);
void e_oauth2_service_prepare_get_token_message
(EOAuth2Service *service,
ESource *source,
SoupMessage *message);
void e_oauth2_service_prepare_refresh_token_form
(EOAuth2Service *service,
ESource *source,
const gchar *refresh_token,
GHashTable *form);
void e_oauth2_service_prepare_refresh_token_message
(EOAuth2Service *service,
ESource *source,
SoupMessage *message);
gboolean e_oauth2_service_receive_and_store_token_sync
(EOAuth2Service *service,
ESource *source,
const gchar *authorization_code,
EOAuth2ServiceRefSourceFunc ref_source,
gpointer ref_source_user_data,
GCancellable *cancellable,
GError **error);
gboolean e_oauth2_service_refresh_and_store_token_sync
(EOAuth2Service *service,
ESource *source,
const gchar *refresh_token,
EOAuth2ServiceRefSourceFunc ref_source,
gpointer ref_source_user_data,
GCancellable *cancellable,
GError **error);
gboolean e_oauth2_service_delete_token_sync (EOAuth2Service *service,
ESource *source,
GCancellable *cancellable,
GError **error);
gboolean e_oauth2_service_get_access_token_sync (EOAuth2Service *service,
ESource *source,
EOAuth2ServiceRefSourceFunc ref_source,
gpointer ref_source_user_data,
gchar **out_access_token,
gint *out_expires_in,
GCancellable *cancellable,
GError **error);
void e_oauth2_service_util_set_to_form (GHashTable *form,
const gchar *name,
const gchar *value);
void e_oauth2_service_util_take_to_form (GHashTable *form,
const gchar *name,
gchar *value);
gboolean e_oauth2_service_util_extract_from_uri (const gchar *in_uri,
gchar **out_authorization_code,
gchar **out_error_code,
gchar **out_error_description);
const gchar * e_oauth2_service_util_compile_value (const gchar *compile_value,
gchar *out_glob_buff,
gsize out_glob_buff_size);
G_END_DECLS
#endif /* E_OAUTH2_SERVICE_H */