libzypp 17.38.15
PublicKey.h
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
12#ifndef ZYPP_PUBLICKEY_H
13#define ZYPP_PUBLICKEY_H
14
15#include <iosfwd>
16#include <list>
17#include <string>
18#include <utility>
19
21
25#include <zypp-core/Pathname.h>
26#include <zypp/Edition.h>
27#include <zypp-core/Date.h>
28
29struct _gpgme_key;
30struct _gpgme_subkey;
31struct _gpgme_key_sig;
32
34namespace zypp
35{
36
37 namespace filesystem
38 {
39 class TmpFile;
40 }
41 class PublicKeyData;
42 class KeyManagerCtx;
43
49 {
50 public:
55 : Exception( "Bad Key Exception" )
56 {}
57
59 { return _keyfile; }
60
64 BadKeyException( const std::string & msg_r, Pathname keyfile = Pathname() )
65 : Exception( msg_r ), _keyfile(std::move(keyfile))
66 {}
67
68 ~BadKeyException() throw() override {};
69 private:
71 };
72
73
80 {
81 public:
84
86
88 explicit operator bool() const;
89
90 public:
92 std::string id() const;
93
95 Date created() const;
96
98 Date expires() const;
99
101 bool expired() const;
102
108 int daysToLive() const;
109
116 std::string asString() const;
117
118 private:
119 struct Impl;
121 friend class PublicKeyData;
122 friend std::ostream & dumpOn( std::ostream & str, const PublicKeyData & obj );
123 PublicSubkeyData(const _gpgme_subkey *rawSubKeyData);
124 };
125
126
128 inline std::ostream & operator<<( std::ostream & str, const PublicSubkeyData & obj )
129 { return str << obj.asString(); }
130
137 {
138 public:
141
143
145 explicit operator bool() const;
146
147 public:
149 std::string id() const;
150
152 std::string name() const;
153
155 Date created() const;
156
158 Date expires() const;
159
161 bool expired() const;
162
168 int daysToLive() const;
169
176 std::string asString() const;
177
178 private:
179 struct Impl;
181 friend class PublicKeyData;
182 friend std::ostream & dumpOn( std::ostream & str, const PublicKeyData & obj );
183 PublicKeySignatureData(const _gpgme_key_sig *rawKeySignatureData);
184 };
185
186
188 inline std::ostream & operator<<( std::ostream & str, const PublicKeySignatureData & obj )
189 { return str << obj.asString(); }
190
201 {
202 public:
205
207
208 PublicKeyData(const PublicKeyData &) = default;
209 PublicKeyData(PublicKeyData &&) noexcept = default;
210 PublicKeyData &operator=(const PublicKeyData &) = default;
211 PublicKeyData &operator=(PublicKeyData &&) noexcept = default;
212
214 explicit operator bool() const;
215
216 public:
218 std::string id() const;
219
221 std::string name() const;
222
224 std::string fingerprint() const;
225
227 std::string algoName() const;
228
230 Date created() const;
231
233 Date expires() const;
234
236 bool expired() const;
237
243 int daysToLive() const;
244
257 std::string expiresAsString() const;
258
260 std::string gpgPubkeyVersion() const;
261
263 std::string gpgPubkeyRelease() const;
264
266 static std::string date2release( const Date & date_r );
267
269 std::string rpmName () const;
270
274
281 std::string asString() const;
282
287 bool isUpdateFor( const PublicKeyData & rhs ) const
288 {
289 // bnc #393160: Comment #30: Compare at least the fingerprint
290 // in case an attacker created a key the the same id.
291 //
292 // bsc#1008325: For keys using subkeys, we'd actually need to compare
293 // the subkey sets, to tell whether a key was updated. because created()
294 // remains unchanged if the primary key is not touched.
295 // For now we wait until a new subkey signs any metadata and treat it as
296 // a new key then (see VerifyFileSignatureLogic)
297 return not rhs || ( fingerprint() == rhs.fingerprint() && created() > rhs.created() );
298 }
299
300 public:
303
305 bool hasSubkeys() const;
306
309
312
316 bool providesKey( const std::string & id_r ) const;
317
321 static bool isSafeKeyId( const std::string & id_r )
322 { return id_r.size() >= 16; }
323
324 public:
326 bool hasSignatures() const;
327
328 public:
331
338 AsciiArt asciiArt() const;
339
340 private:
341 struct Impl;
343
344 friend class KeyManagerCtx;
345 static PublicKeyData fromGpgmeKey(_gpgme_key *data);
346
348 friend std::ostream & dumpOn( std::ostream & str, const PublicKeyData & obj );
349 };
350
351
353 inline std::ostream & operator<<( std::ostream & str, const PublicKeyData & obj )
354 { return str << obj.asString(); }
355
357 std::ostream & dumpOn( std::ostream & str, const PublicKeyData & obj ) ZYPP_API;
358
360 bool operator==( const PublicKeyData & lhs, const PublicKeyData & rhs ) ZYPP_API;
361
363 inline bool operator!=( const PublicKeyData & lhs, const PublicKeyData & rhs )
364 { return !( lhs == rhs ); }
365
378 {
379 public:
381 struct Impl;
382
383 public:
385 PublicKey();
386
395 explicit PublicKey( const Pathname & keyFile_r );
396
403 explicit PublicKey( const filesystem::TmpFile & sharedFile_r );
404
405 ~PublicKey();
406
408 static PublicKey noThrow( const Pathname & keyFile_r );
409
410 public:
412 const PublicKeyData & keyData() const;
413
415
416 bool isValid() const
417 { return ! ( id().empty() || fingerprint().empty() ); }
418
419 std::string id() const;
420 std::string name() const;
421 std::string fingerprint() const;
422 std::string algoName() const;
423 Date created() const;
424 Date expires() const;
425 std::string expiresAsString() const;
426 bool expired() const;
427 int daysToLive() const;
428 std::string gpgPubkeyVersion() const;
429 std::string gpgPubkeyRelease() const;
430 std::string asString() const;
431 std::string rpmName () const;
432
435
436 bool hasSubkeys() const
437 { return keyData().hasSubkeys(); }
438
440 { return keyData().subkeys(); }
441
442 bool providesKey( const std::string & id_r ) const
443 { return keyData().providesKey( id_r ); }
444
445 static bool isSafeKeyId( const std::string & id_r )
446 { return PublicKeyData::isSafeKeyId(id_r); }
447
448 public:
450
452 { return keyData().asciiArt(); }
453
454 public:
456 Pathname path() const;
457
458 bool hasHiddenKeys() const
459 { return not hiddenKeys().empty(); }
460
462 const std::list<PublicKeyData> & hiddenKeys() const;
463
467 bool fileProvidesKey( const std::string & id_r ) const;
468
469 public:
470 bool operator==( const PublicKey & rhs ) const;
471 bool operator!=( const PublicKey & rhs ) const
472 { return not operator==( rhs ); }
473 bool operator==( const std::string & sid ) const;
474 bool operator!=( const std::string & sid ) const
475 { return not operator==( sid ); }
476
477 private:
478 friend class KeyRingImpl;
480 PublicKey( const filesystem::TmpFile & sharedFile_r, const PublicKeyData & keyData_r );
482 explicit PublicKey( const PublicKeyData & keyData_r );
483
484 private:
487 };
488
489
491 inline std::ostream & operator<<( std::ostream & str, const PublicKey & obj )
492 { return str << obj.asString(); }
493
495 std::ostream & dumpOn( std::ostream & str, const PublicKey & obj ) ZYPP_API;
496
498} // namespace zypp
500#endif // ZYPP_PUBLICKEY_H
#define ZYPP_API
Definition Globals.h:74
Pathname keyFile() const
Definition PublicKey.h:58
BadKeyException(const std::string &msg_r, Pathname keyfile=Pathname())
Ctor taking message.
Definition PublicKey.h:64
~BadKeyException() override
Dtor.
Definition PublicKey.h:68
BadKeyException()
Ctor taking message.
Definition PublicKey.h:54
Store and operate on date (time_t).
Definition Date.h:33
Edition represents [epoch:]version[-release].
Definition Edition.h:60
Edition()
Default ctor: noedition.
Definition Edition.h:76
Exception()
Default ctor.
Definition Exception.cc:94
Pathname()
Default ctor: an empty path.
Definition Pathname.h:51
Class representing one GPG Public Keys data.
Definition PublicKey.h:201
friend std::ostream & dumpOn(std::ostream &str, const PublicKeyData &obj)
relates: PublicKeyData Detailed stream output
Definition PublicKey.cc:486
Iterable< KeySignatureIterator > signatures() const
Iterate all key signatures.
Definition PublicKey.cc:469
Date created() const
Creation / last modification date (latest selfsig).
Definition PublicKey.cc:424
bool expired() const
Whether the key has expired.
Definition PublicKey.cc:430
std::string name() const
Key name.
Definition PublicKey.cc:415
bool hasSignatures() const
Whether signatures is not empty.
Iterable< SubkeyIterator > subkeys() const
Iterate any subkeys.
Definition PublicKey.cc:466
int daysToLive() const
Number of days (24h) until the key expires (or since it exired).
Definition PublicKey.cc:433
friend class KeyManagerCtx
Definition PublicKey.h:344
std::string rpmName() const
Gpg-pubkey name as computed by rpm.
Definition PublicKey.cc:448
bool hasSubkeys() const
Whether subkeys is not empty.
Definition PublicKey.cc:463
bool isUpdateFor(const PublicKeyData &rhs) const
Whether this could replace rhs in a keyring.
Definition PublicKey.h:287
PublicKeyData()
Default constructed: empty data.
Definition PublicKey.cc:395
const PublicSubkeyData * SubkeyIterator
Definition PublicKey.h:301
Date expires() const
Expiry date, or Date() if the key never expires.
Definition PublicKey.cc:427
std::string algoName() const
Key algorithm string like RSA 2048.
Definition PublicKey.cc:421
PublicKeyData(const PublicKeyData &)=default
static bool isSafeKeyId(const std::string &id_r)
Whether this is a long id (64bit/16byte) or even better a fingerprint.
Definition PublicKey.h:321
RWCOW_pointer< Impl > _pimpl
Definition PublicKey.h:342
bool providesKey(const std::string &id_r) const
Whether id_r is the id or fingerprint of the primary key or of a subkey.
Definition PublicKey.cc:472
std::string fingerprint() const
Key fingerprint.
Definition PublicKey.cc:418
std::string gpgPubkeyRelease() const
Gpg-pubkey release as computed by rpm (hexencoded created).
Definition PublicKey.cc:442
std::string gpgPubkeyVersion() const
Gpg-pubkey version as computed by rpm (trailing 8 byte id).
Definition PublicKey.cc:439
PublicKeyData(PublicKeyData &&) noexcept=default
static PublicKeyData fromGpgmeKey(_gpgme_key *data)
Definition PublicKey.cc:406
std::string expiresAsString() const
Definition PublicKey.cc:436
AsciiArt asciiArt() const
Random art fingerprint visualization (base::DrunkenBishop).
Definition PublicKey.cc:483
std::string asString() const
Simple string representation.
Definition PublicKey.cc:451
static std::string date2release(const Date &date_r)
Hexencode a date the same way as gpgPubkeyRelease does.
Definition PublicKey.cc:445
base::DrunkenBishop AsciiArt
Random art fingerprint visualization type (base::DrunkenBishop).
Definition PublicKey.h:330
Edition gpgPubkeyEdition() const
Gpg-pubkey Edition built from version and release.
Definition PublicKey.h:272
const PublicKeySignatureData * KeySignatureIterator
Definition PublicKey.h:302
Class representing a signature on a GPG Public Key.
Definition PublicKey.h:137
friend std::ostream & dumpOn(std::ostream &str, const PublicKeyData &obj)
relates: PublicKeyData Detailed stream output
Definition PublicKey.cc:486
Date created() const
Creation date.
Definition PublicKey.cc:263
std::string asString() const
Simple string representation.
Definition PublicKey.cc:275
PublicKeySignatureData()
Default constructed: empty data.
Definition PublicKey.cc:238
RWCOW_pointer< Impl > _pimpl
Definition PublicKey.h:180
int daysToLive() const
Number of days (24h) until the key expires (or since it expired).
Definition PublicKey.cc:272
bool expired() const
Whether the key has expired.
Definition PublicKey.cc:269
std::string id() const
The key ID of key used to create the signature.
Definition PublicKey.cc:257
std::string name() const
The user ID associated with this key, if present.
Definition PublicKey.cc:260
Date expires() const
Expiry date, or Date() if the key never expires.
Definition PublicKey.cc:266
Class representing one GPG Public Key (PublicKeyData + ASCII armored in a tempfile).
Definition PublicKey.h:378
Edition gpgPubkeyEdition() const
!<
Definition PublicKey.h:433
PublicKeyData::AsciiArt AsciiArt
Definition PublicKey.h:449
bool operator==(const PublicKey &rhs) const
Definition PublicKey.cc:699
AsciiArt asciiArt() const
!<
Definition PublicKey.h:451
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
Definition PublicKey.h:486
PublicKey()
Default ctor.
Definition PublicKey.cc:614
const std::list< PublicKeyData > & hiddenKeys() const
Additional keys data in case the ASCII armored blob contains multiple keys.
Definition PublicKey.cc:646
static bool isSafeKeyId(const std::string &id_r)
!<
Definition PublicKey.h:445
const PublicKeyData & keyData() const
The public keys data (.
Definition PublicKey.cc:640
std::string asString() const
Definition PublicKey.cc:693
std::string fingerprint() const
Definition PublicKey.cc:666
std::string id() const
Definition PublicKey.cc:660
bool operator!=(const std::string &sid) const
Definition PublicKey.h:474
bool operator!=(const PublicKey &rhs) const
Definition PublicKey.h:471
PublicKeyData::SubkeyIterator SubkeyIterator
Definition PublicKey.h:414
bool hasHiddenKeys() const
Definition PublicKey.h:458
friend class KeyRingImpl
Definition PublicKey.h:478
static PublicKey noThrow(const Pathname &keyFile_r)
Static ctor returning an empty PublicKey rather than throwing.
Definition PublicKey.cc:637
bool hasSubkeys() const
!<
Definition PublicKey.h:436
bool providesKey(const std::string &id_r) const
!<
Definition PublicKey.h:442
Iterable< SubkeyIterator > subkeys() const
!<
Definition PublicKey.h:439
bool isValid() const
Definition PublicKey.h:416
Class representing a GPG Public Keys subkeys.
Definition PublicKey.h:80
friend std::ostream & dumpOn(std::ostream &str, const PublicKeyData &obj)
relates: PublicKeyData Detailed stream output
Definition PublicKey.cc:486
RWCOW_pointer< Impl > _pimpl
Definition PublicKey.h:120
std::string id() const
Subkey ID.
Definition PublicKey.cc:181
PublicSubkeyData()
Default constructed: empty data.
Definition PublicKey.cc:163
int daysToLive() const
Number of days (24h) until the key expires (or since it exired).
Definition PublicKey.cc:193
Date expires() const
Expiry date, or Date() if the key never expires.
Definition PublicKey.cc:187
friend class PublicKeyData
Definition PublicKey.h:121
std::string asString() const
Simple string representation.
Definition PublicKey.cc:196
Date created() const
Creation date.
Definition PublicKey.cc:184
bool expired() const
Whether the key has expired.
Definition PublicKey.cc:190
Random art fingerprint visualization Visualize fingerprint data on a [17x9] (SSH) or [19x11] (GPG) or...
Provide a new empty temporary file and delete it when no longer needed.
Definition TmpPath.h:118
Definition ansi.h:855
String related utilities and Regular expression matching.
Types and functions for filesystem operations.
Definition Glob.cc:24
Easy-to use interface to the ZYPP dependency resolver.
bool operator!=(const Capability &lhs, const Capability &rhs)
relates: Capability
Definition Capability.h:313
bool operator==(const Capability &lhs, const Capability &rhs)
relates: Capability
Definition Capability.h:309
const Arch Arch_empty ZYPP_API
relates: Arch This is an empty Arch represented by an empty string.
Definition Arch.h:173
std::ostream & dumpOn(std::ostream &str, const Capability &obj)
relates: Capability Detailed stream output
std::string asString(const Patch::Category &obj)
relates: Patch::Category string representation.
Definition Patch.cc:122
std::ostream & operator<<(std::ostream &str, const Capabilities &obj)
relates: Capabilities Stream output
PublicKeyData implementation.
Definition PublicKey.cc:296
PublicKeySignatureData implementation.
Definition PublicKey.cc:207
PublicKey implementation.
Definition PublicKey.cc:510
PublicSubkeyData implementation.
Definition PublicKey.cc:133
RW_pointer supporting 'copy on write' functionality.
Definition PtrTypes.h:469