/* vi: set sw=4 ts=4: * * Copyright (C) 2014 Christian Hohnstaedt. * * All rights reserved. */ #include "PwDialog.h" #include "lib/func.h" #include "lib/base.h" #include "lib/Passwd.h" #include "widgets/MainWindow.h" #include #include #include 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; iappend((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) { if (IS_GUI_APP) { PwDialog *dlg = new PwDialog(p, write); if (abort) dlg->addAbortButton(); int ret = dlg->exec(); *passwd = dlg->getPass(); delete dlg; return ret; } printf(COL_CYAN "%s" COL_LRED "\n%s:" COL_RESET, CCHAR(p->getDescription()), CCHAR(tr("Password"))); *passwd = readPass(); return 1; } int PwDialog::pwCallback(char *buf, int size, int rwflag, void *userdata) { Passwd passwd; pass_info *p = static_cast(userdata); int ret = PwDialog::execute(p, &passwd, rwflag, false); size = MIN(size, passwd.size()); memcpy(buf, passwd.constData(), size); return ret == 1 ? size : 0; } PwDialog::PwDialog(pass_info *p, bool write) :QDialog(p->getWidget()) { pi = p; setupUi(this); image->setPixmap(QPixmap(pi->getImage())); description->setText(pi->getDescription()); title->setText(pi->getType()); if (!pi->getTitle().isEmpty()) setWindowTitle(pi->getTitle()); else setWindowTitle(XCA_TITLE); 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())) { XCA_WARN(tr("%1 mismatch").arg(pi->getType())); return; } QString pw = passB->text(); if (takeHex->isChecked()) { int ret = hex2bin(pw, &final); if (ret == -1) { XCA_WARN(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.toLatin1(); } 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); }