// Copyright 2015 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. #ifndef CHROME_BROWSER_SAFE_BROWSING_SANDBOXED_DMG_ANALYZER_MAC_H_ #define CHROME_BROWSER_SAFE_BROWSING_SANDBOXED_DMG_ANALYZER_MAC_H_ #include "base/callback.h" #include "base/files/file.h" #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "content/public/browser/utility_process_host.h" #include "content/public/browser/utility_process_host_client.h" namespace safe_browsing { namespace zip_analyzer { struct Results; } // This class is used to analyze DMG files in a sandboxed utility process for // file download protection. This class must be created on the UI thread, and // which is where the result callback will be invoked. class SandboxedDMGAnalyzer : public content::UtilityProcessHostClient { public: // Callback that is invoked when the analysis results are ready. using ResultsCallback = base::Callback; SandboxedDMGAnalyzer(const base::FilePath& dmg_file, const ResultsCallback& callback); // Begins the analysis. This must be called on the UI thread. void Start(); private: ~SandboxedDMGAnalyzer() override; // Called on the blocking pool, this opens the DMG file, in preparation for // sending the FD to the utility process. void OpenDMGFile(); // Called on the IO thread, this starts the utility process. void StartAnalysis(); // content::UtilityProcessHostClient: bool OnMessageReceived(const IPC::Message& message) override; // Message handler for reply ping when the utility process has started. void OnUtilityProcessStarted(); // Message handler to receive the results of the analysis. Invokes the // |callback_|. void OnAnalysisFinished(const zip_analyzer::Results& results); const base::FilePath file_path_; // The path of the DMG file. base::File file_; // The opened file handle for |file_path_|. // Weak reference to the utility process, which owns this. base::WeakPtr utility_process_host_; const ResultsCallback callback_; // Result callback. bool callback_called_; // Whether |callback_| has already been invoked. DISALLOW_COPY_AND_ASSIGN(SandboxedDMGAnalyzer); }; } // namespace safe_browsing #endif // CHROME_BROWSER_SAFE_BROWSING_SANDBOXED_DMG_ANALYZER_MAC_H_