libzypp 17.38.15
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 {
144 Present = 0,
145 Missing = 1,
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:
184 {
185 public:
187 SendKeys( KeyRingImpl & keyRing, const Pathname & source, const Pathname & target );
189 SendKeys( KeyRingImpl & keyRing, const Ring source, const Ring target );
190 SendKeys( const SendKeys & ) = delete;
191 SendKeys( SendKeys && ) = delete;
192 SendKeys & operator=( const SendKeys & ) = delete;
193 SendKeys & operator=( SendKeys && ) = delete;
194
198 void operator()( const std::string & id );
199
200 private:
203 };
204
205 private:
206 const Pathname keyRingPath( const Ring ring ) const
207 { return ring == Ring::General ? _general_tmp_dir.path() : _trusted_tmp_dir.path(); }
208
209 void importKey( const Pathname & keyfile, const Pathname & keyring );
210
211 PublicKey exportKey( const std::string & id, const Pathname & keyring ) const;
212 PublicKey exportKey( const PublicKeyData & keyData, const Pathname & keyring ) const;
213
214 void deleteKey( const std::string & id, const Pathname & keyring );
215
216 PublicKeyData publicKeyData( const std::string & id, const Pathname & keyring ) const;
217
218 const std::list<PublicKeyData> & publicKeyData( const Pathname & keyring ) const
219 {
220 if ( _allowPreload && keyring == keyRingPath( Ring::General ) ) {
221 KeyRingImpl * lazyinit = const_cast<KeyRingImpl*>(this);
222 lazyinit->_allowPreload = false;
223 lazyinit->preloadCachedKeys();
224 }
226 }
227
228 std::list<PublicKey> publicKeys( const Pathname & keyring ) const;
229
230 void dumpPublicKey( const std::string & id, const Pathname & keyring, std::ostream & stream ) const;
231 filesystem::TmpFile dumpPublicKeyToTmp( const std::string & id, const Pathname & keyring ) const;
232
233 bool verifyFile( const Pathname & file, const Pathname & signature, const Pathname & keyring );
234
235 private:
237 void preloadCachedKeys();
238
242
243 private:
244 // Used for trusted and untrusted keyrings
248 bool _allowPreload = false; //< General keyring may be preloaded with keys cached on the system.
249
256
259 };
260
261 inline std::ostream & operator<<( std::ostream & str, KeyRingImpl::Ring ring )
262 { return str << ( ring == KeyRingImpl::Ring::General ? "generalKeyRing" : "trustedKeyRing" ); }
263
264 inline std::ostream & operator<<( std::ostream & str, KeyRingImpl::MustUpdate flag )
265 { return str << ( flag == KeyRingImpl::MustUpdate::Present ? "=" : flag == KeyRingImpl::MustUpdate::Missing ? "+" : ">" ); }
266}
267
268
269#endif
void operator()(const std::string &id)
Transfer key with id from source to target keyring.
Definition keyring_p.cc:121
SendKeys & operator=(const SendKeys &)=delete
SendKeys(SendKeys &&)=delete
SendKeys & operator=(SendKeys &&)=delete
SendKeys(KeyRingImpl &keyRing, const Pathname &source, const Pathname &target)
Ctor creates the context for reading source and writing target.
Definition keyring_p.cc:112
SendKeys(const SendKeys &)=delete
CachedPublicKeyData::Manip _target
Definition keyring_p.h:202
zyppng::Signal< void(const PublicKey &)> _sigTrustedKeyAdded
Definition keyring_p.h:257
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:140
const std::list< PublicKeyData > & publicKeyData(const Pathname &keyring) const
Definition keyring_p.h:218
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:320
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:246
bool verifyFile(const Pathname &file, const Pathname &signature, const Ring ring)
Definition keyring_p.h:130
KeyRingImpl(const Pathname &baseTmpDir)
Definition keyring_p.cc:132
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:351
void multiKeyImport(const Pathname &keyfile_r, const Ring ring)
Used by RpmDB to import the trusted keys.
Definition keyring_p.cc:224
zyppng::Signal< void(const PublicKey &)> _sigTrustedKeyRemoved
Definition keyring_p.h:258
const Pathname keyRingPath(const Ring ring) const
Definition keyring_p.h:206
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:230
PublicKey exportKey(const std::string &id, const Ring ring) const
Definition keyring_p.h:118
Pathname _base_dir
Definition keyring_p.h:247
const std::list< PublicKeyData > & publicKeyData(const Ring ring) const
Definition keyring_p.h:174
std::string readSignatureKeyId(const Pathname &signature)
Definition keyring_p.cc:331
void importKeys(const std::list< PublicKey > &keys, const Ring ring)
Definition keyring_p.cc:217
CachedPublicKeyData::Manip keyRingManip(const Pathname &keyring)
Impl helper providing on demand a KeyManagerCtx to manip a cached keyring.
Definition keyring_p.h:240
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:245
CachedPublicKeyData cachedPublicKeyData
Functor returning the keyrings data (cached).
Definition keyring_p.h:255
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:287
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:378
const PublicKeyData & keyData() const
The public keys data (.
Definition PublicKey.cc:640
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
Pathname path() const
Definition TmpPath.cc:124
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
@ Update
Focus on updating requested packages and their dependencies as much as possible.
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