firewall_manager_win.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
1// Copyright 2014 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#include "chrome/installer/util/firewall_manager_win.h"
6
7#include "base/files/file_path.h"
8#include "base/strings/string16.h"
9#include "chrome/installer/util/advanced_firewall_manager_win.h"
10#include "chrome/installer/util/browser_distribution.h"
11#include "chrome/installer/util/legacy_firewall_manager_win.h"
12
13namespace installer {
14
15namespace {
16
17class FirewallManagerAdvancedImpl : public FirewallManager {
18 public:
19  FirewallManagerAdvancedImpl() {}
20  virtual ~FirewallManagerAdvancedImpl() {}
21
22  bool Init(const base::string16& app_name, const base::FilePath& app_path) {
23    return manager_.Init(app_name, app_path);
24  }
25
26  // FirewallManager methods.
27  virtual bool CanUseLocalPorts() OVERRIDE {
28    return !manager_.IsFirewallEnabled() || manager_.HasAnyRule();
29  };
30
31  virtual bool AddFirewallRules() OVERRIDE {
32    // Nothing yet.
33    return true;
34  }
35
36  virtual void RemoveFirewallRules() OVERRIDE {
37    manager_.DeleteAllRules();
38  }
39
40 private:
41  AdvancedFirewallManager manager_;
42  DISALLOW_COPY_AND_ASSIGN(FirewallManagerAdvancedImpl);
43};
44
45class FirewallManagerLegacyImpl : public FirewallManager {
46 public:
47  FirewallManagerLegacyImpl() {}
48  virtual ~FirewallManagerLegacyImpl() {}
49
50  bool Init(const base::string16& app_name, const base::FilePath& app_path) {
51    return manager_.Init(app_name, app_path);
52  }
53
54  // FirewallManager methods.
55  virtual bool CanUseLocalPorts() OVERRIDE {
56    return !manager_.IsFirewallEnabled() ||
57        manager_.GetAllowIncomingConnection(NULL);
58  };
59
60  virtual bool AddFirewallRules() OVERRIDE {
61    // Nothing yet.
62    return true;
63  }
64
65  virtual void RemoveFirewallRules() OVERRIDE {
66    manager_.DeleteRule();
67  }
68
69 private:
70  LegacyFirewallManager manager_;
71  DISALLOW_COPY_AND_ASSIGN(FirewallManagerLegacyImpl);
72};
73
74}  // namespace
75
76FirewallManager::~FirewallManager() {}
77
78// static
79scoped_ptr<FirewallManager> FirewallManager::Create(
80    BrowserDistribution* dist,
81    const base::FilePath& chrome_path) {
82  // First try to connect to "Windows Firewall with Advanced Security" (Vista+).
83  scoped_ptr<FirewallManagerAdvancedImpl> manager(
84      new FirewallManagerAdvancedImpl());
85  if (manager->Init(dist->GetDisplayName(), chrome_path))
86    return manager.PassAs<FirewallManager>();
87
88  // Next try to connect to "Windows Firewall for Windows XP with SP2".
89  scoped_ptr<FirewallManagerLegacyImpl> legacy_manager(
90      new FirewallManagerLegacyImpl());
91  if (legacy_manager->Init(dist->GetDisplayName(), chrome_path))
92    return legacy_manager.PassAs<FirewallManager>();
93
94  return scoped_ptr<FirewallManager>();
95}
96
97FirewallManager::FirewallManager() {
98}
99
100}  // namespace installer
101