g_dbus_method_invocation_return_gerror (invocation, error);
g_error_free (error);
}
-
+
gsignond_disposable_set_keep_in_use (GSIGNOND_DISPOSABLE(self));
return TRUE;
if (change == GSIGNOND_IDENTITY_REMOVED)
gsignond_disposable_delete_later (GSIGNOND_DISPOSABLE (self));
+ else if (change == GSIGNOND_IDENTITY_SIGNED_OUT && self->priv->sessions) {
+ /* destroy all sessions on this identity as it's signed out */
+ g_list_foreach (self->priv->sessions, _destroy_session, NULL);
+ g_list_free (self->priv->sessions);
+ self->priv->sessions = NULL;
+ }
}
const gchar *
return gsignond_db_credentials_database_remove_reference (daemon->priv->db, identity_id, owner, reference);
}
+gboolean
+gsignond_daemon_store_identity_data (GSignondDaemon *daemon, guint32 identity_id, const gchar *method, GHashTable *data)
+{
+ g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), FALSE);
+
+ return gsignond_db_credentials_database_update_data (daemon->priv->db, identity_id, method, data);
+}
+
+gboolean
+gsignond_daemon_clear_identity_data (GSignondDaemon *daemon, guint32 identity_id)
+{
+ g_return_val_if_fail (daemon && GSIGNOND_IS_DAEMON (daemon), FALSE);
+
+ return gsignond_db_credentials_database_remove_data (daemon->priv->db, identity_id, NULL);
+}
+
GSignondIdentity *
gsignond_daemon_register_new_identity (GSignondDaemon *daemon,
const GSignondSecurityContext *ctx,
gboolean
gsignond_daemon_remove_identity_reference (GSignondDaemon *daemon, guint32 identity_id, const GSignondSecurityContext *owner, const gchar *ref);
+gboolean
+gsignond_daemon_store_identity_data (GSignondDaemon *daemon, guint32 identity_id, const gchar *method, GHashTable *data);
+
+gboolean
+gsignond_daemon_clear_identity_data (GSignondDaemon *daemon, guint32 identity_id);
+
guint
gsignond_daemon_get_timeout (GSignondDaemon *self) G_GNUC_CONST;
#include "gsignond-auth-session.h"
#include "gsignond/gsignond-config-dbus.h"
#include "gsignond/gsignond-signonui.h"
+#include "common/gsignond-identity-info-internal.h"
#include "plugins/gsignond-plugin-proxy-factory.h"
enum
};
enum {
- SIG_VERIFY_USER,
- SIG_VERIFY_SECRET,
- SIG_SIGNOUT,
SIG_USER_VERIFIED,
SIG_SECRET_VERIFIED,
SIG_CREDENTIALS_UPDATED,
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
- signals[SIG_SIGNOUT] = g_signal_new ("signout",
- GSIGNOND_TYPE_IDENTITY,
- G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
- 0,
- NULL, NULL,
- NULL,
- G_TYPE_BOOLEAN,
- 0,
- G_TYPE_NONE);
signals[SIG_USER_VERIFIED] = g_signal_new ("user-verified",
GSIGNOND_TYPE_IDENTITY,
G_SIGNAL_RUN_LAST,
return FALSE;
}
gboolean success = FALSE;
+ guint32 identity_id = GSIGNOND_IDENTITY_INFO_NEW_IDENTITY;
VALIDATE_IDENTITY_READ_ACCESS (identity, ctx, FALSE);
- /*
- * TODO: close all auth_sessions and emit "identity-signed-out"
- */
- g_signal_emit (identity,
- signals[SIG_SIGNOUT],
- 0,
- &success);
+ identity_id = gsignond_identity_info_get_id (identity->priv->info);
- if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Not supported");
+ if (identity_id == GSIGNOND_IDENTITY_INFO_NEW_IDENTITY) {
+ /* TODO; clear the cached secret for unstored identity */
+ success = TRUE;
+ }
+ else {
+ success = gsignond_daemon_clear_identity_data (identity->priv->owner, identity_id);
+ }
+ if(!success) {
+ if (error) *error = gsignond_get_gerror_for_id (GSIGNOND_ERROR_UNKNOWN, "Failed to clear data");
+ return FALSE;
+ }
+
+ g_signal_emit (identity, signals[SIG_INFO_UPDATED], 0, GSIGNOND_IDENTITY_SIGNED_OUT, NULL);
return success;
}