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 check_goa_object_match (AddAccountData *data, GoaObject *goa_object) { GoaTelepathyProviderPrivate *priv = data->provider->priv; GoaAccount *goa_account = NULL; const gchar *provider_type = NULL; const gchar *goa_id = NULL; const gchar *tp_id = NULL; if (data->tp_account == NULL) { /* Still waiting for the creation of the TpAccount */ return FALSE; } goa_account = goa_object_peek_account (goa_object); provider_type = goa_account_get_provider_type (goa_account); if (g_strcmp0 (provider_type, priv->provider_type) != 0) return FALSE; /* The backend-specific identity is set to the object path of the * corresponding Telepathy account object. */ goa_id = goa_account_get_identity (goa_account); tp_id = tp_proxy_get_object_path (TP_PROXY (data->tp_account)); if (g_strcmp0 (goa_id, tp_id) == 0) { /* Found it! */ data->ret = g_object_ref (goa_object); g_main_loop_quit (data->loop); return TRUE; } return FALSE; }
static void sync_accounts (GisGoaPage *page) { GisGoaPagePrivate *priv = gis_goa_page_get_instance_private (page); GList *accounts, *l; accounts = goa_client_get_accounts (priv->goa_client); for (l = accounts; l != NULL; l = l->next) { GoaObject *object = GOA_OBJECT (l->data); GoaAccount *account = goa_object_get_account (object); const char *account_type = goa_account_get_provider_type (account); ProviderWidget *provider_widget; provider_widget = g_hash_table_lookup (priv->providers, account_type); if (!provider_widget) continue; priv->accounts_exist = TRUE; if (provider_widget->displayed_account) continue; provider_widget->displayed_account = account; sync_provider_widget (provider_widget); } g_list_free_full (accounts, (GDestroyNotify) g_object_unref); sync_visibility (page); gis_page_set_skippable (GIS_PAGE (page), !priv->accounts_exist); gis_page_set_complete (GIS_PAGE (page), priv->accounts_exist); }
static PhotosSharePoint * photos_share_point_manager_create_share_point_online (PhotosSharePointManager *self, PhotosSource *source) { GIOExtension *extension; GType type; GoaAccount *account; GoaObject *object; PhotosSharePoint *ret_val = NULL; const gchar *provider_type; object = photos_source_get_goa_object (source); if (object == NULL) goto out; account = goa_object_peek_account (object); provider_type = goa_account_get_provider_type (account); extension = g_io_extension_point_get_extension_by_name (self->extension_point_online, provider_type); if (extension == NULL) goto out; type = g_io_extension_get_type (extension); ret_val = PHOTOS_SHARE_POINT (g_object_new (type, "source", source, NULL)); out: return ret_val; }
static void on_info_bar_response (GtkInfoBar *info_bar, gint response_id, gpointer user_data) { GoaPanel *panel = GOA_PANEL (user_data); GtkTreeIter iter; if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (panel->accounts_treeview)), NULL, &iter)) { GoaProvider *provider; const gchar *provider_type; GoaAccount *account; GoaObject *object; GtkWindow *parent; GError *error; gtk_tree_model_get (GTK_TREE_MODEL (panel->accounts_model), &iter, GOA_PANEL_ACCOUNTS_MODEL_COLUMN_OBJECT, &object, -1); account = goa_object_peek_account (object); provider_type = goa_account_get_provider_type (account); provider = goa_provider_get_for_provider_type (provider_type); parent = GTK_WINDOW (cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (panel)))); error = NULL; if (!goa_provider_refresh_account (provider, panel->client, object, parent, &error)) { if (!(error->domain == GOA_ERROR && error->code == GOA_ERROR_DIALOG_DISMISSED)) { GtkWidget *dialog; dialog = gtk_message_dialog_new (parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Error logging into the account")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", error->message); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } g_error_free (error); } g_object_unref (provider); g_object_unref (object); } }
gboolean goa_utils_check_duplicate (GoaClient *client, const gchar *identity, const gchar *presentation_identity, const gchar *provider_type, GoaPeekInterfaceFunc func, GError **error) { GList *accounts; GList *l; gboolean ret; ret = FALSE; accounts = goa_client_get_accounts (client); for (l = accounts; l != NULL; l = l->next) { GoaObject *object = GOA_OBJECT (l->data); GoaAccount *account; gpointer *interface; const gchar *identity_from_object; const gchar *presentation_identity_from_object; const gchar *provider_type_from_object; account = goa_object_peek_account (object); interface = (*func) (object); if (interface == NULL) continue; provider_type_from_object = goa_account_get_provider_type (account); if (g_strcmp0 (provider_type_from_object, provider_type) != 0) continue; identity_from_object = goa_account_get_identity (account); presentation_identity_from_object = goa_account_get_presentation_identity (account); if (g_strcmp0 (identity_from_object, identity) == 0 && g_strcmp0 (presentation_identity_from_object, presentation_identity) == 0) { const gchar *provider_name; provider_name = goa_account_get_provider_name (account); g_set_error (error, GOA_ERROR, GOA_ERROR_ACCOUNT_EXISTS, _("A %s account already exists for %s"), provider_name, presentation_identity); goto out; } } ret = TRUE; out: g_list_free_full (accounts, g_object_unref); return ret; }
static gboolean on_handle_get_password (GoaPasswordBased *interface, GDBusMethodInvocation *invocation, const gchar *id, gpointer user_data) { GoaObject *object; GoaAccount *account; GoaProvider *provider; GError *error; GVariant *credentials; gchar *password; /* TODO: maybe log what app is requesting access */ password = NULL; credentials = NULL; object = GOA_OBJECT (g_dbus_interface_get_object (G_DBUS_INTERFACE (interface))); account = goa_object_peek_account (object); provider = goa_provider_get_for_provider_type (goa_account_get_provider_type (account)); error = NULL; credentials = goa_utils_lookup_credentials_sync (provider, object, NULL, /* GCancellable* */ &error); if (credentials == NULL) { g_dbus_method_invocation_take_error (invocation, error); goto out; } if (!g_variant_lookup (credentials, "password", "s", &password)) { g_dbus_method_invocation_return_error (invocation, GOA_ERROR, GOA_ERROR_FAILED, /* TODO: more specific */ _("Did not find password with username `%s' in credentials"), id); goto out; } goa_password_based_complete_get_password (interface, invocation, password); out: g_free (password); if (credentials != NULL) g_variant_unref (credentials); g_object_unref (provider); return TRUE; /* invocation was handled */ }
void biji_note_book_add_goa_object (BijiNoteBook *self, GoaObject *object) { BijiProvider *provider; GoaAccount *account; const gchar *type; provider = NULL; account = goa_object_get_account (object); if (GOA_IS_ACCOUNT (account)) { type = goa_account_get_provider_type (account); if (g_strcmp0 (type, "owncloud") ==0) provider = biji_own_cloud_provider_new (self, object); } _add_provider (self, provider); }
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 */ }
static void show_page_account (GoaPanel *panel, GoaObject *object) { GList *children; GList *l; GtkWidget *box; GtkWidget *grid; GtkWidget *left_grid; GtkWidget *right_grid; GtkWidget *bar; GtkWidget *label; GoaProvider *provider; GoaAccount *account; const gchar *provider_type; provider = NULL; show_page (panel, 1); box = GTK_WIDGET (gtk_builder_get_object (panel->builder, "accounts-tree-box")); gtk_widget_set_sensitive (box, TRUE); label = GTK_WIDGET (gtk_builder_get_object (panel->builder, "accounts-tree-label")); gtk_widget_hide (label); /* Out with the old */ children = gtk_container_get_children (GTK_CONTAINER (panel->accounts_vbox)); for (l = children; l != NULL; l = l->next) gtk_container_remove (GTK_CONTAINER (panel->accounts_vbox), GTK_WIDGET (l->data)); g_list_free (children); account = goa_object_peek_account (object); provider_type = goa_account_get_provider_type (account); provider = goa_provider_get_for_provider_type (provider_type); /* And in with the new */ if (goa_account_get_attention_needed (account)) { bar = gtk_info_bar_new (); label = gtk_label_new (_("Expired credentials. Please log in again.")); gtk_container_add (GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (bar))), label); if (provider != NULL) gtk_info_bar_add_button (GTK_INFO_BAR (bar), _("_Log In"), GTK_RESPONSE_OK); gtk_box_pack_start (GTK_BOX (panel->accounts_vbox), bar, FALSE, TRUE, 0); g_signal_connect (bar, "response", G_CALLBACK (on_info_bar_response), panel); } left_grid = gtk_grid_new (); gtk_widget_set_halign (left_grid, GTK_ALIGN_END); gtk_widget_set_hexpand (left_grid, TRUE); gtk_orientable_set_orientation (GTK_ORIENTABLE (left_grid), GTK_ORIENTATION_VERTICAL); gtk_grid_set_row_spacing (GTK_GRID (left_grid), 0); right_grid = gtk_grid_new (); gtk_widget_set_hexpand (right_grid, TRUE); gtk_orientable_set_orientation (GTK_ORIENTABLE (right_grid), GTK_ORIENTATION_VERTICAL); gtk_grid_set_row_spacing (GTK_GRID (right_grid), 0); if (provider != NULL) { goa_provider_show_account (provider, panel->client, object, GTK_BOX (panel->accounts_vbox), GTK_GRID (left_grid), GTK_GRID (right_grid)); } grid = gtk_grid_new (); gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_HORIZONTAL); gtk_grid_set_column_spacing (GTK_GRID (grid), 12); gtk_container_add (GTK_CONTAINER (grid), left_grid); gtk_container_add (GTK_CONTAINER (grid), right_grid); gtk_box_pack_start (GTK_BOX (panel->accounts_vbox), grid, FALSE, TRUE, 0); gtk_widget_show_all (panel->accounts_vbox); if (provider != NULL) g_object_unref (provider); }
gint main (void) { GDataDocumentsFeed *feed = NULL; GDataDocumentsQuery *query = NULL; GDataDocumentsService *service = NULL; GError *error = NULL; GList *accounts = NULL; GList *entries; GList *l; GoaClient *client = NULL; client = goa_client_new_sync (NULL, &error); if (error != NULL) { g_warning ("%s", error->message); g_error_free (error); goto out; } accounts = goa_client_get_accounts (client); for (l = accounts; l != NULL; l = l->next) { GoaAccount *account; GoaObject *object = GOA_OBJECT (l->data); const gchar *provider_type; account = goa_object_peek_account (object); provider_type = goa_account_get_provider_type (account); if (g_strcmp0 (provider_type, "google") == 0) { GDataGoaAuthorizer *authorizer; authorizer = gdata_goa_authorizer_new (object); service = gdata_documents_service_new (GDATA_AUTHORIZER (authorizer)); g_object_unref (authorizer); } } if (service == NULL) { g_warning ("Account not found"); goto out; } query = gdata_documents_query_new_with_limits (NULL, 1, 10); gdata_documents_query_set_show_folders (query, TRUE); while (TRUE) { feed = gdata_documents_service_query_documents (service, query, NULL, NULL, NULL, &error); if (error != NULL) { g_warning ("%s", error->message); g_error_free (error); goto out; } entries = gdata_feed_get_entries (GDATA_FEED (feed)); if (entries == NULL) { goto out; } for (l = entries; l != NULL; l = l->next) { GDataEntry *entry = GDATA_ENTRY (l->data); const gchar *title; title = gdata_entry_get_title (entry); g_message ("%s", title); } gdata_query_next_page (GDATA_QUERY (query)); g_object_unref (feed); } out: g_clear_object (&feed); g_clear_object (&query); g_clear_object (&service); g_clear_object (&client); g_list_free_full (accounts, g_object_unref); return 0; }