libzypp 17.37.17
PackageProvider.cc
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
13#include <iostream>
14#include <fstream>
15#include <sstream>
17#include <zypp/base/Logger.h>
18#include <zypp/base/Gettext.h>
19#include <utility>
20#include <zypp-core/base/UserRequestException>
25
26#include <zypp/TmpPath.h>
27#include <zypp/ZConfig.h>
28#include <zypp/RepoInfo.h>
29#include <zypp/RepoManager.h>
30#include <zypp/SrcPackage.h>
31
32#include <zypp/ZYppFactory.h>
33#include <zypp/Target.h>
35#include <zypp/FileChecker.h>
38
39using std::endl;
40
42namespace zypp
43{
45 namespace repo
46 {
52 {
53 public:
54 RpmSigCheckException( repo::DownloadResolvableReport::Action action_r, std::string msg_r = "RpmSigCheckException" )
55 : FileCheckException( std::move(msg_r) )
56 , _action( action_r )
57 {}
58
62
63 private:
65 };
66
67
69 // class PackageProviderPolicy
71
72 bool PackageProviderPolicy::queryInstalled( const std::string & name_r,
73 const Edition & ed_r,
74 const Arch & arch_r ) const
75 {
77 return _queryInstalledCB( name_r, ed_r, arch_r );
78 return false;
79 }
80
86 {
87 Impl() {}
88 Impl(const Impl &) = delete;
89 Impl(Impl &&) = delete;
90 Impl &operator=(const Impl &) = delete;
91 Impl &operator=(Impl &&) = delete;
92 virtual ~Impl() {}
93
98 virtual ManagedFile providePackage() const = 0;
99
102
104 virtual bool isCached() const = 0;
105 };
106
111 template <class TPackage>
113 {
114 using TPackagePtr = typename TPackage::constPtr; // Package or SrcPackage
116 public:
119 PackageProviderPolicy &&policy_r )
120 : _policy(std::move( policy_r ))
121 , _package(std::move( package_r ))
122 , _access( access_r )
123 , _retry(false)
124 {}
125
130
132
133 public:
138 ManagedFile providePackage() const override;
139
142 {
144 if ( ! ( ret->empty() || _package->repoInfo().effectiveKeepPackages() ) )
146 return ret;
147 }
148
150 bool isCached() const override
151 { return ! doProvidePackageFromCache()->empty(); }
152
153 protected:
156
165 { return ManagedFile( _package->cachedLocation() ); }
166
182 {
183 ManagedFile ret;
184 OnMediaLocation loc = _package->location();
185
186 ProvideFilePolicy policy;
187 policy.progressCB( bind( &Base::progressPackageDownload, this, _1 ) );
188 policy.fileChecker( bind( &Base::rpmSigFileChecker, this, _1 ) );
189 return _access.provideFile( _package->repoInfo(), loc, policy );
190 }
191
192 protected:
194 Report & report() const
195 { return *_report; }
196
198 bool progressPackageDownload( int value ) const
199 { return report()->progress( value, _package ); }
200
201
216 void rpmSigFileChecker( const Pathname & file_r ) const
217 {
218 RepoInfo info = _package->repoInfo();
219 if ( info.pkgGpgCheck() )
220 {
221 UserData userData( "pkgGpgCheck" );
222 ResObject::constPtr roptr( _package ); // gcc6 needs it more explcit. Has problem deducing
223 userData.set( "ResObject", roptr ); // a type for '_package->asKind<ResObject>()'...
224 /*legacy:*/userData.set( "Package", roptr->asKind<Package>() );
225 userData.set( "Localpath", file_r );
226
228 while ( res == RpmDb::CHK_NOKEY ) {
229 res = packageSigCheck( file_r, info.pkgGpgCheckIsMandatory(), userData );
230
231 // publish the checkresult, even if it is OK. Apps may want to report something...
232 report()->pkgGpgCheck( userData );
233
234 if ( res == RpmDb::CHK_NOKEY ) {
235 // if the check fails because we don't know the key
236 // we try to resolv it with gpgkey urls from the
237 // repository, if available
238
240 if ( !hr ) {
241 // we did not find any information about the key in the header
242 // this should never happen
243 WAR << "Unable to read package header from " << hr << endl;
244 break;
245 }
246
247 std::string keyID = hr->signatureKeyID();
248 if ( keyID.length() > 0 ) {
250 break;
251
252 } else {
253 // we did not find any information about the key in the header
254 // this should never happen
255 WAR << "packageSigCheck returned without setting providing missing key information" << endl;
256 break;
257 }
258 }
259 }
260
261 if ( res != RpmDb::CHK_OK )
262 {
263 if ( userData.hasvalue( "Action" ) ) // pkgGpgCheck report provided an user error action
264 {
266 }
267 else if ( userData.haskey( "Action" ) ) // pkgGpgCheck requests the default problem report (wo. details)
268 {
270 }
271 else // no advice from user => usedefaults
272 {
273 switch ( res )
274 {
275 case RpmDb::CHK_OK: // Signature is OK
276 break;
277
278 case RpmDb::CHK_NOKEY: // Public key is unavailable
279 case RpmDb::CHK_NOTFOUND: // Signature is unknown type
280 case RpmDb::CHK_FAIL: // Signature does not verify
281 case RpmDb::CHK_NOTTRUSTED: // Signature is OK, but key is not trusted
282 case RpmDb::CHK_ERROR: // File does not exist or can't be opened
283 case RpmDb::CHK_NOSIG: // File is unsigned
284 default:
285 // report problem (w. details), throw if to abort, else retry/ignore
286 defaultReportSignatureError( res, str::Str() << userData.get<RpmDb::CheckPackageDetail>( "CheckPackageDetail" ) );
287 break;
288 }
289 }
290 }
291 }
292 }
293
295
297 RpmDb::CheckPackageResult packageSigCheck( const Pathname & path_r, bool isMandatory_r, UserData & userData ) const
298 {
299 if ( !_target )
300 _target = getZYpp()->getTarget();
301
304 if ( _target )
305 {
306 ret = _target->rpmDb().checkPackageSignature( path_r, detail );
307 if ( ret == RpmDb::CHK_NOSIG && !isMandatory_r )
308 {
309 WAR << "Relax CHK_NOSIG: Config says unsigned packages are OK" << endl;
310 ret = RpmDb::CHK_OK;
311 }
312 }
313 else
314 detail.push_back( RpmDb::CheckPackageDetail::value_type( ret, "OOps. Target is not initialized!" ) );
315
316 userData.set( "CheckPackageResult", ret );
317 userData.set( "CheckPackageDetail", std::move(detail) );
318 return ret;
319 }
320
325 {
326 switch ( action_r )
327 {
329 WAR << _package->asUserString() << ": " << "User requested to accept insecure file" << endl;
330 break;
331 default:
334 ZYPP_THROW(RpmSigCheckException(action_r,"Signature verification failed"));
335 break;
336 }
337 }
338
340 void defaultReportSignatureError( RpmDb::CheckPackageResult ret, const std::string & detail_r = std::string() ) const
341 {
342 str::Str msg;
343 msg << _package->asUserString() << ": " << _("Signature verification failed") << " " << ret;
344 if ( ! detail_r.empty() )
345 msg << "\n" << detail_r;
347 }
348
349
350 protected:
354
355 private:
357
359 {
360 _report.reset( new Report );
361 // Use a custom deleter calling _report.reset() when guard goes out of
362 // scope (cast required as reset is overloaded). We want report to end
363 // when leaving providePackage and not wait for *this going out of scope.
364 return shared_ptr<void>( static_cast<void*>(0),
365 std::bind( std::mem_fn(static_cast<void (shared_ptr<Report>::*)()>(&shared_ptr<Report>::reset)),
366 std::ref(_report) ) );
367 }
368
369 mutable bool _retry;
372 };
374
375 template <class TPackage>
377 {
378 ScopedGuard guardReport( newReport() );
379
380 // check for cache hit:
382 if ( ! ret->empty() )
383 {
384 MIL << "provided Package from cache " << _package << " at " << ret << endl;
385 report()->infoInCache( _package, ret );
386 return ret; // <-- cache hit
387 }
388
389 // HERE: cache misss, check toplevel cache or do download:
390 RepoInfo info = _package->repoInfo();
391
392 // Check toplevel cache
393 {
394 RepoManagerOptions topCache;
395 if ( info.packagesPath().dirname() != topCache.repoPackagesCachePath ) // not using toplevel cache
396 {
397 const OnMediaLocation & loc( _package->location() );
398 if ( ! loc.checksum().empty() ) // no cache hit without checksum
399 {
400 PathInfo pi( topCache.repoPackagesCachePath / info.packagesPath().basename() / info.path() / loc.filename() );
401 if ( pi.isExist() && loc.checksum() == CheckSum( loc.checksum().type(), std::ifstream( pi.c_str() ) ) )
402 {
403 report()->start( _package, pi.path().asFileUrl() );
404 const Pathname & dest( info.packagesPath() / info.path() / loc.filename() );
405 if ( filesystem::assert_dir( dest.dirname() ) == 0 && filesystem::hardlinkCopy( pi.path(), dest ) == 0 )
406 {
407 ret = ManagedFile( dest );
408 if ( ! info.effectiveKeepPackages() )
410
411 MIL << "provided Package from toplevel cache " << _package << " at " << ret << endl;
412 report()->finish( _package, repo::DownloadResolvableReport::NO_ERROR, std::string() );
413 return ret; // <-- toplevel cache hit
414 }
415 }
416 }
417 }
418 }
419
420 if ( info.repoOriginsEmpty() )
421 ZYPP_THROW(Exception("No url in repository."));
422
423 MIL << "provide Package " << _package << endl;
424 Url url = info.location();
425 try {
426 do {
427 _retry = false;
428 if ( ! ret->empty() )
429 {
431 ret.reset();
432 }
433 report()->start( _package, url );
434 try
435 {
436 ret = doProvidePackage();
437 }
438 catch ( const UserRequestException & excpt )
439 {
440 ERR << "Failed to provide Package " << _package << endl;
441 if ( ! _retry )
442 ZYPP_RETHROW( excpt );
443 }
444 catch ( const RpmSigCheckException & excpt )
445 {
446 ERR << "Failed to provide Package " << _package << endl;
447 if ( ! _retry )
448 {
449 // Signature verification error was already reported by the
450 // rpmSigFileChecker. Just handle the users action decision:
451 switch ( excpt.action() )
452 {
454 _retry = true;
455 break;
457 ZYPP_THROW(SkipRequestException("User requested skip of corrupted file"));
458 break;
459 default:
461 ZYPP_THROW(AbortRequestException("User requested to abort"));
462 break;
463 }
464 }
465 }
466 catch ( const FileCheckException & excpt )
467 {
468 ERR << "Failed to provide Package " << _package << endl;
469 if ( ! _retry )
470 {
471 const std::string & package_str = _package->asUserString();
472 // TranslatorExplanation %s = package being checked for integrity
473 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() ) ) )
474 {
476 _retry = true;
477 break;
479 ZYPP_THROW(SkipRequestException("User requested skip of corrupted file"));
480 break;
481 default:
483 ZYPP_THROW(AbortRequestException("User requested to abort"));
484 break;
485 }
486 }
487 }
488 catch ( const Exception & excpt )
489 {
490 ERR << "Failed to provide Package " << _package << endl;
491 if ( ! _retry )
492 {
493 // Aything else gets reported
494 const std::string & package_str = _package->asUserString();
495
496 // TranslatorExplanation %s = name of the package being processed.
497 std::string detail_str( str::form(_("Failed to provide Package %s. Do you want to retry retrieval?"), package_str.c_str() ) );
498 detail_str += str::form( "\n\n%s", excpt.asUserHistory().c_str() );
499
500 switch ( report()->problem( _package, repo::DownloadResolvableReport::IO, detail_str.c_str() ) )
501 {
503 _retry = true;
504 break;
506 ZYPP_THROW(SkipRequestException("User requested skip of file", excpt));
507 break;
508 default:
510 ZYPP_THROW(AbortRequestException("User requested to abort", excpt));
511 break;
512 }
513 }
514 }
515 } while ( _retry );
516 } catch(...){
517 // bsc#1045735: Be sure no invalid files stay in the cache!
518 if ( ! ret->empty() )
520 throw;
521 }
522
523 report()->finish( _package, repo::DownloadResolvableReport::NO_ERROR, std::string() );
524 MIL << "provided Package " << _package << " at " << ret << endl;
525 return ret;
526 }
527
528
534 {
535 public:
537 Package::constPtr &&package_r,
538 DeltaCandidates &&deltas_r,
539 PackageProviderPolicy &&policy_r )
540 : PackageProviderImpl<Package>( access_r, std::move(package_r), std::move(policy_r) )
541 , _deltas( std::move(deltas_r) )
542 {}
543
544 protected:
545 ManagedFile doProvidePackage() const override;
546
547 private:
549
550 ManagedFile tryDelta( const DeltaRpm & delta_r ) const;
551
552 bool progressDeltaDownload( int value ) const
553 { return report()->progressDeltaDownload( value ); }
554
555 void progressDeltaApply( int value ) const
556 { return report()->progressDeltaApply( value ); }
557
558 bool queryInstalled( const Edition & ed_r = Edition() ) const
559 { return _policy.queryInstalled( _package->name(), ed_r, _package->arch() ); }
560
561 private:
563 };
564
565
567 {
568 // check whether to process patch/delta rpms
569 // FIXME we only check the first url for now.
570 if ( ZConfig::instance().download_use_deltarpm()
571 && ( _package->repoInfo().url().schemeIsDownloading() || ZConfig::instance().download_use_deltarpm_always() ) )
572 {
573 std::list<DeltaRpm> deltaRpms;
574 _deltas.deltaRpms( _package ).swap( deltaRpms );
575
576 if ( ! deltaRpms.empty() && queryInstalled() && applydeltarpm::haveApplydeltarpm() )
577 {
578 for_( it, deltaRpms.begin(), deltaRpms.end())
579 {
580 DBG << "tryDelta " << *it << endl;
581 ManagedFile ret( tryDelta( *it ) );
582 if ( ! ret->empty() )
583 return ret;
584 }
585 }
586 }
587
588 // no patch/delta -> provide full package
589 return Base::doProvidePackage();
590 }
591
593 {
594 if ( delta_r.baseversion().edition() != Edition::noedition
595 && ! queryInstalled( delta_r.baseversion().edition() ) )
596 return ManagedFile();
597
599 return ManagedFile();
600
601 report()->startDeltaDownload( delta_r.location().filename(),
602 delta_r.location().downloadSize() );
603 ManagedFile delta;
604 try
605 {
606 ProvideFilePolicy policy;
607 policy.progressCB( bind( &RpmPackageProvider::progressDeltaDownload, this, _1 ) );
608 delta = _access.provideFile( delta_r.repository().info(), delta_r.location(), policy );
609 // bsc#1245672: delta rpms are optional resources.
610 // ProvideFile however always returns a managed file if no Exception occurred.
611 // So the caller has to check whether the optional file actually exists.
612 if ( not PathInfo(delta).isExist() ) {
613 delta.resetDispose();
614 report()->problemDeltaApply( _("download deltarpm: not found") );
615 return ManagedFile();
616 }
617 }
618 catch ( const Exception & excpt )
619 {
620 report()->problemDeltaDownload( excpt.asUserHistory() );
621 return ManagedFile();
622 }
623 report()->finishDeltaDownload();
624
625 report()->startDeltaApply( delta );
626 if ( ! applydeltarpm::check( delta_r.baseversion().sequenceinfo() ) )
627 {
628 report()->problemDeltaApply( _("applydeltarpm check failed.") );
629 return ManagedFile();
630 }
631
632 // Build the package
633 Pathname cachedest( _package->repoInfo().packagesPath() / _package->repoInfo().path() / _package->location().filename() );
634 Pathname builddest( cachedest.extend( ".drpm" ) );
635
636 if ( ! applydeltarpm::provide( delta, builddest,
637 bind( &RpmPackageProvider::progressDeltaApply, this, _1 ) ) )
638 {
639 report()->problemDeltaApply( _("applydeltarpm failed.") );
640 return ManagedFile();
641 }
642 ManagedFile builddestCleanup( builddest, filesystem::unlink );
643 report()->finishDeltaApply();
644
645 // Check and move it into the cache
646 // Here the rpm itself is ready. If the packages sigcheck fails, it
647 // makes no sense to return a ManagedFile() and fallback to download the
648 // full rpm. It won't be different. So let the exceptions escape...
649 rpmSigFileChecker( builddest );
650 if ( filesystem::hardlinkCopy( builddest, cachedest ) != 0 )
651 ZYPP_THROW( Exception( str::Str() << "Can't hardlink/copy " << builddest << " to " << cachedest ) );
652
653 return ManagedFile( cachedest, filesystem::unlink );
654 }
655
657 // class PackageProvider
659 namespace factory
660 {
661 inline PackageProvider::Impl * make( RepoMediaAccess & access_r, const PoolItem & pi_r,
662 DeltaCandidates &&deltas_r,
663 PackageProviderPolicy &&policy_r )
664 {
665 if ( pi_r.isKind<Package>() )
666 return new RpmPackageProvider( access_r, pi_r->asKind<Package>(), std::move(deltas_r), std::move(policy_r) );
667 else if ( pi_r.isKind<SrcPackage>() )
668 return new PackageProviderImpl<SrcPackage>( access_r, pi_r->asKind<SrcPackage>(), std::move(policy_r) );
669 else
670 ZYPP_THROW( Exception( str::Str() << "Don't know how to cache non-package " << pi_r.asUserString() ) );
671 }
672
673 inline PackageProvider::Impl * make( RepoMediaAccess & access_r, const PoolItem & pi_r,
674 PackageProviderPolicy &&policy_r )
675 {
676 if ( pi_r.isKind<Package>() )
677 return new PackageProviderImpl<Package>( access_r, pi_r->asKind<Package>(), std::move(policy_r) );
678 else if ( pi_r.isKind<SrcPackage>() )
679 return new PackageProviderImpl<SrcPackage>( access_r, pi_r->asKind<SrcPackage>(), std::move(policy_r) );
680 else
681 ZYPP_THROW( Exception( str::Str() << "Don't know how to cache non-package " << pi_r.asUserString() ) );
682 }
683
685 Package::constPtr &&package_r,
686 DeltaCandidates &&deltas_r,
687 PackageProviderPolicy &&policy_r )
688 { return new RpmPackageProvider( access_r, std::move(package_r), std::move(deltas_r), std::move(policy_r) ); }
689
690 } // namespace factory
691
692
694 DeltaCandidates deltas_r, PackageProviderPolicy policy_r )
695
696 : _pimpl( factory::make( access_r, pi_r, std::move(deltas_r), std::move(policy_r) ) )
697 {}
698
700 PackageProviderPolicy policy_r )
701 : _pimpl( factory::make( access_r, pi_r, std::move(policy_r) ) )
702 {}
703
704 /* legacy */
706 Package::constPtr package_r,
707 DeltaCandidates deltas_r,
708 PackageProviderPolicy policy_r )
709 : _pimpl( factory::make( access_r, std::move(package_r), std::move(deltas_r), std::move(policy_r) ) )
710 {}
711
714
716 { return _pimpl->providePackage(); }
717
719 { return _pimpl->providePackageFromCache(); }
720
722 { return _pimpl->isCached(); }
723
724 } // namespace repo
726} // namespace zypp
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:795
bool effectiveKeepPackages() const
keepPackages unless the package cache itself enforces keeping the packages.
Definition RepoInfo.cc:738
Pathname path() const
Repository path.
Definition RepoInfo.cc:783
bool pkgGpgCheckIsMandatory() const
Mandatory check (pkgGpgCheck is not off) must ask to confirm using unsigned packages.
Definition RepoInfo.cc:558
Pathname packagesPath() const
Path where this repo packages are cached.
Definition RepoInfo.cc:744
bool pkgGpgCheck() const
Whether the signature of rpm packages should be checked for this repo.
Definition RepoInfo.cc:555
bool repoOriginsEmpty() const
whether repo origins are available
Definition RepoInfo.cc:702
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:940
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:175
Pathname dirname() const
Return all but the last component od this path.
Definition Pathname.h:126
std::string basename() const
Return the last component of this path.
Definition Pathname.h:130
bool empty() const
Test for an empty path.
Definition Pathname.h:116
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 SyncContextRef defaultContext()
Definition Arch.h:364
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:888
int unlink(const Pathname &path)
Like 'unlink'.
Definition PathInfo.cc:705
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
Definition PathInfo.cc:324
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
bool provideAndImportKeyFromRepository(SyncContextRef 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:122
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
#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
Interface to gettext.