| Index: chrome/installer/util/legacy_firewall_manager_win.cc
|
| diff --git a/chrome/installer/util/legacy_firewall_manager_win.cc b/chrome/installer/util/legacy_firewall_manager_win.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ed5e7d8215a9bdad0b2d7c3b321da35c5de3ceb9
|
| --- /dev/null
|
| +++ b/chrome/installer/util/legacy_firewall_manager_win.cc
|
| @@ -0,0 +1,153 @@
|
| +// Copyright 2014 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.
|
| +
|
| +#include "chrome/installer/util/legacy_firewall_manager_win.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/strings/stringprintf.h"
|
| +#include "base/win/scoped_bstr.h"
|
| +#include "chrome/installer/util/browser_distribution.h"
|
| +
|
| +#include "installer_util_strings.h" // NOLINT
|
| +
|
| +namespace installer {
|
| +
|
| +LegacyFirewallManager::LegacyFirewallManager() {}
|
| +
|
| +LegacyFirewallManager::~LegacyFirewallManager() {}
|
| +
|
| +bool LegacyFirewallManager::Init(BrowserDistribution* dist,
|
| + const base::FilePath& chrome_path) {
|
| + HRESULT hr = firewall_manager_.CreateInstance(CLSID_NetFwMgr);
|
| + if (FAILED(hr)) {
|
| + DLOG(ERROR) << base::StringPrintf("0x%X", hr);
|
| + return false;
|
| + }
|
| + distribution_ = dist;
|
| + chrome_path_ = chrome_path;
|
| + return true;
|
| +}
|
| +
|
| +// The SharedAccess service must be running.
|
| +bool LegacyFirewallManager::AddUDPFirewallRuleIfAbsent() {
|
| + base::win::ScopedComPtr<INetFwAuthorizedApplications> authorized_apps(
|
| + GetAuthorizedApplications());
|
| + if (!authorized_apps.get())
|
| + return false;
|
| +
|
| + // There is nothing to do if chrome is already authorized.
|
| + base::win::ScopedComPtr<INetFwAuthorizedApplication> chrome_application;
|
| + HRESULT hr = authorized_apps->Item(
|
| + base::win::ScopedBstr(chrome_path_.value().c_str()),
|
| + chrome_application.Receive());
|
| + if (SUCCEEDED(hr))
|
| + return true;
|
| +
|
| + // Authorize chrome.
|
| + chrome_application = CreateChromeAuthorization();
|
| + if (chrome_application.get()) {
|
| + hr = authorized_apps->Add(chrome_application);
|
| + DLOG_IF(ERROR, FAILED(hr)) << base::StringPrintf("0x%X", hr);
|
| + }
|
| +
|
| + return SUCCEEDED(hr);
|
| +}
|
| +
|
| +void LegacyFirewallManager::DeleteUDPFirewallRule() {
|
| + base::win::ScopedComPtr<INetFwAuthorizedApplications> authorized_apps(
|
| + GetAuthorizedApplications());
|
| + if (!authorized_apps.get())
|
| + return;
|
| +
|
| + HRESULT hr = authorized_apps->Remove(
|
| + base::win::ScopedBstr(chrome_path_.value().c_str()));
|
| + DLOG_IF(ERROR, FAILED(hr)) << base::StringPrintf("0x%X", hr);
|
| +}
|
| +
|
| +bool LegacyFirewallManager::CanUseLocalUDPPort() {
|
| + // It's always safe to bind to a local port if the firewall is disabled.
|
| + base::win::ScopedComPtr<INetFwProfile> current_profile(GetCurrentProfile());
|
| + if (!current_profile.get())
|
| + return false;
|
| +
|
| + VARIANT_BOOL is_enabled = VARIANT_TRUE;
|
| + HRESULT hr = current_profile->get_FirewallEnabled(&is_enabled);
|
| + if (SUCCEEDED(hr) && is_enabled == VARIANT_FALSE)
|
| + return true;
|
| +
|
| + // Otherwise, check to see if there is a rule either allowing or disallowing
|
| + // this chrome.exe.
|
| + base::win::ScopedComPtr<INetFwAuthorizedApplications> authorized_apps(
|
| + GetAuthorizedApplications());
|
| + if (!authorized_apps.get())
|
| + return false;
|
| +
|
| + base::win::ScopedComPtr<INetFwAuthorizedApplication> chrome_application;
|
| + hr = authorized_apps->Item(
|
| + base::win::ScopedBstr(chrome_path_.value().c_str()),
|
| + chrome_application.Receive());
|
| + return SUCCEEDED(hr);
|
| +}
|
| +
|
| +base::win::ScopedComPtr<INetFwProfile>
|
| +LegacyFirewallManager::GetCurrentProfile() {
|
| + if (current_profile_.get())
|
| + return current_profile_;
|
| +
|
| + base::win::ScopedComPtr<INetFwPolicy> firewall_policy;
|
| + HRESULT hr = firewall_manager_->get_LocalPolicy(firewall_policy.Receive());
|
| + if (FAILED(hr)) {
|
| + DLOG(ERROR) << base::StringPrintf("0x%X", hr);
|
| + return base::win::ScopedComPtr<INetFwProfile>();
|
| + }
|
| +
|
| + hr = firewall_policy->get_CurrentProfile(current_profile_.Receive());
|
| + if (FAILED(hr)) {
|
| + DLOG(ERROR) << base::StringPrintf("0x%X", hr);
|
| + return base::win::ScopedComPtr<INetFwProfile>();
|
| + }
|
| +
|
| + return current_profile_;
|
| +}
|
| +
|
| +base::win::ScopedComPtr<INetFwAuthorizedApplications>
|
| +LegacyFirewallManager::GetAuthorizedApplications() {
|
| + base::win::ScopedComPtr<INetFwProfile> current_profile(GetCurrentProfile());
|
| + if (!current_profile.get())
|
| + return base::win::ScopedComPtr<INetFwAuthorizedApplications>();
|
| +
|
| + HRESULT hr = current_profile->get_AuthorizedApplications(
|
| + authorized_apps_.Receive());
|
| + if (FAILED(hr)) {
|
| + DLOG(ERROR) << base::StringPrintf("0x%X", hr);
|
| + return base::win::ScopedComPtr<INetFwAuthorizedApplications>();
|
| + }
|
| +
|
| + return authorized_apps_;
|
| +}
|
| +
|
| +base::win::ScopedComPtr<INetFwAuthorizedApplication>
|
| +LegacyFirewallManager::CreateChromeAuthorization() {
|
| + base::win::ScopedComPtr<INetFwAuthorizedApplication> chrome_application;
|
| +
|
| + HRESULT hr =
|
| + chrome_application.CreateInstance(CLSID_NetFwAuthorizedApplication);
|
| + if (FAILED(hr)) {
|
| + DLOG(ERROR) << base::StringPrintf("0x%X", hr);
|
| + return base::win::ScopedComPtr<INetFwAuthorizedApplication>();
|
| + }
|
| +
|
| + chrome_application->put_Name(
|
| + base::win::ScopedBstr(distribution_->GetDisplayName().c_str()));
|
| + chrome_application->put_ProcessImageFileName(
|
| + base::win::ScopedBstr(chrome_path_.value().c_str()));
|
| + // IpVersion defaults to NET_FW_IP_VERSION_ANY.
|
| + // Scope defaults to NET_FW_SCOPE_ALL.
|
| + // RemoteAddresses defaults to "*".
|
| + chrome_application->put_Enabled(VARIANT_FALSE);
|
| +
|
| + return chrome_application;
|
| +}
|
| +
|
| +} // namespace installer
|
|
|