xca/KeyDB.cpp
2002-02-20 23:18:21 +00:00

182 lines
3.6 KiB
C++

#include "KeyDB.h"
#include <stdio.h>
KeyDB::KeyDB(DbEnv *dbe, QString DBfile, QListBox *list,
QObject *parent , const char *name = 0)
:QObject( parent, name)
{
listView = list;
dbenv = dbe;
data = new Db(dbe, 0);
cerr << "DB:" << DBfile <<"\n";//
int x;
if ( x = data->open(DBfile,"keydb",DB_BTREE, DB_CREATE,0600))
data->err(x,"DB open");
//cerr << "before Update\n";
updateView();
//cerr << "after Update\n";
}
KeyDB::~KeyDB()
{
data->close(0);
// dbenv->close(0);
}
bool KeyDB::updateView()
{
listView->clear();
Dbc *cursor;
if (int x = data->cursor(NULL, &cursor, 0))
data->err(x,"DB new Cursor");
Dbt *key = new Dbt();
Dbt *data = new Dbt();
QString desc;
//cerr << "before While loop\n";
while (!cursor->get(key, data, DB_NEXT)) {
//cerr << "in loop\n";
desc = (char *)key->get_data();
listView->insertItem(desc);
}
}
bool KeyDB::insertKey(RSAkey *key)
{
QString desc = key->description();
QString orig = desc;
int size=0;
unsigned char *p;
p = key->getKey(&size);
int cnt=0;
int x = DB_KEYEXIST;
while (x == DB_KEYEXIST) {
Dbt k((void *)desc.latin1(), desc.length()+1);
Dbt d((void *)p, size);
cerr << "Size: " << d.get_size() << "\n";
if (x = data->put(NULL, &k, &d, DB_NOOVERWRITE)) {
data->err(x,"DB Error put");
desc = orig + "_" + QString::number(++cnt);
}
}
if (x != DB_KEYEXIST && x != 0) {
data->err(x,"DB Error put TINE");
//return false;
}
OPENSSL_free(p);
updateView();
key->setDescription(desc);
return true;
}
bool KeyDB::deleteKey(RSAkey *key)
{
QString desc = key->description();
Dbt k((void *)desc.latin1(), desc.length()+1);
int x = data->del(NULL, &k, 0);
updateView();
if (x){
data->err(x,"DB Error del");
return false;
}
return true;
}
bool KeyDB::updateKey(RSAkey *key, QString desc)
{
if (deleteKey(key)){
key->setDescription(desc);
return insertKey(key);
}
return true;
}
RSAkey *KeyDB::getSelectedKey(QString desc)
{
if (desc.isNull()) return NULL;
unsigned char *p;
RSAkey *targetKey = NULL;
Dbt k((void *)desc.latin1(), desc.length()+1);
Dbt d((void *)p, 0);
int x = data->get(NULL, &k, &d, 0);
p = (unsigned char *)d.get_data();
int size = d.get_size();
if (x) data->err(x,"DB Error get");
else targetKey = new RSAkey(p, size);
targetKey->setDescription(desc);
return targetKey;
}
RSAkey *KeyDB::getSelectedKey()
{
QString desc = listView->currentText();
return getSelectedKey(desc);
}
QStringList KeyDB::getPrivateDesc()
{
unsigned char *p;
Dbc *cursor;
if (int x = data->cursor(NULL, &cursor, 0))
data->err(x,"DB new Cursor");
Dbt *k = new Dbt();
Dbt *d = new Dbt();
QString desc;
QStringList x;
RSAkey *key;
//cerr << "before While loop\n";
while (!cursor->get(k, d, DB_NEXT)) {
//cerr << "in loop\n";
desc = (char *)k->get_data();
p = (unsigned char *)d->get_data();
int size = d->get_size();
key = new RSAkey(p, size);
if (!key->onlyPubKey) {
x.append(desc);
cerr << desc <<endl;
}
delete(key);
}
delete (k);
delete (d);
return x;
}
RSAkey *KeyDB::findPublicKey(RSAkey *refkey)
{
unsigned char *p;
Dbc *cursor;
if (int x = data->cursor(NULL, &cursor, 0))
data->err(x,"DB new Cursor");
Dbt *k = new Dbt();
Dbt *d = new Dbt();
QString desc;
RSAkey *key;
bool found = false;
while (!cursor->get(k, d, DB_NEXT)) {
desc = (char *)k->get_data();
p = (unsigned char *)d->get_data();
int size = d->get_size();
key = new RSAkey(p, size);
key->setDescription(desc);
if (refkey->comparePublic(key)) {
delete (k);
delete (d);
return key;
}
delete(key);
}
delete (k);
delete (d);
return NULL;
}