Commit 08c9c0c5 authored by Aya ElAttar's avatar Aya ElAttar Committed by Commit Bot

DLP: Bubble instead of toasts for clipboard

- Changed the toasts shown for clipboard blocked pastes
to bubbles according to the new mocks.
- Moved all the clipboard notifications related
functions to dlp_clipboard_notification_helper.h/.cc

Bug: 1148224, 1131670
Change-Id: I69a99b1a99d08cbc6ea47852d3ce6a3a7fdace66
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2532564
Commit-Queue: Aya Elsayed <ayaelattar@chromium.org>
Reviewed-by: default avatarAya Elsayed <ayaelattar@chromium.org>
Reviewed-by: default avatarSergey Poromov <poromov@chromium.org>
Reviewed-by: default avatarNikita Podguzov <nikitapodguzov@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Reviewed-by: default avatarAhmed Fakhry <afakhry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#829162}
parent e35022a3
......@@ -2195,6 +2195,8 @@ source_set("chromeos") {
"policy/display_settings_handler.h",
"policy/dlp/data_transfer_dlp_controller.cc",
"policy/dlp/data_transfer_dlp_controller.h",
"policy/dlp/dlp_clipboard_notification_helper.cc",
"policy/dlp/dlp_clipboard_notification_helper.h",
"policy/dlp/dlp_content_manager.cc",
"policy/dlp/dlp_content_manager.h",
"policy/dlp/dlp_content_restriction_set.cc",
......
......@@ -6,32 +6,15 @@
#include <vector>
#include "ash/public/cpp/toast_data.h"
#include "ash/public/cpp/toast_manager.h"
#include "base/notreached.h"
#include "base/optional.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/crostini/crostini_util.h"
#include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/grit/generated_resources.h"
#include "components/strings/grit/components_strings.h"
#include "ui/base/clipboard/clipboard.h"
#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/base/l10n/l10n_util.h"
#include "url/gurl.h"
namespace policy {
namespace {
const char kToastId[] = "clipboard_dlp_block";
constexpr int kToastDurationMs = 2500;
} // namespace
// static
void DataTransferDlpController::Init() {
if (!HasInstance())
......@@ -40,7 +23,7 @@ void DataTransferDlpController::Init() {
bool DataTransferDlpController::IsDataReadAllowed(
const ui::DataTransferEndpoint* const data_src,
const ui::DataTransferEndpoint* const data_dst) const {
const ui::DataTransferEndpoint* const data_dst) {
if (!data_src || data_src->type() == ui::EndpointType::kClipboardHistory) {
return true;
}
......@@ -75,7 +58,7 @@ bool DataTransferDlpController::IsDataReadAllowed(
bool notify_on_paste = !data_dst || data_dst->notify_if_restricted();
if (level == DlpRulesManager::Level::kBlock && notify_on_paste) {
ShowBlockToast(GetToastText(data_src, data_dst));
helper_.NotifyBlockedPaste(data_src, data_dst);
}
return level == DlpRulesManager::Level::kAllow;
......@@ -85,55 +68,4 @@ DataTransferDlpController::DataTransferDlpController() = default;
DataTransferDlpController::~DataTransferDlpController() = default;
void DataTransferDlpController::ShowBlockToast(
const base::string16& text) const {
ash::ToastData toast(kToastId, text, kToastDurationMs, base::nullopt);
toast.is_managed = true;
ash::ToastManager::Get()->Show(toast);
}
base::string16 DataTransferDlpController::GetToastText(
const ui::DataTransferEndpoint* const data_src,
const ui::DataTransferEndpoint* const data_dst) const {
DCHECK(data_src);
DCHECK(data_src->origin());
base::string16 host_name = base::UTF8ToUTF16(data_src->origin()->host());
if (data_dst && data_dst->type() == ui::EndpointType::kGuestOs) {
ProfileManager* profile_manager = g_browser_process->profile_manager();
Profile* profile =
profile_manager ? profile_manager->GetActiveUserProfile() : nullptr;
bool is_crostini_running = crostini::IsCrostiniRunning(profile);
bool is_plugin_vm_running = plugin_vm::IsPluginVmRunning(profile);
if (is_crostini_running && is_plugin_vm_running) {
return l10n_util::GetStringFUTF16(
IDS_POLICY_DLP_CLIPBOARD_BLOCKED_ON_COPY_TWO_VMS, host_name,
l10n_util::GetStringUTF16(IDS_CROSTINI_LINUX),
l10n_util::GetStringUTF16(IDS_PLUGIN_VM_APP_NAME));
} else if (is_crostini_running) {
return l10n_util::GetStringFUTF16(
IDS_POLICY_DLP_CLIPBOARD_BLOCKED_ON_COPY_VM, host_name,
l10n_util::GetStringUTF16(IDS_CROSTINI_LINUX));
} else if (is_plugin_vm_running) {
return l10n_util::GetStringFUTF16(
IDS_POLICY_DLP_CLIPBOARD_BLOCKED_ON_COPY_VM, host_name,
l10n_util::GetStringUTF16(IDS_PLUGIN_VM_APP_NAME));
} else {
NOTREACHED();
}
}
if (data_dst && data_dst->type() == ui::EndpointType::kArc) {
return l10n_util::GetStringFUTF16(
IDS_POLICY_DLP_CLIPBOARD_BLOCKED_ON_COPY_VM, host_name,
l10n_util::GetStringUTF16(IDS_POLICY_DLP_ANDROID_APPS));
}
return l10n_util::GetStringFUTF16(IDS_POLICY_DLP_CLIPBOARD_BLOCKED_ON_PASTE,
host_name);
}
} // namespace policy
......@@ -6,6 +6,7 @@
#define CHROME_BROWSER_CHROMEOS_POLICY_DLP_DATA_TRANSFER_DLP_CONTROLLER_H_
#include "base/strings/string16.h"
#include "chrome/browser/chromeos/policy/dlp/dlp_clipboard_notification_helper.h"
#include "ui/base/data_transfer_policy/data_transfer_policy_controller.h"
namespace ui {
......@@ -28,24 +29,16 @@ class DataTransferDlpController : public ui::DataTransferPolicyController {
void operator=(const DataTransferDlpController&) = delete;
// nullptr can be passed instead of `data_src` or `data_dst`. If data read is
// not allowed, this function will show a toast to the user.
// not allowed, this function will show a notification to the user.
bool IsDataReadAllowed(
const ui::DataTransferEndpoint* const data_src,
const ui::DataTransferEndpoint* const data_dst) const override;
const ui::DataTransferEndpoint* const data_dst) override;
private:
DataTransferDlpController();
~DataTransferDlpController() override;
// Shows toast in case the data read is blocked.
// TODO(crbug.com/1131670): Move `ShowBlockToast` to a separate util/helper.
void ShowBlockToast(const base::string16& text) const;
// The text will be different if the data transferred is being shared with
// Crostini or Parallels or ARC.
base::string16 GetToastText(
const ui::DataTransferEndpoint* const data_src,
const ui::DataTransferEndpoint* const data_dst) const;
DlpClipboardNotificationHelper helper_;
};
} // namespace policy
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_POLICY_DLP_DLP_CLIPBOARD_NOTIFICATION_HELPER_H_
#define CHROME_BROWSER_CHROMEOS_POLICY_DLP_DLP_CLIPBOARD_NOTIFICATION_HELPER_H_
#include "base/strings/string16.h"
#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
#include "ui/views/widget/unique_widget_ptr.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
namespace ui {
class DataTransferEndpoint;
}
namespace policy {
class DlpClipboardNotificationHelper : public views::WidgetObserver {
public:
DlpClipboardNotificationHelper() = default;
~DlpClipboardNotificationHelper() override = default;
DlpClipboardNotificationHelper(const DlpClipboardNotificationHelper&) =
delete;
void operator=(const DlpClipboardNotificationHelper&) = delete;
// Shows a bubble that clipboard paste is not allowed. If the type of
// `data_dst` is kGuestOS or kArc, it will show a toast instead of a
// notification.
void NotifyBlockedPaste(const ui::DataTransferEndpoint* const data_src,
const ui::DataTransferEndpoint* const data_dst);
private:
void ShowClipboardBlockBubble(const base::string16& text);
void ShowClipboardBlockToast(const base::string16& text);
// views::WidgetObserver
void OnWidgetClosing(views::Widget* widget) override;
void OnWidgetDestroyed(views::Widget* widget) override;
views::UniqueWidgetPtr widget_;
};
} // namespace policy
#endif // CHROME_BROWSER_CHROMEOS_POLICY_DLP_DLP_CLIPBOARD_NOTIFICATION_HELPER_H_
......@@ -780,7 +780,7 @@ class FakeDataTransferPolicyController
// ui::DataTransferPolicyController:
bool IsDataReadAllowed(
const ui::DataTransferEndpoint* const data_src,
const ui::DataTransferEndpoint* const data_dst) const override {
const ui::DataTransferEndpoint* const data_dst) override {
// The multipaste menu should have access to any clipboard data.
if (data_dst && data_dst->type() == ui::EndpointType::kClipboardHistory)
return true;
......
......@@ -585,6 +585,9 @@ Additional details:
<message name="IDS_POLICY_DLP_ANDROID_APPS" desc="Name shown for ARC in data leak prevention toasts.">
Android apps
</message>
<message name="IDS_POLICY_DLP_CLIPBOARD_BLOCK_DISMISS_BUTTON" desc="Dismiss dialog button label for disabled paste notification.">
Got it
</message>
<message name="IDS_POLICY_DLP_PRINTING_BLOCKED_TITLE" desc="The title for notification informing the user that printing is blocked.">
Printing is blocked
</message>
......
bde2dbb0124a0fb0b5782b260dfa77bdd7b7f7ce
\ No newline at end of file
......@@ -109,9 +109,9 @@ class MockPolicyController : public DataTransferPolicyController {
MockPolicyController();
~MockPolicyController() override;
MOCK_CONST_METHOD2(IsDataReadAllowed,
bool(const DataTransferEndpoint* const data_src,
const DataTransferEndpoint* const data_dst));
MOCK_METHOD2(IsDataReadAllowed,
bool(const DataTransferEndpoint* const data_src,
const DataTransferEndpoint* const data_dst));
};
MockPolicyController::MockPolicyController() = default;
......
......@@ -29,7 +29,7 @@ class COMPONENT_EXPORT(UI_BASE_DATA_TRANSFER_POLICY)
virtual bool IsDataReadAllowed(
const DataTransferEndpoint* const data_src,
const DataTransferEndpoint* const data_dst) const = 0;
const DataTransferEndpoint* const data_dst) = 0;
protected:
DataTransferPolicyController();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment