vpn_list.cc 2.8 KB

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