Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(272)

Unified Diff: chrome/browser/chromeos/policy/device_status_collector.cc

Issue 907323002: Implemented DeviceStatusCollector::GetDeviceSessionStatus() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/policy/device_status_collector.cc
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc
index d3bd1140d17b926159ba8143a7363a301ea579af..c15926027898b878d0cd41a6c9bb570b8352140b 100644
--- a/chrome/browser/chromeos/policy/device_status_collector.cc
+++ b/chrome/browser/chromeos/policy/device_status_collector.cc
@@ -25,7 +25,10 @@
#include "base/task_runner_util.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/chromeos/policy/device_local_account.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/common/chrome_version_info.h"
#include "chrome/common/pref_names.h"
@@ -40,6 +43,8 @@
#include "components/user_manager/user_manager.h"
#include "components/user_manager/user_type.h"
#include "content/public/browser/browser_thread.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/common/extension.h"
#include "policy/proto/device_management_backend.pb.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
@@ -106,6 +111,25 @@ std::vector<em::VolumeInfo> GetVolumeInfo(
return result;
}
+bool GetCurrentDeviceLocalAccount(chromeos::CrosSettings* settings,
bartfab (slow) 2015/02/11 17:28:43 Nit: The name does not match what the method actua
Andrew T Wilson (Slow) 2015/02/12 15:15:38 Done.
Andrew T Wilson (Slow) 2015/02/12 15:15:39 Changed name to clarify the behavior and added a c
+ policy::DeviceLocalAccount* account) {
+ if (!user_manager::UserManager::Get()->IsLoggedInAsKioskApp())
+ return false;
+ user_manager::User* user = user_manager::UserManager::Get()->GetActiveUser();
bartfab (slow) 2015/02/11 17:28:43 Nit: s/user_manager::User*/const user_manager::Use
Andrew T Wilson (Slow) 2015/02/12 15:15:38 Done.
+ std::string user_id = user->GetUserID();
bartfab (slow) 2015/02/11 17:28:43 Nit: const.
Andrew T Wilson (Slow) 2015/02/12 15:15:38 Done.
+ std::vector<policy::DeviceLocalAccount> accounts =
bartfab (slow) 2015/02/11 17:28:43 Nit: const.
+ policy::GetDeviceLocalAccounts(settings);
bartfab (slow) 2015/02/11 17:28:43 It is possible to remove a device-local account fr
Andrew T Wilson (Slow) 2015/02/12 15:15:38 OK, good to know. I've changed the NOTREACHED into
Andrew T Wilson (Slow) 2015/02/13 13:59:59 BTW, not using the policy broker because it's basi
bartfab (slow) 2015/02/16 13:30:33 The one advantage of going via the broker is that
+
+ for (auto device_account : accounts) {
bartfab (slow) 2015/02/11 17:28:43 Nit 1: s/device_account/device_local_account/ or s
Andrew T Wilson (Slow) 2015/02/12 15:15:38 Done.
+ if (device_account.user_id == user_id) {
+ *account = device_account;
+ return true;
+ }
+ }
+ NOTREACHED() << "Kiosk app user not found in list of local accounts";
bartfab (slow) 2015/02/11 17:28:43 Nit: s/local/device-local/
Andrew T Wilson (Slow) 2015/02/12 15:15:38 Done.
+ return false;
+}
+
} // namespace
namespace policy {
@@ -132,6 +156,7 @@ DeviceStatusCollector::DeviceStatusCollector(
report_network_interfaces_(false),
report_users_(false),
report_hardware_status_(false),
+ report_session_status_(false),
weak_factory_(this) {
if (volume_info_fetcher_.is_null())
volume_info_fetcher_ = base::Bind(&GetVolumeInfo);
@@ -166,6 +191,8 @@ DeviceStatusCollector::DeviceStatusCollector(
chromeos::kReportDeviceUsers, callback);
hardware_status_subscription_ = cros_settings_->AddSettingsObserver(
chromeos::kReportDeviceHardwareStatus, callback);
+ session_status_subscription_ = cros_settings_->AddSettingsObserver(
+ chromeos::kReportDeviceSessionStatus, callback);
// The last known location is persisted in local state. This makes location
// information available immediately upon startup and avoids the need to
@@ -237,32 +264,38 @@ void DeviceStatusCollector::UpdateReportingSettings() {
// All reporting settings default to 'enabled'.
if (!cros_settings_->GetBoolean(
- chromeos::kReportDeviceVersionInfo, &report_version_info_)) {
+ chromeos::kReportDeviceVersionInfo, &report_version_info_)) {
report_version_info_ = true;
}
if (!cros_settings_->GetBoolean(
- chromeos::kReportDeviceActivityTimes, &report_activity_times_)) {
+ chromeos::kReportDeviceActivityTimes, &report_activity_times_)) {
report_activity_times_ = true;
}
if (!cros_settings_->GetBoolean(
- chromeos::kReportDeviceBootMode, &report_boot_mode_)) {
+ chromeos::kReportDeviceBootMode, &report_boot_mode_)) {
report_boot_mode_ = true;
}
if (!cros_settings_->GetBoolean(
- chromeos::kReportDeviceNetworkInterfaces, &report_network_interfaces_)) {
+ chromeos::kReportDeviceNetworkInterfaces,
+ &report_network_interfaces_)) {
report_network_interfaces_ = true;
}
if (!cros_settings_->GetBoolean(
- chromeos::kReportDeviceUsers, &report_users_)) {
+ chromeos::kReportDeviceUsers, &report_users_)) {
report_users_ = true;
}
const bool already_reporting_hardware_status = report_hardware_status_;
if (!cros_settings_->GetBoolean(
- chromeos::kReportDeviceHardwareStatus, &report_hardware_status_)) {
+ chromeos::kReportDeviceHardwareStatus, &report_hardware_status_)) {
report_hardware_status_ = true;
}
+ if (!cros_settings_->GetBoolean(
+ chromeos::kReportDeviceSessionStatus, &report_session_status_)) {
+ report_session_status_ = true;
+ }
+
// Device location reporting is disabled by default because it is
// not launched yet.
if (!cros_settings_->GetBoolean(
@@ -382,9 +415,16 @@ void DeviceStatusCollector::IdleStateCallback(ui::IdleState state) {
}
bool DeviceStatusCollector::IsAutoLaunchedKioskSession() {
- // TODO(atwilson): Determine if the currently active session is an
- // autolaunched kiosk session (http://crbug.com/452968).
- return false;
+ DeviceLocalAccount account(DeviceLocalAccount::TYPE_KIOSK_APP);
bartfab (slow) 2015/02/11 17:28:43 I think this implementation can be improved. The l
Andrew T Wilson (Slow) 2015/02/12 15:15:39 Done.
+ // If no kiosk app is currently running, exit.
+ if (!GetCurrentDeviceLocalAccount(cros_settings_, &account))
+ return false;
+ chromeos::KioskAppManager::App current_app;
+ if (!chromeos::KioskAppManager::Get()->GetApp(account.kiosk_app_id,
+ &current_app)) {
+ return false;
bartfab (slow) 2015/02/11 17:28:43 Is this not a NOTREACHED() case?
Andrew T Wilson (Slow) 2015/02/12 15:15:38 Done.
+ }
+ return current_app.was_auto_launched_with_zero_delay;
}
void DeviceStatusCollector::SampleHardwareStatus() {
@@ -693,9 +733,8 @@ bool DeviceStatusCollector::GetDeviceStatus(
if (report_network_interfaces_)
GetNetworkInterfaces(status);
- if (report_users_) {
+ if (report_users_)
GetUsers(status);
- }
if (report_hardware_status_)
GetHardwareStatus(status);
@@ -711,7 +750,40 @@ bool DeviceStatusCollector::GetDeviceStatus(
bool DeviceStatusCollector::GetDeviceSessionStatus(
em::SessionStatusReportRequest* status) {
- return false;
+ // Only generate session status reports if session status reporting is
+ // enabled, and we are in an auto-launched kiosk session.
+ if (!report_session_status_ || !IsAutoLaunchedKioskSession())
+ return false;
+
+ // Get the account ID associated with this user.
+ DeviceLocalAccount account(DeviceLocalAccount::TYPE_KIOSK_APP);
+ if (!GetCurrentDeviceLocalAccount(cros_settings_, &account))
bartfab (slow) 2015/02/11 17:28:43 You are doing all this fetching, parsing and searc
Andrew T Wilson (Slow) 2015/02/12 15:15:38 Done. This cascaded into a yak shave that impacted
+ return false;
+ status->set_device_local_account_id(account.account_id);
+ em::AppStatus* app_status = status->add_installed_apps();
+ app_status->set_app_id(account.kiosk_app_id);
+
+ // Look up the app and get the version.
+ std::string app_version = GetAppVersion(account.kiosk_app_id);
bartfab (slow) 2015/02/11 17:28:43 Nit: const.
Andrew T Wilson (Slow) 2015/02/12 15:15:39 Done.
+ if (app_version.empty()) {
+ DLOG(ERROR) << "Unable to get version for extension: "
+ << account.kiosk_app_id;
+ } else {
+ app_status->set_extension_version(app_version);
+ }
+ return true;
+}
+
+std::string DeviceStatusCollector::GetAppVersion(std::string kiosk_app_id) {
+ Profile* profile = chromeos::ProfileHelper::Get()->GetProfileByUser(
+ user_manager::UserManager::Get()->GetActiveUser());
+ extensions::ExtensionRegistry* registry =
+ extensions::ExtensionRegistry::Get(profile);
+ const extensions::Extension* extension = registry->GetExtensionById(
+ kiosk_app_id, extensions::ExtensionRegistry::EVERYTHING);
+ if (!extension)
+ return std::string();
+ return extension->VersionString();
}
void DeviceStatusCollector::OnSubmittedSuccessfully() {

Powered by Google App Engine
This is Rietveld 408576698