libzypp 17.38.6
keyring_p.h
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
12#ifndef ZYPP_PRIVATE_KEYRINGIMPL_H
13#define ZYPP_PRIVATE_KEYRINGIMPL_H
14
17#include <zypp-core/fs/WatchFile>
20#include <optional>
21
22namespace zypp {
23
24
33 {
34 const std::list<PublicKeyData> & operator()( const Pathname & keyring_r ) const;
35
36 void setDirty( const Pathname & keyring_r );
37
44 struct Manip {
46 Manip( CachedPublicKeyData & cache_r, Pathname keyring_r );
47
49 private:
52 std::optional<KeyManagerCtx> _context;
53 };
54
55
57 Manip manip( Pathname keyring_r );
58
59 private:
60 struct Cache
61 {
62 Cache();
63
64 void setDirty();
65
66 void assertCache( const Pathname & keyring_r );
67
68 bool hasChanged() const;
69
70 std::list<PublicKeyData> _data;
71
72 private:
73
76 };
77
78 using CacheMap = std::map<Pathname, Cache>;
79
80 const std::list<PublicKeyData> & getData( const Pathname & keyring_r ) const;
81
82 const std::list<PublicKeyData> & getData( const Pathname & keyring_r, Cache & cache_r ) const;
83
85 };
86
91 {
92 public:
93 enum class Ring : bool {
94 General = false,
95 Trusted = true,
96 };
97
99 { return _sigTrustedKeyAdded; }
100
103
104 public:
105 KeyRingImpl( const Pathname & baseTmpDir );
106
107 public:
108 void allowPreload( bool yesno_r ) //< General keyring may be preloaded with keys cached on the system.
109 { _allowPreload = yesno_r; }
110
115 void importKey ( const PublicKey & key, const Ring ring );
116 void importKeys( const std::list<PublicKey> & keys, const Ring ring );
117
118 PublicKey exportKey( const std::string & id, const Ring ring ) const
119 { return exportKey( id, keyRingPath( ring ) ); }
120 PublicKey exportKey( const PublicKeyData & keyData, const Ring ring ) const
121 { return exportKey( keyData, keyRingPath( ring ) ); }
122 PublicKey exportKey( const PublicKey & key, const Ring ring ) const
123 { return exportKey( key.keyData(), ring ); }
124
125 void deleteKey( const std::string & id, const Ring ring );
126
127 void dumpPublicKey( const std::string & id, const Ring ring, std::ostream & stream )
128 { dumpPublicKey( id, keyRingPath( ring ), stream ); }
129
130 bool verifyFile( const Pathname & file, const Pathname & signature, const Ring ring )
131 { return verifyFile( file, signature, keyRingPath( ring ) ); }
132
133 std::string readSignatureKeyId( const Pathname & signature );
134
140 void multiKeyImport( const Pathname & keyfile_r, const Ring ring );
141
142 public:
143 enum class MustUpdate {
146 Update = 2,
147 };
148
149 MustUpdate mustUpdateData( const PublicKeyData & keyData, const Ring ring ) const
150 {
151 PublicKeyData ringKeyData { publicKeyData( keyData, ring ) };
152 if ( not ringKeyData ) {
153 return MustUpdate::Missing;
154 }
155 if ( keyData.isUpdateFor( ringKeyData ) ) {
156 return MustUpdate::Update;
157 }
158 return MustUpdate::Present;
159 }
160
161 bool isKeyTrusted( const std::string & id ) const
162 { return bool(publicKeyData( id, Ring::Trusted )); }
163
164 bool isKeyKnown( const std::string & id ) const
165 { return publicKeyData( id, Ring::Trusted ) || publicKeyData( id, Ring::General ); }
166
167 PublicKeyData publicKeyData( const std::string & id, const Ring ring ) const
168 { return publicKeyData( id, keyRingPath( ring ) ); }
169 PublicKeyData publicKeyData( const PublicKeyData & keyData, const Ring ring ) const
170 { return publicKeyData( keyData.id(), ring ); }
171 PublicKeyData publicKeyData( const PublicKey & key, const Ring ring ) const
172 { return publicKeyData( key.keyData().id(), ring ); }
173
174 const std::list<PublicKeyData> & publicKeyData( const Ring ring ) const
175 { return publicKeyData( keyRingPath( ring ) ); }
176
177 std::list<PublicKey> publicKeys( const Ring ring ) const
178 { return publicKeys( keyRingPath( ring ) ); }
179
180
181 private:
182 const Pathname keyRingPath( const Ring ring ) const
183 { return ring == Ring::General ? _general_tmp_dir.path() : _trusted_tmp_dir.path(); }
184
185 void importKey( const Pathname & keyfile, const Pathname & keyring );
186
187 PublicKey exportKey( const std::string & id, const Pathname & keyring ) const;
188 PublicKey exportKey( const PublicKeyData & keyData, const Pathname & keyring ) const;
189
190 void deleteKey( const std::string & id, const Pathname & keyring );
191
192 PublicKeyData publicKeyData( const std::string & id, const Pathname & keyring ) const;
193
194 const std::list<PublicKeyData> & publicKeyData( const Pathname & keyring ) const
195 {
196 if ( _allowPreload && keyring == keyRingPath( Ring::General ) ) {
197 KeyRingImpl * lazyinit = const_cast<KeyRingImpl*>(this);
198 lazyinit->_allowPreload = false;
199 lazyinit->preloadCachedKeys();
200 }
202 }
203
204 std::list<PublicKey> publicKeys( const Pathname & keyring ) const;
205
206 void dumpPublicKey( const std::string & id, const Pathname & keyring, std::ostream & stream ) const;
207 filesystem::TmpFile dumpPublicKeyToTmp( const std::string & id, const Pathname & keyring ) const;
208
209 bool verifyFile( const Pathname & file, const Pathname & signature, const Pathname & keyring );
210
211 private:
213 void preloadCachedKeys();
214
218
219 private:
220 // Used for trusted and untrusted keyrings
224 bool _allowPreload = false; //< General keyring may be preloaded with keys cached on the system.
225
232
235 };
236
237 inline std::ostream & operator<<( std::ostream & str, KeyRingImpl::Ring ring )
238 { return str << ( ring == KeyRingImpl::Ring::General ? "generalKeyRing" : "trustedKeyRing" ); }
239
240 inline std::ostream & operator<<( std::ostream & str, KeyRingImpl::MustUpdate flag )
241 { return str << ( flag == KeyRingImpl::MustUpdate::Present ? "=" : flag == KeyRingImpl::MustUpdate::Missing ? "+" : ">" ); }
242}
243
244
245#endif
zyppng::Signal< void(const PublicKey &)> _sigTrustedKeyAdded
Definition keyring_p.h:233
std::list< PublicKey > publicKeys(const Ring ring) const
Definition keyring_p.h:177
@ Update
old version of Key is in Ring
Definition keyring_p.h:146
@ Missing
Key is not in Ring.
Definition keyring_p.h:145
void importKey(const PublicKey &key, const Ring ring)
Import PublicKeys into a Ring.
Definition keyring_p.cc:120
const std::list< PublicKeyData > & publicKeyData(const Pathname &keyring) const
Definition keyring_p.h:194
zyppng::SignalProxy< void(const PublicKey &)> sigTrustedKeyRemoved()
Definition keyring_p.h:101
filesystem::TmpFile dumpPublicKeyToTmp(const std::string &id, const Pathname &keyring) const
Definition keyring_p.cc:299
PublicKeyData publicKeyData(const PublicKeyData &keyData, const Ring ring) const
Definition keyring_p.h:169
MustUpdate mustUpdateData(const PublicKeyData &keyData, const Ring ring) const
Helper computing PublicKeyData's status in a Ring.
Definition keyring_p.h:149
bool isKeyKnown(const std::string &id) const
Definition keyring_p.h:164
PublicKey exportKey(const PublicKey &key, const Ring ring) const
Definition keyring_p.h:122
void allowPreload(bool yesno_r)
Definition keyring_p.h:108
filesystem::TmpDir _general_tmp_dir
Definition keyring_p.h:222
bool verifyFile(const Pathname &file, const Pathname &signature, const Ring ring)
Definition keyring_p.h:130
KeyRingImpl(const Pathname &baseTmpDir)
Definition keyring_p.cc:112
PublicKeyData publicKeyData(const std::string &id, const Ring ring) const
Definition keyring_p.h:167
void preloadCachedKeys()
Load key files cached on the system into the generalKeyRing.
Definition keyring_p.cc:330
void multiKeyImport(const Pathname &keyfile_r, const Ring ring)
Used by RpmDB to import the trusted keys.
Definition keyring_p.cc:203
zyppng::Signal< void(const PublicKey &)> _sigTrustedKeyRemoved
Definition keyring_p.h:234
const Pathname keyRingPath(const Ring ring) const
Definition keyring_p.h:182
PublicKey exportKey(const PublicKeyData &keyData, const Ring ring) const
Definition keyring_p.h:120
void deleteKey(const std::string &id, const Ring ring)
Definition keyring_p.cc:209
PublicKey exportKey(const std::string &id, const Ring ring) const
Definition keyring_p.h:118
Pathname _base_dir
Definition keyring_p.h:223
const std::list< PublicKeyData > & publicKeyData(const Ring ring) const
Definition keyring_p.h:174
std::string readSignatureKeyId(const Pathname &signature)
Definition keyring_p.cc:310
void importKeys(const std::list< PublicKey > &keys, const Ring ring)
Definition keyring_p.cc:196
CachedPublicKeyData::Manip keyRingManip(const Pathname &keyring)
Impl helper providing on demand a KeyManagerCtx to manip a cached keyring.
Definition keyring_p.h:216
bool isKeyTrusted(const std::string &id) const
Definition keyring_p.h:161
void dumpPublicKey(const std::string &id, const Ring ring, std::ostream &stream)
Definition keyring_p.h:127
PublicKeyData publicKeyData(const PublicKey &key, const Ring ring) const
Definition keyring_p.h:171
zyppng::SignalProxy< void(const PublicKey &)> sigTrustedKeyAdded()
Definition keyring_p.h:98
filesystem::TmpDir _trusted_tmp_dir
Definition keyring_p.h:221
CachedPublicKeyData cachedPublicKeyData
Functor returning the keyrings data (cached).
Definition keyring_p.h:231
Class representing one GPG Public Keys data.
Definition PublicKey.h:201
bool isUpdateFor(const PublicKeyData &rhs) const
Whether this could replace rhs in a keyring.
Definition PublicKey.h:284
std::string id() const
Key ID.
Definition PublicKey.cc:412
Class representing one GPG Public Key (PublicKeyData + ASCII armored in a tempfile).
Definition PublicKey.h:375
const PublicKeyData & keyData() const
The public keys data (.
Definition PublicKey.cc:637
Provide a new empty temporary directory and recursively delete it when no longer needed.
Definition TmpPath.h:173
Provide a new empty temporary file and delete it when no longer needed.
Definition TmpPath.h:118
String related utilities and Regular expression matching.
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition NonCopyable.h:26
Easy-to use interface to the ZYPP dependency resolver.
KeyRingImpl::Ring Ring
Definition KeyRing.cc:172
std::ostream & operator<<(std::ostream &str, const Capabilities &obj)
relates: Capabilities Stream output
scoped_ptr< WatchFile > _keyringP
Definition keyring_p.h:75
void assertCache(const Pathname &keyring_r)
Definition keyring_p.cc:70
std::list< PublicKeyData > _data
Definition keyring_p.h:70
scoped_ptr< WatchFile > _keyringK
Definition keyring_p.h:74
Helper providing on demand a KeyManagerCtx to manip the cached keyring.
Definition keyring_p.h:44
std::optional< KeyManagerCtx > _context
Definition keyring_p.h:52
KeyManagerCtx & keyManagerCtx()
Definition keyring_p.cc:51
Manip(CachedPublicKeyData &cache_r, Pathname keyring_r)
Definition keyring_p.cc:46
CachedPublicKeyData & _cache
Definition keyring_p.h:50
Functor returning the keyrings data (cached).
Definition keyring_p.h:33
void setDirty(const Pathname &keyring_r)
Definition keyring_p.cc:89
const std::list< PublicKeyData > & operator()(const Pathname &keyring_r) const
Definition keyring_p.cc:86
const std::list< PublicKeyData > & getData(const Pathname &keyring_r) const
Definition keyring_p.cc:94
Manip manip(Pathname keyring_r)
Helper providing on demand a KeyManagerCtx to manip the cached keyring.
Definition keyring_p.cc:92
std::map< Pathname, Cache > CacheMap
Definition keyring_p.h:78