| // Copyright 2017 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/download/trusted_sources_manager.h" |
| |
| #include <urlmon.h> |
| #include <wrl/client.h> |
| |
| #include "base/logging.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/strings/string_util.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "url/gurl.h" |
| |
| namespace { |
| |
| class TrustedSourcesManagerWin : public TrustedSourcesManager { |
| public: |
| TrustedSourcesManagerWin(); |
| ~TrustedSourcesManagerWin() override; |
| |
| // TrustedSourcesManager methods: |
| bool IsFromTrustedSource(const GURL& url) const override; |
| }; |
| |
| TrustedSourcesManagerWin::TrustedSourcesManagerWin() = default; |
| TrustedSourcesManagerWin::~TrustedSourcesManagerWin() = default; |
| |
| bool TrustedSourcesManagerWin::IsFromTrustedSource(const GURL& url) const { |
| Microsoft::WRL::ComPtr<IInternetSecurityManager> security_manager; |
| HRESULT hr = ::CoInternetCreateSecurityManager(NULL, &security_manager, NULL); |
| // URLZONE_LOCAL_MACHINE 0 |
| // URLZONE_INTRANET 1 |
| // URLZONE_TRUSTED 2 |
| // URLZONE_INTERNET 3 |
| // URLZONE_UNTRUSTED 4 |
| DWORD zone = 0; |
| std::wstring urlw = base::ASCIIToWide(url.spec()); |
| hr = security_manager->MapUrlToZone(urlw.c_str(), &zone, 0); |
| if (FAILED(hr)) { |
| LOG(ERROR) << "security_manager->MapUrlToZone failed with hr: " << std::hex |
| << hr; |
| return false; |
| } |
| return zone <= static_cast<DWORD>(URLZONE_TRUSTED); |
| } |
| |
| } // namespace |
| |
| // static |
| std::unique_ptr<TrustedSourcesManager> TrustedSourcesManager::Create() { |
| return base::WrapUnique(new TrustedSourcesManagerWin); |
| } |