From b67b277d1fea7bc4f75eb33048ffbe5bf2ebb82d Mon Sep 17 00:00:00 2001 From: Sam Hartman Date: Fri, 23 Nov 2018 11:07:55 -0500 Subject: [PATCH] Split out Gnome Keyring keystore In preparation for adding libsecret support, split out the gnome keyring specific functions into their own class. --- Makefile.am | 3 +- src/moonshot-keyring-store-base.vala | 94 ++++++++++++++++++++++ ...tore.vala => moonshot-keyring-store-gnome.vala} | 83 +++++-------------- 3 files changed, 114 insertions(+), 66 deletions(-) create mode 100644 src/moonshot-keyring-store-base.vala rename src/{moonshot-keyring-store.vala => moonshot-keyring-store-gnome.vala} (78%) diff --git a/Makefile.am b/Makefile.am index 11b5f48..900c0ae 100644 --- a/Makefile.am +++ b/Makefile.am @@ -56,7 +56,8 @@ src_moonshot_SOURCES = \ src/moonshot-identity-manager-app.vala \ src/moonshot-identity-management-view.vala \ src/moonshot-local-flat-file-store.vala \ - src/moonshot-keyring-store.vala \ + src/moonshot-keyring-store-base.vala \ + src/moonshot-keyring-store-gnome.vala \ src/moonshot-idcard-store.vala \ src/moonshot-id.vala \ src/moonshot-identity-dialog.vala \ diff --git a/src/moonshot-keyring-store-base.vala b/src/moonshot-keyring-store-base.vala new file mode 100644 index 0000000..4aa6494 --- /dev/null +++ b/src/moonshot-keyring-store-base.vala @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2011-2016, JANET(UK) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of JANET(UK) nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. +*/ +using Gee; + +#if GNOME_KEYRING || LIBSECRET_KEYRING +public abstract class KeyringStoreBase : Object, IIdentityCardStore { + protected static MoonshotLogger logger = get_logger("KeyringStore"); + + protected LinkedList id_card_list; + protected const string keyring_store_attribute = "Moonshot"; + protected const string keyring_store_version = "1.0"; + + public void add_card(IdCard card) { + logger.trace("add_card: Adding card '%s' with services: '%s'" + .printf(card.display_name, card.get_services_string("; "))); + + id_card_list.add(card); + store_id_cards(); + } + + public IdCard? update_card(IdCard card) { + logger.trace("update_card"); + + id_card_list.remove(card); + id_card_list.add(card); + + store_id_cards(); + foreach (IdCard idcard in id_card_list) { + if (idcard.display_name == card.display_name) { + return idcard; + } + } + + logger.error(@"update_card: card '$(card.display_name)' was not found after re-loading!"); + return null; + } + + public bool remove_card(IdCard card) { + bool retval = id_card_list.remove(card); + if (retval) + store_id_cards(); + return retval; + } + + public IIdentityCardStore.StoreType get_store_type() { + return IIdentityCardStore.StoreType.KEYRING; + } + + public LinkedList get_card_list() { + return id_card_list; + } + + protected abstract void clear_keyring(); + protected abstract void load_id_cards(); + internal abstract void store_id_cards(); + + + + public KeyringStoreBase() { + id_card_list = new LinkedList(); + load_id_cards(); + } +} + +#endif diff --git a/src/moonshot-keyring-store.vala b/src/moonshot-keyring-store-gnome.vala similarity index 78% rename from src/moonshot-keyring-store.vala rename to src/moonshot-keyring-store-gnome.vala index 7ae0d22..0e0ff5c 100644 --- a/src/moonshot-keyring-store.vala +++ b/src/moonshot-keyring-store-gnome.vala @@ -1,5 +1,6 @@ /* - * Copyright (c) 2011-2016, JANET(UK) +* Copyright (C) 2018 Sam Hartman +* Copyright (c) 2011-2016, JANET(UK) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,72 +30,28 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -using Gee; #if GNOME_KEYRING -public class KeyringStore : Object, IIdentityCardStore { - static MoonshotLogger logger = get_logger("KeyringStore"); - private LinkedList id_card_list; - private const string keyring_store_attribute = "Moonshot"; - private const string keyring_store_version = "1.0"; +using Gee; +public class KeyringStore : KeyringStoreBase { private const GnomeKeyring.ItemType item_type = GnomeKeyring.ItemType.GENERIC_SECRET; - public void add_card(IdCard card) { - logger.trace("add_card: Adding card '%s' with services: '%s'" - .printf(card.display_name, card.get_services_string("; "))); - - id_card_list.add(card); - store_id_cards(); - } - - public IdCard? update_card(IdCard card) { - logger.trace("update_card"); - - id_card_list.remove(card); - id_card_list.add(card); - - store_id_cards(); - foreach (IdCard idcard in id_card_list) { - if (idcard.display_name == card.display_name) { - return idcard; - } - } - - logger.error(@"update_card: card '$(card.display_name)' was not found after re-loading!"); - return null; - } - - public bool remove_card(IdCard card) { - bool retval = id_card_list.remove(card); - if (retval) - store_id_cards(); - return retval; - } - - public IIdentityCardStore.StoreType get_store_type() { - return IIdentityCardStore.StoreType.KEYRING; - } - - public LinkedList get_card_list() { - return id_card_list; - } - /* clear all keyring-stored ids (in preparation to store current list) */ - private void clear_keyring() { - GnomeKeyring.AttributeList match = new GnomeKeyring.AttributeList(); - match.append_string(keyring_store_attribute, keyring_store_version); - GLib.List items; - GnomeKeyring.find_items_sync(item_type, match, out items); - foreach(unowned GnomeKeyring.Found entry in items) { - GnomeKeyring.Result result = GnomeKeyring.item_delete_sync(null, entry.item_id); - if (result != GnomeKeyring.Result.OK) { - stdout.printf("GnomeKeyring.item_delete_sync() failed. result: %d", result); - } - } + protected override void clear_keyring() { + GnomeKeyring.AttributeList match = new GnomeKeyring.AttributeList(); + match.append_string(keyring_store_attribute, keyring_store_version); + GLib.List items; + GnomeKeyring.find_items_sync(item_type, match, out items); + foreach(unowned GnomeKeyring.Found entry in items) { + GnomeKeyring.Result result = GnomeKeyring.item_delete_sync(null, entry.item_id); + if (result != GnomeKeyring.Result.OK) { + stdout.printf("GnomeKeyring.item_delete_sync() failed. result: %d", result); + } + } } - - private void load_id_cards() { + + protected override void load_id_cards() { id_card_list.clear(); GnomeKeyring.AttributeList match = new GnomeKeyring.AttributeList(); @@ -181,7 +138,7 @@ public class KeyringStore : Object, IIdentityCardStore { } } - internal void store_id_cards() { + internal override void store_id_cards() { logger.trace("store_id_cards"); clear_keyring(); foreach (IdCard id_card in this.id_card_list) { @@ -224,10 +181,6 @@ public class KeyringStore : Object, IIdentityCardStore { load_id_cards(); } - public KeyringStore() { - id_card_list = new LinkedList(); - load_id_cards(); - } } #endif -- 2.1.4