17#include <zypp/base/Gettext.h>
18#include <zypp/base/String.h>
19#include <zypp/base/Regex.h>
21#include <zypp/ExternalProgram.h>
22#include <zypp/TmpPath.h>
23#include <zypp/PathInfo.h>
24#include <zypp/base/Exception.h>
25#include <zypp/base/LogTools.h>
34#undef ZYPP_BASE_LOGGER_LOGGROUP
35#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::gpg"
43 inline bool isExpired(
const Date & expires_r )
44 {
return( expires_r && expires_r <
Date::now() ); }
46 inline int hasDaysToLive(
const Date & expires_r )
52 if ( exp < 0 ) ret -= 1;
58 inline std::string expiresDetail(
const Date & expires_r )
64 str <<
_(
"does not expire");
66 else if ( isExpired( expires_r ) )
69 str << ( str::Format(
_(
"expired: %1%") ) % expires_r.printDate() );
74 str << ( str::Format(
_(
"expires: %1%") ) % expires_r.printDate() );
79 inline std::string expiresDetailVerbose(
const Date & expires_r )
83 return _(
"(does not expire)");
85 std::string ret( expires_r.asString() );
86 int ttl( hasDaysToLive( expires_r ) );
92 ret +=
_(
"(EXPIRED)");
96 ret +=
_(
"(expires within 24h)");
100 ret +=
str::form(
PL_(
"(expires in %d day)",
"(expires in %d days)", ttl ), ttl );
106 inline std::string keyAlgoName(
const gpgme_subkey_t & key_r )
109 if (
const char * n = ::gpgme_pubkey_algo_name( key_r->pubkey_algo ) )
110 ret = str::Str() << n <<
' ' << key_r->length;
116 inline bool shorterIsSuffixCI(
const std::string & lhs,
const std::string & rhs )
118 if ( lhs.size() >= rhs.size() )
142 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
149 static shared_ptr<Impl> _nullimpl(
new Impl );
155 return new Impl( *
this );
177 PublicSubkeyData::operator
bool()
const
178 {
return !_pimpl->_id.empty(); }
184 {
return _pimpl->_created; }
187 {
return _pimpl->_expires; }
190 {
return isExpired(
_pimpl->_expires ); }
193 {
return hasDaysToLive(
_pimpl->_expires ); }
217 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
224 static shared_ptr<Impl> _nullimpl(
new Impl );
230 return new Impl( *
this );
253 PublicKeySignatureData::operator
bool()
const
254 {
return !_pimpl->_keyid.empty(); }
257 {
return _pimpl->_keyid; }
263 {
return _pimpl->_created; }
266 {
return _pimpl->_expires; }
269 {
return isExpired(
_pimpl->_expires ); }
272 {
return hasDaysToLive(
_pimpl->_expires ); }
277 if (!
name().empty()) {
281 nameStr =
"[User ID not found] ";
286 <<
" [" << expiresDetail(
expires() ) <<
"]";
290 {
return getZYpp()->keyRing()->isKeyTrusted(
id()); }
293 {
return getZYpp()->keyRing()->isKeyKnown(
id()); }
313 bool hasSubkeyId(
const std::string & id_r )
const;
318 static shared_ptr<Impl>
fromGpgmeKey(gpgme_key_t rawData);
321 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
330 if ( shorterIsSuffixCI( sub.id(), id_r ) ) {
340 static shared_ptr<Impl> _nullimpl(
new Impl );
349 gpgme_subkey_t sKey = rawData->subkeys;
351 shared_ptr<PublicKeyData::Impl> data(
new Impl);
353 if ( rawData->uids && rawData->uids->signatures ) {
354 data->_created =
zypp::Date(rawData->uids->signatures->timestamp);
358 for (
auto t = rawData->uids->signatures->next; t; t = t->next ) {
359 if (t->keyid !=
nullptr) {
363 if ( t->timestamp > data->_created )
364 data->_created = t->timestamp;
372 data->_algoName = keyAlgoName( sKey );
393 return new Impl( *
this );
414 PublicKeyData::operator
bool()
const
415 {
return !_pimpl->_fingerprint.empty(); }
424 {
return _pimpl->_fingerprint; }
427 {
return _pimpl->_algoName; }
430 {
return _pimpl->_created; }
433 {
return _pimpl->_expires; }
436 {
return isExpired(
_pimpl->_expires ); }
439 {
return hasDaysToLive(
_pimpl->_expires ); }
442 {
return expiresDetailVerbose(
_pimpl->_expires ); }
460 for (
auto && sub :
_pimpl->_subkeys )
461 str <<
", " << sub.id();
462 return str <<
"] [" <<
_pimpl->_name.c_str() <<
"] [" << expiresDetail(
_pimpl->_expires ) <<
"]";
466 {
return !
_pimpl->_subkeys.empty(); }
469 {
return makeIterable( &(*
_pimpl->_subkeys.begin()), &(*
_pimpl->_subkeys.end()) ); }
472 {
return makeIterable( &(*
_pimpl->_signatures.begin()), &(*
_pimpl->_signatures.end()) ); }
482 return _pimpl->hasSubkeyId( id_r );
490 str <<
"[" << obj.
name() <<
"]" << endl;
492 str <<
" id " << obj.
id() << endl;
497 for (
auto && sub : obj.
_pimpl->_subkeys )
498 str <<
" sub " << sub << endl;
520 MIL <<
"Taking pubkey from " << keyFile_r <<
" of size " << info.
size() <<
" and sha1 " <<
filesystem::checksum(keyFile_r,
"sha1") << endl;
542 WAR <<
"Invalid PublicKeyData supplied: scanning from file" << endl;
569 switch ( keys.size() )
582 WAR <<
"File " <<
path().
asString() <<
" contains multiple keys: " << keys << endl;
601 static shared_ptr<Impl> _nullimpl(
new Impl );
606 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
609 {
return new Impl( *
this ); }
617 : _pimpl(
Impl::nullimpl() )
621 : _pimpl( new
Impl( file ) )
625 : _pimpl( new
Impl( sharedfile ) )
629 : _pimpl( new
Impl( sharedfile, keyData_r ) )
633 : _pimpl( new
Impl( keyData_r ) )
643 {
return _pimpl->keyData(); }
646 {
return _pimpl->path(); }
649 {
return _pimpl->hiddenKeys(); }
656 if ( keydata.providesKey( id_r ) )
Exception thrown when the supplied key is not a valid gpg key.
Store and operate on date (time_t).
static const ValueType day
static Date now()
Return the current time.
std::string printDate(DateFormat dateFormat_r=DateFormat::calendar, TimeBase base_r=TB_LOCALTIME) const
Convenience for printing the date only ['2014-02-07'] The default is DateFormat::calendar and TB_LOCA...
Base class for Exception.
static KeyManagerCtx createForOpenPGP()
Creates a new KeyManagerCtx for PGP using a volatile temp.
std::list< PublicKeyData > readKeyFromFile(const Pathname &file)
Returns a list of all PublicKeyData found in file.
Class representing one GPG Public Keys data.
Iterable< KeySignatureIterator > signatures() const
Iterate all key signatures.
Date created() const
Creation / last modification date (latest selfsig).
bool expired() const
Whether the key has expired.
std::string name() const
Key name.
Iterable< SubkeyIterator > subkeys() const
Iterate any subkeys.
int daysToLive() const
Number of days (24h) until the key expires (or since it exired).
std::string rpmName() const
Gpg-pubkey name as computed by rpm.
bool hasSubkeys() const
Whether subkeys is not empty.
PublicKeyData()
Default constructed: empty data.
Date expires() const
Expiry date, or Date() if the key never expires.
std::string algoName() const
Key algorithm string like RSA 2048
static bool isSafeKeyId(const std::string &id_r)
Whether this is a long id (64bit/16byte) or even better a fingerprint.
RWCOW_pointer< Impl > _pimpl
bool providesKey(const std::string &id_r) const
Whether id_r is the id or fingerprint of the primary key or of a subkey.
std::string id() const
Key ID.
std::string fingerprint() const
Key fingerprint.
std::string gpgPubkeyRelease() const
Gpg-pubkey release as computed by rpm (hexencoded created)
std::string gpgPubkeyVersion() const
Gpg-pubkey version as computed by rpm (trailing 8 byte id)
static PublicKeyData fromGpgmeKey(_gpgme_key *data)
std::string expiresAsString() const
base::DrunkenBishop AsciiArt
Random art fingerprint visualization type (base::DrunkenBishop).
AsciiArt asciiArt() const
Random art fingerprint visualization (base::DrunkenBishop).
std::string asString() const
Simple string representation.
Class representing a signature on a GPG Public Key.
Date created() const
Creation date.
~PublicKeySignatureData()
std::string asString() const
Simple string representation.
bool inKnownRing() const
Whether the key has been seen before.
PublicKeySignatureData()
Default constructed: empty data.
RWCOW_pointer< Impl > _pimpl
bool inTrustedRing() const
Whether the signature is trusted in rpmdb.
int daysToLive() const
Number of days (24h) until the key expires (or since it expired).
bool expired() const
Whether the key has expired.
std::string id() const
The key ID of key used to create the signature.
std::string name() const
The user ID associated with this key, if present.
Date expires() const
Expiry date, or Date() if the key never expires.
Class representing one GPG Public Key (PublicKeyData + ASCII armored in a tempfile).
Pathname path() const
File containing the ASCII armored key.
std::string expiresAsString() const
bool fileProvidesKey(const std::string &id_r) const
Extends providesKey to look at the hidden keys too.
bool operator==(const PublicKey &rhs) const
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
const std::list< PublicKeyData > & hiddenKeys() const
Additional keys data in case the ASCII armored blob contains multiple keys.
static bool isSafeKeyId(const std::string &id_r)
!<
std::string rpmName() const
const PublicKeyData & keyData() const
The public keys data (.
std::string gpgPubkeyRelease() const
std::string asString() const
std::string fingerprint() const
std::string algoName() const
std::string gpgPubkeyVersion() const
static PublicKey noThrow(const Pathname &keyFile_r)
Static ctor returning an empty PublicKey rather than throwing.
bool providesKey(const std::string &id_r) const
!<
Class representing a GPG Public Keys subkeys.
RWCOW_pointer< Impl > _pimpl
std::string id() const
Subkey ID.
PublicSubkeyData()
Default constructed: empty data.
int daysToLive() const
Number of days (24h) until the key expires (or since it exired).
Date expires() const
Expiry date, or Date() if the key never expires.
std::string asString() const
Simple string representation.
Date created() const
Creation date.
bool expired() const
Whether the key has expired.
Random art fingerprint visualization Visualize fingerprint data on a [17x9] (SSH) or [19x11] (GPG) or...
Wrapper class for stat/lstat.
const Pathname & path() const
Return current Pathname.
bool isExist() const
Return whether valid stat info exists.
const std::string & asString() const
String representation.
Provide a new empty temporary file and delete it when no longer needed.
String related utilities and Regular expression matching.
std::string checksum(const Pathname &file, const std::string &algorithm)
Compute a files checksum.
int hardlinkCopy(const Pathname &oldpath, const Pathname &newpath)
Create newpath as hardlink or copy of oldpath.
const std::string & asString(const std::string &t)
Global asString() that works with std::string too.
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
std::string hexstring(char n, int w=4)
std::string toLower(const std::string &s)
Return lowercase version of s.
bool endsWithCI(const C_Str &str_r, const C_Str &prefix_r)
Easy-to use interface to the ZYPP dependency resolver.
bool operator==(const SetRelation::Enum &lhs, const SetCompare &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
std::ostream & dumpOn(std::ostream &str, const Capability &obj)
PublicKeyData implementation.
static shared_ptr< Impl > fromGpgmeKey(gpgme_key_t rawData)
std::vector< PublicSubkeyData > _subkeys
static shared_ptr< Impl > nullimpl()
Offer default Impl.
Impl * clone() const
clone for RWCOW_pointer
bool hasSubkeyId(const std::string &id_r) const
std::vector< PublicKeySignatureData > _signatures
PublicKeySignatureData implementation.
static shared_ptr< Impl > nullimpl()
Offer default Impl.
Impl * clone() const
clone for RWCOW_pointer
PublicKey implementation.
Impl(const Pathname &keyFile_r)
const PublicKeyData & keyData() const
std::list< PublicKeyData > _hiddenKeys
static shared_ptr< Impl > nullimpl()
Offer default Impl.
Impl(const PublicKeyData &keyData_r)
Impl(const filesystem::TmpFile &sharedFile_r)
Impl(const filesystem::TmpFile &sharedFile_r, const PublicKeyData &keyData_r)
shared_ptr< filesystem::TmpFile > _dontUseThisPtrDirectly
Impl * clone() const
clone for RWCOW_pointer
const std::list< PublicKeyData > & hiddenKeys() const
PublicSubkeyData implementation.
static shared_ptr< Impl > nullimpl()
Offer default Impl.
Impl * clone() const
clone for RWCOW_pointer
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
#define PL_(MSG1, MSG2, N)