File indexing completed on 2024-03-24 05:53:32
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 }