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/browser/extensions/api/networking_private/networking_private_credentials_getter.h"
6
7 #include "base/base64.h"
8 #include "base/bind.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/threading/sequenced_worker_pool.h"
11 #include "chrome/common/chrome_utility_messages.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "content/public/browser/utility_process_host.h"
14
15 using content::BrowserThread;
16 using content::UtilityProcessHost;
17 using extensions::NetworkingPrivateCredentialsGetter;
18
19 namespace {
20
21 class CredentialsGetterHostClient : public content::UtilityProcessHostClient {
22 public:
23 CredentialsGetterHostClient();
24
25 virtual ~CredentialsGetterHostClient();
26
27 // UtilityProcessHostClient
28 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
29 virtual void OnProcessCrashed(int exit_code) OVERRIDE;
30 virtual void OnProcessLaunchFailed() OVERRIDE;
31
32 // IPC message handlers.
33 void OnGotEncryptedCredentials(const std::vector<uint8>& key_data,
34 bool success);
35
36 // Starts the utility process that gets wifi passphrase from system.
37 void StartProcessOnIOThread(
38 const std::string& network_guid,
39 const std::string& public_key,
40 const extensions::NetworkingPrivateServiceClient::CryptoVerify::
41 VerifyAndEncryptCredentialsCallback& callback);
42
43 private:
44 // Callback for reporting the result.
45 extensions::NetworkingPrivateServiceClient::CryptoVerify::
46 VerifyAndEncryptCredentialsCallback callback_;
47
48 DISALLOW_COPY_AND_ASSIGN(CredentialsGetterHostClient);
49 };
50
CredentialsGetterHostClient()51 CredentialsGetterHostClient::CredentialsGetterHostClient() {}
52
~CredentialsGetterHostClient()53 CredentialsGetterHostClient::~CredentialsGetterHostClient() {}
54
OnMessageReceived(const IPC::Message & message)55 bool CredentialsGetterHostClient::OnMessageReceived(
56 const IPC::Message& message) {
57 bool handled = true;
58 IPC_BEGIN_MESSAGE_MAP(CredentialsGetterHostClient, message)
59 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_GotEncryptedWiFiCredentials,
60 OnGotEncryptedCredentials)
61 IPC_MESSAGE_UNHANDLED(handled = false)
62 IPC_END_MESSAGE_MAP()
63 return handled;
64 }
65
OnProcessCrashed(int exit_code)66 void CredentialsGetterHostClient::OnProcessCrashed(int exit_code) {
67 callback_.Run("", "Process Crashed");
68 }
69
OnProcessLaunchFailed()70 void CredentialsGetterHostClient::OnProcessLaunchFailed() {
71 callback_.Run("", "Process Launch Failed");
72 }
73
OnGotEncryptedCredentials(const std::vector<uint8> & key_data,bool success)74 void CredentialsGetterHostClient::OnGotEncryptedCredentials(
75 const std::vector<uint8>& key_data,
76 bool success) {
77 if (success) {
78 std::string base64_encoded_key_data;
79 base::Base64Encode(std::string(key_data.begin(), key_data.end()),
80 &base64_encoded_key_data);
81 callback_.Run(base64_encoded_key_data, "");
82 } else {
83 callback_.Run("", "Get Credentials Failed");
84 }
85 }
86
StartProcessOnIOThread(const std::string & network_guid,const std::string & public_key,const extensions::NetworkingPrivateServiceClient::CryptoVerify::VerifyAndEncryptCredentialsCallback & callback)87 void CredentialsGetterHostClient::StartProcessOnIOThread(
88 const std::string& network_guid,
89 const std::string& public_key,
90 const extensions::NetworkingPrivateServiceClient::CryptoVerify::
91 VerifyAndEncryptCredentialsCallback& callback) {
92 DCHECK_CURRENTLY_ON(BrowserThread::IO);
93 std::vector<uint8> public_key_data(public_key.begin(), public_key.end());
94 UtilityProcessHost* host =
95 UtilityProcessHost::Create(this, base::MessageLoopProxy::current());
96 callback_ = callback;
97 host->ElevatePrivileges();
98 host->Send(new ChromeUtilityHostMsg_GetAndEncryptWiFiCredentials(
99 network_guid, public_key_data));
100 }
101
102 } // namespace
103
104 namespace extensions {
105
106 class NetworkingPrivateCredentialsGetterWin
107 : public NetworkingPrivateCredentialsGetter {
108 public:
109 NetworkingPrivateCredentialsGetterWin();
110
111 virtual void Start(
112 const std::string& network_guid,
113 const std::string& public_key,
114 const extensions::NetworkingPrivateServiceClient::CryptoVerify::
115 VerifyAndEncryptCredentialsCallback& callback) OVERRIDE;
116
117 private:
118 virtual ~NetworkingPrivateCredentialsGetterWin();
119
120 DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateCredentialsGetterWin);
121 };
122
NetworkingPrivateCredentialsGetterWin()123 NetworkingPrivateCredentialsGetterWin::NetworkingPrivateCredentialsGetterWin() {
124 }
125
Start(const std::string & network_guid,const std::string & public_key,const extensions::NetworkingPrivateServiceClient::CryptoVerify::VerifyAndEncryptCredentialsCallback & callback)126 void NetworkingPrivateCredentialsGetterWin::Start(
127 const std::string& network_guid,
128 const std::string& public_key,
129 const extensions::NetworkingPrivateServiceClient::CryptoVerify::
130 VerifyAndEncryptCredentialsCallback& callback) {
131 BrowserThread::PostTask(
132 BrowserThread::IO,
133 FROM_HERE,
134 base::Bind(&CredentialsGetterHostClient::StartProcessOnIOThread,
135 new CredentialsGetterHostClient(),
136 network_guid,
137 public_key,
138 callback));
139 }
140
141 NetworkingPrivateCredentialsGetterWin::
~NetworkingPrivateCredentialsGetterWin()142 ~NetworkingPrivateCredentialsGetterWin() {}
143
144 NetworkingPrivateCredentialsGetter*
Create()145 NetworkingPrivateCredentialsGetter::Create() {
146 return new NetworkingPrivateCredentialsGetterWin();
147 }
148
149 } // namespace extensions
150