static gboolean on_account_handle_ensure_credentials (GoaAccount *account, GDBusMethodInvocation *invocation, gpointer user_data) { GoaDaemon *daemon = GOA_DAEMON (user_data); GoaProvider *provider; GoaObject *object; object = GOA_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (account))); provider = goa_provider_get_for_provider_type (goa_account_get_provider_type (account)); if (provider == NULL) { g_dbus_method_invocation_return_error (invocation, GOA_ERROR, GOA_ERROR_FAILED, "Unsupported account type %s for id %s (no provider)", goa_account_get_provider_type (account), goa_account_get_id (account)); goto out; } goa_provider_ensure_credentials (provider, object, NULL, /* GCancellable */ (GAsyncReadyCallback) ensure_credentials_cb, ensure_data_new (daemon, object, invocation)); out: return TRUE; /* invocation was handled */ }
static gboolean on_manager_handle_add_account (GoaManager *manager, GDBusMethodInvocation *invocation, const gchar *provider_type, const gchar *identity, const gchar *presentation_identity, GVariant *credentials, GVariant *details, gpointer user_data) { GoaDaemon *daemon = GOA_DAEMON (user_data); AddAccountData *data; data = g_slice_new0 (AddAccountData); data->daemon = g_object_ref (daemon); data->manager = g_object_ref (manager); data->invocation = g_object_ref (invocation); data->provider_type = g_strdup (provider_type); data->identity = g_strdup (identity); data->presentation_identity = g_strdup (presentation_identity); data->credentials = g_variant_ref (credentials); data->details = g_variant_ref (details); goa_provider_get_all (get_all_providers_cb, data); return TRUE; /* invocation was handled */ }
static void account_on_attention_needed_notify (GObject *object, GParamSpec *pspec, gpointer user_data) { GoaDaemon *daemon = GOA_DAEMON (user_data); goa_daemon_update_notifications (daemon); }
static gboolean on_config_file_monitor_timeout (gpointer user_data) { GoaDaemon *daemon = GOA_DAEMON (user_data); daemon->config_timeout_id = 0; g_info ("Reloading configuration files\n"); goa_daemon_reload_configuration (daemon); return FALSE; }
static void on_notification_closed (NotifyNotification *notification, gpointer user_data) { GoaDaemon *daemon = GOA_DAEMON (user_data); g_signal_handlers_disconnect_by_func (daemon->notification, G_CALLBACK (on_notification_closed), daemon); g_object_unref (daemon->notification); daemon->notification = NULL; }
static void on_file_monitor_changed (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, gpointer user_data) { GoaDaemon *daemon = GOA_DAEMON (user_data); if (daemon->config_timeout_id == 0) { daemon->config_timeout_id = g_timeout_add (200, on_config_file_monitor_timeout, daemon); } }
static void goa_daemon_finalize (GObject *object) { GoaDaemon *daemon = GOA_DAEMON (object); if (daemon->config_timeout_id != 0) { g_source_remove (daemon->config_timeout_id); } if (daemon->notification != NULL) { g_signal_handlers_disconnect_by_func (daemon->notification, G_CALLBACK (on_notification_closed), daemon); g_object_unref (daemon->notification); } if (daemon->system_conf_dir_monitor != NULL) { g_signal_handlers_disconnect_by_func (daemon->system_conf_dir_monitor, on_file_monitor_changed, daemon); g_object_unref (daemon->system_conf_dir_monitor); } if (daemon->home_conf_dir_monitor != NULL) { g_signal_handlers_disconnect_by_func (daemon->home_conf_dir_monitor, on_file_monitor_changed, daemon); g_object_unref (daemon->home_conf_dir_monitor); } if (daemon->home_conf_file_monitor != NULL) { g_signal_handlers_disconnect_by_func (daemon->home_conf_file_monitor, on_file_monitor_changed, daemon); g_object_unref (daemon->home_conf_file_monitor); } g_object_unref (daemon->manager); g_object_unref (daemon->object_manager); g_object_unref (daemon->connection); G_OBJECT_CLASS (goa_daemon_parent_class)->finalize (object); }
static void goa_daemon_finalize (GObject *object) { GoaDaemon *daemon = GOA_DAEMON (object); if (daemon->config_timeout_id != 0) { g_source_remove (daemon->config_timeout_id); } if (daemon->system_conf_dir_monitor != NULL) { g_signal_handlers_disconnect_by_func (daemon->system_conf_dir_monitor, on_file_monitor_changed, daemon); g_object_unref (daemon->system_conf_dir_monitor); } if (daemon->home_conf_dir_monitor != NULL) { g_signal_handlers_disconnect_by_func (daemon->home_conf_dir_monitor, on_file_monitor_changed, daemon); g_object_unref (daemon->home_conf_dir_monitor); } if (daemon->home_conf_file_monitor != NULL) { g_signal_handlers_disconnect_by_func (daemon->home_conf_file_monitor, on_file_monitor_changed, daemon); g_object_unref (daemon->home_conf_file_monitor); } g_object_unref (daemon->manager); g_object_unref (daemon->object_manager); g_object_unref (daemon->connection); #ifdef GOA_KERBEROS_ENABLED g_clear_object (&daemon->identity_service); #endif G_OBJECT_CLASS (goa_daemon_parent_class)->finalize (object); }
static gboolean on_account_handle_remove (GoaAccount *account, GDBusMethodInvocation *invocation, gpointer user_data) { GoaDaemon *daemon = GOA_DAEMON (user_data); GoaProvider *provider; GKeyFile *key_file; const gchar *provider_type; gchar *path; gchar *group; gchar *data; gsize length; GError *error; provider = NULL; provider_type = NULL; path = NULL; group = NULL; key_file = NULL; data = NULL; /* update key-file - right now we only support removing the account * if the entry is in ~/.config/goa-1.0/accounts.conf */ key_file = g_key_file_new (); path = g_strdup_printf ("%s/goa-1.0/accounts.conf", g_get_user_config_dir ()); error = NULL; if (!g_key_file_load_from_file (key_file, path, G_KEY_FILE_KEEP_COMMENTS, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); goto out; } group = g_strdup_printf ("Account %s", goa_account_get_id (account)); error = NULL; if (!g_key_file_remove_group (key_file, group, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); goto out; } error = NULL; data = g_key_file_to_data (key_file, &length, &error); if (data == NULL) { g_prefix_error (&error, "Error generating key-value-file: "); g_dbus_method_invocation_return_gerror (invocation, error); goto out; } error = NULL; if (!g_file_set_contents (path, data, length, &error)) { g_prefix_error (&error, "Error writing key-value-file %s: ", path); g_dbus_method_invocation_return_gerror (invocation, error); goto out; } provider_type = goa_account_get_provider_type (account); if (provider_type == NULL) { error = NULL; g_set_error_literal (&error, GOA_ERROR, GOA_ERROR_FAILED, /* TODO: more specific */ _("ProviderType property is not set for account")); g_dbus_method_invocation_return_gerror (invocation, error); goto out; } provider = goa_provider_get_for_provider_type (provider_type); if (provider == NULL) { error = NULL; g_set_error (&error, GOA_ERROR, GOA_ERROR_FAILED, /* TODO: more specific */ _("Failed to find a provider for: %s"), provider_type); g_dbus_method_invocation_return_gerror (invocation, error); goto out; } error = NULL; if (!goa_utils_delete_credentials_sync (provider, account, NULL, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); goto out; } goa_daemon_reload_configuration (daemon); goa_account_complete_remove (account, invocation); out: if (provider != NULL) g_object_unref (provider); g_free (data); if (key_file != NULL) g_key_file_free (key_file); g_free (group); g_free (path); return TRUE; /* invocation was handled */ }
GoaDaemon * goa_daemon_new (void) { return GOA_DAEMON (g_object_new (GOA_TYPE_DAEMON, NULL)); }
static gboolean on_account_handle_remove (GoaAccount *account, GDBusMethodInvocation *invocation, gpointer user_data) { GoaDaemon *daemon = GOA_DAEMON (user_data); GKeyFile *key_file; gchar *path; gchar *group; gchar *data; gsize length; GError *error; path = NULL; group = NULL; key_file = NULL; data = NULL; /* update key-file - right now we only support removing the account * if the entry is in ~/.config/goa-1.0/accounts.conf */ key_file = g_key_file_new (); path = g_strdup_printf ("%s/goa-1.0/accounts.conf", g_get_user_config_dir ()); error = NULL; if (!g_key_file_load_from_file (key_file, path, G_KEY_FILE_KEEP_COMMENTS, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); goto out; } group = g_strdup_printf ("Account %s", goa_account_get_id (account)); error = NULL; if (!g_key_file_remove_group (key_file, group, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); g_error_free (error); goto out; } error = NULL; data = g_key_file_to_data (key_file, &length, &error); if (data == NULL) { g_prefix_error (&error, "Error generating key-value-file: "); g_dbus_method_invocation_return_gerror (invocation, error); goto out; } error = NULL; if (!g_file_set_contents (path, data, length, &error)) { g_prefix_error (&error, "Error writing key-value-file %s: ", path); g_dbus_method_invocation_return_gerror (invocation, error); goto out; } goa_daemon_reload_configuration (daemon); goa_account_complete_remove (account, invocation); out: g_free (data); if (key_file != NULL) g_key_file_free (key_file); g_free (group); g_free (path); return TRUE; /* invocation was handled */ }
static gboolean on_manager_handle_add_account (GoaManager *manager, GDBusMethodInvocation *invocation, const gchar *provider, const gchar *identity, const gchar *presentation_identity, GVariant *details, gpointer user_data) { GoaDaemon *daemon = GOA_DAEMON (user_data); GKeyFile *key_file; GError *error; gchar *path; gchar *id; gchar *group; gchar *data; gsize length; gchar *object_path; GVariantIter iter; const gchar *key; const gchar *value; /* TODO: could check for @type */ key_file = NULL; path = NULL; id = NULL; group = NULL; data = NULL; object_path = NULL; key_file = g_key_file_new (); path = g_strdup_printf ("%s/goa-1.0/accounts.conf", g_get_user_config_dir ()); error = NULL; if (!g_file_get_contents (path, &data, &length, &error)) { if (error->domain == G_FILE_ERROR && error->code == G_FILE_ERROR_NOENT) { g_error_free (error); } else { g_prefix_error (&error, "Error loading file %s: ", path); g_dbus_method_invocation_return_gerror (invocation, error); goto out; } } else { if (length > 0) { error = NULL; if (!g_key_file_load_from_data (key_file, data, length, G_KEY_FILE_KEEP_COMMENTS, &error)) { g_prefix_error (&error, "Error parsing key-value-file %s: ", path); g_dbus_method_invocation_return_gerror (invocation, error); goto out; } } } id = generate_new_id (daemon); group = g_strdup_printf ("Account %s", id); g_key_file_set_string (key_file, group, "Provider", provider); g_key_file_set_string (key_file, group, "Identity", identity); g_key_file_set_string (key_file, group, "PresentationIdentity", presentation_identity); g_variant_iter_init (&iter, details); while (g_variant_iter_next (&iter, "{&s&s}", &key, &value)) { g_key_file_set_string (key_file, group, key, value); } g_free (data); error = NULL; data = g_key_file_to_data (key_file, &length, &error); if (data == NULL) { g_prefix_error (&error, "Error generating key-value-file: "); g_dbus_method_invocation_return_gerror (invocation, error); goto out; } error = NULL; if (!g_file_set_contents (path, data, length, &error)) { g_prefix_error (&error, "Error writing key-value-file %s: ", path); g_dbus_method_invocation_return_gerror (invocation, error); goto out; } goa_daemon_reload_configuration (daemon); object_path = g_strdup_printf ("/org/gnome/OnlineAccounts/Accounts/%s", id); goa_manager_complete_add_account (manager, invocation, object_path); out: g_free (object_path); g_free (data); g_free (group); g_free (id); g_free (path); if (key_file != NULL) g_key_file_free (key_file); return TRUE; /* invocation was handled */ }