mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-30 16:14:13 +00:00
sculpt: make download verification controllable
This patch adds the 'Verify' argument to all download-related interfaces in order to control the checking of signatures for downloads. Note that it does not change the sculpt_manager's existing built-in policy of always checking signatures. Issue #4804
This commit is contained in:
parent
a351b0c164
commit
b6bb338011
@ -1106,10 +1106,10 @@ struct Sculpt::Main : Input_event_handler,
|
|||||||
_deploy.update_managed_deploy_config();
|
_deploy.update_managed_deploy_config();
|
||||||
}
|
}
|
||||||
|
|
||||||
Start_name new_construction(Component::Path const &pkg,
|
Start_name new_construction(Component::Path const &pkg, Verify verify,
|
||||||
Component::Info const &info) override
|
Component::Info const &info) override
|
||||||
{
|
{
|
||||||
return _runtime_state.new_construction(pkg, info, _affinity_space);
|
return _runtime_state.new_construction(pkg, verify, info, _affinity_space);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _apply_to_construction(Popup_dialog::Action::Apply_to &fn) override
|
void _apply_to_construction(Popup_dialog::Action::Apply_to &fn) override
|
||||||
@ -1129,9 +1129,9 @@ struct Sculpt::Main : Input_event_handler,
|
|||||||
_deploy.update_managed_deploy_config();
|
_deploy.update_managed_deploy_config();
|
||||||
}
|
}
|
||||||
|
|
||||||
void trigger_download(Path const &path) override
|
void trigger_download(Path const &path, Verify verify) override
|
||||||
{
|
{
|
||||||
_download_queue.add(path);
|
_download_queue.add(path, verify);
|
||||||
|
|
||||||
/* incorporate new download-queue content into update */
|
/* incorporate new download-queue content into update */
|
||||||
_deploy.update_installation();
|
_deploy.update_installation();
|
||||||
|
@ -32,9 +32,11 @@ struct Sculpt::Component : Noncopyable
|
|||||||
Allocator &_alloc;
|
Allocator &_alloc;
|
||||||
|
|
||||||
/* defined at construction time */
|
/* defined at construction time */
|
||||||
Name const name;
|
Name const name;
|
||||||
Path const path;
|
Path const path;
|
||||||
Info const info;
|
Verify const verify;
|
||||||
|
Info const info;
|
||||||
|
|
||||||
|
|
||||||
/* defined when blueprint arrives */
|
/* defined when blueprint arrives */
|
||||||
uint64_t ram { };
|
uint64_t ram { };
|
||||||
@ -98,7 +100,7 @@ struct Sculpt::Component : Noncopyable
|
|||||||
|
|
||||||
struct Construction_action : Interface
|
struct Construction_action : Interface
|
||||||
{
|
{
|
||||||
virtual void new_construction(Path const &pkg, Info const &info) = 0;
|
virtual void new_construction(Path const &pkg, Verify, Info const &) = 0;
|
||||||
|
|
||||||
struct Apply_to : Interface { virtual void apply_to(Component &) = 0; };
|
struct Apply_to : Interface { virtual void apply_to(Component &) = 0; };
|
||||||
|
|
||||||
@ -122,9 +124,10 @@ struct Sculpt::Component : Noncopyable
|
|||||||
};
|
};
|
||||||
|
|
||||||
Component(Allocator &alloc, Name const &name, Path const &path,
|
Component(Allocator &alloc, Name const &name, Path const &path,
|
||||||
Info const &info, Affinity::Space const space)
|
Verify verify, Info const &info, Affinity::Space const space)
|
||||||
:
|
:
|
||||||
_alloc(alloc), name(name), path(path), info(info), affinity_space(space)
|
_alloc(alloc), name(name), path(path), verify(verify), info(info),
|
||||||
|
affinity_space(space)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
~Component()
|
~Component()
|
||||||
|
@ -26,30 +26,42 @@ struct Sculpt::Download_queue : Noncopyable
|
|||||||
{
|
{
|
||||||
Path const path;
|
Path const path;
|
||||||
|
|
||||||
|
bool const verify;
|
||||||
|
|
||||||
enum class State { DOWNLOADING, FAILED, DONE } state;
|
enum class State { DOWNLOADING, FAILED, DONE } state;
|
||||||
|
|
||||||
unsigned percent = 0;
|
unsigned percent = 0;
|
||||||
|
|
||||||
Download(Path const &path) : path(path), state(State::DOWNLOADING) { }
|
Download(Path const &path, Verify verify)
|
||||||
|
:
|
||||||
|
path(path), verify(verify.value), state(State::DOWNLOADING)
|
||||||
|
{ }
|
||||||
|
|
||||||
void gen_installation_entry(Xml_generator &xml) const
|
void gen_installation_entry(Xml_generator &xml) const
|
||||||
{
|
{
|
||||||
if (state != State::DOWNLOADING)
|
if (state != State::DOWNLOADING)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto gen_install_node = [&] (auto type, auto path) {
|
auto gen_verify_attr = [&] {
|
||||||
xml.node(type, [&] () { xml.attribute("path", path); }); };
|
if (!verify)
|
||||||
|
xml.attribute("verify", "no"); };
|
||||||
|
|
||||||
|
auto gen_install_node = [&] (auto type) {
|
||||||
|
xml.node(type, [&] () {
|
||||||
|
xml.attribute("path", path);
|
||||||
|
gen_verify_attr(); }); };
|
||||||
|
|
||||||
if (Depot::Archive::index(path))
|
if (Depot::Archive::index(path))
|
||||||
gen_install_node("index", path);
|
gen_install_node("index");
|
||||||
else if (Depot::Archive::image_index(path))
|
else if (Depot::Archive::image_index(path))
|
||||||
gen_install_node("image_index", path);
|
gen_install_node("image_index");
|
||||||
else if (Depot::Archive::image(path))
|
else if (Depot::Archive::image(path))
|
||||||
gen_install_node("image", path);
|
gen_install_node("image");
|
||||||
else
|
else
|
||||||
xml.node("archive", [&] () {
|
xml.node("archive", [&] () {
|
||||||
xml.attribute("path", path);
|
xml.attribute("path", path);
|
||||||
xml.attribute("source", "no"); });
|
xml.attribute("source", "no");
|
||||||
|
gen_verify_attr(); });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -59,7 +71,7 @@ struct Sculpt::Download_queue : Noncopyable
|
|||||||
|
|
||||||
Download_queue(Allocator &alloc) : _alloc(alloc) { }
|
Download_queue(Allocator &alloc) : _alloc(alloc) { }
|
||||||
|
|
||||||
void add(Path const &path)
|
void add(Path const &path, Verify const verify)
|
||||||
{
|
{
|
||||||
log("add to download queue: ", path);
|
log("add to download queue: ", path);
|
||||||
bool already_exists = false;
|
bool already_exists = false;
|
||||||
@ -70,7 +82,7 @@ struct Sculpt::Download_queue : Noncopyable
|
|||||||
if (already_exists)
|
if (already_exists)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
new (_alloc) Registered<Download>(_downloads, path);
|
new (_alloc) Registered<Download>(_downloads, path, verify);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename FN>
|
template <typename FN>
|
||||||
|
@ -157,12 +157,13 @@ class Sculpt::Runtime_state : public Runtime_info
|
|||||||
*/
|
*/
|
||||||
Launched_child(Allocator &alloc, Start_name const &name,
|
Launched_child(Allocator &alloc, Start_name const &name,
|
||||||
Component::Path const &pkg_path,
|
Component::Path const &pkg_path,
|
||||||
|
Verify const verify,
|
||||||
Component::Info const &info,
|
Component::Info const &info,
|
||||||
Affinity::Space const space)
|
Affinity::Space const space)
|
||||||
:
|
:
|
||||||
name(name), launcher(), launched(false)
|
name(name), launcher(), launched(false)
|
||||||
{
|
{
|
||||||
construction.construct(alloc, name, pkg_path, info, space);
|
construction.construct(alloc, name, pkg_path, verify, info, space);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gen_deploy_start_node(Xml_generator &xml, Runtime_state const &state) const
|
void gen_deploy_start_node(Xml_generator &xml, Runtime_state const &state) const
|
||||||
@ -436,9 +437,10 @@ class Sculpt::Runtime_state : public Runtime_info
|
|||||||
new (_alloc) Registered<Launched_child>(_launched_children, name, launcher);
|
new (_alloc) Registered<Launched_child>(_launched_children, name, launcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
Start_name new_construction(Component::Path const pkg,
|
Start_name new_construction(Component::Path const pkg,
|
||||||
|
Verify const verify,
|
||||||
Component::Info const &info,
|
Component::Info const &info,
|
||||||
Affinity::Space const space)
|
Affinity::Space const space)
|
||||||
{
|
{
|
||||||
/* allow only one construction at a time */
|
/* allow only one construction at a time */
|
||||||
discard_construction();
|
discard_construction();
|
||||||
@ -452,7 +454,7 @@ class Sculpt::Runtime_state : public Runtime_info
|
|||||||
|
|
||||||
_currently_constructed = new (_alloc)
|
_currently_constructed = new (_alloc)
|
||||||
Registered<Launched_child>(_launched_children, _alloc,
|
Registered<Launched_child>(_launched_children, _alloc,
|
||||||
unique_name, pkg, info, space);
|
unique_name, pkg, verify, info, space);
|
||||||
return unique_name;
|
return unique_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,6 +60,11 @@ namespace Sculpt {
|
|||||||
DRIVER = 0,
|
DRIVER = 0,
|
||||||
LEITZENTRALE = 0 /* only for latency-critical drivers */
|
LEITZENTRALE = 0 /* only for latency-critical drivers */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Argument type for controlling the verification of downloads
|
||||||
|
*/
|
||||||
|
struct Verify { bool value; };
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _TYPES_H_ */
|
#endif /* _TYPES_H_ */
|
||||||
|
@ -353,7 +353,7 @@ void Popup_dialog::click(Action &action)
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (!_index_avail(clicked))
|
if (!_index_avail(clicked))
|
||||||
action.trigger_download(_index_path(clicked));
|
action.trigger_download(_index_path(clicked), Verify{true});
|
||||||
else
|
else
|
||||||
action.remove_index(clicked);
|
action.remove_index(clicked);
|
||||||
}
|
}
|
||||||
@ -395,7 +395,8 @@ void Popup_dialog::click(Action &action)
|
|||||||
auto path = item.attribute_value("path", Component::Path());
|
auto path = item.attribute_value("path", Component::Path());
|
||||||
auto info = item.attribute_value("info", Component::Info());
|
auto info = item.attribute_value("info", Component::Info());
|
||||||
|
|
||||||
_construction_name = action.new_construction(path, info);
|
_construction_name =
|
||||||
|
action.new_construction(path, Verify{true}, info);
|
||||||
|
|
||||||
_state = PKG_REQUESTED;
|
_state = PKG_REQUESTED;
|
||||||
_depot_query.trigger_depot_query();
|
_depot_query.trigger_depot_query();
|
||||||
|
@ -88,7 +88,7 @@ struct Sculpt::Popup_dialog : Dialog
|
|||||||
{
|
{
|
||||||
virtual void launch_global(Path const &launcher) = 0;
|
virtual void launch_global(Path const &launcher) = 0;
|
||||||
|
|
||||||
virtual Start_name new_construction(Component::Path const &pkg,
|
virtual Start_name new_construction(Component::Path const &pkg, Verify,
|
||||||
Component::Info const &info) = 0;
|
Component::Info const &info) = 0;
|
||||||
|
|
||||||
struct Apply_to : Interface { virtual void apply_to(Component &) = 0; };
|
struct Apply_to : Interface { virtual void apply_to(Component &) = 0; };
|
||||||
@ -110,7 +110,7 @@ struct Sculpt::Popup_dialog : Dialog
|
|||||||
virtual void discard_construction() = 0;
|
virtual void discard_construction() = 0;
|
||||||
virtual void launch_construction() = 0;
|
virtual void launch_construction() = 0;
|
||||||
|
|
||||||
virtual void trigger_download(Path const &) = 0;
|
virtual void trigger_download(Path const &, Verify) = 0;
|
||||||
virtual void remove_index(Depot::Archive::User const &) = 0;
|
virtual void remove_index(Depot::Archive::User const &) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -340,7 +340,7 @@ struct Sculpt::Popup_dialog : Dialog
|
|||||||
|
|
||||||
if (!_blueprint_info.pkg_avail && _install_item.activated("install")) {
|
if (!_blueprint_info.pkg_avail && _install_item.activated("install")) {
|
||||||
_construction_info.with_construction([&] (Component const &component) {
|
_construction_info.with_construction([&] (Component const &component) {
|
||||||
action.trigger_download(component.path);
|
action.trigger_download(component.path, component.verify);
|
||||||
_install_item.reset();
|
_install_item.reset();
|
||||||
_refresh.refresh_popup_dialog();
|
_refresh.refresh_popup_dialog();
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user