libzypp 17.38.3
PackageProvider.cc
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
12#include <iostream>
13#include <fstream>
14#include <sstream>
18#include <utility>
19#include <zypp-core/base/UserRequestException>
24
25#include <zypp/TmpPath.h>
26#include <zypp/ZConfig.h>
27#include <zypp/RepoInfo.h>
28#include <zypp/RepoManager.h>
29#include <zypp/SrcPackage.h>
30
31#include <zypp/ZYppFactory.h>
32#include <zypp/Target.h>
34#include <zypp/FileChecker.h>
36
37#include <zypp/ng/context.h>
39
40using std::endl;
41
43namespace zypp
44{
46 namespace repo
47 {
53 {
54 public:
55 RpmSigCheckException( repo::DownloadResolvableReport::Action action_r, std::string msg_r = "RpmSigCheckException" )
56 : FileCheckException( std::move(msg_r) )
57 , _action( action_r )
58 {}
59
63
64 private:
66 };
67
68
70 // class PackageProviderPolicy
72
73 bool PackageProviderPolicy::queryInstalled( const std::string & name_r,
74 const Edition & ed_r,
75 const Arch & arch_r ) const
76 {
78 return _queryInstalledCB( name_r, ed_r, arch_r );
79 return false;
80 }
81
87 {
88 Impl() {}
89 Impl(const Impl &) = delete;
90 Impl(Impl &&) = delete;
91 Impl &operator=(const Impl &) = delete;
92 Impl &operator=(Impl &&) = delete;
93 virtual ~Impl() {}
94
99 virtual ManagedFile providePackage() const = 0;
100
103
105 virtual bool isCached() const = 0;
106 };
107
112 template <class TPackage>
114 {
115 using TPackagePtr = typename TPackage::constPtr; // Package or SrcPackage
117 public:
120 PackageProviderPolicy &&policy_r )
121 : _policy(std::move( policy_r ))
122 , _package(std::move( package_r ))
123 , _access( access_r )
124 , _retry(false)
125 {}
126
131
133
134 public:
139 ManagedFile providePackage() const override;
140
143 {
145 if ( ! ( ret->empty() || _package->repoInfo().effectiveKeepPackages() ) )
147 return ret;
148 }
149
151 bool isCached() const override
152 { return ! doProvidePackageFromCache()->empty(); }
153
154 protected:
157
166 { return ManagedFile( _package->cachedLocation() ); }
167
183 {
184 ManagedFile ret;
185 OnMediaLocation loc = _package->location();
186
187 ProvideFilePolicy policy;
188 policy.progressCB( bind( &Base::progressPackageDownload, this, _1 ) );
189 policy.fileChecker( bind( &Base::rpmSigFileChecker, this, _1 ) );
190 return _access.provideFile( _package->repoInfo(), loc, policy );
191 }
192
193 protected:
195 Report & report() const
196 { return *_report; }
197
199 bool progressPackageDownload( int value ) const
200 { return report()->progress( value, _package ); }
201
202
217 void rpmSigFileChecker( const Pathname & file_r ) const
218 {
219 RepoInfo info = _package->repoInfo();
220 if ( info.pkgGpgCheck() )
221 {
222 UserData userData( "pkgGpgCheck" );
223 ResObject::constPtr roptr( _package ); // gcc6 needs it more explcit. Has problem deducing
224 userData.set( "ResObject", roptr ); // a type for '_package->asKind<ResObject>()'...
225 /*legacy:*/userData.set( "Package", roptr->asKind<Package>() );
226 userData.set( "Localpath", file_r );
227
229 while ( res == RpmDb::CHK_NOKEY ) {
230 res = packageSigCheck( file_r, info.pkgGpgCheckIsMandatory(), userData );
231
232 // publish the checkresult, even if it is OK. Apps may want to report something...
233 report()->pkgGpgCheck( userData );
234
235 if ( res == RpmDb::CHK_NOKEY ) {
236 // if the check fails because we don't know the key
237 // we try to resolv it with gpgkey urls from the
238 // repository, if available
239
241 if ( !hr ) {
242 // we did not find any information about the key in the header
243 // this should never happen
244 WAR << "Unable to read package header from " << hr << endl;
245 break;
246 }
247
248 std::string keyID = hr->signatureKeyID();
249 if ( keyID.length() > 0 ) {
251 break;
252
253 } else {
254 // we did not find any information about the key in the header
255 // this should never happen
256 WAR << "packageSigCheck returned without setting providing missing key information" << endl;
257 break;
258 }
259 }
260 }
261
262 if ( res != RpmDb::CHK_OK )
263 {
264 if ( userData.hasvalue( "Action" ) ) // pkgGpgCheck report provided an user error action
265 {
267 }
268 else if ( userData.haskey( "Action" ) ) // pkgGpgCheck requests the default problem report (wo. details)
269 {
271 }
272 else // no advice from user => usedefaults
273 {
274 switch ( res )
275 {
276 case RpmDb::CHK_OK: // Signature is OK
277 break;
278
279 case RpmDb::CHK_NOKEY: // Public key is unavailable
280 case RpmDb::CHK_NOTFOUND: // Signature is unknown type
281 case RpmDb::CHK_FAIL: // Signature does not verify
282 case RpmDb::CHK_NOTTRUSTED: // Signature is OK, but key is not trusted
283 case RpmDb::CHK_ERROR: // File does not exist or can't be opened
284 case RpmDb::CHK_NOSIG: // File is unsigned
285 default:
286 // report problem (w. details), throw if to abort, else retry/ignore
287 defaultReportSignatureError( res, str::Str() << userData.get<RpmDb::CheckPackageDetail>( "CheckPackageDetail" ) );
288 break;
289 }
290 }
291 }
292 }
293 }
294
296
298 RpmDb::CheckPackageResult packageSigCheck( const Pathname & path_r, bool isMandatory_r, UserData & userData ) const
299 {
300 if ( !_target )
301 _target = getZYpp()->getTarget();
302
305 if ( _target )
306 {
307 ret = _target->rpmDb().checkPackageSignature( path_r, detail );
308 if ( ret == RpmDb::CHK_NOSIG && !isMandatory_r )
309 {
310 WAR << "Relax CHK_NOSIG: Config says unsigned packages are OK" << endl;
311 ret = RpmDb::CHK_OK;
312 }
313 }
314 else
315 detail.push_back( RpmDb::CheckPackageDetail::value_type( ret, "OOps. Target is not initialized!" ) );
316
317 userData.set( "CheckPackageResult", ret );
318 userData.set( "CheckPackageDetail", std::move(detail) );
319 return ret;
320 }
321
326 {
327 switch ( action_r )
328 {
330 WAR << _package->asUserString() << ": " << "User requested to accept insecure file" << endl;
331 break;
332 default:
335 ZYPP_THROW(RpmSigCheckException(action_r,"Signature verification failed"));
336 break;
337 }
338 }
339
341 void defaultReportSignatureError( RpmDb::CheckPackageResult ret, const std::string & detail_r = std::string() ) const
342 {
343 str::Str msg;
344 msg << _package->asUserString() << ": " << _("Signature verification failed") << " " << ret;
345 if ( ! detail_r.empty() )
346 msg << "\n" << detail_r;
348 }
349
350
351 protected:
355
356 private:
358
360 {
361 _report.reset( new Report );
362 // Use a custom deleter calling _report.reset() when guard goes out of
363 // scope (cast required as reset is overloaded). We want report to end
364 // when leaving providePackage and not wait for *this going out of scope.
365 return shared_ptr<void>( static_cast<void*>(0),
366 std::bind( std::mem_fn(static_cast<void (shared_ptr<Report>::*)()>(&shared_ptr<Report>::reset)),
367 std::ref(_report) ) );
368 }
369
370 mutable bool _retry;
373 };
375
376 template <class TPackage>
378 {
379 ScopedGuard guardReport( newReport() );
380
381 // check for cache hit:
383 if ( ! ret->empty() )
384 {
385 MIL << "provided Package from cache " << _package << " at " << ret << endl;
386 report()->infoInCache( _package, ret );
387 return ret; // <-- cache hit
388 }
389
390 // HERE: cache misss, check toplevel cache or do download:
391 RepoInfo info = _package->repoInfo();
392
393 // Check toplevel cache
394 {
395 RepoManagerOptions topCache;
396 if ( info.packagesPath().dirname() != topCache.repoPackagesCachePath ) // not using toplevel cache
397 {
398 const OnMediaLocation & loc( _package->location() );
399 if ( ! loc.checksum().empty() ) // no cache hit without checksum
400 {
401 PathInfo pi( topCache.repoPackagesCachePath / info.packagesPath().basename() / info.path() / loc.filename() );
402 if ( pi.isExist() && loc.checksum() == CheckSum( loc.checksum().type(), std::ifstream( pi.c_str() ) ) )
403 {
404 report()->start( _package, pi.path().asFileUrl() );
405 const Pathname & dest( info.packagesPath() / info.path() / loc.filename() );
406 if ( filesystem::assert_dir( dest.dirname() ) == 0 && filesystem::hardlinkCopy( pi.path(), dest ) == 0 )
407 {
408 ret = ManagedFile( dest );
409 if ( ! info.effectiveKeepPackages() )
411
412 MIL << "provided Package from toplevel cache " << _package << " at " << ret << endl;
413 report()->finish( _package, repo::DownloadResolvableReport::NO_ERROR, std::string() );
414 return ret; // <-- toplevel cache hit
415 }
416 }
417 }
418 }
419 }
420
421 if ( info.repoOriginsEmpty() )
422 ZYPP_THROW(Exception("No url in repository."));
423
424 MIL << "provide Package " << _package << endl;
425 Url url = info.location();
426 try {
427 do {
428 _retry = false;
429 if ( ! ret->empty() )
430 {
432 ret.reset();
433 }
434 report()->start( _package, url );
435 try
436 {
437 ret = doProvidePackage();
438 }
439 catch ( const UserRequestException & excpt )
440 {
441 ERR << "Failed to provide Package " << _package << endl;
442 if ( ! _retry )
443 ZYPP_RETHROW( excpt );
444 }
445 catch ( const RpmSigCheckException & excpt )
446 {
447 ERR << "Failed to provide Package " << _package << endl;
448 if ( ! _retry )
449 {
450 // Signature verification error was already reported by the
451 // rpmSigFileChecker. Just handle the users action decision:
452 switch ( excpt.action() )
453 {
455 _retry = true;
456 break;
458 ZYPP_THROW(SkipRequestException("User requested skip of corrupted file"));
459 break;
460 default:
462 ZYPP_THROW(AbortRequestException("User requested to abort"));
463 break;
464 }
465 }
466 }
467 catch ( const FileCheckException & excpt )
468 {
469 ERR << "Failed to provide Package " << _package << endl;
470 if ( ! _retry )
471 {
472 const std::string & package_str = _package->asUserString();
473 // TranslatorExplanation %s = package being checked for integrity
474 switch ( report()->problem( _package, repo::DownloadResolvableReport::INVALID, str::form(_("Package %s seems to be corrupted during transfer. Do you want to retry retrieval?"), package_str.c_str() ) ) )
475 {
477 _retry = true;
478 break;
480 ZYPP_THROW(SkipRequestException("User requested skip of corrupted file"));
481 break;
482 default:
484 ZYPP_THROW(AbortRequestException("User requested to abort"));
485 break;
486 }
487 }
488 }
489 catch ( const Exception & excpt )
490 {
491 ERR << "Failed to provide Package " << _package << endl;
492 if ( ! _retry )
493 {
494 // Aything else gets reported
495 const std::string & package_str = _package->asUserString();
496
497 // TranslatorExplanation %s = name of the package being processed.
498 std::string detail_str( str::form(_("Failed to provide Package %s. Do you want to retry retrieval?"), package_str.c_str() ) );
499 detail_str += str::form( "\n\n%s", excpt.asUserHistory().c_str() );
500
501 switch ( report()->problem( _package, repo::DownloadResolvableReport::IO, detail_str.c_str() ) )
502 {
504 _retry = true;
505 break;
507 ZYPP_THROW(SkipRequestException("User requested skip of file", excpt));
508 break;
509 default:
511 ZYPP_THROW(AbortRequestException("User requested to abort", excpt));
512 break;
513 }
514 }
515 }
516 } while ( _retry );
517 } catch(...){
518 // bsc#1045735: Be sure no invalid files stay in the cache!
519 if ( ! ret->empty() )
521 throw;
522 }
523
524 report()->finish( _package, repo::DownloadResolvableReport::NO_ERROR, std::string() );
525 MIL << "provided Package " << _package << " at " << ret << endl;
526 return ret;
527 }
528
529
535 {
536 public:
538 Package::constPtr &&package_r,
539 DeltaCandidates &&deltas_r,
540 PackageProviderPolicy &&policy_r )
541 : PackageProviderImpl<Package>( access_r, std::move(package_r), std::move(policy_r) )
542 , _deltas( std::move(deltas_r) )
543 {}
544
545 protected:
546 ManagedFile doProvidePackage() const override;
547
548 private:
550
551 ManagedFile tryDelta( const DeltaRpm & delta_r ) const;
552
553 bool progressDeltaDownload( int value ) const
554 { return report()->progressDeltaDownload( value ); }
555
556 void progressDeltaApply( int value ) const
557 { return report()->progressDeltaApply( value ); }
558
559 bool queryInstalled( const Edition & ed_r = Edition() ) const
560 { return _policy.queryInstalled( _package->name(), ed_r, _package->arch() ); }
561
562 private:
564 };
565
566
568 {
569 // check whether to process patch/delta rpms
570 // FIXME we only check the first url for now.
571 if ( ZConfig::instance().download_use_deltarpm()
572 && ( _package->repoInfo().url().schemeIsDownloading() || ZConfig::instance().download_use_deltarpm_always() ) )
573 {
574 std::list<DeltaRpm> deltaRpms;
575 _deltas.deltaRpms( _package ).swap( deltaRpms );
576
577 if ( ! deltaRpms.empty() && queryInstalled() && applydeltarpm::haveApplydeltarpm() )
578 {
579 for_( it, deltaRpms.begin(), deltaRpms.end())
580 {
581 DBG << "tryDelta " << *it << endl;
582 ManagedFile ret( tryDelta( *it ) );
583 if ( ! ret->empty() )
584 return ret;
585 }
586 }
587 }
588
589 // no patch/delta -> provide full package
590 return Base::doProvidePackage();
591 }
592
594 {
595 if ( delta_r.baseversion().edition() != Edition::noedition
596 && ! queryInstalled( delta_r.baseversion().edition() ) )
597 return ManagedFile();
598
600 return ManagedFile();
601
602 report()->startDeltaDownload( delta_r.location().filename(),
603 delta_r.location().downloadSize() );
604 ManagedFile delta;
605 try
606 {
607 ProvideFilePolicy policy;
608 policy.progressCB( bind( &RpmPackageProvider::progressDeltaDownload, this, _1 ) );
609 delta = _access.provideFile( delta_r.repository().info(), delta_r.location(), policy );
610 // bsc#1245672: delta rpms are optional resources.
611 // ProvideFile however always returns a managed file if no Exception occurred.
612 // So the caller has to check whether the optional file actually exists.
613 if ( not PathInfo(delta).isExist() ) {
614 delta.resetDispose();
615 report()->problemDeltaApply( _("download deltarpm: not found") );
616 return ManagedFile();
617 }
618 }
619 catch ( const Exception & excpt )
620 {
621 report()->problemDeltaDownload( excpt.asUserHistory() );
622 return ManagedFile();
623 }
624 report()->finishDeltaDownload();
625
626 report()->startDeltaApply( delta );
627 if ( ! applydeltarpm::check( delta_r.baseversion().sequenceinfo() ) )
628 {
629 report()->problemDeltaApply( _("applydeltarpm check failed.") );
630 return ManagedFile();
631 }
632
633 // Build the package
634 Pathname cachedest( _package->repoInfo().packagesPath() / _package->repoInfo().path() / _package->location().filename() );
635 Pathname builddest( cachedest.extend( ".drpm" ) );
636
637 if ( ! applydeltarpm::provide( delta, builddest,
638 bind( &RpmPackageProvider::progressDeltaApply, this, _1 ) ) )
639 {
640 report()->problemDeltaApply( _("applydeltarpm failed.") );
641 return ManagedFile();
642 }
643 ManagedFile builddestCleanup( builddest, filesystem::unlink );
644 report()->finishDeltaApply();
645
646 // Check and move it into the cache
647 // Here the rpm itself is ready. If the packages sigcheck fails, it
648 // makes no sense to return a ManagedFile() and fallback to download the
649 // full rpm. It won't be different. So let the exceptions escape...
650 rpmSigFileChecker( builddest );
651 if ( filesystem::hardlinkCopy( builddest, cachedest ) != 0 )
652 ZYPP_THROW( Exception( str::Str() << "Can't hardlink/copy " << builddest << " to " << cachedest ) );
653
654 return ManagedFile( cachedest, filesystem::unlink );
655 }
656
658 // class PackageProvider
660 namespace factory
661 {
662 inline PackageProvider::Impl * make( RepoMediaAccess & access_r, const PoolItem & pi_r,
663 DeltaCandidates &&deltas_r,
664 PackageProviderPolicy &&policy_r )
665 {
666 if ( pi_r.isKind<Package>() )
667 return new RpmPackageProvider( access_r, pi_r->asKind<Package>(), std::move(deltas_r), std::move(policy_r) );
668 else if ( pi_r.isKind<SrcPackage>() )
669 return new PackageProviderImpl<SrcPackage>( access_r, pi_r->asKind<SrcPackage>(), std::move(policy_r) );
670 else
671 ZYPP_THROW( Exception( str::Str() << "Don't know how to cache non-package " << pi_r.asUserString() ) );
672 }
673
674 inline PackageProvider::Impl * make( RepoMediaAccess & access_r, const PoolItem & pi_r,
675 PackageProviderPolicy &&policy_r )
676 {
677 if ( pi_r.isKind<Package>() )
678 return new PackageProviderImpl<Package>( access_r, pi_r->asKind<Package>(), std::move(policy_r) );
679 else if ( pi_r.isKind<SrcPackage>() )
680 return new PackageProviderImpl<SrcPackage>( access_r, pi_r->asKind<SrcPackage>(), std::move(policy_r) );
681 else
682 ZYPP_THROW( Exception( str::Str() << "Don't know how to cache non-package " << pi_r.asUserString() ) );
683 }
684
686 Package::constPtr &&package_r,
687 DeltaCandidates &&deltas_r,
688 PackageProviderPolicy &&policy_r )
689 { return new RpmPackageProvider( access_r, std::move(package_r), std::move(deltas_r), std::move(policy_r) ); }
690
691 } // namespace factory
692
693
695 DeltaCandidates deltas_r, PackageProviderPolicy policy_r )
696
697 : _pimpl( factory::make( access_r, pi_r, std::move(deltas_r), std::move(policy_r) ) )
698 {}
699
701 PackageProviderPolicy policy_r )
702 : _pimpl( factory::make( access_r, pi_r, std::move(policy_r) ) )
703 {}
704
705 /* legacy */
707 Package::constPtr package_r,
708 DeltaCandidates deltas_r,
709 PackageProviderPolicy policy_r )
710 : _pimpl( factory::make( access_r, std::move(package_r), std::move(deltas_r), std::move(policy_r) ) )
711 {}
712
715
717 { return _pimpl->providePackage(); }
718
720 { return _pimpl->providePackageFromCache(); }
721
723 { return _pimpl->isCached(); }
724
725 } // namespace repo
727} // namespace zypp
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition Easy.h:27
#define ZYPP_RETHROW(EXCPT)
Drops a logline and rethrows, updating the CodeLocation.
Definition Exception.h:479
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition Exception.h:459
#define _(MSG)
Definition Gettext.h:39
#define DBG
Definition Logger.h:99
#define MIL
Definition Logger.h:100
#define ERR
Definition Logger.h:102
#define WAR
Definition Logger.h:101
Architecture.
Definition Arch.h:37
void resetDispose()
Set no dispose function.
void reset()
Reset to default Ctor values.
void setDispose(const Dispose &dispose_r)
Set a new dispose function.
bool empty() const
Definition CheckSum.cc:173
std::string type() const
Definition CheckSum.cc:167
Edition represents [epoch:]version[-release].
Definition Edition.h:61
static const Edition noedition
Value representing noedition ("") This is in fact a valid Edition.
Definition Edition.h:73
Base class for Exception.
Definition Exception.h:153
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
Definition Exception.cc:140
FileCheckException(std::string msg)
Describes a resource file located on a medium.
const ByteCount & downloadSize() const
The size of the resource on the server.
const Pathname & filename() const
The path to the resource on the medium.
const CheckSum & checksum() const
The checksum of the resource on the server.
Package interface.
Definition Package.h:34
TraitsType::constPtrType constPtr
Definition Package.h:39
Combining sat::Solvable and ResStatus.
Definition PoolItem.h:51
Policy for provideFile and RepoMediaAccess.
ProvideFilePolicy & fileChecker(FileChecker fileChecker_r)
Add a FileCecker passed down to the Fetcher.
ProvideFilePolicy & progressCB(ProgressCB progressCB_r)
Set callback.
What is known about a repository.
Definition RepoInfo.h:72
Url location() const
Returns the location URL for the repository, this is either the first configured baseUrl or a configu...
Definition RepoInfo.cc:834
bool effectiveKeepPackages() const
keepPackages unless the package cache itself enforces keeping the packages.
Definition RepoInfo.cc:774
Pathname path() const
Repository path.
Definition RepoInfo.cc:822
bool pkgGpgCheckIsMandatory() const
Mandatory check (pkgGpgCheck is not off) must ask to confirm using unsigned packages.
Definition RepoInfo.cc:594
Pathname packagesPath() const
packagesPath Checks if the effective user is allowed to write into the system package cache.
Definition RepoInfo.cc:783
bool pkgGpgCheck() const
Whether the signature of rpm packages should be checked for this repo.
Definition RepoInfo.cc:591
bool repoOriginsEmpty() const
whether repo origins are available
Definition RepoInfo.cc:738
RepoInfo info() const
Return any associated RepoInfo.
TraitsType::constPtrType constPtr
Definition ResObject.h:43
SrcPackage interface.
Definition SrcPackage.h:30
Url manipulation class.
Definition Url.h:93
Base for exceptions caused by explicit user request.
static ZConfig & instance()
Singleton ctor.
Definition ZConfig.cc:971
ZYpp::Ptr getZYpp()
Convenience to get the Pointer to the ZYpp instance.
Definition ZYppFactory.h:77
Typesafe passing of user data via callbacks.
Definition UserData.h:40
const Tp & get(const std::string &key_r) const
Pass back a const Tp & reference to key_r value.
Definition UserData.h:176
bool hasvalue(const std::string &key_r) const
Whether key_r is in data and value is not empty.
Definition UserData.h:102
bool set(const std::string &key_r, AnyType val_r)
Set the value for key (nonconst version always returns true).
Definition UserData.h:119
bool haskey(const std::string &key_r) const
Whether key_r is in data.
Definition UserData.h:98
Wrapper class for stat/lstat.
Definition PathInfo.h:226
const Pathname & path() const
Return current Pathname.
Definition PathInfo.h:251
bool isExist() const
Return whether valid stat info exists.
Definition PathInfo.h:286
const char * c_str() const
Return current Pathname as C-string.
Definition PathInfo.h:255
Pathname extend(const std::string &r) const
Append string r to the last component of the path.
Definition Pathname.h:182
Pathname dirname() const
Return all but the last component od this path.
Definition Pathname.h:133
std::string basename() const
Return the last component of this path.
Definition Pathname.h:137
bool empty() const
Test for an empty path.
Definition Pathname.h:117
const std::string & sequenceinfo() const
const OnMediaLocation & location() const
const Repository & repository() const
const BaseVersion & baseversion() const
Candidate delta and patches for a package.
PackageProviderImpl(const PackageProviderImpl &)=delete
ManagedFile doProvidePackageFromCache() const
Lookup the final rpm in cache.
PackageProviderImpl(RepoMediaAccess &access_r, TPackagePtr &&package_r, PackageProviderPolicy &&policy_r)
Ctor taking the Package to provide.
void rpmSigFileChecker(const Pathname &file_r) const
bool isCached() const override
Whether the package is cached.
PackageProviderImpl(PackageProviderImpl &&)=delete
PackageProviderImpl & operator=(PackageProviderImpl &&)=delete
typename TPackage::constPtr TPackagePtr
PackageProviderImpl< TPackage > Base
callback::SendReport< repo::DownloadResolvableReport > Report
bool progressPackageDownload(int value) const
Redirect ProvideFilePolicy package download progress to this.
ManagedFile providePackage() const override
Provide the package.
ManagedFile providePackageFromCache() const override
Provide the package if it is cached.
void defaultReportSignatureError(RpmDb::CheckPackageResult ret, const std::string &detail_r=std::string()) const
Default signature verification error handling.
RpmDb::CheckPackageResult packageSigCheck(const Pathname &path_r, bool isMandatory_r, UserData &userData) const
Actual rpm package signature check.
void resolveSignatureErrorAction(repo::DownloadResolvableReport::Action action_r) const
React on signature verification error user action.
Report & report() const
Access to the DownloadResolvableReport.
PackageProviderImpl & operator=(const PackageProviderImpl &)=delete
virtual ManagedFile doProvidePackage() const
Actually provide the final rpm.
Policies and options for PackageProvider.
bool queryInstalled(const std::string &name_r, const Edition &ed_r, const Arch &arch_r) const
Evaluate callback.
RW_pointer< Impl > _pimpl
Implementation class.
PackageProvider(RepoMediaAccess &access, const PoolItem &pi_r, PackageProviderPolicy policy_r=PackageProviderPolicy())
Ctor taking the package to provide.
ManagedFile providePackage() const
Provide the package.
bool isCached() const
Whether the package is cached.
ManagedFile providePackageFromCache() const
Provide the package if it is cached.
Provides files from different repos.
RPM PackageProvider implementation (with deltarpm processing).
packagedelta::DeltaRpm DeltaRpm
ManagedFile tryDelta(const DeltaRpm &delta_r) const
void progressDeltaApply(int value) const
bool progressDeltaDownload(int value) const
RpmPackageProvider(RepoMediaAccess &access_r, Package::constPtr &&package_r, DeltaCandidates &&deltas_r, PackageProviderPolicy &&policy_r)
bool queryInstalled(const Edition &ed_r=Edition()) const
ManagedFile doProvidePackage() const override
Actually provide the final rpm.
Exception thrown by PackageProviderImpl::rpmSigFileChecker.
repo::DownloadResolvableReport::Action _action
RpmSigCheckException(repo::DownloadResolvableReport::Action action_r, std::string msg_r="RpmSigCheckException")
const repo::DownloadResolvableReport::Action & action() const
Users final decision how to proceed.
Interface to the rpm program.
Definition RpmDb.h:51
CheckPackageResult
checkPackage result
Definition RpmDb.h:377
intrusive_ptr< const RpmHeader > constPtr
Definition RpmHeader.h:65
static RpmHeader::constPtr readPackage(const Pathname &path, VERIFICATION verification=VERIFY)
Get an accessible packages data from disk.
Definition RpmHeader.cc:212
static ContextRef defaultContext()
Definition context.cc:26
Definition ansi.h:855
bool haveApplydeltarpm()
Test whether an execuatble applydeltarpm program is available.
bool provide(const Pathname &delta_r, const Pathname &new_r, const Progress &report_r)
Apply a binary delta to on-disk data to re-create a new rpm.
bool quickcheck(const std::string &sequenceinfo_r)
Quick via check sequence info.
bool check(const std::string &sequenceinfo_r, bool quick_r)
Check via sequence info.
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition NonCopyable.h:26
int hardlinkCopy(const Pathname &oldpath, const Pathname &newpath)
Create newpath as hardlink or copy of oldpath.
Definition PathInfo.cc:902
int unlink(const Pathname &path)
Like 'unlink'.
Definition PathInfo.cc:719
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
Definition PathInfo.cc:338
PackageProvider::Impl * make(RepoMediaAccess &access_r, const PoolItem &pi_r, DeltaCandidates &&deltas_r, PackageProviderPolicy &&policy_r)
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Definition String.cc:39
Url details namespace.
Definition UrlBase.cc:58
Easy-to use interface to the ZYPP dependency resolver.
AutoDispose< const Pathname > ManagedFile
A Pathname plus associated cleanup code to be executed when path is no longer needed.
Definition ManagedFile.h:27
ResTraits< TRes >::PtrType make(const sat::Solvable &solvable_r)
Directly create a certain kind of ResObject from sat::Solvable.
Definition ResObject.h:118
MaybeAwaitable< bool > provideAndImportKeyFromRepository(ContextRef ctx, std::string id_r, zypp::RepoInfo info_r)
Try to find the id in key cache or repository specified in info.
Definition keyringwf.cc:115
Repo manager settings.
PackageProvider implementation interface.
virtual bool isCached() const =0
Whether the package is cached.
virtual ManagedFile providePackageFromCache() const =0
Provide the package if it is cached.
virtual ManagedFile providePackage() const =0
Provide the package.
Impl & operator=(Impl &&)=delete
Impl & operator=(const Impl &)=delete
std::string asUserString() const
bool isKind(const SolvableType< Derived > &solvable_r)
Test whether the Solvable is of a certain ResKind.
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
Definition String.h:213
std::string str() const
Definition String.h:223
Detailed rpm signature check log messages A single multiline message if CHK_OK.
Definition RpmDb.h:392