Cpp: Add support for TOFU_CONFLICT sigsum
[gpgme.git] / lang / cpp / src / verificationresult.h
1 /*
2   verificationresult.h - wraps a gpgme verify result
3   Copyright (C) 2004 Klarälvdalens Datakonsult AB
4
5   This file is part of GPGME++.
6
7   GPGME++ is free software; you can redistribute it and/or
8   modify it under the terms of the GNU Library General Public
9   License as published by the Free Software Foundation; either
10   version 2 of the License, or (at your option) any later version.
11
12   GPGME++ is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU Library General Public License for more details.
16
17   You should have received a copy of the GNU Library General Public License
18   along with GPGME++; see the file COPYING.LIB.  If not, write to the
19   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20   Boston, MA 02110-1301, USA.
21 */
22
23 #ifndef __GPGMEPP_VERIFICATIONRESULT_H__
24 #define __GPGMEPP_VERIFICATIONRESULT_H__
25
26 #include "gpgmefw.h"
27 #include "result.h"
28 #include "gpgmepp_export.h"
29
30 #include <time.h>
31
32 #include <memory>
33
34 #include <vector>
35 #include <iosfwd>
36
37 namespace GpgME
38 {
39
40 class Error;
41 class Signature;
42 class Notation;
43 class TofuInfo;
44
45 class GPGMEPP_EXPORT VerificationResult : public Result
46 {
47 public:
48     VerificationResult();
49     VerificationResult(gpgme_ctx_t ctx, int error);
50     VerificationResult(gpgme_ctx_t ctx, const Error &error);
51     explicit VerificationResult(const Error &err);
52
53     const VerificationResult &operator=(VerificationResult other)
54     {
55         swap(other);
56         return *this;
57     }
58
59     void swap(VerificationResult &other)
60     {
61         Result::swap(other);
62         using std::swap;
63         swap(this->d, other.d);
64     }
65
66     bool isNull() const;
67
68     const char *fileName() const;
69
70     unsigned int numSignatures() const;
71     Signature signature(unsigned int index) const;
72     std::vector<Signature> signatures() const;
73
74     class Private;
75 private:
76     void init(gpgme_ctx_t ctx);
77     std::shared_ptr<Private> d;
78 };
79
80 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const VerificationResult &result);
81
82 class GPGMEPP_EXPORT Signature
83 {
84     friend class ::GpgME::VerificationResult;
85     Signature(const std::shared_ptr<VerificationResult::Private> &parent, unsigned int index);
86 public:
87     typedef GPGMEPP_DEPRECATED GpgME::Notation Notation;
88
89     Signature();
90
91     const Signature &operator=(Signature other)
92     {
93         swap(other);
94         return *this;
95     }
96
97     void swap(Signature &other)
98     {
99         using std::swap;
100         swap(this->d, other.d);
101         swap(this->idx, other.idx);
102     }
103
104     bool isNull() const;
105
106     enum Summary {
107         None       = 0x000,
108         Valid      = 0x001,
109         Green      = 0x002,
110         Red        = 0x004,
111         KeyRevoked = 0x008,
112         KeyExpired = 0x010,
113         SigExpired = 0x020,
114         KeyMissing = 0x040,
115         CrlMissing = 0x080,
116         CrlTooOld  = 0x100,
117         BadPolicy  = 0x200,
118         SysError   = 0x400,
119         TofuConflict= 0x800
120     };
121     Summary summary() const;
122
123     const char *fingerprint() const;
124
125     Error status() const;
126
127     time_t creationTime() const;
128     time_t expirationTime() const;
129     bool neverExpires() const;
130
131     GPGMEPP_DEPRECATED bool wrongKeyUsage() const
132     {
133         return isWrongKeyUsage();
134     }
135     bool isWrongKeyUsage() const;
136     bool isVerifiedUsingChainModel() const;
137
138     enum PKAStatus {
139         UnknownPKAStatus, PKAVerificationFailed, PKAVerificationSucceeded
140     };
141     PKAStatus pkaStatus() const;
142     const char *pkaAddress() const;
143
144     enum Validity {
145         Unknown, Undefined, Never, Marginal, Full, Ultimate
146     };
147     Validity validity() const;
148     char validityAsString() const;
149     Error nonValidityReason() const;
150
151     unsigned int publicKeyAlgorithm() const;
152     const char *publicKeyAlgorithmAsString() const;
153
154     unsigned int hashAlgorithm() const;
155     const char *hashAlgorithmAsString() const;
156
157     const char *policyURL() const;
158     GpgME::Notation notation(unsigned int index) const;
159     std::vector<GpgME::Notation> notations() const;
160
161     /** List of TOFU stats for this signature.
162      *
163      * For each UserID of the key used to create this
164      * signature a tofu entry is returned.
165      *
166      * Warning: Addresses can be ambigous if there are multiple UserID's
167      * with the same mailbox in a key.
168      *
169      * @returns The list of TOFU stats.
170      */
171     std::vector<GpgME::TofuInfo> tofuInfo() const;
172
173 private:
174     std::shared_ptr<VerificationResult::Private> d;
175     unsigned int idx;
176 };
177
178 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Signature &sig);
179 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Signature::PKAStatus pkaStatus);
180 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Signature::Summary summary);
181
182 }
183
184 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(VerificationResult)
185 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Signature)
186
187 #endif // __GPGMEPP_VERIFICATIONRESULT_H__