Don't allow rollback on the stable-channel.
This change explicitly disallows rollback on the stable-channel.
BUG=chromium:252539
TEST=unittests + on device.
Change-Id: I71caf95daae185790cf9fb0fda790eaf960bbe6b
Reviewed-on: https://gerrit.chromium.org/gerrit/61687
Tested-by: Chris Sosa <sosa@chromium.org>
Reviewed-by: David Zeuthen <zeuthen@chromium.org>
Commit-Queue: Chris Sosa <sosa@chromium.org>
diff --git a/omaha_request_params.h b/omaha_request_params.h
index 7a85500..1a65c75 100644
--- a/omaha_request_params.h
+++ b/omaha_request_params.h
@@ -216,6 +216,9 @@
// For unit-tests.
void set_root(const std::string& root);
+ void set_current_channel(const std::string& channel) {
+ current_channel_ = channel;
+ }
// Enforce security mode for testing purposes.
void SetLockDown(bool lock);
diff --git a/update_attempter.cc b/update_attempter.cc
index 4104739..8d7e455 100644
--- a/update_attempter.cc
+++ b/update_attempter.cc
@@ -552,6 +552,17 @@
// check for != stable-channel here.
RefreshDevicePolicy();
+ // Initialize the default request params.
+ if (!omaha_request_params_->Init("", "", true)) {
+ LOG(ERROR) << "Unable to initialize Omaha request params.";
+ return false;
+ }
+
+ if (omaha_request_params_->current_channel() == "stable-channel") {
+ LOG(ERROR) << "Rollback is not supported while on the stable-channel.";
+ return false;
+ }
+
LOG(INFO) << "Setting rollback options.";
InstallPlan install_plan;
if (install_path == NULL) {
@@ -583,12 +594,6 @@
new InstallPlanAction(install_plan));
actions_.push_back(shared_ptr<AbstractAction>(install_plan_action));
- // Initialize the default request params.
- if (!omaha_request_params_->Init("", "", true)) {
- LOG(ERROR) << "Unable to initialize Omaha request params.";
- return false;
- }
-
BuildPostInstallActions(install_plan_action.get());
// Enqueue the actions
diff --git a/update_attempter_unittest.cc b/update_attempter_unittest.cc
index 2de8ca2..98fc1a8 100644
--- a/update_attempter_unittest.cc
+++ b/update_attempter_unittest.cc
@@ -75,12 +75,13 @@
void UpdateTestStart();
void UpdateTestVerify();
- void RollbackTestStart(bool enterprise_rollback);
+ void RollbackTestStart(bool enterprise_rollback, bool stable_channel);
void RollbackTestVerify();
static gboolean StaticUpdateTestStart(gpointer data);
static gboolean StaticUpdateTestVerify(gpointer data);
static gboolean StaticRollbackTestStart(gpointer data);
static gboolean StaticEnterpriseRollbackTestStart(gpointer data);
+ static gboolean StaticStableChannelRollbackTestStart(gpointer data);
static gboolean StaticRollbackTestVerify(gpointer data);
void PingOmahaTestStart();
@@ -309,12 +310,19 @@
}
gboolean UpdateAttempterTest::StaticRollbackTestStart(gpointer data) {
- reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestStart(false);
+ reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestStart(false, false);
return FALSE;
}
gboolean UpdateAttempterTest::StaticEnterpriseRollbackTestStart(gpointer data) {
- reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestStart(true);
+ reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestStart(true, false);
+ return FALSE;
+}
+
+gboolean UpdateAttempterTest::StaticStableChannelRollbackTestStart(
+ gpointer data) {
+ reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestStart(
+ false, true);
return FALSE;
}
@@ -425,7 +433,8 @@
g_main_loop_quit(loop_);
}
-void UpdateAttempterTest::RollbackTestStart(bool enterprise_rollback) {
+void UpdateAttempterTest::RollbackTestStart(
+ bool enterprise_rollback, bool stable_channel) {
// Create a device policy so that we can change settings.
policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
@@ -435,13 +444,31 @@
Return(device_policy));
string install_path = "/dev/sda3";
+ bool is_rollback_allowed = false;
- // Non-enterprise enrolled device account with an owner in the device policy.
- if (!enterprise_rollback) {
+ // We only allow rollback on devices that are neither enterprise enrolled or
+ // not on the stable channel.
+ if (!(enterprise_rollback || stable_channel)) {
+ is_rollback_allowed = true;
+ }
+
+ // Set up the policy for the test given our args.
+ if (stable_channel) {
+ attempter_.omaha_request_params_->set_current_channel(
+ string("stable-channel"));
+ } else if (enterprise_rollback) {
+ // We return an empty owner as this is an enterprise.
+ EXPECT_CALL(*device_policy, GetOwner(_)).WillOnce(
+ DoAll(SetArgumentPointee<0>(std::string("")),
+ Return(true)));
+ } else {
+ // We return a fake owner as this is an owned consumer device.
EXPECT_CALL(*device_policy, GetOwner(_)).WillOnce(
DoAll(SetArgumentPointee<0>(std::string("fake.mail@fake.com")),
Return(true)));
+ }
+ if (is_rollback_allowed) {
InSequence s;
for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
EXPECT_CALL(*processor_,
@@ -453,12 +480,6 @@
EXPECT_TRUE(attempter_.Rollback(true, &install_path));
g_idle_add(&StaticRollbackTestVerify, this);
} else {
- // We return an empty owner as this is an enterprise.
- EXPECT_CALL(*device_policy, GetOwner(_)).WillOnce(
- DoAll(SetArgumentPointee<0>(std::string("")),
- Return(true)));
-
- // We do not currently support rollbacks for enterprises.
EXPECT_FALSE(attempter_.Rollback(true, &install_path));
g_main_loop_quit(loop_);
}
@@ -497,6 +518,14 @@
loop_ = NULL;
}
+TEST_F(UpdateAttempterTest, StableChannelRollbackTest) {
+ loop_ = g_main_loop_new(g_main_context_default(), FALSE);
+ g_idle_add(&StaticStableChannelRollbackTestStart, this);
+ g_main_loop_run(loop_);
+ g_main_loop_unref(loop_);
+ loop_ = NULL;
+}
+
TEST_F(UpdateAttempterTest, EnterpriseRollbackTest) {
loop_ = g_main_loop_new(g_main_context_default(), FALSE);
g_idle_add(&StaticEnterpriseRollbackTestStart, this);