blob: da6f872a893f3af13d44541afdfd639ad7ffe927 [file] [log] [blame]
// Copyright 2019 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_SHARING_SHARING_FCM_SENDER_H_
#define CHROME_BROWSER_SHARING_SHARING_FCM_SENDER_H_
#include <memory>
#include <string>
#include <vector>
#include "base/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "chrome/browser/sharing/proto/sharing_message.pb.h"
#include "chrome/browser/sharing/sharing_message_sender.h"
#include "chrome/browser/sharing/sharing_send_message_result.h"
#include "chrome/browser/sharing/web_push/web_push_sender.h"
#include "components/sync_device_info/device_info.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace gcm {
class GCMDriver;
enum class GCMEncryptionResult;
} // namespace gcm
namespace syncer {
class LocalDeviceInfoProvider;
class SyncService;
} // namespace syncer
namespace sync_pb {
class SharingMessageCommitError;
}
enum class SharingChannelType;
enum class SendWebPushMessageResult;
class SharingMessageBridge;
class SharingSyncPreference;
class VapidKeyManager;
// Responsible for sending FCM messages within Sharing infrastructure.
class SharingFCMSender : public SharingMessageSender::SendMessageDelegate {
public:
using SharingMessage = chrome_browser_sharing::SharingMessage;
using SendMessageCallback =
base::OnceCallback<void(SharingSendMessageResult result,
absl::optional<std::string> message_id,
SharingChannelType channel_type)>;
SharingFCMSender(std::unique_ptr<WebPushSender> web_push_sender,
SharingMessageBridge* sharing_message_bridge,
SharingSyncPreference* sync_preference,
VapidKeyManager* vapid_key_manager,
gcm::GCMDriver* gcm_driver,
syncer::LocalDeviceInfoProvider* local_device_info_provider,
syncer::SyncService* sync_service);
SharingFCMSender(const SharingFCMSender&) = delete;
SharingFCMSender& operator=(const SharingFCMSender&) = delete;
~SharingFCMSender() override;
// Sends a |message| to device identified by |fcm_configuration|, which
// expires after |time_to_live| seconds. |callback| will be invoked with
// message_id if asynchronous operation succeeded, or absl::nullopt if
// operation failed.
virtual void SendMessageToFcmTarget(
const chrome_browser_sharing::FCMChannelConfiguration& fcm_configuration,
base::TimeDelta time_to_live,
SharingMessage message,
SendMessageCallback callback);
// Sends a |message| to device identified by |server_channel|, |callback| will
// be invoked with message_id if asynchronous operation succeeded, or
// absl::nullopt if operation failed.
virtual void SendMessageToServerTarget(
const chrome_browser_sharing::ServerChannelConfiguration& server_channel,
SharingMessage message,
SendMessageCallback callback);
// Used to inject fake WebPushSender in integration tests.
void SetWebPushSenderForTesting(
std::unique_ptr<WebPushSender> web_push_sender);
// Used to inject fake SharingMessageBridge in integration tests.
void SetSharingMessageBridgeForTesting(
SharingMessageBridge* sharing_message_bridge);
protected:
// SharingMessageSender::SendMessageDelegate:
void DoSendMessageToDevice(const syncer::DeviceInfo& device,
base::TimeDelta time_to_live,
SharingMessage message,
SendMessageCallback callback) override;
private:
using MessageSender = base::OnceCallback<void(std::string message,
SendMessageCallback callback)>;
void EncryptMessage(const std::string& authorized_entity,
const std::string& p256dh,
const std::string& auth_secret,
const SharingMessage& message,
SharingChannelType channel_type,
SendMessageCallback callback,
MessageSender message_sender);
void OnMessageEncrypted(SharingChannelType channel_type,
SendMessageCallback callback,
MessageSender message_sender,
gcm::GCMEncryptionResult result,
std::string message);
void DoSendMessageToVapidTarget(const std::string& fcm_token,
base::TimeDelta time_to_live,
std::string message,
SendMessageCallback callback);
void OnMessageSentToVapidTarget(SendMessageCallback callback,
SendWebPushMessageResult result,
absl::optional<std::string> message_id);
void DoSendMessageToSenderIdTarget(const std::string& fcm_token,
base::TimeDelta time_to_live,
const std::string& message_id,
std::string message,
SendMessageCallback callback);
void DoSendMessageToServerTarget(const std::string& server_channel,
const std::string& message_id,
std::string message,
SendMessageCallback callback);
void OnMessageSentViaSync(SendMessageCallback callback,
const std::string& message_id,
SharingChannelType channel_type,
const sync_pb::SharingMessageCommitError& error);
bool SetMessageSenderInfo(SharingMessage* message);
std::unique_ptr<WebPushSender> web_push_sender_;
raw_ptr<SharingMessageBridge> sharing_message_bridge_;
raw_ptr<SharingSyncPreference> sync_preference_;
raw_ptr<VapidKeyManager> vapid_key_manager_;
raw_ptr<gcm::GCMDriver> gcm_driver_;
raw_ptr<syncer::LocalDeviceInfoProvider> local_device_info_provider_;
raw_ptr<syncer::SyncService> sync_service_;
base::WeakPtrFactory<SharingFCMSender> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_SHARING_SHARING_FCM_SENDER_H_