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> 26 #include <zypp/Date.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(); }
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(); }
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(); }
461 str <<
", " << sub.id();
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 ) )
656 if ( keydata.providesKey( id_r ) )
std::string asString() const
Simple string representation.
static const ValueType day
PublicKeySignatureData()
Default constructed: empty data.
static shared_ptr< Impl > nullimpl()
Offer default Impl.
Impl(const filesystem::TmpFile &sharedFile_r, const PublicKeyData &keyData_r)
static bool isSafeKeyId(const std::string &id_r)
Whether this is a long id (64bit/16byte) or even better a fingerprint.
int daysToLive() const
Number of days (24h) until the key expires (or since it exired).
std::list< PublicKeyData > readKeyFromFile(const Pathname &file)
Returns a list of all PublicKeyData found in file.
const Pathname & path() const
Return current Pathname.
const std::list< PublicKeyData > & hiddenKeys() const
Additional keys data in case the ASCII armored blob contains multiple keys.
std::list< PublicKeyData > _hiddenKeys
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
const PublicKeyData & keyData() const
The public keys data (.
static shared_ptr< Impl > nullimpl()
Offer default Impl.
Iterable< KeySignatureIterator > signatures() const
Iterate all key signatures.
RWCOW_pointer< Impl > _pimpl
std::string gpgPubkeyRelease() const
Gpg-pubkey release as computed by rpm (hexencoded created)
PublicSubkeyData implementation.
bool fileProvidesKey(const std::string &id_r) const
Extends providesKey to look at the hidden keys too.
Class representing one GPG Public Keys data.
bool expired() const
Whether the key has expired.
std::string asString() const
Simple string representation.
const PublicKeyData & keyData() const
Exception thrown when the supplied key is not a valid gpg key.
std::string algoName() const
Key algorithm string like RSA 2048
PublicSubkeyData()
Default constructed: empty data.
std::string name() const
Key name.
String related utilities and Regular expression matching.
RWCOW_pointer< Impl > _pimpl
const std::string & asString(const std::string &t)
Global asString() that works with std::string too.
std::string asString() const
Simple string representation.
Date created() const
Creation date.
static shared_ptr< Impl > nullimpl()
Offer default Impl.
static KeyManagerCtx createForOpenPGP()
Creates a new KeyManagerCtx for PGP using a volatile temp.
bool operator==(const SetRelation::Enum &lhs, const SetCompare &rhs)
Provide a new empty temporary file and delete it when no longer needed.
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Iterable< SubkeyIterator > subkeys() const
Iterate any subkeys.
Date expires() const
Expiry date, or Date() if the key never expires.
PublicKeyData()
Default constructed: empty data.
PublicKeySignatureData implementation.
bool inTrustedRing() const
Whether the signature is trusted in rpmdb.
bool endsWithCI(const C_Str &str_r, const C_Str &prefix_r)
std::string expiresAsString() const
std::string gpgPubkeyVersion() const
Gpg-pubkey version as computed by rpm (trailing 8 byte id)
const std::list< PublicKeyData > & hiddenKeys() const
std::string id() const
Subkey ID.
bool operator==(const PublicKey &rhs) const
std::string expiresAsString() const
int daysToLive() const
Number of days (24h) until the key expires (or since it exired).
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
std::string rpmName() const
Gpg-pubkey name as computed by rpm.
Store and operate on date (time_t).
Date created() const
Creation / last modification date (latest selfsig).
bool expired() const
Whether the key has expired.
base::DrunkenBishop AsciiArt
Random art fingerprint visualization type (base::DrunkenBishop).
std::string name() const
The user ID associated with this key, if present.
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
Impl(const Pathname &keyFile_r)
std::string gpgPubkeyVersion() const
std::string rpmName() const
const std::string & asString() const
String representation.
bool isExist() const
Return whether valid stat info exists.
Impl * clone() const
clone for RWCOW_pointer
bool providesKey(const std::string &id_r) const
!<
int hardlinkCopy(const Pathname &oldpath, const Pathname &newpath)
Create newpath as hardlink or copy of oldpath.
bool inKnownRing() const
Whether the key has been seen before.
shared_ptr< filesystem::TmpFile > _dontUseThisPtrDirectly
static shared_ptr< Impl > nullimpl()
Offer default Impl.
std::ostream & dumpOn(std::ostream &str, const Capability &obj)
int daysToLive() const
Number of days (24h) until the key expires (or since it expired).
Impl * clone() const
clone for RWCOW_pointer
std::string toLower(const std::string &s)
Return lowercase version of s.
Impl(const PublicKeyData &keyData_r)
Date created() const
Creation date.
Impl * clone() const
clone for RWCOW_pointer
PublicKey implementation.
std::string fingerprint() const
Key fingerprint.
bool expired() const
Whether the key has expired.
std::string gpgPubkeyRelease() const
Class representing a GPG Public Keys subkeys.
Class representing one GPG Public Key (PublicKeyData + ASCII armored in a tempfile).
Date expires() const
Expiry date, or Date() if the key never expires.
AsciiArt asciiArt() const
Random art fingerprint visualization (base::DrunkenBishop).
Base class for Exception.
static bool isSafeKeyId(const std::string &id_r)
!<
Pathname path() const
File containing the ASCII armored key.
std::string id() const
Key ID.
Impl(const filesystem::TmpFile &sharedFile_r)
static Date now()
Return the current time.
std::string checksum(const Pathname &file, const std::string &algorithm)
Compute a files checksum.
RWCOW_pointer< Impl > _pimpl
#define PL_(MSG1, MSG2, N)
std::string fingerprint() const
std::string asString() const
PublicKeyData implementation.
Wrapper class for ::stat/::lstat.
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...
static shared_ptr< Impl > fromGpgmeKey(gpgme_key_t rawData)
bool hasSubkeyId(const std::string &id_r) const
static PublicKey noThrow(const Pathname &keyFile_r)
Static ctor returning an empty PublicKey rather than throwing.
std::vector< PublicKeySignatureData > _signatures
static PublicKeyData fromGpgmeKey(_gpgme_key *data)
std::vector< PublicSubkeyData > _subkeys
Easy-to use interface to the ZYPP dependency resolver.
bool providesKey(const std::string &id_r) const
Whether id_r is the id or fingerprint of the primary key or of a subkey.
Class representing a signature on a GPG Public Key.
Date expires() const
Expiry date, or Date() if the key never expires.
std::string hexstring(char n, int w=4)
std::string algoName() const
std::string id() const
The key ID of key used to create the signature.
bool hasSubkeys() const
Whether subkeys is not empty.
Impl * clone() const
clone for RWCOW_pointer
Random art fingerprint visualization Visualize fingerprint data on a [17x9] (SSH) or [19x11] (GPG) or...
~PublicKeySignatureData()