• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #ifndef CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_H_
6 #define CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_H_
7 #pragma once
8 
9 // A class that encapsulates the detailed malware reports sent when
10 // users opt-in to do so from the malware warning page.
11 
12 // An instance of this class is generated when a malware warning page
13 // is shown (SafeBrowsingBlockingPage).
14 
15 #include <string>
16 #include <vector>
17 
18 #include "base/hash_tables.h"
19 #include "base/memory/linked_ptr.h"
20 #include "base/memory/ref_counted.h"
21 #include "base/memory/scoped_ptr.h"
22 #include "chrome/browser/safe_browsing/report.pb.h"
23 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
24 #include "content/browser/tab_contents/tab_contents_observer.h"
25 #include "net/base/completion_callback.h"
26 
27 class TabContents;
28 struct SafeBrowsingHostMsg_MalwareDOMDetails_Node;
29 
30 class MalwareDetailsCacheCollector;
31 class MalwareDetailsFactory;
32 
33 namespace safe_browsing {
34 // Maps a URL to its Resource.
35 typedef base::hash_map<
36   std::string,
37   linked_ptr<safe_browsing::ClientMalwareReportRequest::Resource> > ResourceMap;
38 }
39 
40 class MalwareDetails : public base::RefCountedThreadSafe<MalwareDetails>,
41                        public TabContentsObserver {
42  public:
43   // Constructs a new MalwareDetails instance, using the factory.
44   static MalwareDetails* NewMalwareDetails(
45       SafeBrowsingService* sb_service,
46       TabContents* tab_contents,
47       const SafeBrowsingService::UnsafeResource& resource);
48 
49   // Makes the passed |factory| the factory used to instanciate
50   // SafeBrowsingBlockingPage objects. Useful for tests.
RegisterFactory(MalwareDetailsFactory * factory)51   static void RegisterFactory(MalwareDetailsFactory* factory) {
52     factory_ = factory;
53   }
54 
55   // The SafeBrowsingBlockingPage calls this from the IO thread when
56   // the user is leaving the blocking page and has opted-in to sending
57   // the report. We start the cache collection, and when we are done,
58   // we send the report.
59   void FinishCollection();
60 
61   void OnCacheCollectionReady();
62 
63   // TabContentsObserver implementation.
64   virtual bool OnMessageReceived(const IPC::Message& message);
65 
66  protected:
67   friend class MalwareDetailsFactoryImpl;
68 
69   MalwareDetails(SafeBrowsingService* sb_service,
70                  TabContents* tab_contents,
71                  const SafeBrowsingService::UnsafeResource& resource);
72 
73   virtual ~MalwareDetails();
74 
75   // Called on the IO thread with the DOM details.
76   virtual void AddDOMDetails(
77       const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params);
78 
79   // The report protocol buffer.
80   scoped_ptr<safe_browsing::ClientMalwareReportRequest> report_;
81 
82   // Used to get a pointer to the HTTP cache.
83   scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
84 
85  private:
86   friend class base::RefCountedThreadSafe<MalwareDetails>;
87 
88   // Starts the collection of the report.
89   void StartCollection();
90 
91   // Whether the url is "public" so we can add it to the report.
92   bool IsPublicUrl(const GURL& url) const;
93 
94   // Finds an existing Resource for the given url, or creates a new
95   // one if not found, and adds it to |resources_|. Returns the
96   // found/created resource.
97   safe_browsing::ClientMalwareReportRequest::Resource* FindOrCreateResource(
98       const GURL& url);
99 
100   // Adds a Resource to resources_ with the given parent-child
101   // relationship. |parent| and |tagname| can be empty, |children| can be NULL.
102   void AddUrl(const GURL& url,
103               const GURL& parent,
104               const std::string& tagname,
105               const std::vector<GURL>* children);
106 
107   // Message handler.
108   void OnReceivedMalwareDOMDetails(
109       const std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node>& params);
110 
111   scoped_refptr<SafeBrowsingService> sb_service_;
112 
113   const SafeBrowsingService::UnsafeResource resource_;
114 
115   // For every Url we collect we create a Resource message. We keep
116   // them in a map so we can avoid duplicates.
117   safe_browsing::ResourceMap resources_;
118 
119   // Result from the cache extractor.
120   bool cache_result_;
121 
122   // The factory used to instanciate SafeBrowsingBlockingPage objects.
123   // Usefull for tests, so they can provide their own implementation of
124   // SafeBrowsingBlockingPage.
125   static MalwareDetailsFactory* factory_;
126 
127   // Used to collect details from the HTTP Cache.
128   scoped_refptr<MalwareDetailsCacheCollector> cache_collector_;
129 
130   FRIEND_TEST_ALL_PREFIXES(MalwareDetailsTest, MalwareDOMDetails);
131   FRIEND_TEST_ALL_PREFIXES(MalwareDetailsTest, HTTPCache);
132   FRIEND_TEST_ALL_PREFIXES(MalwareDetailsTest, HTTPCacheNoEntries);
133 
134   DISALLOW_COPY_AND_ASSIGN(MalwareDetails);
135 };
136 
137 // Factory for creating MalwareDetails.  Useful for tests.
138 class MalwareDetailsFactory {
139  public:
~MalwareDetailsFactory()140   virtual ~MalwareDetailsFactory() { }
141 
142   virtual MalwareDetails* CreateMalwareDetails(
143       SafeBrowsingService* sb_service,
144       TabContents* tab_contents,
145       const SafeBrowsingService::UnsafeResource& unsafe_resource) = 0;
146 };
147 
148 #endif  // CHROME_BROWSER_SAFE_BROWSING_MALWARE_DETAILS_H_
149