1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// found in the LICENSE file. 4bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "chrome/browser/media_galleries/fileapi/av_scanning_file_validator.h" 6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 7bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(OS_WIN) 8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include <windows.h> 9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include <shlobj.h> 10bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif 11bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 12bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/bind.h" 13bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/callback.h" 14bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/location.h" 15bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/logging.h" 16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/strings/utf_string_conversions.h" 17bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "chrome/common/chrome_constants.h" 18bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/public/browser/browser_thread.h" 19bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 20bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(OS_WIN) 21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/win/scoped_comptr.h" 22bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif 23bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochusing content::BrowserThread; 25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 26bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace chrome { 27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 28bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace { 29bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(OS_WIN) 31bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochbase::PlatformFileError ScanFile( 32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const base::FilePath& dest_platform_path) { 33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 34bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 35bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::win::ScopedComPtr<IAttachmentExecute> attachment_services; 36bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch HRESULT hr = attachment_services.CreateInstance(CLSID_AttachmentServices); 37bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 38bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (FAILED(hr)) { 39bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // The thread must have COM initialized. 40bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DCHECK_NE(CO_E_NOTINITIALIZED, hr); 41bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return base::PLATFORM_FILE_ERROR_SECURITY; 42bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 44bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch hr = attachment_services->SetLocalPath(dest_platform_path.value().c_str()); 45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (FAILED(hr)) 46bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return base::PLATFORM_FILE_ERROR_SECURITY; 47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 48bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // A failure in the Save() call below could result in the downloaded file 49bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // being deleted. 50bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch HRESULT scan_result = attachment_services->Save(); 51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (scan_result == S_OK) 52bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return base::PLATFORM_FILE_OK; 53bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 54bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return base::PLATFORM_FILE_ERROR_SECURITY; 55bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 56bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif 57bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 58bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} // namespace 59bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 60bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochAVScanningFileValidator::~AVScanningFileValidator() {} 61bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 62bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid AVScanningFileValidator::StartPostWriteValidation( 63bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const base::FilePath& dest_platform_path, 64bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const ResultCallback& result_callback) { 65bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 66bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 67bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(OS_WIN) 68bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch BrowserThread::PostTaskAndReplyWithResult( 69bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch BrowserThread::FILE, 70bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch FROM_HERE, 71bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch base::Bind(&ScanFile, dest_platform_path), 72bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch result_callback); 73bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#else 74bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch result_callback.Run(base::PLATFORM_FILE_OK); 75bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif 76bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 77bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 78bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochAVScanningFileValidator::AVScanningFileValidator() { 79bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 80bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 81bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} // namespace chrome 82