xca/widgets/PwDialog.cpp
Christian Hohnstaedt b622e64209 consolidate Password and Pin input dialogs
change storage type of passwords from char[] to QByteArray
Create PwDialog class and drop passWrite and passRead
Create Passwd class derived from QBytearray
move PKCS12 password input to PwDialog
2011-04-30 07:53:26 +02:00

132 lines
2.6 KiB
C++

/* vi: set sw=4 ts=4:
*
* Copyright (C) 2011 Christian Hohnstaedt.
*
* All rights reserved.
*/
#include "PwDialog.h"
#include "lib/base.h"
#include "lib/Passwd.h"
#include "widgets/MainWindow.h"
#include <QtGui/QLabel>
#include <QtGui/QMessageBox>
static int hex2bin(QString &x, Passwd *final)
{
bool ok = false;
int len = x.length();
if (len % 2)
return -1;
len /= 2;
final->clear();
for (int i=0; i<len; i++) {
final->append((x.mid(i*2, 2).toInt(&ok, 16)) & 0xff);
if (!ok)
return -1;
}
return len;
}
int PwDialog::execute(pass_info *p, Passwd *passwd, bool write, bool abort)
{
PwDialog *dlg;
int ret;
dlg = new PwDialog(p, write);
if (abort)
dlg->addAbortButton();
ret = dlg->exec();
*passwd = dlg->getPass();
delete dlg;
return ret;
}
int PwDialog::pwCallback(char *buf, int size, int rwflag, void *userdata)
{
int ret;
pass_info *p = (pass_info *)userdata;
PwDialog *dlg = new PwDialog(p, rwflag);
ret = dlg->exec();
QByteArray pw = dlg->getPass();
size = MIN(size, pw.size());
memcpy(buf, pw.constData(), size);
delete dlg;
return ret == 1 ? size : 0;
}
PwDialog::PwDialog(pass_info *p, bool write)
:QDialog(p->getWidget())
{
pi = p;
setupUi(this);
setWindowTitle(XCA_TITLE);
image->setPixmap(pi->getImage());
description->setText(pi->getDescription());
title->setText(pi->getType());
setWindowTitle(pi->getTitle());
if (pi->getType() != "PIN")
takeHex->hide();
setRW(write);
}
void PwDialog::setRW(bool write)
{
wrDialog = write;
if (write) {
label->setText(pi->getType());
repeatLabel->setText(tr("Repeat %1").arg(pi->getType()));
label->show();
passA->show();
} else {
repeatLabel->setText(pi->getType());
label->hide();
passA->hide();
}
}
void PwDialog::accept()
{
if (wrDialog && (passA->text() != passB->text())) {
QMessageBox::warning(this, XCA_TITLE,
tr("%1 missmatch").arg(pi->getType()));
return;
}
QString pw = passB->text();
if (takeHex->isChecked()) {
int ret = hex2bin(pw, &final);
if (ret == -1) {
QMessageBox::warning(this, XCA_TITLE, tr("Hex password must only contain the characters '0' - '9' and 'a' - 'f' and it must consist of an even number of characters"));
return;
}
} else {
final = pw.toAscii();
}
QDialog::accept();
}
void PwDialog::buttonPress(QAbstractButton *but)
{
switch (buttonBox->standardButton(but)) {
case QDialogButtonBox::Ok:
accept();
break;
case QDialogButtonBox::Cancel:
reject();
break;
case QDialogButtonBox::Abort:
default:
done(2);
}
}
void PwDialog::addAbortButton()
{
buttonBox->addButton(tr("E&xit"), QDialogButtonBox::ResetRole);
}