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 }