| OLD | NEW |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/policy/status_uploader.h" | 5 #include "chrome/browser/chromeos/policy/status_uploader.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/chromeos/logging.h" |
| 12 #include "base/location.h" | 13 #include "base/location.h" |
| 13 #include "base/sequenced_task_runner.h" | 14 #include "base/sequenced_task_runner.h" |
| 15 #include "base/sys_info.h" |
| 14 #include "chrome/browser/chromeos/policy/device_local_account.h" | 16 #include "chrome/browser/chromeos/policy/device_local_account.h" |
| 15 #include "chrome/browser/chromeos/policy/device_status_collector.h" | 17 #include "chrome/browser/chromeos/policy/device_status_collector.h" |
| 16 #include "chromeos/settings/cros_settings_names.h" | 18 #include "chromeos/settings/cros_settings_names.h" |
| 17 #include "chromeos/settings/cros_settings_provider.h" | 19 #include "chromeos/settings/cros_settings_provider.h" |
| 18 #include "components/policy/core/common/cloud/cloud_policy_client.h" | 20 #include "components/policy/core/common/cloud/cloud_policy_client.h" |
| 19 #include "components/policy/core/common/cloud/device_management_service.h" | 21 #include "components/policy/core/common/cloud/device_management_service.h" |
| 20 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
| 21 #include "content/public/browser/media_request_state.h" | 23 #include "content/public/browser/media_request_state.h" |
| 22 #include "content/public/common/media_stream_request.h" | 24 #include "content/public/common/media_stream_request.h" |
| 23 #include "ui/base/user_activity/user_activity_detector.h" | 25 #include "ui/base/user_activity/user_activity_detector.h" |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 base::Bind(&StatusUploader::RefreshUploadFrequency, | 102 base::Bind(&StatusUploader::RefreshUploadFrequency, |
| 101 weak_factory_.GetWeakPtr()))) { | 103 weak_factory_.GetWeakPtr()))) { |
| 102 return; | 104 return; |
| 103 } | 105 } |
| 104 | 106 |
| 105 // CrosSettings are trusted - update our cached upload_frequency (we cache the | 107 // CrosSettings are trusted - update our cached upload_frequency (we cache the |
| 106 // value because CrosSettings can become untrusted at arbitrary times and we | 108 // value because CrosSettings can become untrusted at arbitrary times and we |
| 107 // want to use the last trusted value). | 109 // want to use the last trusted value). |
| 108 int frequency; | 110 int frequency; |
| 109 if (settings->GetInteger(chromeos::kReportUploadFrequency, &frequency)) { | 111 if (settings->GetInteger(chromeos::kReportUploadFrequency, &frequency)) { |
| 110 LOG(WARNING) << "Changing status upload frequency from " | 112 CHROMEOS_SYSLOG(WARNING) << "Changing status upload frequency from " |
| 111 << upload_frequency_ << " to " | 113 << upload_frequency_ << " to " |
| 112 << base::TimeDelta::FromMilliseconds(frequency); | 114 << base::TimeDelta::FromMilliseconds(frequency); |
| 113 upload_frequency_ = base::TimeDelta::FromMilliseconds( | 115 upload_frequency_ = base::TimeDelta::FromMilliseconds( |
| 114 std::max(kMinUploadDelayMs, frequency)); | 116 std::max(kMinUploadDelayMs, frequency)); |
| 115 } | 117 } |
| 116 | 118 |
| 117 // Schedule a new upload with the new frequency - only do this if we've | 119 // Schedule a new upload with the new frequency - only do this if we've |
| 118 // already performed the initial upload, because we want the initial upload | 120 // already performed the initial upload, because we want the initial upload |
| 119 // to happen in a minute after startup and not get cancelled by settings | 121 // to happen in a minute after startup and not get cancelled by settings |
| 120 // changes. | 122 // changes. |
| 121 if (!last_upload_.is_null()) | 123 if (!last_upload_.is_null()) |
| 122 ScheduleNextStatusUpload(); | 124 ScheduleNextStatusUpload(); |
| 123 } | 125 } |
| 124 | 126 |
| 125 bool StatusUploader::IsSessionDataUploadAllowed() { | 127 bool StatusUploader::IsSessionDataUploadAllowed() { |
| 126 // Check if we're in an auto-launched kiosk session. | 128 // Check if we're in an auto-launched kiosk session. |
| 127 std::unique_ptr<DeviceLocalAccount> account = | 129 std::unique_ptr<DeviceLocalAccount> account = |
| 128 collector_->GetAutoLaunchedKioskSessionInfo(); | 130 collector_->GetAutoLaunchedKioskSessionInfo(); |
| 129 if (!account) | 131 if (!account) { |
| 132 CHROMEOS_SYSLOG(WARNING) |
| 133 << "Not a kiosk session, data upload is not allowed."; |
| 130 return false; | 134 return false; |
| 135 } |
| 131 | 136 |
| 132 // Check if there has been any user input. | 137 // Check if there has been any user input. |
| 133 if (!ui::UserActivityDetector::Get()->last_activity_time().is_null()) | 138 base::TimeTicks last_activity_time = |
| 139 ui::UserActivityDetector::Get()->last_activity_time(); |
| 140 std::string last_activity_name = |
| 141 ui::UserActivityDetector::Get()->last_activity_name(); |
| 142 if (!last_activity_time.is_null()) { |
| 143 CHROMEOS_SYSLOG(WARNING) |
| 144 << "User input " << last_activity_name << " detected " |
| 145 << (base::TimeTicks::Now() - last_activity_time) << " ago (" |
| 146 << (base::SysInfo::Uptime() - |
| 147 (base::TimeTicks::Now() - last_activity_time)) |
| 148 << " after last boot), data upload is not allowed."; |
| 134 return false; | 149 return false; |
| 150 } |
| 135 | 151 |
| 136 // Screenshot is allowed as long as we have not captured media. | 152 // Screenshot is allowed as long as we have not captured media. |
| 137 return !has_captured_media_; | 153 if (has_captured_media_) { |
| 154 CHROMEOS_SYSLOG(WARNING) |
| 155 << "Media has been captured, data upload is not allowed."; |
| 156 return false; |
| 157 } else { |
| 158 return true; |
| 159 } |
| 138 } | 160 } |
| 139 | 161 |
| 140 void StatusUploader::OnRequestUpdate(int render_process_id, | 162 void StatusUploader::OnRequestUpdate(int render_process_id, |
| 141 int render_frame_id, | 163 int render_frame_id, |
| 142 content::MediaStreamType stream_type, | 164 content::MediaStreamType stream_type, |
| 143 const content::MediaRequestState state) { | 165 const content::MediaRequestState state) { |
| 144 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 166 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 145 // If a video or audio capture stream is opened, set a flag so we disallow | 167 // If a video or audio capture stream is opened, set a flag so we disallow |
| 146 // upload of potentially sensitive data. | 168 // upload of potentially sensitive data. |
| 147 if (state == content::MEDIA_REQUEST_STATE_OPENING && | 169 if (state == content::MEDIA_REQUEST_STATE_OPENING && |
| 148 (stream_type == content::MEDIA_DEVICE_AUDIO_CAPTURE || | 170 (stream_type == content::MEDIA_DEVICE_AUDIO_CAPTURE || |
| 149 stream_type == content::MEDIA_DEVICE_VIDEO_CAPTURE)) { | 171 stream_type == content::MEDIA_DEVICE_VIDEO_CAPTURE)) { |
| 150 has_captured_media_ = true; | 172 has_captured_media_ = true; |
| 151 } | 173 } |
| 152 } | 174 } |
| 153 | 175 |
| 154 void StatusUploader::UploadStatus() { | 176 void StatusUploader::UploadStatus() { |
| 155 enterprise_management::DeviceStatusReportRequest device_status; | 177 enterprise_management::DeviceStatusReportRequest device_status; |
| 156 bool have_device_status = collector_->GetDeviceStatus(&device_status); | 178 bool have_device_status = collector_->GetDeviceStatus(&device_status); |
| 157 enterprise_management::SessionStatusReportRequest session_status; | 179 enterprise_management::SessionStatusReportRequest session_status; |
| 158 bool have_session_status = collector_->GetDeviceSessionStatus( | 180 bool have_session_status = collector_->GetDeviceSessionStatus( |
| 159 &session_status); | 181 &session_status); |
| 160 if (!have_device_status && !have_session_status) { | 182 if (!have_device_status && !have_session_status) { |
| 161 LOG(WARNING) << "Skipping status upload because no data to upload"; | 183 CHROMEOS_SYSLOG(WARNING) |
| 184 << "Skipping status upload because no data to upload"; |
| 162 // Don't have any status to upload - just set our timer for next time. | 185 // Don't have any status to upload - just set our timer for next time. |
| 163 last_upload_ = base::Time::NowFromSystemTime(); | 186 last_upload_ = base::Time::NowFromSystemTime(); |
| 164 ScheduleNextStatusUpload(); | 187 ScheduleNextStatusUpload(); |
| 165 return; | 188 return; |
| 166 } | 189 } |
| 167 | 190 |
| 168 LOG(WARNING) << "Starting status upload: have_device_status = " | 191 CHROMEOS_SYSLOG(WARNING) << "Starting status upload: have_device_status = " |
| 169 << have_device_status; | 192 << have_device_status; |
| 170 client_->UploadDeviceStatus( | 193 client_->UploadDeviceStatus( |
| 171 have_device_status ? &device_status : nullptr, | 194 have_device_status ? &device_status : nullptr, |
| 172 have_session_status ? &session_status : nullptr, | 195 have_session_status ? &session_status : nullptr, |
| 173 base::Bind(&StatusUploader::OnUploadCompleted, | 196 base::Bind(&StatusUploader::OnUploadCompleted, |
| 174 weak_factory_.GetWeakPtr())); | 197 weak_factory_.GetWeakPtr())); |
| 175 } | 198 } |
| 176 | 199 |
| 177 void StatusUploader::OnUploadCompleted(bool success) { | 200 void StatusUploader::OnUploadCompleted(bool success) { |
| 178 // Set the last upload time, regardless of whether the upload was successful | 201 // Set the last upload time, regardless of whether the upload was successful |
| 179 // or not (we don't change the time of the next upload based on whether this | 202 // or not (we don't change the time of the next upload based on whether this |
| 180 // upload succeeded or not - if a status upload fails, we just skip it and | 203 // upload succeeded or not - if a status upload fails, we just skip it and |
| 181 // wait until it's time to try again. | 204 // wait until it's time to try again. |
| 182 LOG_IF(ERROR, !success) << "Error uploading status: " << client_->status(); | 205 CHROMEOS_SYSLOG_IF(ERROR, !success) << "Error uploading status: " |
| 183 LOG_IF(WARNING, success) << "Status upload successful"; | 206 << client_->status(); |
| 207 CHROMEOS_SYSLOG_IF(WARNING, success) << "Status upload successful"; |
| 184 last_upload_ = base::Time::NowFromSystemTime(); | 208 last_upload_ = base::Time::NowFromSystemTime(); |
| 185 | 209 |
| 186 // If the upload was successful, tell the collector so it can clear its cache | 210 // If the upload was successful, tell the collector so it can clear its cache |
| 187 // of pending items. | 211 // of pending items. |
| 188 if (success) | 212 if (success) |
| 189 collector_->OnSubmittedSuccessfully(); | 213 collector_->OnSubmittedSuccessfully(); |
| 190 | 214 |
| 191 ScheduleNextStatusUpload(); | 215 ScheduleNextStatusUpload(); |
| 192 } | 216 } |
| 193 | 217 |
| 194 } // namespace policy | 218 } // namespace policy |
| OLD | NEW |