1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_util.h"
6 
7 #include <string>
8 #include <utility>
9 
10 #include "chrome/common/extensions/api/safe_browsing_private.h"
11 
12 namespace safe_browsing_private = extensions::api::safe_browsing_private;
13 
14 namespace extensions {
15 
16 namespace safe_browsing_util {
17 
ReferrerToReferrerChainEntry(const safe_browsing::ReferrerChainEntry & referrer)18 safe_browsing_private::ReferrerChainEntry ReferrerToReferrerChainEntry(
19     const safe_browsing::ReferrerChainEntry& referrer) {
20   safe_browsing_private::ReferrerChainEntry entry;
21   // Add all referrer chain entry fields to the entry.
22   entry.url = referrer.url();
23   if (referrer.has_main_frame_url()) {
24     entry.main_frame_url =
25         std::make_unique<std::string>(referrer.main_frame_url());
26   }
27   // This url type value is deprecated and should not be used.
28   DCHECK_NE(
29       referrer.type(),
30       safe_browsing::ReferrerChainEntry_URLType_DEPRECATED_SERVER_REDIRECT);
31   switch (referrer.type()) {
32     case safe_browsing::ReferrerChainEntry_URLType_EVENT_URL:
33       entry.url_type = safe_browsing_private::URLType::URL_TYPE_EVENT_URL;
34       break;
35     case safe_browsing::ReferrerChainEntry_URLType_LANDING_PAGE:
36       entry.url_type = safe_browsing_private::URLType::URL_TYPE_LANDING_PAGE;
37       break;
38     case safe_browsing::ReferrerChainEntry_URLType_LANDING_REFERRER:
39       entry.url_type =
40           safe_browsing_private::URLType::URL_TYPE_LANDING_REFERRER;
41       break;
42     case safe_browsing::ReferrerChainEntry_URLType_CLIENT_REDIRECT:
43       entry.url_type = safe_browsing_private::URLType::URL_TYPE_CLIENT_REDIRECT;
44       break;
45     case safe_browsing::ReferrerChainEntry_URLType_RECENT_NAVIGATION:
46       entry.url_type =
47           safe_browsing_private::URLType::URL_TYPE_RECENT_NAVIGATION;
48       break;
49     case safe_browsing::ReferrerChainEntry_URLType_REFERRER:
50       entry.url_type = safe_browsing_private::URLType::URL_TYPE_REFERRER;
51       break;
52     case safe_browsing::ReferrerChainEntry_URLType_DEPRECATED_SERVER_REDIRECT:
53       NOTREACHED();
54   }
55   if (referrer.ip_addresses_size() > 0) {
56     entry.ip_addresses = std::make_unique<std::vector<std::string>>();
57     entry.ip_addresses->reserve(referrer.ip_addresses_size());
58     for (const std::string& ip_address : referrer.ip_addresses())
59       entry.ip_addresses->emplace_back(ip_address);
60   }
61   if (referrer.has_referrer_url()) {
62     entry.referrer_url = std::make_unique<std::string>(referrer.referrer_url());
63   }
64   if (referrer.has_referrer_main_frame_url()) {
65     entry.referrer_main_frame_url =
66         std::make_unique<std::string>(referrer.referrer_main_frame_url());
67   }
68   if (referrer.has_is_retargeting())
69     entry.is_retargeting = std::make_unique<bool>(referrer.is_retargeting());
70   if (referrer.has_navigation_time_msec()) {
71     entry.navigation_time_ms =
72         std::make_unique<double>(referrer.navigation_time_msec());
73   }
74   if (referrer.server_redirect_chain_size() > 0) {
75     entry.server_redirect_chain =
76         std::make_unique<std::vector<safe_browsing_private::ServerRedirect>>();
77     entry.server_redirect_chain->reserve(referrer.server_redirect_chain_size());
78     for (const auto& server_redirect : referrer.server_redirect_chain()) {
79       safe_browsing_private::ServerRedirect result;
80       result.url = std::make_unique<std::string>(server_redirect.url());
81       entry.server_redirect_chain->emplace_back(std::move(result));
82     }
83   }
84   if (referrer.has_navigation_initiation()) {
85     DCHECK_NE(referrer.navigation_initiation(),
86               safe_browsing::ReferrerChainEntry_NavigationInitiation_UNDEFINED);
87     switch (referrer.navigation_initiation()) {
88       case safe_browsing::
89           ReferrerChainEntry_NavigationInitiation_BROWSER_INITIATED:
90         entry.navigation_initiation =
91             safe_browsing_private::NAVIGATION_INITIATION_BROWSER_INITIATED;
92         break;
93       case safe_browsing::
94           ReferrerChainEntry_NavigationInitiation_RENDERER_INITIATED_WITHOUT_USER_GESTURE:
95         entry.navigation_initiation = safe_browsing_private::
96             NAVIGATION_INITIATION_RENDERER_INITIATED_WITHOUT_USER_GESTURE;
97         break;
98       case safe_browsing::
99           ReferrerChainEntry_NavigationInitiation_RENDERER_INITIATED_WITH_USER_GESTURE:
100         entry.navigation_initiation = safe_browsing_private::
101             NAVIGATION_INITIATION_RENDERER_INITIATED_WITH_USER_GESTURE;
102         break;
103       case safe_browsing::ReferrerChainEntry_NavigationInitiation_UNDEFINED:
104         NOTREACHED();
105     }
106   }
107   if (referrer.has_maybe_launched_by_external_application()) {
108     entry.maybe_launched_by_external_app = std::make_unique<bool>(
109         referrer.maybe_launched_by_external_application());
110   }
111 
112   return entry;
113 }
114 
115 }  // namespace safe_browsing_util
116 
117 }  // namespace extensions
118