}
}
- if (error != NULL)
+ if (error != NULL) {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
+ }
g_simple_async_result_complete (res);
g_object_unref (res);
g_variant_unref (retval);
}
- if (error != NULL)
+ if (error != NULL) {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (async, error);
+ }
g_simple_async_result_complete (async);
g_object_unref (async);
retval = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error);
- if (error == NULL)
+ if (error == NULL) {
_secret_item_set_cached_secret (self, set->value);
- else
+ } else {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
+ }
if (retval != NULL)
g_variant_unref (retval);
GError *error = NULL;
closure->out = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error);
- if (error != NULL)
+ if (error != NULL) {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
+ }
g_simple_async_result_complete (res);
g_object_unref (res);
retval = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error);
if (error != NULL) {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
g_simple_async_result_complete (res);
g_variant_unref (retval);
} else {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
g_simple_async_result_complete (res);
}
g_variant_unref (retval);
} else {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
g_simple_async_result_complete (res);
}
g_variant_unref (retval);
} else {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
g_simple_async_result_complete (res);
}
GVariant *retval;
retval = g_dbus_proxy_call_finish (G_DBUS_PROXY (self), result, error);
+
+ _secret_util_strip_remote_error (error);
if (retval == NULL)
return NULL;
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
retval = g_dbus_proxy_call_finish (G_DBUS_PROXY (self), result, error);
+
+ _secret_util_strip_remote_error (error);
if (retval == NULL)
return FALSE;
SecretPrompt * _secret_prompt_instance (SecretService *service,
const gchar *prompt_path);
+void _secret_util_strip_remote_error (GError **error);
+
gchar * _secret_util_parent_path (const gchar *path);
gboolean _secret_util_empty_path (const gchar *path);
g_clear_error (&error);
if (error != NULL) {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
perform_prompt_complete (res, TRUE);
g_clear_error (&error);
if (error != NULL) {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
perform_prompt_complete (res, TRUE);
}
EGG_SECURE_GLIB_DEFINITIONS ();
+GQuark _secret_error_quark = 0;
static const gchar *default_bus_name = SECRET_SERVICE_BUS_NAME;
enum {
_secret_list_get_type (), G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
g_type_class_add_private (klass, sizeof (SecretServicePrivate));
+
+ /* Initialize this error domain, registers dbus errors */
+ _secret_error_quark = secret_error_get_quark ();
}
typedef struct {
g_variant_unref (response);
} else {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
g_simple_async_result_complete (res);
}
/* Other errors result in a failure */
} else {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
g_simple_async_result_complete (res);
}
typedef enum {
SECRET_ERROR_PROTOCOL = 1,
+ SECRET_ERROR_IS_LOCKED = 2,
+ SECRET_ERROR_NO_SUCH_OBJECT = 3,
+ SECRET_ERROR_ALREADY_EXISTS = 4,
} SecretError;
typedef struct _SecretCollection SecretCollection;
* SecretError:
* @SECRET_ERROR_PROTOCOL: received an invalid data or message from the Secret
* Service
+ * @SECRET_ERROR_IS_LOCKED: the item or collection is locked and the operation
+ * cannot be performed
+ * @SECRET_ERROR_NO_SUCH_OBJECT: no such item or collection found in the
+ * Secret Service
+ * @SECRET_ERROR_ALREADY_EXISTS: a relevant item or collection already exists
*
* Errors returned by the Secret Service. None of the errors are appropriate
* for display to the user.
GQuark
secret_error_get_quark (void)
{
- static volatile gsize initialized = 0;
- static GQuark quark = 0;
+ static volatile gsize quark = 0;
- if (g_once_init_enter (&initialized)) {
- quark = g_quark_from_static_string ("secret-error");
- g_once_init_leave (&initialized, 1);
- }
+ static const GDBusErrorEntry entries[] = {
+ { SECRET_ERROR_IS_LOCKED, "org.freedesktop.Secret.Error.IsLocked", },
+ { SECRET_ERROR_NO_SUCH_OBJECT, "org.freedesktop.Secret.Error.NoSuchObject", },
+ { SECRET_ERROR_ALREADY_EXISTS, "org.freedesktop.Secret.Error.AlreadyExists" },
+ };
+
+ g_dbus_error_register_error_domain ("secret-error", &quark,
+ entries, G_N_ELEMENTS (entries));
return quark;
}
+void
+_secret_util_strip_remote_error (GError **error)
+{
+ gchar *remote;
+
+ if (error == NULL || *error == NULL)
+ return;
+
+ remote = g_dbus_error_get_remote_error (*error);
+ if (remote) {
+ if (g_dbus_error_strip_remote_error (*error)) {
+ g_message ("Remote error from secret service: %s: %s",
+ remote, (*error)->message);
+ }
+ g_free (remote);
+ }
+}
+
gchar *
_secret_util_parent_path (const gchar *path)
{
retval = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), result, &error);
- if (error == NULL)
+ if (error == NULL) {
process_get_all_reply (proxy, retval);
- else
+ } else {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
+ }
if (retval != NULL)
g_variant_unref (retval);
retval = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source),
result, &error);
- if (error != NULL)
+ if (error != NULL) {
+ _secret_util_strip_remote_error (&error);
g_simple_async_result_take_error (res, error);
+ }
if (retval != NULL)
g_variant_unref (retval);
egg_test_wait_idle ();
}
+static void
+null_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
+ const gchar *message, gpointer user_data)
+{
+
+}
+
int
main (int argc, char **argv)
{
g_set_prgname ("test-prompt");
g_type_init ();
+ /* Suppress these messages in tests */
+ g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG,
+ null_log_handler, NULL);
+
g_test_add ("/prompt/run", Test, "mock-service-prompt.py", setup, test_perform_run, teardown);
g_test_add ("/prompt/perform-sync", Test, "mock-service-prompt.py", setup, test_perform_sync, teardown);
g_test_add ("/prompt/perform-async", Test, "mock-service-prompt.py", setup, test_perform_async, teardown);