summaryrefslogtreecommitdiff
path: root/chromium/components/sync_wifi/wifi_credential.cc
blob: 0337ee8188f30e420dbe0a5118c3a929e86feeed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// 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 "components/sync_wifi/wifi_credential.h"

#include "base/i18n/streaming_utf8_validator.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "components/onc/onc_constants.h"

namespace sync_wifi {

WifiCredential::WifiCredential(const WifiCredential& other) = default;

WifiCredential::~WifiCredential() {}

// static
std::unique_ptr<WifiCredential> WifiCredential::Create(
    const SsidBytes& ssid,
    WifiSecurityClass security_class,
    const std::string& passphrase) {
  if (security_class == SECURITY_CLASS_INVALID) {
    LOG(ERROR) << "SecurityClass is invalid.";
    return nullptr;
  }

  if (!base::StreamingUtf8Validator::Validate(passphrase)) {
    LOG(ERROR) << "Passphrase is not valid UTF-8";
    return nullptr;
  }

  return base::WrapUnique(new WifiCredential(ssid, security_class, passphrase));
}

std::unique_ptr<base::DictionaryValue> WifiCredential::ToOncProperties() const {
  const std::string ssid_utf8(ssid().begin(), ssid().end());
  // TODO(quiche): Remove this test, once ONC suports non-UTF-8 SSIDs.
  // crbug.com/432546.
  if (!base::StreamingUtf8Validator::Validate(ssid_utf8)) {
    LOG(ERROR) << "SSID is not valid UTF-8";
    return nullptr;
  }

  std::string onc_security;
  if (!WifiSecurityClassToOncSecurityString(security_class(), &onc_security)) {
    NOTREACHED() << "Failed to convert SecurityClass with value "
                 << security_class();
    return base::MakeUnique<base::DictionaryValue>();
  }

  std::unique_ptr<base::DictionaryValue> onc_properties(
      new base::DictionaryValue());
  onc_properties->Set(onc::toplevel_config::kType,
                      new base::Value(onc::network_type::kWiFi));
  // TODO(quiche): Switch to the HexSSID property, once ONC fully supports it.
  // crbug.com/432546.
  onc_properties->Set(onc::network_config::WifiProperty(onc::wifi::kSSID),
                      new base::Value(ssid_utf8));
  onc_properties->Set(onc::network_config::WifiProperty(onc::wifi::kSecurity),
                      new base::Value(onc_security));
  if (WifiSecurityClassSupportsPassphrases(security_class())) {
    onc_properties->Set(
        onc::network_config::WifiProperty(onc::wifi::kPassphrase),
        new base::Value(passphrase()));
  }
  return onc_properties;
}

std::string WifiCredential::ToString() const {
  return base::StringPrintf(
      "[SSID (hex): %s, SecurityClass: %d]",
      base::HexEncode(&ssid_.front(), ssid_.size()).c_str(),
      security_class_);  // Passphrase deliberately omitted.
}

// static
bool WifiCredential::IsLessThan(const WifiCredential& a,
                                const WifiCredential& b) {
  return a.ssid_ < b.ssid_ || a.security_class_ < b.security_class_ ||
         a.passphrase_ < b.passphrase_;
}

// static
WifiCredential::CredentialSet WifiCredential::MakeSet() {
  return CredentialSet(WifiCredential::IsLessThan);
}

// static
WifiCredential::SsidBytes WifiCredential::MakeSsidBytesForTest(
    const std::string& ssid) {
  return SsidBytes(ssid.begin(), ssid.end());
}

// Private methods.

WifiCredential::WifiCredential(const std::vector<unsigned char>& ssid,
                               WifiSecurityClass security_class,
                               const std::string& passphrase)
    : ssid_(ssid), security_class_(security_class), passphrase_(passphrase) {}

}  // namespace sync_wifi