// 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. #include "remoting/base/directory_service_client.h" #include "base/bind.h" #include "remoting/base/protobuf_http_request.h" #include "remoting/base/protobuf_http_request_config.h" #include "remoting/base/service_urls.h" #include "remoting/proto/remoting/v1/directory_messages.pb.h" #include "services/network/public/cpp/shared_url_loader_factory.h" namespace remoting { DirectoryServiceClient::DirectoryServiceClient( OAuthTokenGetter* token_getter, scoped_refptr url_loader_factory) : http_client_(ServiceUrls::GetInstance()->remoting_server_endpoint(), token_getter, url_loader_factory) {} DirectoryServiceClient::~DirectoryServiceClient() = default; void DirectoryServiceClient::DeleteHost(const std::string& host_id, DeleteHostCallback callback) { constexpr net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("remoting_directory_delete_host", R"( semantics { sender: "Chrome Remote Desktop" description: "Deletes a Chrome Remote Desktop host from the user's account." trigger: "User deletes a Chrome Remote Desktop host from the host list." data: "User's Chrome Remote Desktop credentials and the Chrome Remote " "Desktop host ID that identifies the host." destination: GOOGLE_OWNED_SERVICE } policy { cookies_allowed: NO setting: "This request cannot be stopped in settings, but will not be sent " "if the user does not use Chrome Remote Desktop." policy_exception_justification: "Not implemented." })"); constexpr char path[] = "/v1/directory:deletehost"; auto delete_host_request = std::make_unique(); delete_host_request->set_host_id(host_id); ExecuteRequest(traffic_annotation, path, std::move(delete_host_request), std::move(callback)); } void DirectoryServiceClient::GetHostList(GetHostListCallback callback) { constexpr net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("remoting_directory_get_host_list", R"( semantics { sender: "Chrome Remote Desktop" description: "Retrieves information about Chrome Remote Desktop hosts that are " "registered under the user's account." trigger: "User opens the Chrome Remote Desktop app." data: "User's Chrome Remote Desktop credentials." destination: GOOGLE_OWNED_SERVICE } policy { cookies_allowed: NO setting: "This request cannot be stopped in settings, but will not be sent " "if the user does not use Chrome Remote Desktop." policy_exception_justification: "Not implemented." })"); constexpr char path[] = "/v1/directory:gethostlist"; ExecuteRequest(traffic_annotation, path, std::make_unique(), std::move(callback)); } void DirectoryServiceClient::RegisterHost(const std::string& host_id, const std::string& host_name, const std::string& public_key, const std::string& host_client_id, RegisterHostCallback callback) { constexpr net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("remoting_directory_register_host", R"( semantics { sender: "Chrome Remote Desktop" description: "Registers a new Chrome Remote Desktop host under the user's " "account." trigger: "User runs the remoting_start_host command by typing it on the " "terminal. Third party administrators might implement scripts to " "run this automatically, but the Chrome Remote Desktop product " "does not come with such scripts." data: "User's Chrome Remote Desktop credentials and information about " "the new Chrome Remote Desktop host such as host ID and host name." destination: GOOGLE_OWNED_SERVICE } policy { cookies_allowed: NO setting: "This request cannot be stopped in settings, but will not be sent " "if the user does not use Chrome Remote Desktop." policy_exception_justification: "Not implemented." })"); constexpr char path[] = "/v1/directory:registerhost"; auto register_host_request = std::make_unique(); register_host_request->set_host_id(host_id); register_host_request->set_host_name(host_name); register_host_request->set_public_key(public_key); register_host_request->set_host_client_id(host_client_id); ExecuteRequest(traffic_annotation, path, std::move(register_host_request), std::move(callback)); } void DirectoryServiceClient::CancelPendingRequests() { http_client_.CancelPendingRequests(); } template void DirectoryServiceClient::ExecuteRequest( const net::NetworkTrafficAnnotationTag& traffic_annotation, const std::string& path, std::unique_ptr request_message, CallbackType callback) { auto request_config = std::make_unique(traffic_annotation); request_config->path = path; request_config->request_message = std::move(request_message); auto request = std::make_unique(std::move(request_config)); request->SetResponseCallback(std::move(callback)); http_client_.ExecuteRequest(std::move(request)); } } // namespace remoting