/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Pix * * Copyright (C) 2010 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #ifdef HAVE_LIBSECRET #include #endif /* HAVE_LIBSECRET */ #include #include "oauth-account.h" #define ACCOUNTS_FORMAT_VERSION "2.0" enum { PROP_0, PROP_ID, PROP_USERNAME, PROP_NAME, PROP_TOKEN, PROP_TOKEN_SECRET, PROP_IS_DEFAULT }; static void oauth_account_dom_domizable_interface_init (DomDomizableInterface *iface); G_DEFINE_TYPE_WITH_CODE (OAuthAccount, oauth_account, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (DOM_TYPE_DOMIZABLE, oauth_account_dom_domizable_interface_init)) static void oauth_account_finalize (GObject *obj) { OAuthAccount *self; self = OAUTH_ACCOUNT (obj); g_free (self->id); g_free (self->username); g_free (self->name); g_free (self->token); g_free (self->token_secret); G_OBJECT_CLASS (oauth_account_parent_class)->finalize (obj); } static void oauth_account_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { OAuthAccount *self; self = OAUTH_ACCOUNT (object); switch (property_id) { case PROP_ID: _g_str_set (&self->id, g_value_get_string (value)); break; case PROP_USERNAME: _g_str_set (&self->username, g_value_get_string (value)); if (self->name == NULL) _g_str_set (&self->name, g_value_get_string (value)); break; case PROP_NAME: _g_str_set (&self->name, g_value_get_string (value)); break; case PROP_TOKEN: _g_str_set (&self->token, g_value_get_string (value)); break; case PROP_TOKEN_SECRET: _g_str_set (&self->token_secret, g_value_get_string (value)); break; case PROP_IS_DEFAULT: self->is_default = g_value_get_boolean (value); break; default: break; } } static void oauth_account_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { OAuthAccount *self; self = OAUTH_ACCOUNT (object); switch (property_id) { case PROP_ID: g_value_set_string (value, self->id); break; case PROP_USERNAME: g_value_set_string (value, self->username); break; case PROP_NAME: g_value_set_string (value, self->name); break; case PROP_TOKEN: g_value_set_string (value, self->token); break; case PROP_TOKEN_SECRET: g_value_set_string (value, self->token_secret); break; case PROP_IS_DEFAULT: g_value_set_boolean (value, self->is_default); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void oauth_account_class_init (OAuthAccountClass *klass) { GObjectClass *object_class; object_class = G_OBJECT_CLASS (klass); object_class->finalize = oauth_account_finalize; object_class->set_property = oauth_account_set_property; object_class->get_property = oauth_account_get_property; /* properties */ g_object_class_install_property (object_class, PROP_ID, g_param_spec_string ("id", "ID", "", NULL, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_USERNAME, g_param_spec_string ("username", "Username", "", NULL, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_NAME, g_param_spec_string ("name", "Name", "", NULL, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_TOKEN, g_param_spec_string ("token", "Token", "", NULL, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_TOKEN_SECRET, g_param_spec_string ("token-secret", "Token secret", "", NULL, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_IS_DEFAULT, g_param_spec_boolean ("is-default", "Is default", "", FALSE, G_PARAM_READWRITE)); } DomElement * oauth_account_create_element (DomDomizable *base, DomDocument *doc) { OAuthAccount *self; DomElement *element; gboolean set_token; self = OAUTH_ACCOUNT (base); element = dom_document_create_element (doc, "account", NULL); if (self->id != NULL) dom_element_set_attribute (element, "id", self->id); if (self->username != NULL) dom_element_set_attribute (element, "username", self->username); if (self->name != NULL) dom_element_set_attribute (element, "name", self->name); /* Do not save the token in the configuration file if the keyring is * available. */ #ifdef HAVE_LIBSECRET set_token = FALSE; #else set_token = TRUE; #endif if (set_token && (self->token_secret != NULL)) dom_element_set_attribute (element, "token-secret", self->token_secret); if (self->is_default) dom_element_set_attribute (element, "default", "1"); return element; } void oauth_account_load_from_element (DomDomizable *base, DomElement *element) { OAuthAccount *self; self = OAUTH_ACCOUNT (base); g_object_set (self, "id", dom_element_get_attribute (element, "id"), "username", dom_element_get_attribute (element, "username"), "name", dom_element_get_attribute (element, "name"), "token-secret", dom_element_get_attribute (element, "token-secret"), "is-default", (g_strcmp0 (dom_element_get_attribute (element, "default"), "1") == 0), NULL); } static void oauth_account_dom_domizable_interface_init (DomDomizableInterface *iface) { iface->create_element = oauth_account_create_element; iface->load_from_element = oauth_account_load_from_element; } static void oauth_account_init (OAuthAccount *self) { self->id = NULL; self->username = NULL; self->name = NULL; self->token = NULL; self->token_secret = NULL; self->is_default = FALSE; } OAuthAccount * oauth_account_new (void) { return g_object_new (OAUTH_TYPE_ACCOUNT, NULL); } void oauth_account_set_username (OAuthAccount *self, const char *value) { _g_str_set (&self->username, value); } void oauth_account_set_token (OAuthAccount *self, const char *value) { _g_str_set (&self->token, value); } void oauth_account_set_token_secret (OAuthAccount *self, const char *value) { _g_str_set (&self->token_secret, value); } int oauth_account_cmp (OAuthAccount *a, OAuthAccount *b) { if ((a == NULL) && (b == NULL)) return 0; else if (a == NULL) return 1; else if (b == NULL) return -1; else if ((a->id != NULL) || (b->id != NULL)) return g_strcmp0 (a->id, b->id); else if ((a->username != NULL) || (b->username != NULL)) return g_strcmp0 (a->username, b->username); else return g_strcmp0 (a->name, b->name); } GList * oauth_accounts_load_from_file (const char *service_name, GType account_type) { GList *accounts = NULL; char *filename; GFile *file; char *buffer; gsize len; GError *error = NULL; DomDocument *doc; if (account_type == 0) account_type = OAUTH_TYPE_ACCOUNT; filename = g_strconcat (service_name, ".xml", NULL); file = gth_user_dir_get_file_for_read (GTH_DIR_CONFIG, PIX_DIR, "accounts", filename, NULL); if (! _g_file_load_in_buffer (file, (void **) &buffer, &len, NULL, &error)) { g_error_free (error); g_object_unref (file); g_free (filename); return NULL; } doc = dom_document_new (); if (dom_document_load (doc, buffer, len, NULL)) { DomElement *node; node = DOM_ELEMENT (doc)->first_child; if ((node != NULL) && (g_strcmp0 (node->tag_name, "accounts") == 0) && (g_strcmp0 (dom_element_get_attribute (node, "version"), ACCOUNTS_FORMAT_VERSION) == 0)) { DomElement *child; for (child = node->first_child; child != NULL; child = child->next_sibling) { if (strcmp (child->tag_name, "account") == 0) { OAuthAccount *account; account = g_object_new (account_type, NULL); dom_domizable_load_from_element (DOM_DOMIZABLE (account), child); accounts = g_list_prepend (accounts, account); } } accounts = g_list_reverse (accounts); } } g_object_unref (doc); g_free (buffer); g_object_unref (file); g_free (filename); return accounts; } OAuthAccount * oauth_accounts_find_default (GList *accounts) { GList *scan; for (scan = accounts; scan; scan = scan->next) { OAuthAccount *account = scan->data; if (account->is_default) return g_object_ref (account); } return NULL; } void oauth_accounts_save_to_file (const char *service_name, GList *accounts, OAuthAccount *default_account) { DomDocument *doc; DomElement *root; GList *scan; char *buffer; gsize len; char *filename; GFile *file; doc = dom_document_new (); root = dom_document_create_element (doc, "accounts", "version", ACCOUNTS_FORMAT_VERSION, NULL); dom_element_append_child (DOM_ELEMENT (doc), root); for (scan = accounts; scan; scan = scan->next) { OAuthAccount *account = scan->data; DomElement *node; if ((default_account != NULL) && g_strcmp0 (account->id, default_account->id) == 0) account->is_default = TRUE; else account->is_default = FALSE; node = dom_domizable_create_element (DOM_DOMIZABLE (account), doc); dom_element_append_child (root, node); } filename = g_strconcat (service_name, ".xml", NULL); file = gth_user_dir_get_file_for_write (GTH_DIR_CONFIG, PIX_DIR, "accounts", filename, NULL); buffer = dom_document_dump (doc, &len); _g_file_write (file, FALSE, G_FILE_CREATE_PRIVATE | G_FILE_CREATE_REPLACE_DESTINATION, buffer, len, NULL, NULL); g_free (buffer); g_object_unref (file); g_free (filename); g_object_unref (doc); }