privetd: Compare user scope with minimalRole for local commands
Prived passes current auth scope corresponding to the current
/privet/v3/commands/execute requests to buffet.
Buffet compare scope with minimalRole of requested command and denies
request if scope is not enough.
BUG=brillo:808
TEST=`FEATURES=test emerge-gizmo buffet privetd`
Change-Id: Ib691184460fcd9d099e0688eaeadf831229672aa
Reviewed-on: https://chromium-review.googlesource.com/274234
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc
index 8408a46..ab8f189 100644
--- a/buffet/buffet_client.cc
+++ b/buffet/buffet_client.cc
@@ -365,7 +365,7 @@
void CallAddCommand(const std::string& command, ManagerProxy* manager_proxy) {
ErrorPtr error;
std::string id;
- if (!manager_proxy->AddCommand(command, &id, &error)) {
+ if (!manager_proxy->AddCommand(command, "owner", &id, &error)) {
return ReportError(error.get());
}
OnJobComplete();
diff --git a/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml b/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml
index 9a3b9c2..0fa4282 100644
--- a/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml
+++ b/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml
@@ -45,6 +45,7 @@
</method>
<method name="AddCommand">
<arg name="json_command" type="s" direction="in"/>
+ <arg name="user_role" type="s" direction="in"/>
<arg name="id" type="s" direction="out"/>
<annotation name="org.chromium.DBus.Method.Kind" value="async"/>
</method>
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 23e4fca..40ef9c0 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -162,7 +162,8 @@
}
void Manager::AddCommand(DBusMethodResponse<std::string> response,
- const std::string& json_command) {
+ const std::string& json_command,
+ const std::string& in_user_role) {
static int next_id = 0;
std::string error_message;
std::unique_ptr<base::Value> value(base::JSONReader::ReadAndReturnError(
@@ -181,6 +182,24 @@
response->ReplyWithError(error.get());
return;
}
+
+ UserRole role;
+ if (!FromString(in_user_role, &role, &error)) {
+ response->ReplyWithError(error.get());
+ return;
+ }
+
+ UserRole minimal_role =
+ command_instance->GetCommandDefinition()->GetMinimalRole();
+ if (role < minimal_role) {
+ chromeos::Error::AddToPrintf(
+ &error, FROM_HERE, kErrorDomainGCD, "access_denied",
+ "User role '%s' less than minimal: '%s'", ToString(role).c_str(),
+ ToString(minimal_role).c_str());
+ response->ReplyWithError(error.get());
+ return;
+ }
+
std::string id = std::to_string(++next_id);
command_instance->SetID(id);
command_manager_->AddCommand(std::move(command_instance));
diff --git a/buffet/manager.h b/buffet/manager.h
index 2acb73e..35e6e25 100644
--- a/buffet/manager.h
+++ b/buffet/manager.h
@@ -77,7 +77,8 @@
const chromeos::VariantDictionary& property_set) override;
bool GetState(chromeos::ErrorPtr* error, std::string* state) override;
void AddCommand(DBusMethodResponse<std::string> response,
- const std::string& json_command) override;
+ const std::string& json_command,
+ const std::string& in_user_role) override;
void GetCommand(DBusMethodResponse<std::string> response,
const std::string& id) override;
void SetCommandVisibility(