Cpp: Add TofuInfo to signatures
[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     };
120     Summary summary() const;
121
122     const char *fingerprint() const;
123
124     Error status() const;
125
126     time_t creationTime() const;
127     time_t expirationTime() const;
128     bool neverExpires() const;
129
130     GPGMEPP_DEPRECATED bool wrongKeyUsage() const
131     {
132         return isWrongKeyUsage();
133     }
134     bool isWrongKeyUsage() const;
135     bool isVerifiedUsingChainModel() const;
136
137     enum PKAStatus {
138         UnknownPKAStatus, PKAVerificationFailed, PKAVerificationSucceeded
139     };
140     PKAStatus pkaStatus() const;
141     const char *pkaAddress() const;
142
143     enum Validity {
144         Unknown, Undefined, Never, Marginal, Full, Ultimate
145     };
146     Validity validity() const;
147     char validityAsString() const;
148     Error nonValidityReason() const;
149
150     unsigned int publicKeyAlgorithm() const;
151     const char *publicKeyAlgorithmAsString() const;
152
153     unsigned int hashAlgorithm() const;
154     const char *hashAlgorithmAsString() const;
155
156     const char *policyURL() const;
157     GpgME::Notation notation(unsigned int index) const;
158     std::vector<GpgME::Notation> notations() const;
159
160     /** List of TOFU stats for this signature.
161      *
162      * For each UserID of the key used to create this
163      * signature a tofu entry is returned.
164      *
165      * Warning: Addresses can be ambigous if there are multiple UserID's
166      * with the same mailbox in a key.
167      *
168      * @returns The list of TOFU stats.
169      */
170     std::vector<GpgME::TofuInfo> tofuInfo() const;
171
172 private:
173     std::shared_ptr<VerificationResult::Private> d;
174     unsigned int idx;
175 };
176
177 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Signature &sig);
178 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Signature::PKAStatus pkaStatus);
179 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Signature::Summary summary);
180
181 }
182
183 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(VerificationResult)
184 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Signature)
185
186 #endif // __GPGMEPP_VERIFICATIONRESULT_H__