Home | History | Annotate | Download | only in safe_browsing
      1 // Copyright (c) 2012 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 // Browser-side interface to analyze zip files for SafeBrowsing download
      6 // protection.  The actual zip decoding is performed in a sandboxed utility
      7 // process.
      8 //
      9 // This class lives on the UI thread.
     10 
     11 #ifndef CHROME_BROWSER_SAFE_BROWSING_SANDBOXED_ZIP_ANALYZER_H_
     12 #define CHROME_BROWSER_SAFE_BROWSING_SANDBOXED_ZIP_ANALYZER_H_
     13 
     14 #include "base/basictypes.h"
     15 #include "base/callback.h"
     16 #include "base/files/file_path.h"
     17 #include "base/memory/weak_ptr.h"
     18 #include "base/platform_file.h"
     19 #include "content/public/browser/utility_process_host.h"
     20 #include "content/public/browser/utility_process_host_client.h"
     21 
     22 namespace IPC {
     23 class Message;
     24 }
     25 
     26 namespace safe_browsing {
     27 namespace zip_analyzer {
     28 struct Results;
     29 }
     30 
     31 class SandboxedZipAnalyzer : public content::UtilityProcessHostClient {
     32  public:
     33   // Callback that is invoked when the analysis results are ready.
     34   typedef base::Callback<void(const zip_analyzer::Results&)> ResultCallback;
     35 
     36   SandboxedZipAnalyzer(const base::FilePath& zip_file,
     37                        const ResultCallback& result_callback);
     38 
     39   // Posts a task to start the zip analysis in the utility process.
     40   void Start();
     41 
     42  private:
     43   virtual ~SandboxedZipAnalyzer();
     44 
     45   // Creates the sandboxed utility process and tells it to start analysis.
     46   // Runs on a worker thread.
     47   void AnalyzeInSandbox();
     48 
     49   // content::UtilityProcessHostClient implementation.
     50   // These notifications run on the IO thread.
     51   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     52 
     53   // Notification that the utility process is running, and we can now get its
     54   // process handle.
     55   void OnUtilityProcessStarted();
     56 
     57   // Notification from the utility process that the zip file has been analyzed,
     58   // with the given results.  Runs on the IO thread.
     59   void OnAnalyzeZipFileFinished(const zip_analyzer::Results& results);
     60 
     61   // Launches the utility process.  Must run on the IO thread.
     62   void StartProcessOnIOThread();
     63 
     64   const base::FilePath zip_file_;
     65   // Once we have opened the file, we store the handle so that we can use it
     66   // once the utility process has launched.
     67   base::PlatformFile zip_platform_file_;
     68   base::WeakPtr<content::UtilityProcessHost> utility_process_host_;
     69   const ResultCallback callback_;
     70   // Initialized on the UI thread, but only accessed on the IO thread.
     71   bool callback_called_;
     72 
     73   DISALLOW_COPY_AND_ASSIGN(SandboxedZipAnalyzer);
     74 };
     75 
     76 }  // namespace safe_browsing
     77 
     78 #endif  // CHROME_BROWSER_SAFE_BROWSING_SANDBOXED_ZIP_ANALYZER_H_
     79