14#include <zypp-media/ng/Provide>
15#include <zypp-media/ng/ProvideSpec>
16#include <zypp/ng/Context>
17#include <zypp/ng/repo/Downloader>
30#undef ZYPP_BASE_LOGGER_LOGGROUP
31#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager"
38 template <
class Executor,
class OpType >
39 struct DownloadMasterIndexLogic :
public LogicBase<Executor, OpType>
46 using ProvideType =
typename ZyppContextType::ProvideType;
47 using MediaHandle =
typename ProvideType::MediaHandle;
51 : _dlContext( std::move(ctxRef) )
52 , _media(std::move( mediaHandle ))
53 , _masterIndex(std::move( masterIndex_r ))
57 MaybeAsyncRef<expected<DlContextRefType>> execute( ) {
59 _sigpath = _masterIndex.extend(
".asc" );
60 _keypath = _masterIndex.extend(
".key" );
61 _destdir = _dlContext->destDir();
63 auto providerRef = _dlContext->zyppContext()->provider();
67 |
and_then( ProvideType::copyResultToDest ( providerRef, _destdir / _sigpath ) ),
69 |
and_then( ProvideType::copyResultToDest ( providerRef, _destdir / _keypath ) ),
72 | [
this]( std::vector<expected<zypp::ManagedFile>> &&res ) {
75 std::for_each( res.begin (), res.end(),
78 _dlContext->files().push_back( std::move(f.get()));
86 |
and_then( std::bind( &DownloadMasterIndexLogic::pluginVerification,
this, std::placeholders::_1 ) )
89 |
and_then( std::bind( &DownloadMasterIndexLogic::signatureCheck,
this, std::placeholders::_1 ) )
92 |
and_then( ProvideType::copyResultToDest ( providerRef, _destdir / _masterIndex ) )
97 _dlContext->repoInfo().setMetadataPath( _destdir );
98 _dlContext->repoInfo().setValidRepoSignature( _repoSigValidated );
101 _media = MediaHandle();
102 auto &allFiles = _dlContext->files();
105 allFiles.insert( allFiles.begin (), std::move(masterIndex) );
113 return _dlContext->zyppContext()->provider();
116 MaybeAsyncRef<expected<ProvideRes>> signatureCheck (
ProvideRes &&res ) {
118 if ( _dlContext->repoInfo().repoGpgCheck() ) {
125 if ( isSigned || _dlContext->repoInfo().repoGpgCheckIsMandatory() ) {
131 verifyCtx.signature( sigpathLocal );
136 _dlContext->zyppContext()->keyRing()->importKey(
zypp::PublicKey(keypathLocal),
false );
144 verifyCtx.keyContext( _dlContext->repoInfo() );
146 return getExtraKeysInRepomd( std::move(res ) )
148 for (
const auto &keyData : _buddyKeys ) {
149 DBG <<
"Keyhint remember buddy " << keyData << std::endl;
150 vCtx.addBuddyKey( keyData.id() );
162 WAR <<
"Accept unsigned repository because repoGpgCheck is not mandatory for " << _dlContext->repoInfo().alias() << std::endl;
165 WAR <<
"Signature checking disabled in config of repository " << _dlContext->repoInfo().alias() << std::endl;
175 if ( _dlContext->pluginRepoverification() && _dlContext->pluginRepoverification()->isNeeded() ) {
177 _dlContext->pluginRepoverification()->getChecker( sigpathLocal, keypathLocal, _dlContext->repoInfo() )( prevRes.file() );
189 MaybeAsyncRef<expected<ProvideRes>> getExtraKeysInRepomd (
ProvideRes &&res ) {
191 if ( _masterIndex.basename() !=
"repomd.xml" ) {
196 if ( keyhints.empty() )
198 DBG <<
"Check keyhints: " << keyhints.size() << std::endl;
200 auto keyRing { _dlContext->zyppContext()->keyRing() };
202 |
transform([
this, keyRing]( std::pair<std::string, std::string> val ) {
204 const auto& [ file, keyid ] = val;
205 auto keyData = keyRing->trustedPublicKeyData( keyid );
207 DBG <<
"Keyhint is already trusted: " << keyid <<
" (" << file <<
")" << std::endl;
211 DBG <<
"Keyhint search key " << keyid <<
" (" << file <<
")" << std::endl;
213 keyData = keyRing->publicKeyData( keyid );
218 const zypp::ZConfig & conf = _dlContext->zyppContext()->config();
222 | [ keyid = keyid ](
auto &&key ){
223 if ( key.fileProvidesKey( keyid ) )
229 auto providerRef = _dlContext->zyppContext()->provider();
230 return providerRef->provide( _media, file,
ProvideFileSpec().setOptional(
true) )
231 |
and_then( ProvideType::copyResultToDest( providerRef, _destdir / file ) )
235 _dlContext->files().push_back ( std::move(res) );
238 if ( not key.fileProvidesKey( keyid ) ) {
239 const auto &
str =
zypp::str::Str() <<
"Keyhint " << file <<
" does not contain a key with id " << keyid <<
". Skipping it.";
246 return providerRef->copyFile( key.path(), cacheFile )
250 res->resetDispose ();
257 keyRing->importKey( key,
false );
263 if ( keyData && *keyData ) {
264 if ( not zypp::PublicKey::isSafeKeyId( keyData->id() ) ) {
265 WAR <<
"Keyhint " << keyData->id() <<
" for " << *keyData <<
" is not strong enough for auto import. Just caching it." << std::endl;
268 _buddyKeys.push_back ( std::move(keyData.get()) );
272 MIL <<
"Check keyhints done. Buddy keys: " << _buddyKeys.size() << std::endl;
277 DlContextRefType _dlContext;
286 std::vector<zypp::PublicKeyData> _buddyKeys;
304 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
313 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
321 template <
class DlContextRefType,
class MediaHandleType>
322 auto statusImpl ( DlContextRefType dlCtx, MediaHandleType &&mediaHandle ) {
324 constexpr bool isAsync = std::is_same_v<DlContextRefType,repo::AsyncDownloadContextRef>;
330 switch( dlCtx->repoInfo().type().toEnum()) {
346 return statusImpl( dl, std::move(mediaHandle) );
350 return statusImpl( dl, std::move(mediaHandle) );
355 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
363 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
371 template <
class DlContextRefType,
class MediaHandleType>
372 auto downloadImpl ( DlContextRefType dlCtx, MediaHandleType &&mediaHandle, ProgressObserverRef &&progressObserver ) {
374 constexpr bool isAsync = std::is_same_v<DlContextRefType,repo::AsyncDownloadContextRef>;
376 switch( dlCtx->repoInfo().type().toEnum()) {
378 return RpmmdWorkflows::download( std::move(dlCtx), std::forward<MediaHandleType>(mediaHandle), std::move(progressObserver) );
393 return downloadImpl( dl, std::move(mediaHandle), std::move(progressObserver) );
398 return downloadImpl( dl, std::move(mediaHandle), std::move(progressObserver) );
404 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
406 return downloadImpl( dl, std::move(handle), std::move(po) );
413 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
415 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.
Class representing one GPG Public Key (PublicKeyData + ASCII armored in a tempfile).
static PublicKey noThrow(const Pathname &keyFile_r)
Static ctor returning an empty PublicKey rather than throwing.
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.
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)
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)
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.