16#include <zypp/base/Logger.h>
17#include <zypp/base/Gettext.h>
18#include <zypp-core/base/UserRequestException>
19#include <zypp/base/NonCopyable.h>
24#include <zypp/TmpPath.h>
104 template <
class TPackage>
132 if ( ! (
ret->empty() ||
_package->repoInfo().keepPackages() ) )
175 policy.progressCB( bind( &Base::progressPackageDownload,
this, _1 ) );
176 policy.fileChecker( bind( &Base::rpmSigFileChecker,
this, _1 ) );
220 report()->pkgGpgCheck( userData );
231 WAR <<
"Unable to read package header from " <<
hr << endl;
235 std::string
keyID =
hr->signatureKeyID();
236 if (
keyID.length() > 0 ) {
237 if ( ! getZYpp()->keyRing()->provideAndImportKeyFromRepositoryWorkflow(
keyID, info ) )
243 WAR <<
"packageSigCheck returned without setting providing missing key information" << endl;
251 if ( userData.
hasvalue(
"Action" ) )
255 else if ( userData.
haskey(
"Action" ) )
288 _target = getZYpp()->getTarget();
297 WAR <<
"Relax CHK_NOSIG: Config says unsigned packages are OK" << endl;
302 detail.push_back( RpmDb::CheckPackageDetail::value_type(
ret,
"OOps. Target is not initialized!" ) );
304 userData.
set(
"CheckPackageResult",
ret );
305 userData.
set(
"CheckPackageDetail", std::move(detail) );
317 WAR <<
_package->asUserString() <<
": " <<
"User requested to accept insecure file" << endl;
331 msg <<
_package->asUserString() <<
": " <<
_(
"Signature verification failed") <<
" " <<
ret;
353 std::bind( std::mem_fn(
static_cast<void (
shared_ptr<Report>::*)()
>(&shared_ptr<Report>::reset)),
363 template <
class TPackage>
370 if ( !
ret->empty() )
372 MIL <<
"provided Package from cache " << _package <<
" at " <<
ret << endl;
373 report()->infoInCache( _package,
ret );
378 RepoInfo info = _package->repoInfo();
386 if ( !
loc.checksum().empty() )
389 if (
pi.isExist() &&
loc.checksum() ==
CheckSum(
loc.checksum().type(), std::ifstream(
pi.c_str() ) ) )
391 report()->start( _package,
pi.path().asFileUrl() );
399 MIL <<
"provided Package from toplevel cache " << _package <<
" at " <<
ret << endl;
412 MIL <<
"provide Package " << _package << endl;
417 if ( !
ret->empty() )
422 report()->start( _package, url );
425 ret = doProvidePackage();
429 ERR <<
"Failed to provide Package " << _package << endl;
435 ERR <<
"Failed to provide Package " << _package << endl;
440 switch (
excpt.action() )
457 ERR <<
"Failed to provide Package " << _package << endl;
460 const std::string &
package_str = _package->asUserString();
479 ERR <<
"Failed to provide Package " << _package << endl;
483 const std::string &
package_str = _package->asUserString();
507 if ( !
ret->empty() )
513 MIL <<
"provided Package " << _package <<
" at " <<
ret << endl;
542 {
return report()->progressDeltaDownload( value ); }
545 {
return report()->progressDeltaApply( value ); }
562 std::list<DeltaRpm> deltaRpms;
567 for_(
it, deltaRpms.begin(), deltaRpms.end())
569 DBG <<
"tryDelta " << *
it << endl;
571 if ( !
ret->empty() )
591 delta_r.location().downloadSize() );
601 report()->problemDeltaDownload(
excpt.asUserHistory() );
604 report()->finishDeltaDownload();
609 report()->problemDeltaApply(
_(
"applydeltarpm check failed.") );
620 report()->problemDeltaApply(
_(
"applydeltarpm failed.") );
624 report()->finishDeltaApply();
696 {
return _pimpl->providePackage(); }
699 {
return _pimpl->providePackageFromCache(); }
702 {
return _pimpl->isCached(); }
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
void reset()
Reset to default Ctor values.
void setDispose(const Dispose &dispose_r)
Set a new dispose function.
Edition represents [epoch:]version[-release]
static const Edition noedition
Value representing noedition ("") This is in fact a valid Edition.
Base class for Exception.
TraitsType::constPtrType constPtr
Combining sat::Solvable and ResStatus.
Policy for provideFile and RepoMediaAccess.
What is known about a repository.
bool baseUrlsEmpty() const
whether repository urls are available
bool keepPackages() const
Whether packages downloaded from this repository will be kept in local cache.
Pathname path() const
Repository path.
bool pkgGpgCheckIsMandatory() const
Mandatory check (pkgGpgCheck is not off) must ask to confirm using unsigned packages.
urls_const_iterator baseUrlsBegin() const
iterator that points at begin of repository urls
Pathname packagesPath() const
Path where this repo packages are cached.
bool pkgGpgCheck() const
Whether the signature of rpm packages should be checked for this repo.
TraitsType::constPtrType constPtr
Base for exceptions caused by explicit user request.
static ZConfig & instance()
Singleton ctor.
Typesafe passing of user data via callbacks.
const Tp & get(const std::string &key_r) const
Pass back a const Tp & reference to key_r value.
bool hasvalue(const std::string &key_r) const
Whether key_r is in data and value is not empty.
bool set(const std::string &key_r, AnyType val_r)
Set the value for key (nonconst version always returns true).
bool haskey(const std::string &key_r) const
Whether key_r is in data.
Wrapper class for stat/lstat.
Pathname dirname() const
Return all but the last component od this path.
std::string basename() const
Return the last component of this path.
bool empty() const
Test for an empty path.
Candidate delta and patches for a package.
std::list< packagedelta::DeltaRpm > deltaRpms(const Package::constPtr &package) const
ManagedFile doProvidePackageFromCache() const
Lookup the final rpm in cache.
callback::UserData UserData
void rpmSigFileChecker(const Pathname &file_r) const
PackageProviderImpl(RepoMediaAccess &access_r, const TPackagePtr &package_r, const PackageProviderPolicy &policy_r)
Ctor taking the Package to provide.
virtual ManagedFile providePackageFromCache() const
Provide the package if it is cached.
PackageProviderPolicy _policy
shared_ptr< Report > _report
shared_ptr< void > ScopedGuard
virtual ManagedFile providePackage() const
Provide the package.
bool progressPackageDownload(int value) const
Redirect ProvideFilePolicy package download progress to this.
void defaultReportSignatureError(RpmDb::CheckPackageResult ret, const std::string &detail_r=std::string()) const
Default signature verification error handling.
callback::SendReport< repo::DownloadResolvableReport > Report
RepoMediaAccess & _access
RpmDb::CheckPackageResult packageSigCheck(const Pathname &path_r, bool isMandatory_r, UserData &userData) const
Actual rpm package signature check.
TPackage::constPtr TPackagePtr
virtual bool isCached() const
Whether the package is cached.
ScopedGuard newReport() const
void resolveSignatureErrorAction(repo::DownloadResolvableReport::Action action_r) const
React on signature verification error user action.
Report & report() const
Access to the DownloadResolvableReport.
PackageProviderImpl< TPackage > Base
virtual ~PackageProviderImpl()
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.
QueryInstalledCB _queryInstalledCB
PackageProvider(RepoMediaAccess &access, const PoolItem &pi_r, const PackageProviderPolicy &policy_r=PackageProviderPolicy())
Ctor taking the package to provide.
RW_pointer< Impl > _pimpl
Implementation class.
ManagedFile providePackage() const
Provide the package.
bool isCached() const
Whether the package is cached.
ManagedFile providePackageFromCache() const
Provide the package if it is cached.
RPM PackageProvider implementation (with deltarpm processing).
virtual ManagedFile doProvidePackage() const
Actually provide the final rpm.
packagedelta::DeltaRpm DeltaRpm
RpmPackageProvider(RepoMediaAccess &access_r, const Package::constPtr &package_r, const DeltaCandidates &deltas_r, const PackageProviderPolicy &policy_r)
ManagedFile tryDelta(const DeltaRpm &delta_r) const
void progressDeltaApply(int value) const
bool progressDeltaDownload(int value) const
bool queryInstalled(const Edition &ed_r=Edition()) const
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.
CheckPackageResult
checkPackage result
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.
int unlink(const Pathname &path)
Like 'unlink'.
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
int hardlinkCopy(const Pathname &oldpath, const Pathname &newpath)
Create newpath as hardlink or copy of oldpath.
PackageProvider::Impl * make(RepoMediaAccess &access_r, const PoolItem &pi_r, const DeltaCandidates &deltas_r, const PackageProviderPolicy &policy_r)
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
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.
ResTraits< TRes >::PtrType make(const sat::Solvable &solvable_r)
Directly create a certain kind of ResObject from sat::Solvable.
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.
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
Detailed rpm signature check log messages A single multiline message if CHK_OK.
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
#define ZYPP_RETHROW(EXCPT)
Drops a logline and rethrows, updating the CodeLocation.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.