#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "wocky-auth-handler.h"
#include "wocky-auth-registry.h"
GType
wocky_auth_handler_get_type (void)
{
static volatile gsize g_define_type_id__volatile = 0;
if (g_once_init_enter (&g_define_type_id__volatile))
{
const GTypeInfo info =
{
/* class_size */ sizeof (WockyAuthHandlerIface),
/* base_init */ NULL,
/* base_finalize */ NULL,
/* class_init */ NULL,
/* class_finalize */ NULL,
/* class_data */ NULL,
/* instance_size */ 0,
/* n_preallocs */ 0,
/* instance_init */ NULL,
/* value_table */ NULL
};
GType g_define_type_id = g_type_register_static (
G_TYPE_INTERFACE, "WockyAuthHandler", &info, 0);
g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT);
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
}
return g_define_type_id__volatile;
}
/**
* wocky_auth_handler_get_mechanism:
* @handler: a handler for a SASL mechanism.
*
* Returns the name of the SASL mechanism @handler implements.
*
* Returns: the name of the SASL mechanism @handler implements.
*/
const gchar *
wocky_auth_handler_get_mechanism (WockyAuthHandler *handler)
{
return WOCKY_AUTH_HANDLER_GET_IFACE (handler)->mechanism;
}
/**
* wocky_auth_handler_is_plain:
* @handler: a handler for a SASL mechanism.
*
* Checks whether @handler sends secrets in plaintext. This may be used to
* decide whether to use @handler on an insecure XMPP connection.
*
* Returns: %TRUE if @handler sends secrets in plaintext.
*/
gboolean
wocky_auth_handler_is_plain (WockyAuthHandler *handler)
{
return WOCKY_AUTH_HANDLER_GET_IFACE (handler)->plain;
}
/**
* wocky_auth_handler_get_initial_response:
* @handler: a handler for a SASL mechanism
* @initial_data: (out) (transfer full): initial data to send to the server, if
* any
* @error: an optional location for a #GError to fill, or %NULL
*
* Called when authentication begins to fetch the initial data to send to the
* server in the <auth/>
stanza.
*
* If this function returns %TRUE, @initial_data will be non-%NULL if @handler
* provides an initial response, and %NULL otherwise.
*
* Returns: %TRUE on success; %FALSE otherwise.
*/
gboolean
wocky_auth_handler_get_initial_response (WockyAuthHandler *handler,
GString **initial_data,
GError **error)
{
WockyAuthInitialResponseFunc func =
WOCKY_AUTH_HANDLER_GET_IFACE (handler)->initial_response_func;
g_assert (initial_data != NULL);
*initial_data = NULL;
if (func == NULL)
return TRUE;
return func (handler, initial_data, error);
}
/**
* wocky_auth_handler_handle_auth_data:
* @handler: a #WockyAuthHandler object
* @data: the challenge string
* @response: (out) (transfer full): a location to fill with a challenge
* response in a #GString
* @error: an optional location for a #GError to fill, or %NULL
*
* Asks @handler to respond to a <challenge/>
stanza or a
* <success/>
with data. On success, @handler will put
* response data into @response, Base64-encoding it if appropriate.
*
* Returns: %TRUE on success, otherwise %FALSE
*/
gboolean
wocky_auth_handler_handle_auth_data (
WockyAuthHandler *handler,
const GString *data,
GString **response,
GError **error)
{
WockyAuthAuthDataFunc func =
WOCKY_AUTH_HANDLER_GET_IFACE (handler)->auth_data_func;
g_assert (response != NULL);
*response = NULL;
if (func == NULL)
{
g_set_error (error, WOCKY_AUTH_ERROR,
WOCKY_AUTH_ERROR_INVALID_REPLY,
"Server send a challenge, but the mechanism didn't expect any");
return FALSE;
}
return func (handler, data, response, error);
}
/**
* wocky_auth_handler_handle_success:
* @handler: a #WockyAuthHandler object
* @error: an optional location for a #GError to fill, or %NULL
*
* Called when a <success/>
stanza is received
* during authentication. If no error is returned, then authentication
* is considered finished. (Typically, an error is only raised if the
* <success/>
stanza was received earlier than
* expected)
*
* Returns: %TRUE on success, otherwise %FALSE
*/
gboolean
wocky_auth_handler_handle_success (
WockyAuthHandler *handler,
GError **error)
{
WockyAuthSuccessFunc func =
WOCKY_AUTH_HANDLER_GET_IFACE (handler)->success_func;
if (func == NULL)
return TRUE;
else
return func (handler, error);
}