22#include <zypp-core/ng/pipelines/Transform>
23#include <zypp-core/ng/pipelines/Expected>
24#include <zypp-core/ng/pipelines/MTry>
26#include <zypp-media/ng/ProvideSpec>
27#include <zypp/ng/Context>
28#include <zypp/ng/UserRequest>
35 using namespace zyppng::operators;
37 struct FetchGpgKeysLogic {
39 using ZyppContextRefType =ContextRef;
40 using ZyppContextType = Context;
42 using MediaHandle =
typename ProvideType::MediaHandle;
43 using ProvideRes =
typename ProvideType::Res;
45 FetchGpgKeysLogic( ZyppContextRefType &&zyppContext, zypp::RepoInfo &&info )
46 : _reports( std::move(zyppContext ))
47 , _info( std::move(info) )
50 MaybeAwaitable<expected<void>> execute () {
52 using namespace zyppng::operators;
53 using zyppng::operators::operator|;
54 using zyppng::expected;
58 if ( gpgKeyUrls.empty() ) {
59 if ( !_info.baseUrlsEmpty() ) {
60 MIL <<
"No gpgkey URL specified, Trying to generate the key file path." << std::endl;
62 zypp::Url bUrl = *_info.baseUrlsBegin();
67 gpgKeyUrls.push_back( bUrl );
71 gpgKeyUrls.push_back( bUrl );
75 MIL <<
"Repo type is not known, unable to generate the gpgkey Url on the fly." << std::endl;
81 if ( gpgKeyUrls.empty () )
85 _keysDownloaded.clear();
91 _reports.info( zypp::str::Format(
_(
"Looking for gpg keys in repository %1%.") ) % _info.asUserString() );
93 return std::move(gpgKeyUrls)
94 |
transform( [
this](
const zypp::Url &url ) {
96 _reports.info(
" gpgkey=" + url.
asString() );
97 return _reports.zyppContext()->provider ()->provide( url, zyppng::ProvideFileSpec().setMirrorsAllowed(
false) )
98 |
and_then( [
this, url]( ProvideRes f ) -> expected<void> {
100 zypp::PublicKey key(f.
file());
101 if ( !key.isValid() )
105 _reports.zyppContext()->keyRing()->importKey(key,
false);
107 }
catch (
const std::exception & e ) {
110 MIL <<
"Key import from url:'"<<url<<
"' failed." << std::endl;
117 | []( std::list<expected<void>> && ) {
123 JobReportHelper _reports;
124 const zypp::RepoInfo _info;
125 std::set<std::string> _keysDownloaded;
132 FetchGpgKeysLogic impl( std::move(ctx), std::move(info) );
133 zypp_co_return zypp_co_await( impl.execute () );
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
#define ZYPP_FWD_CURRENT_EXCPT()
Drops a logline and returns the current Exception as a std::exception_ptr.
What is known about a repository.
std::string asString() const
Returns a default string representation of the Url object.
void appendPathName(const Pathname &path_r, EEncoding eflag_r=zypp::url::E_DECODED)
Extend the path name.
const zypp::Pathname file() const
static expected success(ConsParams &&...params)
MaybeAwaitable< expected< void > > fetchGpgKeys(ContextRef ctx, zypp::RepoInfo info)
ResultType and_then(const expected< T, E > &exp, Function &&f)
auto transform(Container< Msg, CArgs... > &&val, Transformation &&transformation)