-
Notifications
You must be signed in to change notification settings - Fork 6.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support profile level remote command job.
Create a new profile picker helper class. It can accept `ProfileManager` for CBCM remote command. Or a `Profile` instance for profile level remote command. Note that one job can only be one of the two states above. The helper class now is only used for `ClearBrowsingDataJob`. Change-Id: I06f5298ce8c0779892822c4e745b68f7e0204b40 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4776180 Reviewed-by: Anthony Vallée-Dubois <anthonyvd@chromium.org> Commit-Queue: Owen Min <zmin@chromium.org> Cr-Commit-Position: refs/heads/main@{#1184313}
- Loading branch information
Owen Min
authored and
Chromium LUCI CQ
committed
Aug 16, 2023
1 parent
fdb6289
commit 0d9183b
Showing
6 changed files
with
176 additions
and
52 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
81 changes: 81 additions & 0 deletions
81
chrome/browser/enterprise/remote_commands/job_profile_picker.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
// Copyright 2023 The Chromium Authors | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#include "chrome/browser/enterprise/remote_commands/job_profile_picker.h" | ||
|
||
#include "base/values.h" | ||
#include "build/build_config.h" | ||
#include "chrome/browser/profiles/profile.h" | ||
#include "chrome/browser/profiles/profile_attributes_storage.h" | ||
#include "chrome/browser/profiles/profile_manager.h" | ||
|
||
namespace enterprise_commands { | ||
namespace { | ||
|
||
const char kProfilePathField[] = "profile_path"; | ||
|
||
} // namespace | ||
|
||
JobProfilePicker::JobProfilePicker(Profile* profile) | ||
: profile_or_profile_manager_(profile) {} | ||
JobProfilePicker::JobProfilePicker(ProfileManager* profile_manager) | ||
: profile_or_profile_manager_(profile_manager) {} | ||
|
||
JobProfilePicker::~JobProfilePicker() = default; | ||
|
||
bool JobProfilePicker::ParseCommandPayload( | ||
const base::Value::Dict& command_payload) { | ||
if (absl::holds_alternative<raw_ptr<Profile>>(profile_or_profile_manager_)) { | ||
return true; | ||
} | ||
|
||
const std::string* path = command_payload.FindString(kProfilePathField); | ||
if (!path) { | ||
return false; | ||
} | ||
|
||
// On Windows, file paths are wstring as opposed to string on other platforms. | ||
// On POSIX platforms other than MacOS and ChromeOS, the encoding is unknown. | ||
// | ||
// This path is sent from the server, which obtained it from Chrome in a | ||
// previous report, and Chrome casts the path as UTF8 using UTF8Unsafe before | ||
// sending it (see BrowserReportGeneratorDesktop::GenerateProfileInfo). | ||
// Because of that, the best thing we can do everywhere is try to get the | ||
// path from UTF8, and ending up with an invalid path will fail later in | ||
// RunImpl when we attempt to get the profile from the path. | ||
profile_path_ = base::FilePath::FromUTF8Unsafe(*path); | ||
#if BUILDFLAG(IS_WIN) | ||
// For Windows machines, the path that Chrome reports for the profile is | ||
// "Normalized" to all lower-case on the reporting server. This means that | ||
// when the server sends the command, the path will be all lower case and | ||
// the profile manager won't be able to use it as a key. To avoid this issue, | ||
// This code will iterate over all profile paths and find the one that matches | ||
// in a case-insensitive comparison. If this doesn't find one, RunImpl will | ||
// fail in the same manner as if the profile didn't exist, which is the | ||
// expected behavior. | ||
ProfileAttributesStorage& storage = | ||
absl::get<raw_ptr<ProfileManager>>(profile_or_profile_manager_) | ||
->GetProfileAttributesStorage(); | ||
for (ProfileAttributesEntry* entry : storage.GetAllProfilesAttributes()) { | ||
base::FilePath entry_path = entry->GetPath(); | ||
|
||
if (base::FilePath::CompareEqualIgnoreCase(profile_path_.value(), | ||
entry_path.value())) { | ||
profile_path_ = entry_path; | ||
break; | ||
} | ||
} | ||
#endif | ||
return true; | ||
} | ||
|
||
Profile* JobProfilePicker::GetProfile() { | ||
if (absl::holds_alternative<raw_ptr<Profile>>(profile_or_profile_manager_)) { | ||
return absl::get<raw_ptr<Profile>>(profile_or_profile_manager_); | ||
} | ||
return absl::get<raw_ptr<ProfileManager>>(profile_or_profile_manager_) | ||
->GetProfileByPath(profile_path_); | ||
} | ||
|
||
} // namespace enterprise_commands |
40 changes: 40 additions & 0 deletions
40
chrome/browser/enterprise/remote_commands/job_profile_picker.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// Copyright 2023 The Chromium Authors | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef CHROME_BROWSER_ENTERPRISE_REMOTE_COMMANDS_JOB_PROFILE_PICKER_H_ | ||
#define CHROME_BROWSER_ENTERPRISE_REMOTE_COMMANDS_JOB_PROFILE_PICKER_H_ | ||
|
||
#include "base/files/file_path.h" | ||
#include "base/memory/raw_ptr.h" | ||
#include "base/values.h" | ||
#include "third_party/abseil-cpp/absl/types/variant.h" | ||
|
||
class ProfileManager; | ||
class Profile; | ||
|
||
namespace enterprise_commands { | ||
// A helper class that allow remote command job select the correct profile to | ||
// execute the command, regardless the command come with CBCM or Profile | ||
// management. | ||
class JobProfilePicker { | ||
public: | ||
explicit JobProfilePicker(Profile* profile); | ||
explicit JobProfilePicker(ProfileManager* profile); | ||
JobProfilePicker(const JobProfilePicker&) = delete; | ||
JobProfilePicker& operator=(const JobProfilePicker&) = delete; | ||
~JobProfilePicker(); | ||
|
||
bool ParseCommandPayload(const base::Value::Dict& command_payload); | ||
Profile* GetProfile(); | ||
|
||
private: | ||
absl::variant<raw_ptr<Profile>, raw_ptr<ProfileManager>> | ||
profile_or_profile_manager_; | ||
|
||
base::FilePath profile_path_; | ||
}; | ||
|
||
} // namespace enterprise_commands | ||
|
||
#endif // CHROME_BROWSER_ENTERPRISE_REMOTE_COMMANDS_JOB_PROFILE_PICKER_H_ |