Cpp: Add TofuInfo to signatures
[gpgme.git] / lang / cpp / src / tofuinfo.cpp
1 /* tofuinfo.cpp - wraps gpgme tofu info
2   Copyright (C) 2016 Intevation GmbH
3
4   This file is part of GPGME++.
5
6   GPGME++ is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Library General Public
8   License as published by the Free Software Foundation; either
9   version 2 of the License, or (at your option) any later version.
10
11   GPGME++ is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU Library General Public License for more details.
15
16   You should have received a copy of the GNU Library General Public License
17   along with GPGME++; see the file COPYING.LIB.  If not, write to the
18   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19   Boston, MA 02110-1301, USA.
20 */
21
22 #include "tofuinfo.h"
23
24 #include <istream>
25 #include "util.h"
26
27 class GpgME::TofuInfo::Private
28 {
29 public:
30     Private() {}
31     Private(gpgme_tofu_info_t info)
32         : mInfo(info ? new _gpgme_tofu_info(*info) : nullptr)
33     {
34         if (mInfo && mInfo->fpr) {
35             mInfo->fpr = strdup(mInfo->fpr);
36         }
37         if (mInfo && mInfo->address) {
38             mInfo->address = strdup(mInfo->address);
39         }
40         if (mInfo && mInfo->description) {
41             mInfo->description = strdup(mInfo->description);
42         }
43     }
44
45     Private(const Private &other)
46         : mInfo(other.mInfo)
47     {
48         if (mInfo && mInfo->fpr) {
49             mInfo->fpr = strdup(mInfo->fpr);
50         }
51         if (mInfo && mInfo->address) {
52             mInfo->address = strdup(mInfo->address);
53         }
54         if (mInfo && mInfo->description) {
55             mInfo->description = strdup(mInfo->description);
56         }
57     }
58
59     ~Private()
60     {
61         if (mInfo) {
62             std::free(mInfo->fpr);
63             mInfo->fpr = nullptr;
64             std::free(mInfo->address);
65             mInfo->address = nullptr;
66             std::free(mInfo->description);
67             mInfo->description = nullptr;
68
69             delete mInfo;
70         }
71     }
72
73     gpgme_tofu_info_t mInfo;
74 };
75
76 GpgME::TofuInfo::TofuInfo(gpgme_tofu_info_t info)
77     : d(new Private(info))
78 {
79 }
80
81 GpgME::TofuInfo::TofuInfo() : d()
82 {
83 }
84
85 bool GpgME::TofuInfo::isNull() const
86 {
87     return !d || !d->mInfo;
88 }
89
90 GpgME::TofuInfo::Validity GpgME::TofuInfo::validity() const
91 {
92     if (isNull()) {
93         return ValidityUnknown;
94     }
95     switch (d->mInfo->validity) {
96         case 0:
97             return Conflict;
98         case 1:
99             return NoHistory;
100         case 2:
101             return LittleHistory;
102         case 3:
103             return BasicHistory;
104         case 4:
105             return LargeHistory;
106         default:
107             return ValidityUnknown;
108     }
109 }
110
111 GpgME::TofuInfo::Policy GpgME::TofuInfo::policy() const
112 {
113     if (isNull()) {
114         return PolicyUnknown;
115     }
116     switch (d->mInfo->policy) {
117         case GPGME_TOFU_POLICY_NONE:
118             return PolicyNone;
119         case GPGME_TOFU_POLICY_AUTO:
120             return PolicyAuto;
121         case GPGME_TOFU_POLICY_GOOD:
122             return PolicyGood;
123         case GPGME_TOFU_POLICY_BAD:
124             return PolicyBad;
125         case GPGME_TOFU_POLICY_ASK:
126             return PolicyAsk;
127         case GPGME_TOFU_POLICY_UNKNOWN:
128             return PolicyUnknown;
129     }
130 }
131
132 const char *GpgME::TofuInfo::fingerprint() const
133 {
134     return isNull() ? nullptr : d->mInfo->fpr;
135 }
136
137 const char *GpgME::TofuInfo::address() const
138 {
139     return isNull() ? nullptr : d->mInfo->address;
140 }
141
142 const char *GpgME::TofuInfo::description() const
143 {
144     return isNull() ? nullptr : d->mInfo->description;
145 }
146
147 unsigned short GpgME::TofuInfo::signCount() const
148 {
149     return isNull() ? 0 : d->mInfo->signcount;
150 }
151
152 unsigned int GpgME::TofuInfo::firstSeen() const
153 {
154     return isNull() ? 0 : d->mInfo->firstseen;
155 }
156
157 unsigned int GpgME::TofuInfo::lastSeen() const
158 {
159     return isNull() ? 0 : d->mInfo->lastseen;
160 }
161
162 std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::TofuInfo &info)
163 {
164     os << "GpgME::Signature::TofuInfo(";
165     if (!info.isNull()) {
166         os << "\n address:  " << protect(info.address())
167            << "\n fpr: "      << protect(info.fingerprint())
168            << "\n desc: "     << protect(info.description())
169            << "\n validity: " << info.validity()
170            << "\n policy: "   << info.policy()
171            << "\n signcount: "<< info.signCount()
172            << "\n firstseen: "<< info.firstSeen()
173            << "\n lastseen: " << info.lastSeen()
174            << '\n';
175     }
176     return os << ")";
177 }