#ifndef REMOTING_HOST_IT2ME_IT2ME_HOST_H_
#define REMOTING_HOST_IT2ME_IT2ME_HOST_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/values.h"
#include "remoting/base/errors.h"
#include "remoting/base/local_session_policies_provider.h"
#include "remoting/base/session_policies.h"
#include "remoting/host/chromeos/chromeos_enterprise_params.h"
#include "remoting/host/host_status_observer.h"
#include "remoting/host/it2me/it2me_confirmation_dialog.h"
#include "remoting/host/it2me/it2me_confirmation_dialog_proxy.h"
#include "remoting/host/it2me/it2me_constants.h"
#include "remoting/host/it2me/reconnect_params.h"
#include "remoting/host/register_support_host_request.h"
#include "remoting/protocol/errors.h"
#include "remoting/protocol/validating_authenticator.h"
#include "remoting/signaling/signal_strategy.h"
namespace remoting {
class ChromotingHost;
class ChromotingHostContext;
class CorpHostStatusLogger;
class DesktopEnvironmentFactory;
class FtlSignalingConnector;
class HostEventLogger;
class HostEventReporter;
class HostStatusMonitor;
class OAuthTokenGetter;
class RegisterSupportHostRequest;
class RsaKeyPair;
namespace protocol {
struct IceConfig;
}
class It2MeHost : public base::RefCountedThreadSafe<It2MeHost>,
public HostStatusObserver {
public:
struct DeferredConnectContext {
DeferredConnectContext();
~DeferredConnectContext();
std::unique_ptr<RegisterSupportHostRequest> register_request;
std::unique_ptr<SignalStrategy> signal_strategy;
std::unique_ptr<OAuthTokenGetter> signaling_token_getter;
std::unique_ptr<OAuthTokenGetter> api_token_getter;
std::string ftl_device_id;
bool is_corp_user = false;
};
using CreateDeferredConnectContext =
base::OnceCallback<std::unique_ptr<DeferredConnectContext>(
ChromotingHostContext*)>;
using HostEventReporterFactory =
base::RepeatingCallback<std::unique_ptr<HostEventReporter>(
scoped_refptr<HostStatusMonitor>)>;
class Observer {
public:
virtual void OnClientAuthenticated(const std::string& client_username) = 0;
virtual void OnStoreAccessCode(const std::string& access_code,
base::TimeDelta access_code_lifetime) = 0;
virtual void OnNatPoliciesChanged(bool nat_traversal_enabled,
bool relay_connections_allowed) = 0;
virtual void OnStateChanged(It2MeHostState state,
protocol::ErrorCode error_code) = 0;
};
It2MeHost();
It2MeHost(const It2MeHost&) = delete;
It2MeHost& operator=(const It2MeHost&) = delete;
void set_chrome_os_enterprise_params(ChromeOsEnterpriseParams params);
const ChromeOsEnterpriseParams& chrome_os_enterprise_params() const {
return *chrome_os_enterprise_params_;
}
bool is_enterprise_session() const {
return chrome_os_enterprise_params_.has_value();
}
bool is_class_management_session() const {
return chrome_os_enterprise_params_.has_value() &&
chrome_os_enterprise_params_->request_origin ==
remoting::ChromeOsEnterpriseRequestOrigin::kClassManagement;
}
void set_authorized_helper(const std::string& authorized_helper);
const std::string& authorized_helper() const { return authorized_helper_; }
void set_reconnect_params(ReconnectParams reconnect_params);
virtual std::optional<ReconnectParams> CreateReconnectParams() const;
virtual void Connect(
std::unique_ptr<ChromotingHostContext> context,
base::Value::Dict policies,
std::unique_ptr<It2MeConfirmationDialogFactory> dialog_factory,
base::WeakPtr<It2MeHost::Observer> observer,
CreateDeferredConnectContext create_context,
const std::string& username,
const protocol::IceConfig& ice_config);
virtual void Disconnect();
void OnClientAccessDenied(const std::string& signaling_id) override;
void OnClientConnected(const std::string& signaling_id) override;
void OnClientDisconnected(const std::string& signaling_id) override;
void SetStateForTesting(It2MeHostState state,
protocol::ErrorCode error_code) {
SetState(state, error_code);
}
protocol::ValidatingAuthenticator::ValidationCallback
GetValidationCallbackForTesting();
#if BUILDFLAG(IS_CHROMEOS)
void SetHostEventReporterFactoryForTesting(HostEventReporterFactory factory);
#endif
void OnPolicyUpdate(base::Value::Dict policies);
protected:
friend class base::RefCountedThreadSafe<It2MeHost>;
friend class It2MeNativeMessagingHostTest;
~It2MeHost() override;
ChromotingHostContext* host_context() { return host_context_.get(); }
base::WeakPtr<It2MeHost::Observer> observer() { return observer_; }
private:
friend class MockIt2MeHost;
friend class It2MeHostTest;
void SetState(It2MeHostState state, protocol::ErrorCode error_code);
bool IsRunning() const;
void OnConfirmationResult(
protocol::ValidatingAuthenticator::ResultCallback result_callback,
It2MeConfirmationDialog::Result result);
void ConnectOnNetworkThread(const std::string& username,
const protocol::IceConfig& ice_config,
CreateDeferredConnectContext create_context);
void OnReceivedSupportID(const std::string& support_id,
const base::TimeDelta& lifetime,
protocol::ErrorCode error_code);
std::optional<ErrorCode> OnEffectiveSessionPoliciesReceived(
const SessionPolicies& session_policies);
void ReportNatPolicies(const SessionPolicies& session_policies);
void UpdateHostDomainListPolicy(std::vector<std::string> host_domain_list);
void UpdateClientDomainListPolicy(
std::vector<std::string> client_domain_list);
void UpdateLocalSessionPolicies(const base::Value::Dict& platform_policies);
void DisconnectOnNetworkThread(
protocol::ErrorCode error_code = protocol::ErrorCode::OK);
void ValidateConnectionDetails(
const std::string& remote_jid,
protocol::ValidatingAuthenticator::ResultCallback result_callback);
bool RemoteSupportConnectionsAllowed(const base::Value::Dict& policies);
bool SessionSupportsReconnections() const;
void SendReconnectSessionMessage() const;
std::unique_ptr<ChromotingHostContext> host_context_;
base::WeakPtr<It2MeHost::Observer> observer_;
std::unique_ptr<SignalStrategy> signal_strategy_;
std::unique_ptr<FtlSignalingConnector> ftl_signaling_connector_;
std::unique_ptr<OAuthTokenGetter> api_token_getter_;
It2MeHostState state_ = It2MeHostState::kDisconnected;
std::optional<ReconnectParams> reconnect_params_;
std::string support_id_;
std::string host_secret_;
std::string ftl_device_id_;
scoped_refptr<RsaKeyPair> host_key_pair_;
std::unique_ptr<RegisterSupportHostRequest> register_request_;
std::unique_ptr<DesktopEnvironmentFactory> desktop_environment_factory_;
std::unique_ptr<HostEventLogger> host_event_logger_;
std::unique_ptr<LocalSessionPoliciesProvider>
local_session_policies_provider_;
#if BUILDFLAG(IS_CHROMEOS)
std::unique_ptr<HostEventReporter> host_event_reporter_;
HostEventReporterFactory host_event_reporter_factory_;
#endif
bool use_corp_session_authz_ = false;
std::unique_ptr<CorpHostStatusLogger> corp_host_status_logger_;
std::unique_ptr<ChromotingHost> host_;
int failed_login_attempts_ = 0;
std::unique_ptr<It2MeConfirmationDialogFactory> confirmation_dialog_factory_;
std::unique_ptr<It2MeConfirmationDialogProxy> confirmation_dialog_proxy_;
bool session_policies_finalized_ = false;
std::optional<bool> last_reported_nat_traversal_enabled_ = false;
std::optional<bool> last_reported_relay_connections_allowed_ = false;
std::optional<ChromeOsEnterpriseParams> chrome_os_enterprise_params_;
std::string authorized_helper_;
std::vector<std::string> required_client_domain_list_;
std::vector<std::string> required_host_domain_list_;
bool remote_support_connections_allowed_ = true;
std::string connecting_jid_;
base::WeakPtrFactory<It2MeHost> weak_factory_{this};
};
class It2MeHostFactory {
public:
It2MeHostFactory();
It2MeHostFactory(const It2MeHostFactory&) = delete;
It2MeHostFactory& operator=(const It2MeHostFactory&) = delete;
virtual ~It2MeHostFactory();
virtual std::unique_ptr<It2MeHostFactory> Clone() const;
virtual scoped_refptr<It2MeHost> CreateIt2MeHost();
};
}
#endif