17#include <zypp-media/ng/Provide>
18#include <zypp-media/ng/ProvideSpec>
19#include <zypp/ng/Context>
20#include <zypp/ng/repo/Downloader>
21#include <zypp-common/PublicKey.h>
35#undef ZYPP_BASE_LOGGER_LOGGROUP
36#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager"
44 template <
class Executor,
class OpType >
45 struct DownloadMasterIndexLogic :
public LogicBase<Executor, OpType>
52 using ProvideType =
typename ZyppContextType::ProvideType;
53 using MediaHandle =
typename ProvideType::MediaHandle;
57 : _dlContext( std::move(ctxRef) )
58 , _media(std::move( mediaHandle ))
59 , _masterIndex(std::move( masterIndex_r ))
63 MaybeAsyncRef<expected<DlContextRefType>> execute( ) {
67 _sigpath = _masterIndex.extend(
".asc" );
68 _keypath = _masterIndex.extend(
".key" );
69 _destdir = _dlContext->destDir();
71 auto providerRef = _dlContext->zyppContext()->provider();
81 |
and_then( ProvideType::copyResultToDest ( provider(), _destdir / _sigpath ) )
88 _dlContext->files().push_back( std::move(*sigFile) );
92 if ( expKeyId && !_dlContext->zyppContext()->keyRing()->isKeyKnown(*expKeyId) ) {
94 if ( _dlContext->repoInfo().mirrorListUrl().isValid() ) {
97 JobReportHelper( _dlContext->zyppContext() ).
warning(
_(
"Downloading signature key via mirrors, consider explicitely setting gpgKeyUrl via the repository configuration instead."));
102 |
and_then( ProvideType::copyResultToDest ( provider(), _destdir / _keypath ) )
104 _dlContext->files().push_back( std::move(keyFile));
119 |
and_then( std::bind( &DownloadMasterIndexLogic::pluginVerification,
this, std::placeholders::_1 ) )
122 |
and_then( std::bind( &DownloadMasterIndexLogic::signatureCheck,
this, std::placeholders::_1 ) )
125 |
and_then( ProvideType::copyResultToDest ( providerRef, _destdir / _masterIndex ) )
130 _dlContext->repoInfo().setMetadataPath( _destdir );
131 _dlContext->repoInfo().setValidRepoSignature( _repoSigValidated );
134 _media = MediaHandle();
135 auto &allFiles = _dlContext->files();
138 allFiles.insert( allFiles.begin (), std::move(masterIndex) );
146 return _dlContext->zyppContext()->provider();
149 MaybeAsyncRef<expected<ProvideRes>> signatureCheck (
ProvideRes &&res ) {
151 if ( _dlContext->repoInfo().repoGpgCheck() ) {
158 if ( isSigned || _dlContext->repoInfo().repoGpgCheckIsMandatory() ) {
164 verifyCtx.signature( sigpathLocal );
169 _dlContext->zyppContext()->keyRing()->importKey( zypp::PublicKey(keypathLocal),
false );
177 verifyCtx.keyContext( _dlContext->repoInfo() );
179 return getExtraKeysInRepomd( std::move(res ) )
181 for (
const auto &keyData : _buddyKeys ) {
182 DBG <<
"Keyhint remember buddy " << keyData << std::endl;
183 vCtx.addBuddyKey( keyData.id() );
195 WAR <<
"Accept unsigned repository because repoGpgCheck is not mandatory for " << _dlContext->repoInfo().alias() << std::endl;
198 WAR <<
"Signature checking disabled in config of repository " << _dlContext->repoInfo().alias() << std::endl;
209 if ( _dlContext->pluginRepoverification() && _dlContext->pluginRepoverification()->isNeeded() ) {
213 auto kr = _dlContext->zyppContext()->keyRing();
217 MIL <<
"Failed to read signature from file: " << sigpathLocal << std::endl;
219 std::ofstream os( keypathLocal.c_str() );
220 if ( kr->isKeyKnown(*expKeyId) ) {
223 kr->isKeyTrusted(*expKeyId),
230 _dlContext->pluginRepoverification()->getChecker( sigpathLocal, keypathLocal, _dlContext->repoInfo() )( prevRes.file() );
242 MaybeAsyncRef<expected<ProvideRes>> getExtraKeysInRepomd (
ProvideRes &&res ) {
244 if ( _masterIndex.basename() !=
"repomd.xml" ) {
249 if ( keyhints.empty() )
251 DBG <<
"Check keyhints: " << keyhints.size() << std::endl;
253 auto keyRing { _dlContext->zyppContext()->keyRing() };
255 |
transform([
this, keyRing]( std::pair<std::string, std::string> val ) {
257 const auto& [ file, keyid ] = val;
258 auto keyData = keyRing->trustedPublicKeyData( keyid );
260 DBG <<
"Keyhint is already trusted: " << keyid <<
" (" << file <<
")" << std::endl;
264 DBG <<
"Keyhint search key " << keyid <<
" (" << file <<
")" << std::endl;
266 keyData = keyRing->publicKeyData( keyid );
271 const zypp::ZConfig & conf = _dlContext->zyppContext()->config();
274 return zypp::PublicKey::noThrow(cacheFile)
275 | [ keyid = keyid ](
auto &&key ){
276 if ( key.fileProvidesKey( keyid ) )
282 auto providerRef = _dlContext->zyppContext()->provider();
283 return providerRef->provide( _media, file,
ProvideFileSpec().setOptional(
true) )
284 |
and_then( ProvideType::copyResultToDest( providerRef, _destdir / file ) )
288 _dlContext->files().push_back ( std::move(res) );
290 auto key = zypp::PublicKey::noThrow( _dlContext->files().back() );
291 if ( not key.fileProvidesKey( keyid ) ) {
292 const std::string
str = (
zypp::str::Str() <<
"Keyhint " << file <<
" does not contain a key with id " << keyid <<
". Skipping it.");
299 return providerRef->copyFile( key.path(), cacheFile )
303 res->resetDispose ();
309 |
and_then( [ keyRing, keyid = keyid ]( zypp::PublicKey key ){
310 keyRing->importKey( key,
false );
316 if ( keyData && *keyData ) {
317 if ( not zypp::PublicKey::isSafeKeyId( keyData->id() ) ) {
318 WAR <<
"Keyhint " << keyData->id() <<
" for " << *keyData <<
" is not strong enough for auto import. Just caching it." << std::endl;
321 _buddyKeys.push_back ( std::move(keyData.get()) );
325 MIL <<
"Check keyhints done. Buddy keys: " << _buddyKeys.size() << std::endl;
330 DlContextRefType _dlContext;
339 std::vector<zypp::PublicKeyData> _buddyKeys;
357 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
366 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
374 template <
class DlContextRefType,
class MediaHandleType>
375 auto statusImpl ( DlContextRefType dlCtx, MediaHandleType &&mediaHandle ) {
377 constexpr bool isAsync = std::is_same_v<DlContextRefType,repo::AsyncDownloadContextRef>;
383 switch( dlCtx->repoInfo().type().toEnum()) {
399 return statusImpl( dl, std::move(mediaHandle) );
403 return statusImpl( dl, std::move(mediaHandle) );
408 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
416 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
424 template <
class DlContextRefType,
class MediaHandleType>
425 auto downloadImpl ( DlContextRefType dlCtx, MediaHandleType &&mediaHandle, ProgressObserverRef &&progressObserver ) {
427 constexpr bool isAsync = std::is_same_v<DlContextRefType,repo::AsyncDownloadContextRef>;
429 switch( dlCtx->repoInfo().type().toEnum()) {
431 return RpmmdWorkflows::download( std::move(dlCtx), std::forward<MediaHandleType>(mediaHandle), std::move(progressObserver) );
446 return downloadImpl( dl, std::move(mediaHandle), std::move(progressObserver) );
451 return downloadImpl( dl, std::move(mediaHandle), std::move(progressObserver) );
457 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
459 return downloadImpl( dl, std::move(handle), std::move(po) );
466 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
468 return downloadImpl( dl, std::move(handle), std::move(po) );
Interface of repomd.xml file reader.
Store and operate with byte count.
static const Unit MB
1000^2 Byte
Base class for Exception.
std::string readSignatureKeyId(const Pathname &signature)
reads the public key id from a signature
What is known about a repository.
Track changing files or directories.
Interim helper class to collect global options and settings.
Pathname repoManagerRoot() const
The RepoManager root directory.
Pathname pubkeyCachePath() const
Path where the pubkey caches.
Wrapper class for stat/lstat.
bool isExist() const
Return whether valid stat info exists.
Pathname dirname() const
Return all but the last component od this path.
I/O context for KeyRing::verifyFileSignatureWorkflow.
bool fileValidated() const
Whether the signature was actually successfully verified.
Reads through a repomd.xml file and collects type, location, checksum and other data about metadata f...
std::vector< std::pair< std::string, std::string > > keyhints() const
gpg key hits shipped in keywords (bsc#1184326)
thrown when it was impossible to determine this repo type.
bool warning(std::string msg_r, UserData userData_r=UserData())
send warning text
A ProvideRes object is a reference counted ownership of a resource in the cache provided by a Provide...
static expected success(ConsParams &&...params)
static expected error(ConsParams &&...params)
#define ZYPP_ENABLE_LOGIC_BASE(Executor, OpType)
typename conditional< B, T, F >::type conditional_t
String related utilities and Regular expression matching.
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
AutoDispose< const Pathname > ManagedFile
A Pathname plus associated cleanup code to be executed when path is no longer needed.
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
AsyncOpRef< expected< repo::AsyncDownloadContextRef > > download(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver)
AsyncOpRef< expected< zypp::RepoStatus > > repoStatus(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle)
AsyncOpRef< expected< repo::AsyncDownloadContextRef > > download(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver=nullptr)
AsyncOpRef< expected< repo::AsyncDownloadContextRef > > downloadMasterIndex(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, zypp::filesystem::Pathname masterIndex_r)
AsyncOpRef< expected< zypp::RepoStatus > > repoStatus(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle)
expected< void > fetchGpgKeys(SyncContextRef ctx, zypp::RepoInfo info)
AsyncOpRef< expected< repo::AsyncDownloadContextRef > > download(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver)
AsyncOpRef< expected< zypp::RepoStatus > > repoStatus(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle)
expected< zypp::keyring::VerifyFileContext > verifySignature(SyncContextRef ctx, zypp::keyring::VerifyFileContext context)
auto and_then(Fun &&function)
Exp mtry(F &&f, Args &&...args)
std::conditional_t< isAsync, AsyncOpRef< T >, T > makeReadyResult(T &&result)
std::shared_ptr< AsyncOp< T > > AsyncOpRef
typename remove_smart_ptr< T >::type remove_smart_ptr_t
static expected< std::decay_t< Type >, Err > make_expected_success(Type &&t)
LazyMediaHandle< Provide > AsyncLazyMediaHandle
ResultType or_else(const expected< T, E > &exp, Function &&f)
ResultType and_then(const expected< T, E > &exp, Function &&f)
LazyMediaHandle< MediaSyncFacade > SyncLazyMediaHandle
Container< Ret > transform(Container< Msg, CArgs... > &&val, Transformation &&transformation)
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
#define ZYPP_EXCPT_PTR(EXCPT)
Drops a logline and returns Exception as a std::exception_ptr.
#define ZYPP_FWD_CURRENT_EXCPT()
Drops a logline and returns the current Exception as a std::exception_ptr.