Disable Public key import when displaying key of cert

Importing the displayed public key of a certificate during
certificate import resulted in a double free.

The "import" flag of the key-details can now forcefully
disable the import button.

Fixing it was way more complex than simply disabling it.

Also add sanity checks for pointers that are not our childs
when creating the QModelIndex
This commit is contained in:
Christian Hohnstaedt 2023-10-08 16:17:22 +02:00
parent 993da2d474
commit fc0191a512
7 changed files with 16 additions and 12 deletions

View File

@ -400,7 +400,7 @@ QModelIndex db_base::index(int row, int column,
QModelIndex db_base::index(pki_base *pki) const
{
if (!pki || pki == treeItem)
if (!pki || pki == treeItem || rootItem->indexOf(pki) == -1)
return QModelIndex();
return createIndex(rownumber(pki), 0, pki);
}

View File

@ -112,6 +112,8 @@ QList<pki_x509 *> db_x509::getAllIssuers()
void db_x509::remFromCont(const QModelIndex &idx)
{
if (!idx.isValid())
return;
db_crl *crls = Database.model<db_crl>();
db_x509super::remFromCont(idx);
pki_base *pki = fromIndex(idx);

View File

@ -252,8 +252,7 @@ int pki_base::childCount() const
int pki_base::indexOf(const pki_base *child) const
{
int ret = childItems.indexOf(const_cast<pki_base *>(child));
return ret >= 0 ? ret : 0;
return childItems.indexOf(const_cast<pki_base *>(child));
}
void pki_base::takeChild(pki_base *pki)

View File

@ -269,7 +269,7 @@ void CertDetail::itemChanged(pki_base *pki)
void CertDetail::showPubKey()
{
KeyDetail::showKey(this, myPubKey, !keySqlId.isValid());
KeyDetail::showKey(this, myPubKey, false);
}
void CertDetail::showIssuer()

View File

@ -237,11 +237,12 @@ pki_base *ImportMulti::import(const QModelIndex &idx)
pki_base *ImportMulti::import(pki_base *pki)
{
QModelIndex idx = mcont->index(pki);
if (!pki || pki->getSqlItemId().isValid())
return NULL;
mcont->remFromCont(idx);
QModelIndex idx = mcont->index(pki);
if (idx.isValid())
mcont->remFromCont(idx);
if (!Database.isOpen()) {
try {

View File

@ -72,12 +72,13 @@ void KeyDetail::setupFingerprints(pki_key *key)
}
}
void KeyDetail::setKey(pki_key *key)
void KeyDetail::setKey(pki_key *key, bool import)
{
keySqlId = key->getSqlItemId();
descr->setText(key->getIntName());
keyLength->setText(key->length());
connect_pki(key);
if (import)
connect_pki(key);
keyPrivEx->disableToolTip();
if (!key->isToken())
@ -151,12 +152,13 @@ void KeyDetail::itemChanged(pki_base *pki)
descr->setText(pki->getIntName());
}
void KeyDetail::showKey(QWidget *parent, pki_key *key, bool ro)
void KeyDetail::showKey(QWidget *parent, pki_key *key, bool import)
{
if (!key)
return;
KeyDetail *dlg = new KeyDetail(parent);
dlg->setKey(key);
bool ro = !key->getSqlItemId().isValid();
dlg->setKey(key, import);
dlg->descr->setReadOnly(ro);
dlg->comment->setReadOnly(ro);

View File

@ -22,9 +22,9 @@ class KeyDetail: public XcaDetail, public Ui::KeyDetail
public:
KeyDetail(QWidget *w = nullptr);
void setKey(pki_key *key);
void setKey(pki_key *key, bool import = true);
void setupFingerprints(pki_key *key);
static void showKey(QWidget *parent, pki_key *keyi, bool ro = false);
static void showKey(QWidget *parent, pki_key *key, bool import = true);
public slots:
void itemChanged(pki_base *pki) override;