14#include <zypp-media/ng/Provide>
15#include <zypp-media/ng/ProvideSpec>
16#include <zypp/ng/Context>
17#include <zypp/ng/repo/Downloader>
35 template <
class Executor,
class OpType >
36 struct DownloadMasterIndexLogic :
public LogicBase<Executor, OpType>
43 using ProvideType =
typename ZyppContextType::ProvideType;
44 using MediaHandle =
typename ProvideType::MediaHandle;
54 MaybeAsyncRef<expected<DlContextRefType>> execute( ) {
60 auto providerRef =
_dlContext->zyppContext()->provider();
64 |
and_then( ProvideType::copyResultToDest ( providerRef, _destdir / _sigpath ) ),
66 |
and_then( ProvideType::copyResultToDest ( providerRef, _destdir / _keypath ) ),
69 | [
this]( std::vector<expected<zypp::ManagedFile>> &&res ) {
72 std::for_each( res.begin (), res.end(),
75 _dlContext->files().push_back( std::move(f.get()));
83 |
and_then( std::bind( &DownloadMasterIndexLogic::pluginVerification,
this, std::placeholders::_1 ) )
86 |
and_then( std::bind( &DownloadMasterIndexLogic::signatureCheck,
this, std::placeholders::_1 ) )
89 |
and_then( ProvideType::copyResultToDest ( providerRef, _destdir / _masterIndex ) )
94 _dlContext->repoInfo().setMetadataPath( _destdir );
95 _dlContext->repoInfo().setValidRepoSignature( _repoSigValidated );
102 allFiles.insert( allFiles.begin (), std::move(masterIndex) );
113 MaybeAsyncRef<expected<ProvideRes>> signatureCheck (
ProvideRes &&res ) {
115 if (
_dlContext->repoInfo().repoGpgCheck() ) {
122 if ( isSigned ||
_dlContext->repoInfo().repoGpgCheckIsMandatory() ) {
128 verifyCtx.signature( sigpathLocal );
141 verifyCtx.keyContext(
_dlContext->repoInfo() );
143 return getExtraKeysInRepomd( std::move(res ) )
146 DBG <<
"Keyhint remember buddy " << keyData << std::endl;
147 vCtx.addBuddyKey( keyData.id() );
159 WAR <<
"Accept unsigned repository because repoGpgCheck is not mandatory for " <<
_dlContext->repoInfo().alias() << std::endl;
162 WAR <<
"Signature checking disabled in config of repository " <<
_dlContext->repoInfo().alias() << std::endl;
172 if (
_dlContext->pluginRepoverification() &&
_dlContext->pluginRepoverification()->isNeeded() ) {
174 _dlContext->pluginRepoverification()->getChecker( sigpathLocal, keypathLocal,
_dlContext->repoInfo() )( prevRes.file() );
186 MaybeAsyncRef<expected<ProvideRes>> getExtraKeysInRepomd (
ProvideRes &&res ) {
193 if ( keyhints.empty() )
195 DBG <<
"Check keyhints: " << keyhints.size() << std::endl;
197 auto keyRing {
_dlContext->zyppContext()->keyRing() };
199 |
transform([
this, keyRing]( std::pair<std::string, std::string> val ) {
201 const auto& [ file, keyid ] = val;
202 auto keyData = keyRing->trustedPublicKeyData( keyid );
204 DBG <<
"Keyhint is already trusted: " << keyid <<
" (" << file <<
")" << std::endl;
208 DBG <<
"Keyhint search key " << keyid <<
" (" << file <<
")" << std::endl;
210 keyData = keyRing->publicKeyData( keyid );
219 | [ keyid = keyid ](
auto &&key ){
220 if ( key.fileProvidesKey( keyid ) )
226 auto providerRef =
_dlContext->zyppContext()->provider();
232 _dlContext->files().push_back ( std::move(res) );
235 if ( not key.fileProvidesKey( keyid ) ) {
236 const auto &
str =
zypp::str::Str() <<
"Keyhint " << file <<
" does not contain a key with id " << keyid <<
". Skipping it.";
243 return providerRef->copyFile( key.path(), cacheFile )
247 res->resetDispose ();
254 keyRing->importKey( key,
false );
260 if ( keyData && *keyData ) {
261 if ( not zypp::PublicKey::isSafeKeyId( keyData->id() ) ) {
262 WAR <<
"Keyhint " << keyData->id() <<
" for " << *keyData <<
" is not strong enough for auto import. Just caching it." << std::endl;
265 _buddyKeys.push_back ( std::move(keyData.get()) );
269 MIL <<
"Check keyhints done. Buddy keys: " <<
_buddyKeys.size() << std::endl;
300 template <
class DlContextRefType,
class MediaHandleType>
301 auto statusImpl ( DlContextRefType dlCtx, MediaHandleType &&mediaHandle ) {
303 constexpr bool isAsync = std::is_same_v<DlContextRefType,repo::AsyncDownloadContextRef>;
309 switch( dlCtx->repoInfo().type().toEnum()) {
311 return RpmmdWorkflows::repoStatus( dlCtx, std::forward<MediaHandleType>(mediaHandle) ) | and_then( std::move(finalizeStatus) );
313 return SuseTagsWorkflows::repoStatus( dlCtx, std::forward<MediaHandleType>(mediaHandle) ) | and_then( std::move(finalizeStatus) );
315 return PlaindirWorkflows::repoStatus ( dlCtx, std::forward<MediaHandleType>(mediaHandle) ) | and_then( std::move(finalizeStatus) );
325 return statusImpl( dl, std::move(mediaHandle) );
329 return statusImpl( dl, std::move(mediaHandle) );
334 template <
class DlContextRefType,
class MediaHandleType>
335 auto downloadImpl ( DlContextRefType dlCtx, MediaHandleType &&mediaHandle, ProgressObserverRef &&progressObserver ) {
337 constexpr bool isAsync = std::is_same_v<DlContextRefType,repo::AsyncDownloadContextRef>;
339 switch( dlCtx->repoInfo().type().toEnum()) {
341 return RpmmdWorkflows::download( std::move(dlCtx), std::forward<MediaHandleType>(mediaHandle), std::move(progressObserver) );
343 return SuseTagsWorkflows::download( std::move(dlCtx), std::forward<MediaHandleType>(mediaHandle), std::move(progressObserver) );
345 return PlaindirWorkflows::download ( std::move(dlCtx), std::forward<MediaHandleType>(mediaHandle) );
356 return downloadImpl( dl, std::move(mediaHandle), std::move(progressObserver) );
361 return downloadImpl( dl, std::move(mediaHandle), std::move(progressObserver) );
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 extend(const std::string &r) const
Append string r to the last component of the path.
Pathname dirname() const
Return all but the last component od this path.
std::string basename() const
Return the last component of 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)
#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'.
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
expected< zypp::keyring::VerifyFileContext > verifySignature(SyncContextRef ctx, zypp::keyring::VerifyFileContext context)
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)
ResultType or_else(const expected< T, E > &exp, Function &&f)
ResultType and_then(const expected< T, E > &exp, Function &&f)
Container< Ret > transform(Container< Msg, CArgs... > &&val, Transformation &&transformation)
zypp::Pathname _masterIndex
std::vector< zypp::PublicKeyData > _buddyKeys
zypp::TriBool _repoSigValidated
DlContextRefType _dlContext
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.