File indexing completed on 2024-04-21 05:50:43

0001 /*
0002     SPDX-FileCopyrightText: 2009-2022 Rolf Eike Beer <kde@opensource.sf-tec.de>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "kgpgsignuid.h"
0007 
0008 #include "gpgproc.h"
0009 #include "model/kgpgitemnode.h"
0010 
0011 KGpgSignUid::KGpgSignUid(QObject *parent, const QString &signer, const KGpgSignableNode *uid, const bool local, const carefulCheck checking)
0012     : KGpgUidTransaction(parent),
0013     KGpgSignTransactionHelper(signer, !local, checking)
0014 {
0015     insertArgument(1, QLatin1String( "-u" ));
0016     insertArgument(2, signer);
0017     m_signerPos = 2;
0018     addArgumentRef(&m_signerPos);
0019 
0020     m_cmdPos = addArgument(QString());
0021     addArgumentRef(&m_cmdPos);
0022 
0023     addArgument(QLatin1String("save"));
0024 
0025     setUid(uid);
0026 
0027     setLocal(local);
0028 }
0029 
0030 void
0031 KGpgSignUid::setUid(const KGpgSignableNode *uid)
0032 {
0033     switch (uid->getType()) {
0034     case ITYPE_PUBLIC:
0035     case ITYPE_PAIR:
0036         KGpgUidTransaction::setUid(1);
0037         setKey(uid->toKeyNode());
0038         break;
0039     case ITYPE_UAT:
0040     case ITYPE_UID:
0041         KGpgUidTransaction::setUid(uid->getId());
0042         setKey(uid->getParentKeyNode()->toKeyNode());
0043         break;
0044     default:
0045         Q_ASSERT(0);
0046     }
0047 
0048     setKeyId(getKey()->getId());
0049 }
0050 
0051 bool
0052 KGpgSignUid::preStart()
0053 {
0054     if (!KGpgUidTransaction::preStart())
0055         return false;
0056 
0057     /* GnuPG >= 2.1 do not send a GOOD_PASSPHRASE anymore which could be used as a trigger that
0058      * everything worked fine, so just assume everything is OK until an ERROR is received. */
0059     if (GPGProc::gpgVersion(GPGProc::gpgVersionString(QString())) > 0x20100)
0060         setSuccess(TS_OK);
0061 
0062     return true;
0063 }
0064 
0065 bool
0066 KGpgSignUid::nextLine(const QString &line)
0067 {
0068     switch (KGpgSignTransactionHelper::nextLine(line)) {
0069     case KGpgSignTransactionHelper::handledFalse:
0070         return false;
0071     case KGpgSignTransactionHelper::handledTrue:
0072         return true;
0073     default:
0074         Q_ASSERT(0);
0075     case KGpgSignTransactionHelper::notHandled:
0076         if (line.contains(QLatin1String(" ERROR keysig "))) {
0077             setSuccess(TS_BAD_PASSPHRASE);
0078             return true;
0079         } else if (line.contains(QLatin1String(" ERROR "))) {
0080             setSuccess(TS_MSG_SEQUENCE);
0081             return true;
0082         } else {
0083             return standardCommands(line);
0084         }
0085     }
0086 }
0087 
0088 KGpgTransaction::ts_boolanswer
0089 KGpgSignUid::boolQuestion(const QString& line)
0090 {
0091     ts_boolanswer ret = KGpgSignTransactionHelper::boolQuestion(line);
0092 
0093     if (ret == BA_UNKNOWN)
0094         ret = KGpgTransaction::boolQuestion(line);
0095 
0096     return ret;
0097 }
0098 
0099 bool
0100 KGpgSignUid::passphraseReceived()
0101 {
0102     setSuccess(KGpgTransaction::TS_OK);
0103     return true;
0104 }
0105 
0106 KGpgTransaction *
0107 KGpgSignUid::asTransaction()
0108 {
0109     return this;
0110 }
0111 
0112 void
0113 KGpgSignUid::replaceCmd(const QString &cmd)
0114 {
0115     replaceArgument(m_cmdPos, cmd);
0116 }