1 // Copyright 2015 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 "ash/system/network/vpn_list.h"
6 
7 #include <utility>
8 
9 #include "ash/public/cpp/network_config_service.h"
10 #include "ash/system/model/system_tray_model.h"
11 #include "ash/system/network/tray_network_state_model.h"
12 #include "base/notreached.h"
13 
14 namespace ash {
15 
16 VpnList::Observer::~Observer() = default;
17 
VpnList(TrayNetworkStateModel * model)18 VpnList::VpnList(TrayNetworkStateModel* model) : model_(model) {
19   model_->AddObserver(this);
20   AddBuiltInProvider();
21   VpnProvidersChanged();
22 }
23 
~VpnList()24 VpnList::~VpnList() {
25   model_->RemoveObserver(this);
26 }
27 
HaveExtensionOrArcVpnProviders() const28 bool VpnList::HaveExtensionOrArcVpnProviders() const {
29   for (const VpnProviderPtr& extension_provider : extension_vpn_providers_) {
30     if (extension_provider->type == VpnType::kExtension)
31       return true;
32   }
33   return arc_vpn_providers_.size() > 0;
34 }
35 
AddObserver(Observer * observer)36 void VpnList::AddObserver(Observer* observer) {
37   observer_list_.AddObserver(observer);
38 }
39 
RemoveObserver(Observer * observer)40 void VpnList::RemoveObserver(Observer* observer) {
41   observer_list_.RemoveObserver(observer);
42 }
43 
ActiveNetworkStateChanged()44 void VpnList::ActiveNetworkStateChanged() {
45   Update();
46 }
47 
VpnProvidersChanged()48 void VpnList::VpnProvidersChanged() {
49   Update();
50 }
51 
SetVpnProvidersForTest(std::vector<VpnProviderPtr> providers)52 void VpnList::SetVpnProvidersForTest(std::vector<VpnProviderPtr> providers) {
53   OnGetVpnProviders(std::move(providers));
54 }
55 
OnGetVpnProviders(std::vector<VpnProviderPtr> providers)56 void VpnList::OnGetVpnProviders(std::vector<VpnProviderPtr> providers) {
57   extension_vpn_providers_.clear();
58   arc_vpn_providers_.clear();
59   AddBuiltInProvider();
60   // Add Third Party (Extension and Arc) providers.
61   for (auto& provider : providers) {
62     switch (provider->type) {
63       case VpnType::kL2TPIPsec:
64       case VpnType::kOpenVPN:
65         // Only third party VpnProvider instances should exist.
66         NOTREACHED();
67         break;
68       case VpnType::kExtension:
69         extension_vpn_providers_.push_back(std::move(provider));
70         break;
71       case VpnType::kArc:
72         arc_vpn_providers_.push_back(std::move(provider));
73         break;
74     }
75   }
76   NotifyObservers();
77 }
78 
NotifyObservers()79 void VpnList::NotifyObservers() {
80   for (auto& observer : observer_list_)
81     observer.OnVpnProvidersChanged();
82 }
83 
AddBuiltInProvider()84 void VpnList::AddBuiltInProvider() {
85   // Create a VpnProvider with type kOpenVPN for the built-in provider.
86   extension_vpn_providers_.push_back(
87       VpnProvider::New(VpnType::kOpenVPN,
88                        /*provider_id=*/std::string(),
89                        /*provider_name=*/std::string(),
90                        /*app_id=*/std::string(),
91                        /*last_launch_time=*/base::Time()));
92 }
93 
Update()94 void VpnList::Update() {
95   model_->cros_network_config()->GetVpnProviders(
96       base::BindOnce(&VpnList::OnGetVpnProviders, base::Unretained(this)));
97 }
98 
99 }  // namespace ash
100