390 lines
11 KiB
C++
390 lines
11 KiB
C++
|
#include<stdio.h>
|
||
|
#include <kapp.h>
|
||
|
#include <kcmdlineargs.h>
|
||
|
#include<kwallet.h>
|
||
|
#include <dcopclient.h>
|
||
|
|
||
|
|
||
|
using namespace KWallet;
|
||
|
|
||
|
#include "kwallets_rw.h"
|
||
|
#include "kwallets_rw.moc"
|
||
|
//#include "mytest.h"
|
||
|
|
||
|
|
||
|
// char *applName="dcopifacedemo";
|
||
|
char *applName="casaconsole";
|
||
|
QStringList walletList;
|
||
|
|
||
|
DCOPDemoWidget *win = new DCOPDemoWidget();
|
||
|
|
||
|
DCOPDemoWidget::DCOPDemoWidget()
|
||
|
{
|
||
|
if ( !kapp->dcopClient()->isRegistered() ) {
|
||
|
kapp->dcopClient()->registerAs( "casaconsole" );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
DCOPDemoWidget::~DCOPDemoWidget()
|
||
|
{
|
||
|
|
||
|
for ( QStringList::Iterator walletIter = walletList.begin(); walletIter != walletList.end(); ++walletIter )
|
||
|
{
|
||
|
QString walletName = (*walletIter);
|
||
|
Wallet::disconnectApplication(walletName,applName);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
int DCOPDemoWidget::ReadKey(Wallet *wallet,QString key, QByteArray *secretVal)
|
||
|
{
|
||
|
|
||
|
// Read the secret from the entry
|
||
|
QByteArray value;
|
||
|
|
||
|
if (wallet->readEntry(key, value)==0)
|
||
|
{
|
||
|
|
||
|
if (value)
|
||
|
{
|
||
|
|
||
|
*secretVal = value;
|
||
|
QDataStream convert(*secretVal, IO_ReadOnly);
|
||
|
|
||
|
|
||
|
if (wallet->entryType(key) == 1 )
|
||
|
{
|
||
|
|
||
|
// Convert the ByteArray to QString
|
||
|
QString passwd;
|
||
|
convert >> passwd;
|
||
|
|
||
|
} else if (wallet->entryType(key) == 3)
|
||
|
{
|
||
|
|
||
|
// If the entry is of type "map"
|
||
|
// Convert the ByteArray to QMap
|
||
|
QMap<QString,QString> mapSecret;
|
||
|
convert >> mapSecret;
|
||
|
|
||
|
// Iterate through each map entry.
|
||
|
QMap<QString,QString>::Iterator mapIter;
|
||
|
QString tempSecret = QString::fromLatin1("");
|
||
|
|
||
|
for ( mapIter = mapSecret.begin(); mapIter != mapSecret.end(); ++mapIter )
|
||
|
{
|
||
|
// This logic has to be improved
|
||
|
tempSecret.append(mapIter.key().latin1());
|
||
|
tempSecret.append(":");
|
||
|
tempSecret.append(mapIter.data().latin1());
|
||
|
|
||
|
if ((++mapIter) != mapSecret.end())
|
||
|
tempSecret.append(";");
|
||
|
|
||
|
--mapIter;
|
||
|
}
|
||
|
|
||
|
// Convert the QString to QByteArray
|
||
|
QDataStream stream(*secretVal, IO_WriteOnly);
|
||
|
stream << tempSecret ;
|
||
|
|
||
|
}
|
||
|
|
||
|
} else
|
||
|
{
|
||
|
printf("Could not read the entry..inner IF\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
} else
|
||
|
{
|
||
|
printf("Could not read the entry Inside wallet->readkey\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
extern "C"
|
||
|
{
|
||
|
struct EnumSecretList *tempEnumSecrets = NULL;
|
||
|
|
||
|
//void MyTest(struct EnumSecretList *enumWalletSecrets)
|
||
|
void Aggregate(struct EnumSecretList *enumWalletSecrets)
|
||
|
{
|
||
|
|
||
|
printf("inside natiove agg");
|
||
|
int retVal = 0;
|
||
|
// struct EnumSecretList *tempEnumSecrets = NULL;
|
||
|
retVal = win->ReadAllWalletSecrets(&tempEnumSecrets);
|
||
|
|
||
|
struct EnumSecretList *iter = tempEnumSecrets;
|
||
|
//struct EnumSecretList *head = tempEnumSecrets;
|
||
|
/*
|
||
|
if (iter == NULL)
|
||
|
{
|
||
|
|
||
|
printf("Native has given NULLLL\n");
|
||
|
enumWalletSecrets = NULL;
|
||
|
return;
|
||
|
}
|
||
|
*/
|
||
|
while (iter != NULL)
|
||
|
{
|
||
|
|
||
|
/*
|
||
|
printf("\n\n**Wallet Name : %s\n",iter->walletName);
|
||
|
printf("\t**Folder Name : %s\n",iter->folderName);
|
||
|
printf("\t\t**Secret Type : %d\n",iter->entryType);
|
||
|
printf("\t\t\t**Secret Value : %s\n",iter->secretVal);
|
||
|
*/
|
||
|
|
||
|
enumWalletSecrets->walletName = iter->walletName;
|
||
|
enumWalletSecrets->folderName = iter->folderName;
|
||
|
enumWalletSecrets->secretVal = iter->secretVal;
|
||
|
enumWalletSecrets->entryType = iter->entryType;
|
||
|
enumWalletSecrets->next = iter->next;
|
||
|
|
||
|
iter = iter->next;
|
||
|
if (iter != NULL)
|
||
|
{
|
||
|
enumWalletSecrets = enumWalletSecrets->next ;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
enumWalletSecrets = NULL;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
/*
|
||
|
// Free the list
|
||
|
struct EnumSecretList *temp;
|
||
|
while (head != NULL)
|
||
|
{
|
||
|
free(head->walletName);
|
||
|
free(head->folderName);
|
||
|
free(head->secretVal);
|
||
|
//free(head->entryType);
|
||
|
temp = head->next;
|
||
|
free(head);
|
||
|
head = temp;
|
||
|
}
|
||
|
|
||
|
|
||
|
*/
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void FreeList()
|
||
|
{
|
||
|
|
||
|
struct EnumSecretList *head = tempEnumSecrets;
|
||
|
|
||
|
// Free the list
|
||
|
struct EnumSecretList *temp;
|
||
|
while (head != NULL)
|
||
|
{
|
||
|
free(head->walletName);
|
||
|
free(head->folderName);
|
||
|
free(head->secretVal);
|
||
|
//free(head->entryType);
|
||
|
temp = head->next;
|
||
|
free(head);
|
||
|
head = temp;
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
int DCOPDemoWidget::ReadAllWalletSecrets(struct EnumSecretList **enumWalletSecrets)
|
||
|
{
|
||
|
|
||
|
walletList = Wallet::walletList();
|
||
|
for ( QStringList::Iterator walletIter = walletList.begin(); walletIter != walletList.end(); ++walletIter )
|
||
|
{
|
||
|
QString walletName = (*walletIter);
|
||
|
// printf("The wallet name is %s\n",(*walletIter).latin1());
|
||
|
|
||
|
|
||
|
// Open the wallet
|
||
|
Wallet *wallet = NULL;
|
||
|
wallet = Wallet::openWallet(walletName,0,Wallet::Synchronous);
|
||
|
|
||
|
if (wallet == NULL)
|
||
|
{
|
||
|
printf("Could not open the wallet\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// Get the folder list of the wallet
|
||
|
QStringList folderList = wallet->folderList();
|
||
|
|
||
|
for ( QStringList::Iterator folderIter = folderList.begin(); folderIter != folderList.end(); ++folderIter)
|
||
|
{
|
||
|
|
||
|
// printf("\t%s\n",(*folderIter).latin1());
|
||
|
QString folderName = (*folderIter);
|
||
|
|
||
|
// Set the current folder
|
||
|
if (!(wallet->setFolder(folderName)))
|
||
|
{
|
||
|
printf("Could not set the folder\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// Get the list of entries in the folder
|
||
|
QStringList entryList = wallet->entryList();
|
||
|
|
||
|
for ( QStringList::Iterator entryIter = entryList.begin(); entryIter != entryList.end(); ++entryIter)
|
||
|
{
|
||
|
//printf("Entry Name : \t\t%s\n",(*entryIter).latin1());
|
||
|
|
||
|
// Read the secret from the entry
|
||
|
QString key = (*entryIter);
|
||
|
|
||
|
QByteArray *secretVal = new QByteArray();
|
||
|
if (ReadKey(wallet,key,secretVal) != 0)
|
||
|
{
|
||
|
printf("Could not read \"%s\"\n",key.latin1());
|
||
|
break;
|
||
|
//FIXME
|
||
|
}
|
||
|
|
||
|
struct EnumSecretList *tempWalletSecrets = (struct EnumSecretList*)malloc(sizeof(struct EnumSecretList));
|
||
|
|
||
|
if (tempWalletSecrets == NULL) {
|
||
|
printf("Memory Allocation failure\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
tempWalletSecrets->walletName = (char*)malloc(512);
|
||
|
|
||
|
if (tempWalletSecrets->walletName == NULL)
|
||
|
{
|
||
|
printf("Memory Allocation failure\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
//printf("Wallet Name is %s\n",walletName.latin1());
|
||
|
strcpy(tempWalletSecrets->walletName, walletName.latin1());
|
||
|
tempWalletSecrets->folderName = (char*)malloc(512);
|
||
|
|
||
|
if (tempWalletSecrets->folderName == NULL)
|
||
|
{
|
||
|
printf("Memory Allocation failure\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// printf("Folder Name is %s\n",folderName.latin1());
|
||
|
|
||
|
strcpy(tempWalletSecrets->folderName, folderName.latin1());
|
||
|
tempWalletSecrets->entryType = wallet->entryType(key);
|
||
|
// printf("EntryType is %d\n",wallet->entryType(key));
|
||
|
|
||
|
|
||
|
if (*enumWalletSecrets == NULL)
|
||
|
{
|
||
|
*enumWalletSecrets = tempWalletSecrets;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
struct EnumSecretList *iter;
|
||
|
for(iter=*enumWalletSecrets; iter->next!=NULL; iter=iter->next);
|
||
|
iter->next = tempWalletSecrets;
|
||
|
}
|
||
|
|
||
|
tempWalletSecrets->next = NULL;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
QDataStream convert(*secretVal, IO_ReadOnly);
|
||
|
QString passwd;
|
||
|
convert >> passwd;
|
||
|
tempWalletSecrets->secretVal = (char*)malloc(512);
|
||
|
|
||
|
if (tempWalletSecrets->secretVal == NULL)
|
||
|
{
|
||
|
printf("Memory Allocation failure\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
strcpy(tempWalletSecrets->secretVal,key.latin1());
|
||
|
//printf("After strcpy - 1 - key is %s\n",key.latin1());
|
||
|
strcat(tempWalletSecrets->secretVal,"=");
|
||
|
//printf("After strcat = \n");
|
||
|
if(passwd)
|
||
|
{
|
||
|
//printf("Passwd is %s\n",passwd.latin1());
|
||
|
strcat(tempWalletSecrets->secretVal,passwd.latin1());
|
||
|
}
|
||
|
|
||
|
// Free memory
|
||
|
free(secretVal);
|
||
|
// printf("After free\n");
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
// Print all the secrets
|
||
|
/*
|
||
|
struct EnumSecretList *iter = *enumWalletSecrets;
|
||
|
while (iter != NULL)
|
||
|
{
|
||
|
printf("\n\nWallet Name : %s\n",iter->walletName);
|
||
|
printf("\tFolder Name : %s\n",iter->folderName);
|
||
|
printf("\t\tSecret Type : %d\n",iter->entryType);
|
||
|
printf("\t\t\t Secret Value : %s\n",iter->secretVal);
|
||
|
iter = iter->next;
|
||
|
}
|
||
|
|
||
|
*/
|
||
|
|
||
|
}
|
||
|
|
||
|
return(0);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|