File indexing completed on 2024-05-26 05:24:32
0001 /* -*- mode: c++; c-basic-offset:4 -*- 0002 utils/classify.h 0003 0004 This file is part of Kleopatra, the KDE keymanager 0005 SPDX-FileCopyrightText: 2007 Klarälvdalens Datakonsult AB 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #pragma once 0011 0012 #include "kleo_export.h" 0013 0014 #include <QStringList> 0015 0016 #include <gpgme++/global.h> 0017 0018 class QByteArray; 0019 class QString; 0020 0021 namespace Kleo 0022 { 0023 0024 namespace Class 0025 { 0026 enum { 0027 // clang-format off 0028 NoClass = 0, 0029 0030 // protocol: 0031 CMS = 0x01, 0032 OpenPGP = 0x02, 0033 0034 AnyProtocol = OpenPGP | CMS, 0035 ProtocolMask = AnyProtocol, 0036 0037 // format: 0038 Binary = 0x04, 0039 Ascii = 0x08, 0040 0041 AnyFormat = Binary | Ascii, 0042 FormatMask = AnyFormat, 0043 0044 // type: 0045 DetachedSignature = 0x010, 0046 OpaqueSignature = 0x020, 0047 ClearsignedMessage = 0x040, 0048 0049 AnySignature = DetachedSignature | OpaqueSignature | ClearsignedMessage, 0050 0051 CipherText = 0x080, 0052 0053 AnyMessageType = AnySignature | CipherText, 0054 0055 Importable = 0x100, 0056 Certificate = 0x200 | Importable, 0057 ExportedPSM = 0x400 | Importable, 0058 0059 AnyCertStoreType = Certificate | ExportedPSM, 0060 0061 CertificateRequest = 0x800, 0062 0063 CertificateRevocationList = 0x1000, 0064 0065 MimeFile = 0x2000, 0066 0067 AnyType = AnyMessageType | AnyCertStoreType | CertificateRequest | CertificateRevocationList, 0068 TypeMask = AnyType | MimeFile 0069 // clang-format on 0070 }; 0071 } 0072 0073 KLEO_EXPORT unsigned int classify(const QString &filename); 0074 KLEO_EXPORT unsigned int classify(const QStringList &fileNames); 0075 KLEO_EXPORT unsigned int classifyContent(const QByteArray &data); 0076 0077 KLEO_EXPORT QString findSignedData(const QString &signatureFileName); 0078 KLEO_EXPORT QStringList findSignatures(const QString &signedDataFileName); 0079 KLEO_EXPORT QString outputFileName(const QString &input); 0080 0081 /** Check if a string looks like a fingerprint (SHA1 sum) */ 0082 KLEO_EXPORT bool isFingerprint(const QString &fpr); 0083 0084 /** Check if a filename matches a ChecksumDefinition pattern */ 0085 KLEO_EXPORT bool isChecksumFile(const QString &file); 0086 0087 KLEO_EXPORT QString outputFileExtension(unsigned int classification, bool usePGPFileExt); 0088 0089 KLEO_EXPORT QString printableClassification(unsigned int classification); 0090 0091 inline bool isCMS(const QString &filename) 0092 { 0093 return (classify(filename) & Class::ProtocolMask) == Class::CMS; 0094 } 0095 inline bool isCMS(const unsigned int classification) 0096 { 0097 return (classification & Class::ProtocolMask) == Class::CMS; 0098 } 0099 inline bool mayBeCMS(const QString &filename) 0100 { 0101 return classify(filename) & Class::CMS; 0102 } 0103 inline bool mayBeCMS(const unsigned int classification) 0104 { 0105 return classification & Class::CMS; 0106 } 0107 0108 inline bool isOpenPGP(const QString &filename) 0109 { 0110 return (classify(filename) & Class::ProtocolMask) == Class::OpenPGP; 0111 } 0112 inline bool isOpenPGP(const unsigned int classification) 0113 { 0114 return (classification & Class::ProtocolMask) == Class::OpenPGP; 0115 } 0116 inline bool mayBeOpenPGP(const QString &filename) 0117 { 0118 return classify(filename) & Class::OpenPGP; 0119 } 0120 inline bool mayBeOpenPGP(const unsigned int classification) 0121 { 0122 return classification & Class::OpenPGP; 0123 } 0124 0125 inline bool isBinary(const QString &filename) 0126 { 0127 return (classify(filename) & Class::FormatMask) == Class::Binary; 0128 } 0129 inline bool isBinary(const unsigned int classification) 0130 { 0131 return (classification & Class::FormatMask) == Class::Binary; 0132 } 0133 inline bool mayBeBinary(const QString &filename) 0134 { 0135 return classify(filename) & Class::Binary; 0136 } 0137 inline bool mayBeBinary(const unsigned int classification) 0138 { 0139 return classification & Class::Binary; 0140 } 0141 0142 inline bool isAscii(const QString &filename) 0143 { 0144 return (classify(filename) & Class::FormatMask) == Class::Ascii; 0145 } 0146 inline bool isAscii(const unsigned int classification) 0147 { 0148 return (classification & Class::FormatMask) == Class::Ascii; 0149 } 0150 inline bool mayBeAscii(const QString &filename) 0151 { 0152 return classify(filename) & Class::Ascii; 0153 } 0154 inline bool mayBeAscii(const unsigned int classification) 0155 { 0156 return classification & Class::Ascii; 0157 } 0158 0159 inline bool isDetachedSignature(const QString &filename) 0160 { 0161 return (classify(filename) & Class::TypeMask) == Class::DetachedSignature; 0162 } 0163 inline bool isDetachedSignature(const unsigned int classification) 0164 { 0165 return (classification & Class::TypeMask) == Class::DetachedSignature; 0166 } 0167 inline bool mayBeDetachedSignature(const QString &filename) 0168 { 0169 return classify(filename) & Class::DetachedSignature; 0170 } 0171 inline bool mayBeDetachedSignature(const unsigned int classification) 0172 { 0173 return classification & Class::DetachedSignature; 0174 } 0175 0176 inline bool isOpaqueSignature(const QString &filename) 0177 { 0178 return (classify(filename) & Class::TypeMask) == Class::OpaqueSignature; 0179 } 0180 inline bool isOpaqueSignature(const unsigned int classification) 0181 { 0182 return (classification & Class::TypeMask) == Class::OpaqueSignature; 0183 } 0184 inline bool mayBeOpaqueSignature(const QString &filename) 0185 { 0186 return classify(filename) & Class::OpaqueSignature; 0187 } 0188 inline bool mayBeOpaqueSignature(const unsigned int classification) 0189 { 0190 return classification & Class::OpaqueSignature; 0191 } 0192 0193 inline bool isCipherText(const QString &filename) 0194 { 0195 return (classify(filename) & Class::TypeMask) == Class::CipherText; 0196 } 0197 inline bool isCipherText(const unsigned int classification) 0198 { 0199 return (classification & Class::TypeMask) == Class::CipherText; 0200 } 0201 inline bool mayBeCipherText(const QString &filename) 0202 { 0203 return classify(filename) & Class::CipherText; 0204 } 0205 inline bool mayBeCipherText(const unsigned int classification) 0206 { 0207 return classification & Class::CipherText; 0208 } 0209 0210 inline bool isAnyMessageType(const QString &filename) 0211 { 0212 return (classify(filename) & Class::TypeMask) == Class::AnyMessageType; 0213 } 0214 inline bool isAnyMessageType(const unsigned int classification) 0215 { 0216 return (classification & Class::TypeMask) == Class::AnyMessageType; 0217 } 0218 inline bool mayBeAnyMessageType(const QString &filename) 0219 { 0220 return classify(filename) & Class::AnyMessageType; 0221 } 0222 inline bool mayBeAnyMessageType(const unsigned int classification) 0223 { 0224 return classification & Class::AnyMessageType; 0225 } 0226 0227 inline bool isCertificateRevocationList(const QString &filename) 0228 { 0229 return (classify(filename) & Class::TypeMask) == Class::CertificateRevocationList; 0230 } 0231 inline bool isCertificateRevocationList(const unsigned int classification) 0232 { 0233 return (classification & Class::TypeMask) == Class::CertificateRevocationList; 0234 } 0235 inline bool mayBeCertificateRevocationList(const QString &filename) 0236 { 0237 return classify(filename) & Class::CertificateRevocationList; 0238 } 0239 inline bool mayBeCertificateRevocationList(const unsigned int classification) 0240 { 0241 return classification & Class::CertificateRevocationList; 0242 } 0243 0244 inline bool isAnyCertStoreType(const QString &filename) 0245 { 0246 return (classify(filename) & Class::TypeMask) == Class::AnyCertStoreType; 0247 } 0248 inline bool isAnyCertStoreType(const unsigned int classification) 0249 { 0250 return (classification & Class::TypeMask) == Class::AnyCertStoreType; 0251 } 0252 inline bool mayBeAnyCertStoreType(const QString &filename) 0253 { 0254 return classify(filename) & Class::AnyCertStoreType; 0255 } 0256 inline bool mayBeAnyCertStoreType(const unsigned int classification) 0257 { 0258 return classification & Class::AnyCertStoreType; 0259 } 0260 0261 inline bool isMimeFile(const unsigned int classification) 0262 { 0263 return (classification & Class::TypeMask) == Class::MimeFile; 0264 } 0265 0266 inline bool isMimeFile(const QString &filename) 0267 { 0268 return (classify(filename) & Class::TypeMask) == Class::MimeFile; 0269 } 0270 0271 inline bool mayBeMimeFile(const QString &filename) 0272 { 0273 return classify(filename) & Class::MimeFile; 0274 } 0275 inline bool mayBeMimeFile(const unsigned int classification) 0276 { 0277 return classification & Class::MimeFile; 0278 } 0279 0280 inline GpgME::Protocol findProtocol(const unsigned int classification) 0281 { 0282 if (isOpenPGP(classification)) { 0283 return GpgME::OpenPGP; 0284 } else if (isCMS(classification)) { 0285 return GpgME::CMS; 0286 } else { 0287 return GpgME::UnknownProtocol; 0288 } 0289 } 0290 inline GpgME::Protocol findProtocol(const QString &filename) 0291 { 0292 return findProtocol(classify(filename)); 0293 } 0294 0295 }