blob: cc9359be5522cc5f99301d38b902e2754acc74d9 [file] [log] [blame]
Darin Petkov1c115202012-03-22 15:35:47 +01001// Copyright (c) 2012 The Chromium OS 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 "shill/openvpn_management_server.h"
6
Darin Petkov271fe522012-03-27 13:47:29 +02007#include <netinet/in.h>
8
Darin Petkov683942b2012-03-27 18:00:04 +02009#include <chromeos/dbus/service_constants.h>
Darin Petkov1c115202012-03-22 15:35:47 +010010#include <gtest/gtest.h>
11
Darin Petkov683942b2012-03-27 18:00:04 +020012#include "shill/glib.h"
Darin Petkov1c115202012-03-22 15:35:47 +010013#include "shill/key_value_store.h"
Darin Petkov271fe522012-03-27 13:47:29 +020014#include "shill/mock_event_dispatcher.h"
Darin Petkov1c115202012-03-22 15:35:47 +010015#include "shill/mock_openvpn_driver.h"
Darin Petkov271fe522012-03-27 13:47:29 +020016#include "shill/mock_sockets.h"
17
Darin Petkov3273da72013-02-13 11:50:25 +010018using base::Bind;
19using base::Unretained;
Darin Petkov271fe522012-03-27 13:47:29 +020020using std::string;
Darin Petkov46463022012-03-29 14:57:32 +020021using std::vector;
Darin Petkov271fe522012-03-27 13:47:29 +020022using testing::_;
Darin Petkove08084d2012-06-11 13:19:35 +020023using testing::Assign;
Darin Petkov0cd0d1e2013-02-11 12:49:10 +010024using testing::InSequence;
Darin Petkov271fe522012-03-27 13:47:29 +020025using testing::Return;
26using testing::ReturnNew;
Darin Petkov1c115202012-03-22 15:35:47 +010027
28namespace shill {
29
Darin Petkov271fe522012-03-27 13:47:29 +020030namespace {
Darin Petkov271fe522012-03-27 13:47:29 +020031MATCHER_P(VoidStringEq, value, "") {
32 return value == reinterpret_cast<const char *>(arg);
33}
34} // namespace {}
35
Darin Petkov1c115202012-03-22 15:35:47 +010036class OpenVPNManagementServerTest : public testing::Test {
37 public:
38 OpenVPNManagementServerTest()
Paul Stewart451aa7f2012-04-11 19:07:58 -070039 : server_(&driver_, &glib_) {}
Darin Petkov1c115202012-03-22 15:35:47 +010040
41 virtual ~OpenVPNManagementServerTest() {}
42
Darin Petkova42afe32013-02-05 16:53:52 +010043 protected:
44 static const int kConnectedSocket;
45
Darin Petkov271fe522012-03-27 13:47:29 +020046 void SetSockets() { server_.sockets_ = &sockets_; }
47 void SetDispatcher() { server_.dispatcher_ = &dispatcher_; }
Darin Petkovffd33062012-06-11 19:23:42 +020048 void ExpectNotStarted() { EXPECT_FALSE(server_.IsStarted()); }
Darin Petkov271fe522012-03-27 13:47:29 +020049
Darin Petkov683942b2012-03-27 18:00:04 +020050 void SetConnectedSocket() {
51 server_.connected_socket_ = kConnectedSocket;
52 SetSockets();
53 }
54
55 void ExpectSend(const string &value) {
56 EXPECT_CALL(sockets_,
57 Send(kConnectedSocket, VoidStringEq(value), value.size(), 0))
Darin Petkov271fe522012-03-27 13:47:29 +020058 .WillOnce(Return(value.size()));
59 }
60
Darin Petkov683942b2012-03-27 18:00:04 +020061 void ExpectStaticChallengeResponse() {
Ben Chan73728782013-09-20 13:40:54 -070062 driver_.args()->SetString(kOpenVPNUserProperty, "jojo");
63 driver_.args()->SetString(kOpenVPNPasswordProperty, "yoyo");
64 driver_.args()->SetString(kOpenVPNOTPProperty, "123456");
Darin Petkov683942b2012-03-27 18:00:04 +020065 SetConnectedSocket();
66 ExpectSend("username \"Auth\" jojo\n");
67 ExpectSend("password \"Auth\" \"SCRV1:eW95bw==:MTIzNDU2\"\n");
68 }
69
Darin Petkovdaaa5532012-07-24 15:37:55 +020070 void ExpectAuthenticationResponse() {
Ben Chan73728782013-09-20 13:40:54 -070071 driver_.args()->SetString(kOpenVPNUserProperty, "jojo");
72 driver_.args()->SetString(kOpenVPNPasswordProperty, "yoyo");
Darin Petkovdaaa5532012-07-24 15:37:55 +020073 SetConnectedSocket();
74 ExpectSend("username \"Auth\" jojo\n");
75 ExpectSend("password \"Auth\" \"yoyo\"\n");
76 }
77
Darin Petkove0d5dd12012-04-04 16:10:48 +020078 void ExpectPINResponse() {
Ben Chan73728782013-09-20 13:40:54 -070079 driver_.args()->SetString(kOpenVPNPinProperty, "987654");
Darin Petkove0d5dd12012-04-04 16:10:48 +020080 SetConnectedSocket();
81 ExpectSend("password \"User-Specific TPM Token FOO\" \"987654\"\n");
82 }
83
Darin Petkova5e07ef2012-07-09 14:27:57 +020084 void ExpectHoldRelease() {
85 SetConnectedSocket();
86 ExpectSend("hold release\n");
87 }
88
Darin Petkova42afe32013-02-05 16:53:52 +010089 void ExpectRestart() {
90 SetConnectedSocket();
91 ExpectSend("signal SIGUSR1\n");
92 }
93
Darin Petkov271fe522012-03-27 13:47:29 +020094 InputData CreateInputDataFromString(const string &str) {
95 InputData data(
96 reinterpret_cast<unsigned char *>(const_cast<char *>(str.data())),
97 str.size());
98 return data;
99 }
100
Darin Petkova42afe32013-02-05 16:53:52 +0100101 void SendSignal(const string &signal) {
102 server_.SendSignal(signal);
103 }
104
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100105 void OnInput(InputData *data) {
106 server_.OnInput(data);
107 }
108
109 void ProcessMessage(const string &message) {
110 server_.ProcessMessage(message);
111 }
112
Darin Petkova42afe32013-02-05 16:53:52 +0100113 bool ProcessSuccessMessage(const string &message) {
114 return server_.ProcessSuccessMessage(message);
115 }
Darin Petkov683942b2012-03-27 18:00:04 +0200116
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100117 bool ProcessStateMessage(const string &message) {
118 return server_.ProcessStateMessage(message);
119 }
120
Darin Petkov16e70322013-03-07 15:54:23 +0100121 bool ProcessAuthTokenMessage(const string &message) {
122 return server_.ProcessAuthTokenMessage(message);
123 }
124
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100125 bool GetHoldWaiting() { return server_.hold_waiting_; }
126
Darin Petkovaba89322013-03-11 14:48:22 +0100127 static string ParseSubstring(
128 const string &message, const string &start, const string &end) {
129 return OpenVPNManagementServer::ParseSubstring(message, start, end);
130 }
131
132 static string ParsePasswordTag(const string &message) {
133 return OpenVPNManagementServer::ParsePasswordTag(message);
134 }
135
136 static string ParsePasswordFailedReason(const string &message) {
137 return OpenVPNManagementServer::ParsePasswordFailedReason(message);
138 }
139
Darin Petkov1c049c72013-03-21 13:15:45 +0100140 void SetClientState(const string &state) {
141 server_.state_ = state;
142 }
143
Darin Petkov683942b2012-03-27 18:00:04 +0200144 GLib glib_;
Darin Petkov1c115202012-03-22 15:35:47 +0100145 MockOpenVPNDriver driver_;
Darin Petkov271fe522012-03-27 13:47:29 +0200146 MockSockets sockets_;
147 MockEventDispatcher dispatcher_;
mukesh agrawal7efde5b2013-05-08 11:36:58 -0700148 OpenVPNManagementServer server_; // Destroy before anything it references.
Darin Petkov1c115202012-03-22 15:35:47 +0100149};
150
Darin Petkov683942b2012-03-27 18:00:04 +0200151// static
152const int OpenVPNManagementServerTest::kConnectedSocket = 555;
153
Darin Petkov271fe522012-03-27 13:47:29 +0200154TEST_F(OpenVPNManagementServerTest, StartStarted) {
155 SetSockets();
Darin Petkov46463022012-03-29 14:57:32 +0200156 EXPECT_TRUE(server_.Start(NULL, NULL, NULL));
Darin Petkov271fe522012-03-27 13:47:29 +0200157}
158
159TEST_F(OpenVPNManagementServerTest, StartSocketFail) {
160 EXPECT_CALL(sockets_, Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
161 .WillOnce(Return(-1));
Darin Petkov46463022012-03-29 14:57:32 +0200162 EXPECT_FALSE(server_.Start(NULL, &sockets_, NULL));
Darin Petkov271fe522012-03-27 13:47:29 +0200163 ExpectNotStarted();
164}
165
166TEST_F(OpenVPNManagementServerTest, StartGetSockNameFail) {
167 const int kSocket = 123;
168 EXPECT_CALL(sockets_, Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
169 .WillOnce(Return(kSocket));
170 EXPECT_CALL(sockets_, Bind(kSocket, _, _)).WillOnce(Return(0));
171 EXPECT_CALL(sockets_, Listen(kSocket, 1)).WillOnce(Return(0));
172 EXPECT_CALL(sockets_, GetSockName(kSocket, _, _)).WillOnce(Return(-1));
173 EXPECT_CALL(sockets_, Close(kSocket)).WillOnce(Return(0));
Darin Petkov46463022012-03-29 14:57:32 +0200174 EXPECT_FALSE(server_.Start(NULL, &sockets_, NULL));
Darin Petkov271fe522012-03-27 13:47:29 +0200175 ExpectNotStarted();
176}
177
Darin Petkov78f63262012-03-26 01:30:24 +0200178TEST_F(OpenVPNManagementServerTest, Start) {
Paul Stewart406c4732013-08-01 09:30:12 -0700179 const string kStaticChallenge = "static-challenge";
Ben Chan73728782013-09-20 13:40:54 -0700180 driver_.args()->SetString(kOpenVPNStaticChallengeProperty, kStaticChallenge);
Darin Petkov271fe522012-03-27 13:47:29 +0200181 const int kSocket = 123;
182 EXPECT_CALL(sockets_, Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
183 .WillOnce(Return(kSocket));
184 EXPECT_CALL(sockets_, Bind(kSocket, _, _)).WillOnce(Return(0));
185 EXPECT_CALL(sockets_, Listen(kSocket, 1)).WillOnce(Return(0));
186 EXPECT_CALL(sockets_, GetSockName(kSocket, _, _)).WillOnce(Return(0));
187 EXPECT_CALL(dispatcher_,
Darin Petkov3273da72013-02-13 11:50:25 +0100188 CreateReadyHandler(kSocket, IOHandler::kModeInput, _))
Darin Petkov271fe522012-03-27 13:47:29 +0200189 .WillOnce(ReturnNew<IOHandler>());
Paul Stewart406c4732013-08-01 09:30:12 -0700190 vector<vector<string>> options;
Darin Petkov46463022012-03-29 14:57:32 +0200191 EXPECT_TRUE(server_.Start(&dispatcher_, &sockets_, &options));
Darin Petkov271fe522012-03-27 13:47:29 +0200192 EXPECT_EQ(&sockets_, server_.sockets_);
193 EXPECT_EQ(kSocket, server_.socket_);
194 EXPECT_TRUE(server_.ready_handler_.get());
195 EXPECT_EQ(&dispatcher_, server_.dispatcher_);
Paul Stewart406c4732013-08-01 09:30:12 -0700196 vector<vector<string>> expected_options {
Paul Stewartb26347a2013-08-02 12:12:09 -0700197 { "management", "127.0.0.1", "0" },
198 { "management-client" },
199 { "management-hold" },
200 { "management-query-passwords" },
201 { "static-challenge", kStaticChallenge, "1" }
Paul Stewart406c4732013-08-01 09:30:12 -0700202 };
203 EXPECT_EQ(expected_options, options);
Darin Petkov271fe522012-03-27 13:47:29 +0200204}
205
206TEST_F(OpenVPNManagementServerTest, Stop) {
Darin Petkov1c049c72013-03-21 13:15:45 +0100207 EXPECT_TRUE(server_.state().empty());
Darin Petkov271fe522012-03-27 13:47:29 +0200208 SetSockets();
209 server_.input_handler_.reset(new IOHandler());
210 const int kConnectedSocket = 234;
211 server_.connected_socket_ = kConnectedSocket;
212 EXPECT_CALL(sockets_, Close(kConnectedSocket)).WillOnce(Return(0));
213 SetDispatcher();
214 server_.ready_handler_.reset(new IOHandler());
215 const int kSocket = 345;
216 server_.socket_ = kSocket;
Darin Petkov1c049c72013-03-21 13:15:45 +0100217 SetClientState(OpenVPNManagementServer::kStateReconnecting);
Darin Petkov271fe522012-03-27 13:47:29 +0200218 EXPECT_CALL(sockets_, Close(kSocket)).WillOnce(Return(0));
219 server_.Stop();
220 EXPECT_FALSE(server_.input_handler_.get());
221 EXPECT_EQ(-1, server_.connected_socket_);
222 EXPECT_FALSE(server_.dispatcher_);
223 EXPECT_FALSE(server_.ready_handler_.get());
224 EXPECT_EQ(-1, server_.socket_);
Darin Petkov1c049c72013-03-21 13:15:45 +0100225 EXPECT_TRUE(server_.state().empty());
Darin Petkov271fe522012-03-27 13:47:29 +0200226 ExpectNotStarted();
227}
228
229TEST_F(OpenVPNManagementServerTest, OnReadyAcceptFail) {
230 const int kSocket = 333;
231 SetSockets();
232 EXPECT_CALL(sockets_, Accept(kSocket, NULL, NULL)).WillOnce(Return(-1));
233 server_.OnReady(kSocket);
234 EXPECT_EQ(-1, server_.connected_socket_);
235}
236
237TEST_F(OpenVPNManagementServerTest, OnReady) {
238 const int kSocket = 111;
Darin Petkov683942b2012-03-27 18:00:04 +0200239 SetConnectedSocket();
Darin Petkov271fe522012-03-27 13:47:29 +0200240 SetDispatcher();
241 EXPECT_CALL(sockets_, Accept(kSocket, NULL, NULL))
242 .WillOnce(Return(kConnectedSocket));
243 server_.ready_handler_.reset(new IOHandler());
Darin Petkov3273da72013-02-13 11:50:25 +0100244 EXPECT_CALL(dispatcher_, CreateInputHandler(kConnectedSocket, _, _))
Darin Petkov271fe522012-03-27 13:47:29 +0200245 .WillOnce(ReturnNew<IOHandler>());
Darin Petkov683942b2012-03-27 18:00:04 +0200246 ExpectSend("state on\n");
Darin Petkov271fe522012-03-27 13:47:29 +0200247 server_.OnReady(kSocket);
248 EXPECT_EQ(kConnectedSocket, server_.connected_socket_);
249 EXPECT_FALSE(server_.ready_handler_.get());
250 EXPECT_TRUE(server_.input_handler_.get());
251}
252
253TEST_F(OpenVPNManagementServerTest, OnInput) {
254 {
255 string s;
256 InputData data = CreateInputDataFromString(s);
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100257 OnInput(&data);
Darin Petkov271fe522012-03-27 13:47:29 +0200258 }
259 {
260 string s = "foo\n"
261 ">INFO:...\n"
Darin Petkov683942b2012-03-27 18:00:04 +0200262 ">PASSWORD:Need 'Auth' SC:user/password/otp\n"
Darin Petkove0d5dd12012-04-04 16:10:48 +0200263 ">PASSWORD:Need 'User-Specific TPM Token FOO' ...\n"
Darin Petkov0440b9b2012-04-17 16:11:56 +0200264 ">PASSWORD:Verification Failed: .\n"
Darin Petkov16e70322013-03-07 15:54:23 +0100265 ">PASSWORD:Auth-Token:ToKeN==\n"
Darin Petkova5e07ef2012-07-09 14:27:57 +0200266 ">STATE:123,RECONNECTING,detail,...,...\n"
Darin Petkova42afe32013-02-05 16:53:52 +0100267 ">HOLD:Waiting for hold release\n"
268 "SUCCESS: Hold released.";
Darin Petkov271fe522012-03-27 13:47:29 +0200269 InputData data = CreateInputDataFromString(s);
Darin Petkov683942b2012-03-27 18:00:04 +0200270 ExpectStaticChallengeResponse();
Darin Petkove0d5dd12012-04-04 16:10:48 +0200271 ExpectPINResponse();
Darin Petkov1c049c72013-03-21 13:15:45 +0100272 EXPECT_CALL(driver_, FailService(Service::kFailureConnect,
273 Service::kErrorDetailsNone));
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100274 EXPECT_CALL(driver_, OnReconnecting(_));
275 EXPECT_FALSE(GetHoldWaiting());
276 OnInput(&data);
277 EXPECT_TRUE(GetHoldWaiting());
Darin Petkov271fe522012-03-27 13:47:29 +0200278 }
279}
280
Darin Petkove08084d2012-06-11 13:19:35 +0200281TEST_F(OpenVPNManagementServerTest, OnInputStop) {
282 string s =
283 ">PASSWORD:Verification Failed: .\n"
284 ">STATE:123,RECONNECTING,detail,...,...";
285 InputData data = CreateInputDataFromString(s);
286 SetSockets();
287 // Stops the server after the first message is processed.
Darin Petkov1c049c72013-03-21 13:15:45 +0100288 EXPECT_CALL(driver_, FailService(Service::kFailureConnect,
289 Service::kErrorDetailsNone))
Darin Petkove08084d2012-06-11 13:19:35 +0200290 .WillOnce(Assign(&server_.sockets_, reinterpret_cast<Sockets *>(NULL)));
291 // The second message should not be processed.
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100292 EXPECT_CALL(driver_, OnReconnecting(_)).Times(0);
293 OnInput(&data);
Darin Petkove08084d2012-06-11 13:19:35 +0200294}
295
Darin Petkov271fe522012-03-27 13:47:29 +0200296TEST_F(OpenVPNManagementServerTest, ProcessMessage) {
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100297 ProcessMessage("foo");
298 ProcessMessage(">INFO:");
Darin Petkov271fe522012-03-27 13:47:29 +0200299
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100300 EXPECT_CALL(driver_, OnReconnecting(_));
301 ProcessMessage(">STATE:123,RECONNECTING,detail,...,...");
Darin Petkov271fe522012-03-27 13:47:29 +0200302}
303
Darin Petkova42afe32013-02-05 16:53:52 +0100304TEST_F(OpenVPNManagementServerTest, ProcessSuccessMessage) {
305 EXPECT_FALSE(ProcessSuccessMessage("foo"));
306 EXPECT_TRUE(ProcessSuccessMessage("SUCCESS: foo"));
307}
308
Darin Petkov271fe522012-03-27 13:47:29 +0200309TEST_F(OpenVPNManagementServerTest, ProcessInfoMessage) {
310 EXPECT_FALSE(server_.ProcessInfoMessage("foo"));
Darin Petkova42afe32013-02-05 16:53:52 +0100311 EXPECT_TRUE(server_.ProcessInfoMessage(">INFO:foo"));
Darin Petkov271fe522012-03-27 13:47:29 +0200312}
313
314TEST_F(OpenVPNManagementServerTest, ProcessStateMessage) {
Darin Petkov1c049c72013-03-21 13:15:45 +0100315 EXPECT_TRUE(server_.state().empty());
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100316 EXPECT_FALSE(ProcessStateMessage("foo"));
Darin Petkov1c049c72013-03-21 13:15:45 +0100317 EXPECT_TRUE(server_.state().empty());
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100318 EXPECT_TRUE(ProcessStateMessage(">STATE:123,WAIT,detail,...,..."));
Darin Petkov1c049c72013-03-21 13:15:45 +0100319 EXPECT_EQ("WAIT", server_.state());
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100320 {
321 InSequence seq;
322 EXPECT_CALL(driver_,
323 OnReconnecting(OpenVPNDriver::kReconnectReasonUnknown));
324 EXPECT_CALL(driver_,
325 OnReconnecting(OpenVPNDriver::kReconnectReasonTLSError));
326 }
327 EXPECT_TRUE(ProcessStateMessage(">STATE:123,RECONNECTING,detail,...,..."));
Darin Petkov1c049c72013-03-21 13:15:45 +0100328 EXPECT_EQ(OpenVPNManagementServer::kStateReconnecting, server_.state());
Darin Petkov0cd0d1e2013-02-11 12:49:10 +0100329 EXPECT_TRUE(ProcessStateMessage(">STATE:123,RECONNECTING,tls-error,...,..."));
Darin Petkov271fe522012-03-27 13:47:29 +0200330}
331
Darin Petkov683942b2012-03-27 18:00:04 +0200332TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageAuthSC) {
Darin Petkov683942b2012-03-27 18:00:04 +0200333 ExpectStaticChallengeResponse();
334 EXPECT_TRUE(
335 server_.ProcessNeedPasswordMessage(
336 ">PASSWORD:Need 'Auth' SC:user/password/otp"));
Ben Chan73728782013-09-20 13:40:54 -0700337 EXPECT_FALSE(driver_.args()->ContainsString(kOpenVPNOTPProperty));
Darin Petkov683942b2012-03-27 18:00:04 +0200338}
339
Darin Petkovdaaa5532012-07-24 15:37:55 +0200340TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageAuth) {
341 ExpectAuthenticationResponse();
342 EXPECT_TRUE(
343 server_.ProcessNeedPasswordMessage(
344 ">PASSWORD:Need 'Auth' username/password"));
345}
346
Darin Petkove0d5dd12012-04-04 16:10:48 +0200347TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageTPMToken) {
348 ExpectPINResponse();
349 EXPECT_TRUE(
350 server_.ProcessNeedPasswordMessage(
351 ">PASSWORD:Need 'User-Specific TPM Token FOO' ..."));
352}
353
354TEST_F(OpenVPNManagementServerTest, ProcessNeedPasswordMessageUnknown) {
355 EXPECT_FALSE(server_.ProcessNeedPasswordMessage("foo"));
356}
357
Darin Petkovaba89322013-03-11 14:48:22 +0100358TEST_F(OpenVPNManagementServerTest, ParseSubstring) {
359 EXPECT_EQ("", ParseSubstring("", "'", "'"));
360 EXPECT_EQ("", ParseSubstring(" ", "'", "'"));
361 EXPECT_EQ("", ParseSubstring("'", "'", "'"));
362 EXPECT_EQ("", ParseSubstring("''", "'", "'"));
363 EXPECT_EQ("", ParseSubstring("] [", "[", "]"));
364 EXPECT_EQ("", ParseSubstring("[]", "[", "]"));
365 EXPECT_EQ("bar", ParseSubstring("foo['bar']zoo", "['", "']"));
366 EXPECT_EQ("bar", ParseSubstring("foo['bar']", "['", "']"));
367 EXPECT_EQ("bar", ParseSubstring("['bar']zoo", "['", "']"));
368 EXPECT_EQ("bar", ParseSubstring("['bar']['zoo']", "['", "']"));
369}
370
371TEST_F(OpenVPNManagementServerTest, ParsePasswordTag) {
372 EXPECT_EQ("", ParsePasswordTag(""));
373 EXPECT_EQ("Auth",
374 ParsePasswordTag(
375 ">PASSWORD:Verification Failed: 'Auth' "
376 "['REVOKED: client certificate has been revoked']"));
377}
378
379TEST_F(OpenVPNManagementServerTest, ParsePasswordFailedReason) {
380 EXPECT_EQ("", ParsePasswordFailedReason(""));
381 EXPECT_EQ("REVOKED: client certificate has been revoked",
382 ParsePasswordFailedReason(
383 ">PASSWORD:Verification Failed: 'Auth' "
384 "['REVOKED: client certificate has been revoked']"));
Darin Petkove0d5dd12012-04-04 16:10:48 +0200385}
386
Darin Petkov683942b2012-03-27 18:00:04 +0200387TEST_F(OpenVPNManagementServerTest, PerformStaticChallengeNoCreds) {
Darin Petkov1c049c72013-03-21 13:15:45 +0100388 EXPECT_CALL(driver_, FailService(Service::kFailureInternal,
389 Service::kErrorDetailsNone)).Times(3);
Darin Petkove0d5dd12012-04-04 16:10:48 +0200390 server_.PerformStaticChallenge("Auth");
Ben Chan73728782013-09-20 13:40:54 -0700391 driver_.args()->SetString(kOpenVPNUserProperty, "jojo");
Darin Petkove0d5dd12012-04-04 16:10:48 +0200392 server_.PerformStaticChallenge("Auth");
Ben Chan73728782013-09-20 13:40:54 -0700393 driver_.args()->SetString(kOpenVPNPasswordProperty, "yoyo");
Darin Petkove0d5dd12012-04-04 16:10:48 +0200394 server_.PerformStaticChallenge("Auth");
Darin Petkov683942b2012-03-27 18:00:04 +0200395}
396
397TEST_F(OpenVPNManagementServerTest, PerformStaticChallenge) {
398 ExpectStaticChallengeResponse();
Darin Petkove0d5dd12012-04-04 16:10:48 +0200399 server_.PerformStaticChallenge("Auth");
Ben Chan73728782013-09-20 13:40:54 -0700400 EXPECT_FALSE(driver_.args()->ContainsString(kOpenVPNOTPProperty));
Darin Petkov683942b2012-03-27 18:00:04 +0200401}
402
Darin Petkovdaaa5532012-07-24 15:37:55 +0200403TEST_F(OpenVPNManagementServerTest, PerformAuthenticationNoCreds) {
Darin Petkov1c049c72013-03-21 13:15:45 +0100404 EXPECT_CALL(driver_, FailService(Service::kFailureInternal,
405 Service::kErrorDetailsNone)).Times(2);
Darin Petkovdaaa5532012-07-24 15:37:55 +0200406 server_.PerformAuthentication("Auth");
Ben Chan73728782013-09-20 13:40:54 -0700407 driver_.args()->SetString(kOpenVPNUserProperty, "jojo");
Darin Petkovdaaa5532012-07-24 15:37:55 +0200408 server_.PerformAuthentication("Auth");
409}
410
411TEST_F(OpenVPNManagementServerTest, PerformAuthentication) {
412 ExpectAuthenticationResponse();
413 server_.PerformAuthentication("Auth");
414}
415
Darin Petkova5e07ef2012-07-09 14:27:57 +0200416TEST_F(OpenVPNManagementServerTest, ProcessHoldMessage) {
417 EXPECT_FALSE(server_.hold_release_);
418 EXPECT_FALSE(server_.hold_waiting_);
419
420 EXPECT_FALSE(server_.ProcessHoldMessage("foo"));
421
422 EXPECT_TRUE(server_.ProcessHoldMessage(">HOLD:Waiting for hold release"));
423 EXPECT_FALSE(server_.hold_release_);
424 EXPECT_TRUE(server_.hold_waiting_);
425
426 ExpectHoldRelease();
427 server_.hold_release_ = true;
428 server_.hold_waiting_ = false;
429 EXPECT_TRUE(server_.ProcessHoldMessage(">HOLD:Waiting for hold release"));
430 EXPECT_TRUE(server_.hold_release_);
431 EXPECT_FALSE(server_.hold_waiting_);
432}
433
Darin Petkove0d5dd12012-04-04 16:10:48 +0200434TEST_F(OpenVPNManagementServerTest, SupplyTPMTokenNoPIN) {
Darin Petkov1c049c72013-03-21 13:15:45 +0100435 EXPECT_CALL(driver_, FailService(Service::kFailureInternal,
436 Service::kErrorDetailsNone));
Darin Petkove0d5dd12012-04-04 16:10:48 +0200437 server_.SupplyTPMToken("User-Specific TPM Token FOO");
438}
439
440TEST_F(OpenVPNManagementServerTest, SupplyTPMToken) {
441 ExpectPINResponse();
442 server_.SupplyTPMToken("User-Specific TPM Token FOO");
443}
444
Darin Petkov271fe522012-03-27 13:47:29 +0200445TEST_F(OpenVPNManagementServerTest, Send) {
Darin Petkov271fe522012-03-27 13:47:29 +0200446 const char kMessage[] = "foo\n";
Darin Petkov683942b2012-03-27 18:00:04 +0200447 SetConnectedSocket();
448 ExpectSend(kMessage);
Darin Petkov271fe522012-03-27 13:47:29 +0200449 server_.Send(kMessage);
450}
451
452TEST_F(OpenVPNManagementServerTest, SendState) {
Darin Petkov683942b2012-03-27 18:00:04 +0200453 SetConnectedSocket();
454 ExpectSend("state off\n");
Darin Petkov271fe522012-03-27 13:47:29 +0200455 server_.SendState("off");
Darin Petkov1c115202012-03-22 15:35:47 +0100456}
457
Darin Petkov683942b2012-03-27 18:00:04 +0200458TEST_F(OpenVPNManagementServerTest, SendUsername) {
459 SetConnectedSocket();
460 ExpectSend("username \"Auth\" joesmith\n");
461 server_.SendUsername("Auth", "joesmith");
462}
463
464TEST_F(OpenVPNManagementServerTest, SendPassword) {
465 SetConnectedSocket();
Darin Petkovdaaa5532012-07-24 15:37:55 +0200466 ExpectSend("password \"Auth\" \"foo\\\"bar\"\n");
467 server_.SendPassword("Auth", "foo\"bar");
Darin Petkov683942b2012-03-27 18:00:04 +0200468}
469
Darin Petkov0440b9b2012-04-17 16:11:56 +0200470TEST_F(OpenVPNManagementServerTest, ProcessFailedPasswordMessage) {
471 EXPECT_FALSE(server_.ProcessFailedPasswordMessage("foo"));
Darin Petkov1c049c72013-03-21 13:15:45 +0100472 EXPECT_CALL(driver_, FailService(Service::kFailureConnect,
473 Service::kErrorDetailsNone)).Times(3);
474 EXPECT_CALL(driver_, FailService(Service::kFailureConnect, "Revoked."));
Darin Petkov0440b9b2012-04-17 16:11:56 +0200475 EXPECT_TRUE(
476 server_.ProcessFailedPasswordMessage(">PASSWORD:Verification Failed: ."));
Darin Petkovaba89322013-03-11 14:48:22 +0100477 EXPECT_TRUE(
478 server_.ProcessFailedPasswordMessage(
479 ">PASSWORD:Verification Failed: 'Private Key' ['Reason']"));
480 EXPECT_TRUE(
481 server_.ProcessFailedPasswordMessage(
482 ">PASSWORD:Verification Failed: 'Auth'"));
483 EXPECT_TRUE(
484 server_.ProcessFailedPasswordMessage(
485 ">PASSWORD:Verification Failed: 'Auth' ['Revoked.']"));
Darin Petkov0440b9b2012-04-17 16:11:56 +0200486}
487
Darin Petkov16e70322013-03-07 15:54:23 +0100488TEST_F(OpenVPNManagementServerTest, ProcessAuthTokenMessage) {
489 EXPECT_FALSE(ProcessAuthTokenMessage("foo"));
490 EXPECT_TRUE(ProcessAuthTokenMessage(">PASSWORD:Auth-Token:ToKeN=="));
491}
492
Darin Petkova42afe32013-02-05 16:53:52 +0100493TEST_F(OpenVPNManagementServerTest, SendSignal) {
494 SetConnectedSocket();
495 ExpectSend("signal SIGUSR2\n");
496 SendSignal("SIGUSR2");
497}
498
499TEST_F(OpenVPNManagementServerTest, Restart) {
500 ExpectRestart();
501 server_.Restart();
502}
503
Darin Petkova5e07ef2012-07-09 14:27:57 +0200504TEST_F(OpenVPNManagementServerTest, SendHoldRelease) {
505 ExpectHoldRelease();
506 server_.SendHoldRelease();
507}
508
509TEST_F(OpenVPNManagementServerTest, Hold) {
510 EXPECT_FALSE(server_.hold_release_);
511 EXPECT_FALSE(server_.hold_waiting_);
512
513 server_.ReleaseHold();
514 EXPECT_TRUE(server_.hold_release_);
515 EXPECT_FALSE(server_.hold_waiting_);
516
517 server_.Hold();
518 EXPECT_FALSE(server_.hold_release_);
519 EXPECT_FALSE(server_.hold_waiting_);
520
521 server_.hold_waiting_ = true;
522 ExpectHoldRelease();
523 server_.ReleaseHold();
524 EXPECT_TRUE(server_.hold_release_);
525 EXPECT_FALSE(server_.hold_waiting_);
526}
527
Darin Petkovdaaa5532012-07-24 15:37:55 +0200528TEST_F(OpenVPNManagementServerTest, EscapeToQuote) {
529 EXPECT_EQ("", OpenVPNManagementServer::EscapeToQuote(""));
530 EXPECT_EQ("foo './", OpenVPNManagementServer::EscapeToQuote("foo './"));
531 EXPECT_EQ("\\\\", OpenVPNManagementServer::EscapeToQuote("\\"));
532 EXPECT_EQ("\\\"", OpenVPNManagementServer::EscapeToQuote("\""));
533 EXPECT_EQ("\\\\\\\"foo\\\\bar\\\"",
534 OpenVPNManagementServer::EscapeToQuote("\\\"foo\\bar\""));
535}
536
Darin Petkov1c115202012-03-22 15:35:47 +0100537} // namespace shill