15 #include <zypp-media/ng/ProvideSpec> 20 #include <zypp/ng/Context> 21 #include <zypp/ng/media/Provide> 22 #include <zypp/ng/repo/Downloader> 36 #undef ZYPP_BASE_LOGGER_LOGGROUP 37 #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager" 45 struct DownloadMasterIndexLogic
51 DownloadMasterIndexLogic( repo::DownloadContextRef &&ctxRef, MediaHandle &&mediaHandle,
zypp::filesystem::Pathname &&masterIndex_r )
53 ,
_media(std::move( mediaHandle ))
58 MaybeAwaitable<expected<repo::DownloadContextRef>> execute( ) {
66 auto providerRef =
_dlContext->zyppContext()->provider();
78 | [
this]( expected<zypp::ManagedFile> sigFile ) {
83 _dlContext->files().push_back( std::move(*sigFile) );
87 if ( expKeyId && !
_dlContext->zyppContext()->keyRing()->isKeyKnown(*expKeyId) ) {
89 bool needsMirrorToFetchKey =
_dlContext->repoInfo().baseUrlsEmpty() &&
_dlContext->repoInfo().mirrorListUrl().isValid() ;
90 if ( needsMirrorToFetchKey ) {
93 JobReportHelper(
_dlContext->zyppContext() ).warning(
_(
"Downloading signature key via mirrors, consider explicitely setting gpgKeyUrl via the repository configuration instead."));
100 _dlContext->files().push_back( std::move(keyFile));
109 | [masterres=std::move(masterres)]( expected<void> ) {
115 |
and_then( std::bind( &DownloadMasterIndexLogic::pluginVerification,
this, std::placeholders::_1 ) )
118 |
and_then( std::bind( &DownloadMasterIndexLogic::signatureCheck,
this, std::placeholders::_1 ) )
134 allFiles.insert( allFiles.begin (), std::move(masterIndex) );
141 ProvideRef provider () {
145 MaybeAwaitable<expected<ProvideRes>> signatureCheck (
ProvideRes &&res ) {
147 if (
_dlContext->repoInfo().repoGpgCheck() ) {
154 if ( isSigned ||
_dlContext->repoInfo().repoGpgCheckIsMandatory() ) {
173 verifyCtx.keyContext(
_dlContext->repoInfo() );
175 return getExtraKeysInRepomd( std::move(res ) )
178 DBG <<
"Keyhint remember buddy " << keyData << std::endl;
179 vCtx.addBuddyKey( keyData.id() );
191 WAR <<
"Accept unsigned repository because repoGpgCheck is not mandatory for " <<
_dlContext->repoInfo().alias() << std::endl;
194 WAR <<
"Signature checking disabled in config of repository " <<
_dlContext->repoInfo().alias() << std::endl;
200 expected<ProvideRes> pluginVerification (
ProvideRes &&prevRes ) {
205 if (
_dlContext->pluginRepoverification() &&
_dlContext->pluginRepoverification()->isNeeded() ) {
209 auto kr =
_dlContext->zyppContext()->keyRing();
213 MIL <<
"Failed to read signature from file: " << sigpathLocal << std::endl;
215 std::ofstream os( keypathLocal.c_str() );
216 if ( kr->isKeyKnown(*expKeyId) ) {
219 kr->isKeyTrusted(*expKeyId),
226 _dlContext->pluginRepoverification()->getChecker( sigpathLocal, keypathLocal,
_dlContext->repoInfo() )( prevRes.file() );
238 MaybeAwaitable<expected<ProvideRes>> getExtraKeysInRepomd (
ProvideRes &&res ) {
245 if ( keyhints.empty() )
247 DBG <<
"Check keyhints: " << keyhints.size() << std::endl;
249 auto keyRing {
_dlContext->zyppContext()->keyRing() };
251 |
transform( [
this, keyRing]( std::pair<std::string, std::string> val ) {
253 const auto& [ file, keyid ] = val;
254 auto keyData = keyRing->trustedPublicKeyData( keyid );
256 DBG <<
"Keyhint is already trusted: " << keyid <<
" (" << file <<
")" << std::endl;
260 DBG <<
"Keyhint search key " << keyid <<
" (" << file <<
")" << std::endl;
262 keyData = keyRing->publicKeyData( keyid );
271 | [ keyid = keyid ](
auto &&key ){
272 if ( key.fileProvidesKey( keyid ) )
277 |
or_else ([
this, file = file, keyid = keyid, cacheFile ] (
auto )
mutable -> MaybeAwaitable<expected<zypp::PublicKey>> {
278 auto providerRef =
_dlContext->zyppContext()->provider();
279 return providerRef->provide(
_media, file, ProvideFileSpec().setOptional(
true).setMirrorsAllowed(
false) )
284 _dlContext->files().push_back ( std::move(res) );
287 if ( not key.fileProvidesKey( keyid ) ) {
288 const std::string
str = (
zypp::str::Str() <<
"Keyhint " << file <<
" does not contain a key with id " << keyid <<
". Skipping it.");
295 return providerRef->copyFile( key.path(), cacheFile )
296 | [ key ]( expected<zypp::ManagedFile> res )
mutable {
299 res->resetDispose ();
306 keyRing->importKey( key,
false );
310 | [
this, res = res] ( std::vector<expected<zypp::PublicKeyData>> &&keyHints )
mutable {
311 std::for_each( keyHints.begin(), keyHints.end(), [
this]( expected<zypp::PublicKeyData> &keyData ){
312 if ( keyData && *keyData ) {
314 WAR <<
"Keyhint " << keyData->id() <<
" for " << *keyData <<
" is not strong enough for auto import. Just caching it." << std::endl;
317 _buddyKeys.push_back ( std::move(keyData.get()) );
321 MIL <<
"Check keyhints done. Buddy keys: " <<
_buddyKeys.size() << std::endl;
342 DownloadMasterIndexLogic impl( std::move(dl), std::move(mediaHandle), std::move(masterIndex_r) );
343 zypp_co_return zypp_co_await( impl.execute() );
349 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
357 auto statusImpl ( repo::DownloadContextRef dlCtx,
ProvideMediaHandle &&mediaHandle ) {
362 switch( dlCtx->repoInfo().type().toEnum()) {
378 return statusImpl( dl, std::move(mediaHandle) );
383 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
390 auto downloadImpl ( repo::DownloadContextRef dlCtx,
ProvideMediaHandle &&mediaHandle, ProgressObserverRef &&progressObserver ) {
391 switch( dlCtx->repoInfo().type().toEnum()) {
393 return RpmmdWorkflows::download( std::move(dlCtx), std::forward<ProvideMediaHandle>(mediaHandle), std::move(progressObserver) );
395 return SuseTagsWorkflows::download( std::move(dlCtx), std::forward<ProvideMediaHandle>(mediaHandle), std::move(progressObserver) );
408 return downloadImpl( dl, std::move(mediaHandle), std::move(progressObserver) );
414 return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle )
416 return downloadImpl( dl, std::move(handle), std::move(po) );
auto mtry(Fun &&function)
thrown when it was impossible to determine this repo type.
auto transform(Transformation &&transformation)
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
MaybeAwaitable< expected< repo::DownloadContextRef > > downloadMasterIndex(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle, zypp::filesystem::Pathname masterIndex_r)
MaybeAwaitable< expected< void > > fetchGpgKeys(ContextRef ctx, zypp::RepoInfo info)
Store and operate with byte count.
Pathname pubkeyCachePath() const
Path where the pubkey caches.
Pathname extend(const std::string &r) const
Append string r to the last component of the path.
zypp::Pathname _masterIndex
String related utilities and Regular expression matching.
zypp::TriBool _repoSigValidated
What is known about a repository.
static expected< std::decay_t< Type >, Err > make_expected_success(Type &&t)
I/O context for KeyRing::verifyFileSignatureWorkflow.
static const Unit MB
1000^2 Byte
std::string basename() const
Return the last component of this path.
repo::DownloadContextRef _dlContext
#define ZYPP_EXCPT_PTR(EXCPT)
Drops a logline and returns Exception as a std::exception_ptr.
MaybeAwaitable< expected< repo::DownloadContextRef > > download(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver)
MaybeAwaitable< expected< repo::DownloadContextRef > > download(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver)
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
Pathname repoManagerRoot() const
The RepoManager root directory.
auto or_else(Fun &&function)
const Pathname & signature() const
Detached signature or empty.
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
bool isExist() const
Return whether valid stat info exists.
Pathname dirname() const
Return all but the last component od this path.
Interim helper class to collect global options and settings.
ProvideMediaHandle MediaHandle
MaybeAwaitable< expected< zypp::keyring::VerifyFileContext > > verifySignature(ContextRef ctx, zypp::keyring::VerifyFileContext context)
static expected success(ConsParams &&...params)
MaybeAwaitable< expected< zypp::RepoStatus > > repoStatus(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle)
MaybeAwaitable< expected< repo::DownloadContextRef > > download(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver=nullptr)
Class representing one GPG Public Key (PublicKeyData + ASCII armored in a tempfile).
Reads through a repomd.xml file and collects type, location, checksum and other data about metadata f...
Base class for Exception.
static bool isSafeKeyId(const std::string &id_r)
!<
auto and_then(Fun &&function)
Wrapper class for ::stat/::lstat.
Interface of repomd.xml file reader.
ResultType and_then(const expected< T, E > &exp, Function &&f)
MaybeAwaitable< expected< zypp::RepoStatus > > repoStatus(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle)
Track changing files or directories.
static PublicKey noThrow(const Pathname &keyFile_r)
Static ctor returning an empty PublicKey rather than throwing.
#define ZYPP_FWD_CURRENT_EXCPT()
Drops a logline and returns the current Exception as a std::exception_ptr.
MaybeAwaitable< expected< zypp::RepoStatus > > repoStatus(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle)
std::string readSignatureKeyId(const Pathname &signature)
reads the public key id from a signature
static auto copyResultToDest(ProvideRef provider, const zypp::Pathname &targetPath)
std::vector< zypp::PublicKeyData > _buddyKeys