/*********************************************************************** * * Copyright (C) 2005-2006 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; version 2.1 * of the License. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * To contact Novell about this file by physical or electronic mail, * you may find current contact information at www.novell.com. * ***********************************************************************/ #include "ad_gk.h" GMainLoop *loop = NULL; static void OperationCompletedCb (GnomeKeyringResult result, gpointer data) { OperationCompleted *cbData = (OperationCompleted *)data; g_print ("ad_gk.c : Operation %s Completed %d\n", cbData->OperationName, result); cbData->result = result; g_main_loop_quit (loop); } static void CreateItemCb (GnomeKeyringResult result, guint32 id, gpointer data) { OperationCompleted *cbData = (OperationCompleted *)data; g_print ("ad_gk.c : CreateItemCb : created item: res: %d id: %d\n", result, id); if (result != GNOME_KEYRING_RESULT_OK) { g_print ("ad_gk.c : CreateItemCb : Unable to create item : %d\n", result); } cbData->result = result; g_main_loop_quit (loop); } int UnlockRing(char *keyring, char *password) { // unlock the named keyring OperationCompleted cbData; cbData.OperationName = "Unlock Ring"; loop = g_main_loop_new (NULL, FALSE); gnome_keyring_unlock(keyring, password, OperationCompletedCb, &cbData, NULL); g_main_loop_run (loop); return cbData.result; } static int CreateItemInKeyring(char *keyring, int32_t itemType, char *display_name, char *secret, Attribute **attrs, int attrcnt) { GnomeKeyringAttributeList *attributes; GnomeKeyringAttribute attribute; OperationCompleted cbData; int i; //printf("ad.gk.c : CreateItemInKeyring : Keyring %s, itemType %d displayname %s, secret %s \n",keyring,itemType, display_name,secret); cbData.OperationName = "Create Item"; loop = g_main_loop_new (NULL, FALSE); attributes = gnome_keyring_attribute_list_new (); for (i=0; i< attrcnt; i++) { //printf("as.gk.c : CreateItemInKeyring : In key %s \n", attrs[i]->key); attribute.name = g_strdup (attrs[i]->key); attribute.type = GNOME_KEYRING_ATTRIBUTE_TYPE_STRING; attribute.value.string = g_strdup (attrs[i]->value); g_array_append_val (attributes, attribute); } gnome_keyring_item_create(keyring,itemType,display_name,attributes,secret,FALSE,CreateItemCb,&cbData,NULL); gnome_keyring_attribute_list_free (attributes); g_main_loop_run (loop); return cbData.result; } static int CreateKeyring(char *keyring) { OperationCompleted cbData; cbData.OperationName = "Create Keyring"; loop = g_main_loop_new (NULL, FALSE); gnome_keyring_create(keyring,NULL,OperationCompletedCb,&cbData,NULL); g_main_loop_run(loop); return cbData.result; } void ListKeyringsCb (GnomeKeyringResult result, GList *keyrings, gpointer data) { GList *l = NULL; char *name = NULL; GList **retList = data; GetKeyringsCbData *cbData = data; GMainLoop *loop = cbData->loop; retList = cbData->keyringList; *retList = NULL; if (result != GNOME_KEYRING_RESULT_OK) { g_print ("Unable to get keyring list - %d\n", result); } else { for (l = keyrings; l != NULL; l = l->next) { name = l->data; *retList = g_list_append (*retList, g_strdup (name)); } } g_main_loop_quit (loop); } void KeyringGetInfoCb(GnomeKeyringResult result, GnomeKeyringInfo *info, gpointer data) { GetKeyringInfoCbData *cbData = data; KeyringInfo *retInfo = cbData->info; if (result != GNOME_KEYRING_RESULT_OK) { g_print ("Unable to get keyring info %d\n", result); } else { retInfo->lockOnIdle = gnome_keyring_info_get_lock_on_idle(info); retInfo->lockTimeout = gnome_keyring_info_get_lock_timeout(info); retInfo->mTime = gnome_keyring_info_get_mtime(info); retInfo->cTime = gnome_keyring_info_get_ctime(info); retInfo->isLocked = gnome_keyring_info_get_is_locked(info); } g_main_loop_quit (cbData->loop); } void ListItemCb( GnomeKeyringResult result, GList *list, gpointer data) { GList **retList; GetItemsCbData *cbData = data; retList = cbData->itemList; *retList = NULL; if (result != GNOME_KEYRING_RESULT_OK) { g_print ("Unable to get list of items : %d\n", result); } else { *retList = g_list_copy (list); } g_main_loop_quit (cbData->loop); } void ItemGetInfoCb( GnomeKeyringResult result, GnomeKeyringItemInfo *info, gpointer data) { GetItemInfoCbData *cbData = data; ItemInfo *itemInfo = cbData->info; if (result != GNOME_KEYRING_RESULT_OK) { g_print ("Unable to get Item info: %d\n", result); } else { itemInfo->itemType = gnome_keyring_item_info_get_type(info); strcpy(itemInfo->displayName,gnome_keyring_item_info_get_display_name(info)); strcpy(itemInfo->secret,gnome_keyring_item_info_get_secret(info)); itemInfo->mTime = gnome_keyring_item_info_get_mtime(info); itemInfo->cTime = gnome_keyring_item_info_get_ctime(info); } g_main_loop_quit (cbData->loop); } void ItemGetAttributesCb(GnomeKeyringResult result, GnomeKeyringAttributeList *attributes, gpointer data) { GnomeKeyringAttribute *attrList = NULL; int i = 0; GetAttributeListCbData *cbData = data; Attribute *attr = NULL; GList **retList; retList = cbData->attrList; *retList = NULL; if( result != GNOME_KEYRING_RESULT_OK ) { g_print("Unable to get the attributes of item\n"); } else { attrList = (GnomeKeyringAttribute*)(attributes->data); //GArray has len and data for(i = 0; i < attributes->len; i++ ) { if(attrList[i].type == GNOME_KEYRING_ATTRIBUTE_TYPE_STRING) { attr = (Attribute*)malloc(sizeof(Attribute)); if( NULL != attr ) { memset(attr,0,sizeof(Attribute)); attr->type = 0; attr->key = (char*)malloc(KEY_SIZE); if(attr->key != NULL) strcpy(attr->key,attrList[i].name); attr->value = (char*)malloc(VAL_SIZE); if(attr->value != NULL) strcpy(attr->value,attrList[i].value.string); } } else if(attrList[i].type == GNOME_KEYRING_ATTRIBUTE_TYPE_UINT32) { attr = (Attribute*)malloc(sizeof(Attribute)); if( NULL != attr ) { memset(attr,0,sizeof(Attribute)); attr->type = 0; attr->key = (char*)malloc(KEY_SIZE); if(attr->key != NULL) strcpy(attr->key,attrList[i].name); attr->value = (char*)malloc(VAL_SIZE); if(attr->value != NULL) sprintf(attr->value,"%d",attrList[i].value.integer); } } *retList = g_list_append (*retList, attr); } } g_main_loop_quit (cbData->loop); } int GetKeyrings(GList **keyringList) { GList *l = NULL; GetKeyringsCbData cbData; cbData.loop = g_main_loop_new (NULL, FALSE); cbData.keyringList = keyringList; gnome_keyring_list_keyring_names(ListKeyringsCb,&cbData,NULL); g_main_loop_run(cbData.loop); return SUCCESS; } int GetKeyringInfo(char *keyring,KeyringInfo *info) { GetKeyringInfoCbData cbData; cbData.loop = g_main_loop_new (NULL, FALSE); cbData.info = info; gnome_keyring_get_info(keyring, KeyringGetInfoCb,&cbData, NULL); g_main_loop_run (cbData.loop); return SUCCESS; } int GetItems(char *keyring, GList **itemList) { GList *l = NULL; gint itemId; GetItemsCbData cbData; cbData.loop = g_main_loop_new (NULL, FALSE); cbData.itemList = itemList; gnome_keyring_list_item_ids(keyring, ListItemCb, &cbData, NULL); g_main_loop_run (cbData.loop); return SUCCESS; } int GetItemInfo(char *keyring, int itemId, ItemInfo *info) { GetItemInfoCbData cbData; cbData.loop = g_main_loop_new (NULL, FALSE); cbData.info = info; gnome_keyring_item_get_info (keyring,itemId, ItemGetInfoCb, &cbData, NULL); g_main_loop_run (cbData.loop); return SUCCESS; } int GetAttributeList(char *keyring, int itemId, GList **attrList) { int i = 0; GetAttributeListCbData cbData; cbData.loop = g_main_loop_new (NULL, FALSE); cbData.attrList = attrList; gnome_keyring_item_get_attributes (keyring, itemId, ItemGetAttributesCb, &cbData, NULL); g_main_loop_run (cbData.loop); return SUCCESS; } int FreeAttributeList(GList *attrList) { GList *l; Attribute *attr = NULL; for(l = attrList; l != NULL; l = l->next) { attr = (Attribute*)(l->data); if(attr->key) { free(attr->key); } if(attr->value) { free(attr->value); } } g_list_free(attrList); return SUCCESS; } int SetItemAttributes (char *keyring, guint32 itemid, Attribute **attrs, int length) { GnomeKeyringAttributeList *attributes; GnomeKeyringAttribute attribute; OperationCompleted cbData; int i; //printf("ad_gk.c : In SetItemAttributes\n"); //printf("ad_gk.c : Keyring %s, itemid %d\n",keyring,itemid); cbData.OperationName = "Set Item Attributes"; loop = g_main_loop_new (NULL, FALSE); attributes = gnome_keyring_attribute_list_new (); for (i=0; i< length; i++) { //printf("ad_gk.c : In key %s \n", attrs[i]->key); attribute.name = g_strdup (attrs[i]->key); attribute.type = GNOME_KEYRING_ATTRIBUTE_TYPE_STRING; attribute.value.string = g_strdup (attrs[i]->value); g_array_append_val (attributes, attribute); } gnome_keyring_item_set_attributes (keyring, itemid, attributes, OperationCompletedCb, &cbData, NULL); gnome_keyring_attribute_list_free (attributes); g_main_loop_run (loop); return cbData.result; } int RemoveItem (char *keyring, guint32 itemid) { OperationCompleted cbData; loop = g_main_loop_new (NULL, FALSE); cbData.OperationName = "Remove Item"; gnome_keyring_item_delete (keyring, itemid, OperationCompletedCb, &cbData, NULL); g_main_loop_run (loop); return cbData.result; } int SetPassword (char *keyring, guint32 itemid, char *secret) { GnomeKeyringItemInfo *info; OperationCompleted cbData; loop = g_main_loop_new (NULL, FALSE); cbData.OperationName = "Set Item Secret"; info = gnome_keyring_item_info_new (); gnome_keyring_item_info_set_secret (info, secret); gnome_keyring_item_set_info (keyring, itemid, info, OperationCompletedCb, &cbData, NULL); gnome_keyring_item_info_free (info); g_main_loop_run (loop); return cbData.result; } int CreateItem(char *keyring, int32_t itemType, char *display_name, char *secret, Attribute **attrs, int attrcnt) { int ret; ret = CreateItemInKeyring(keyring,itemType,display_name,secret,attrs,attrcnt); if (ret == 4) { ret = CreateKeyring(keyring); if (ret != 0) { return GNOME_KEYRING_RESULT_CANNOT_CREATE_KEYRING ; } ret = CreateItemInKeyring(keyring,itemType,display_name ,secret,attrs,attrcnt); return ret; } return ret; }