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.h" 17 #include "base/files/file_path.h" 18 #include "base/memory/weak_ptr.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_name_; 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::File zip_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