File indexing completed on 2024-04-28 09:46:03

0001 /*
0002     SPDX-FileCopyrightText: 2008-2022 Rolf Eike Beer <kde@opensource.sf-tec.de>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "kgpgdeluid.h"
0007 
0008 #include "gpgproc.h"
0009 #include "core/kgpgkey.h"
0010 #include "core/KGpgKeyNode.h"
0011 
0012 #include <algorithm>
0013 
0014 KGpgDelUid::KGpgDelUid(QObject *parent, const KGpgSignableNode *uid)
0015     : KGpgUidTransaction(parent, uid->getParentKeyNode()->getId(), uid->getId()),
0016     m_fixargs(addArgument(QLatin1String( "deluid" )))
0017 {
0018     setUid(uid);
0019 }
0020 
0021 KGpgDelUid::KGpgDelUid(QObject *parent, const KGpgSignableNode::const_List &uids)
0022     : KGpgUidTransaction(parent),
0023     m_fixargs(addArgument(QLatin1String( "deluid" )))
0024 {
0025     setUids(uids);
0026 }
0027 
0028 KGpgDelUid::KGpgDelUid(QObject *parent, const KGpgKeyNode *keynode, const int uid, const RemoveMode removeMode)
0029     : KGpgUidTransaction(parent),
0030     m_fixargs(addArgument(QLatin1String( "deluid" )))
0031 {
0032     setUid(keynode, uid, removeMode);
0033 }
0034 
0035 void
0036 KGpgDelUid::setUid(const KGpgSignableNode *uid)
0037 {
0038     KGpgSignableNode::const_List uids;
0039 
0040     uids.append(uid);
0041     setUids(uids);
0042 }
0043 
0044 void
0045 KGpgDelUid::setUids(const KGpgSignableNode::const_List &uids)
0046 {
0047     Q_ASSERT(!uids.isEmpty());
0048 
0049     m_uids = uids;
0050 
0051     GPGProc *proc = getProcess();
0052 
0053     QStringList args(proc->program());
0054     proc->clearProgram();
0055 
0056     for (int i = args.count() - m_fixargs - 1; i > 0; i--)
0057         args.removeLast();
0058 
0059     std::sort(m_uids.begin(), m_uids.end(),
0060             [](const KGpgSignableNode *s, const KGpgSignableNode *t) { return *t < *s; });
0061 
0062     const KGpgSignableNode *nd = m_uids.first();
0063     const KGpgExpandableNode *parent;
0064     if (nd->getType() & KgpgCore::ITYPE_PAIR)
0065         parent = nd;
0066     else
0067         parent = nd->getParentKeyNode();
0068 
0069     for (auto it = ++m_uids.constBegin(); it != m_uids.constEnd(); it++) {
0070         nd = *it;
0071         Q_ASSERT((nd->getParentKeyNode() == parent) || (nd == parent));
0072 
0073         args.append(QLatin1String( "uid" ));
0074         if (nd->getType() & KgpgCore::ITYPE_PAIR)
0075             args.append(QLatin1String("1"));
0076         else
0077             args.append(nd->getId());
0078         args.append(QLatin1String( "deluid" ));
0079     }
0080 
0081     proc->setProgram(args);
0082     nd = m_uids.first();
0083 
0084     switch (nd->getType()) {
0085     case KgpgCore::ITYPE_PUBLIC:
0086     case KgpgCore::ITYPE_PAIR:
0087         KGpgUidTransaction::setUid(1);
0088         break;
0089     default:
0090         KGpgUidTransaction::setUid(nd->getId());
0091         break;
0092     }
0093     setKeyId(parent->getId());
0094 }
0095 
0096 void
0097 KGpgDelUid::setUid(const KGpgKeyNode *keynode, const int uid, const RemoveMode removeMode)
0098 {
0099     Q_ASSERT(uid != 0);
0100 
0101     KGpgSignableNode::const_List uids;
0102     const KGpgSignableNode *uidnode;
0103 
0104     if (uid > 0) {
0105         uidnode = keynode->getUid(uid);
0106 
0107         Q_ASSERT(uidnode != nullptr);
0108         uids.append(uidnode);
0109     } else {
0110         Q_ASSERT(keynode->wasExpanded());
0111         int idx = 0;
0112 
0113         while(1) {
0114             idx++;
0115             if (idx == -uid)
0116                 continue;
0117 
0118             uidnode = keynode->getUid(idx);
0119 
0120             if (uidnode == nullptr)
0121                 break;
0122 
0123             switch (removeMode) {
0124             case RemoveAllOther:
0125                 uids.append(uidnode);
0126                 break;
0127             case KeepUats:
0128                 if (uidnode->getType() != KgpgCore::ITYPE_UAT)
0129                     uids.append(uidnode);
0130                 break;
0131             case RemoveWithEmail:
0132                 if (!uidnode->getEmail().isEmpty())
0133                     uids.append(uidnode);
0134                 break;
0135             }
0136         }
0137     }
0138 
0139     if (!uids.isEmpty())
0140         setUids(uids);
0141 }
0142 
0143 bool
0144 KGpgDelUid::preStart()
0145 {
0146     if (m_uids.isEmpty()) {
0147         setSuccess(TS_NO_SUCH_UID);
0148         return false;
0149     }
0150 
0151     return true;
0152 }
0153 
0154 bool
0155 KGpgDelUid::nextLine(const QString &line)
0156 {
0157     return standardCommands(line);
0158 }
0159 
0160 KGpgTransaction::ts_boolanswer
0161 KGpgDelUid::boolQuestion(const QString& line)
0162 {
0163     if (line == QLatin1String("keyedit.remove.uid.okay")) {
0164         m_uids.removeFirst();
0165         return BA_YES;
0166     } else {
0167         return KGpgTransaction::boolQuestion(line);
0168     }
0169 }
0170 
0171 void
0172 KGpgDelUid::finish()
0173 {
0174     if (!m_uids.isEmpty())
0175         setSuccess(TS_MSG_SEQUENCE);
0176 }