static gboolean service_method_read_alias (GkdExportedService *skeleton, GDBusMethodInvocation *invocation, gchar *alias, GkdSecretService *self) { gchar *path = NULL; const gchar *identifier; GckObject *collection = NULL; identifier = gkd_secret_service_get_alias (self, alias); if (identifier) path = gkd_secret_util_build_path (SECRET_COLLECTION_PREFIX, identifier, -1); /* Make sure it actually exists */ if (path) collection = gkd_secret_objects_lookup_collection (self->objects, g_dbus_method_invocation_get_sender (invocation), path); if (collection == NULL) { g_free (path); path = NULL; } else { g_object_unref (collection); } if (path == NULL) path = g_strdup ("/"); gkd_exported_service_complete_read_alias (skeleton, invocation, path); g_free (path); return TRUE; }
static DBusMessage* service_method_read_alias (GkdSecretService *self, DBusMessage *message) { DBusMessage *reply; const char *alias; gchar *path = NULL; const gchar *identifier; GckObject *collection = NULL; if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &alias, DBUS_TYPE_INVALID)) return NULL; identifier = gkd_secret_service_get_alias (self, alias); if (identifier) path = gkd_secret_util_build_path (SECRET_COLLECTION_PREFIX, identifier, -1); /* Make sure it actually exists */ if (path) collection = gkd_secret_objects_lookup_collection (self->objects, dbus_message_get_sender (message), path); if (collection == NULL) { g_free (path); path = NULL; } else { g_object_unref (collection); } reply = dbus_message_new_method_return (message); if (path == NULL) path = g_strdup ("/"); dbus_message_append_args (reply, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); g_free (path); return reply; }
static gboolean parse_object_path (GkdSecretObjects *self, const gchar *path, gchar **collection, gchar **item) { const gchar *replace; g_assert (self); g_assert (path); g_assert (collection); if (!gkd_secret_util_parse_path (path, collection, item)) return FALSE; if (g_str_has_prefix (path, SECRET_ALIAS_PREFIX)) { replace = gkd_secret_service_get_alias (self->service, *collection); if (!replace) { g_free (*collection); *collection = NULL; if (item) { g_free (*item); *item = NULL; } return FALSE; } g_free (*collection); *collection = g_strdup (replace); } return TRUE; }
static GDBusMessage * rewrite_default_alias (GkdSecretService *self, GDBusMessage *message) { const char *path = g_dbus_message_get_path (message); const char *replace; char *collection = NULL, *item = NULL; char *collection_path, *item_path; GDBusMessage *rewritten; GError *error = NULL; if (path == NULL) return message; if (!g_str_has_prefix (path, SECRET_ALIAS_PREFIX)) return message; if (!gkd_secret_util_parse_path (path, &collection, &item)) return message; replace = gkd_secret_service_get_alias (self, collection); if (!replace) { g_free (item); g_free (collection); return message; } rewritten = g_dbus_message_copy (message, &error); if (error != NULL) { g_error_free (error); return message; } collection_path = gkd_secret_util_build_path (SECRET_COLLECTION_PREFIX, replace, -1); if (item != NULL) { item_path = gkd_secret_util_build_path (collection_path, item, -1); g_dbus_message_set_path (rewritten, item_path); g_free (item_path); } else { g_dbus_message_set_path (rewritten, collection_path); } g_free (collection_path); g_free (item); g_free (collection); g_object_unref (message); return rewritten; }
static gboolean locate_alias_collection_if_exists (GkdSecretCreate *self) { GkdSecretService *service; GkdSecretObjects *objects; GckObject *collection; const gchar *identifier; const gchar *caller; gchar *path; if (!self->alias) return FALSE; g_assert (!self->result_path); service = gkd_secret_prompt_get_service (GKD_SECRET_PROMPT (self)); caller = gkd_secret_prompt_get_caller (GKD_SECRET_PROMPT (self)); objects = gkd_secret_prompt_get_objects (GKD_SECRET_PROMPT (self)); identifier = gkd_secret_service_get_alias (service, self->alias); if (!identifier) return FALSE; /* Make sure it actually exists */ path = gkd_secret_util_build_path (SECRET_COLLECTION_PREFIX, identifier, -1); collection = gkd_secret_objects_lookup_collection (objects, caller, path); if (collection) { self->result_path = path; g_object_unref (collection); return TRUE; } else { g_free (path); return FALSE; } }