Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: remoting/host/security_key/security_key_socket.cc

Issue 2589933002: Updating SecurityKeyAuthHandlerPosix socket lifetime management (Closed)
Patch Set: Prereview tweaks Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/host/security_key/security_key_socket.h" 5 #include "remoting/host/security_key/security_key_socket.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/callback_helpers.h" 9 #include "base/callback_helpers.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 12 matching lines...) Expand all
23 23
24 // SSH Failure Code 24 // SSH Failure Code
25 const char kSshError[] = {0x05}; 25 const char kSshError[] = {0x05};
26 26
27 } // namespace 27 } // namespace
28 28
29 SecurityKeySocket::SecurityKeySocket(std::unique_ptr<net::StreamSocket> socket, 29 SecurityKeySocket::SecurityKeySocket(std::unique_ptr<net::StreamSocket> socket,
30 base::TimeDelta timeout, 30 base::TimeDelta timeout,
31 const base::Closure& timeout_callback) 31 const base::Closure& timeout_callback)
32 : socket_(std::move(socket)), 32 : socket_(std::move(socket)),
33 read_completed_(false),
34 read_buffer_(new net::IOBufferWithSize(kRequestReadBufferLength)) { 33 read_buffer_(new net::IOBufferWithSize(kRequestReadBufferLength)) {
35 timer_.reset(new base::Timer(false, false)); 34 timer_.reset(new base::Timer(false, false));
36 timer_->Start(FROM_HERE, timeout, timeout_callback); 35 timer_->Start(FROM_HERE, timeout, timeout_callback);
37 } 36 }
38 37
39 SecurityKeySocket::~SecurityKeySocket() {} 38 SecurityKeySocket::~SecurityKeySocket() {}
40 39
41 bool SecurityKeySocket::GetAndClearRequestData(std::string* data_out) { 40 bool SecurityKeySocket::GetAndClearRequestData(std::string* data_out) {
42 DCHECK(thread_checker_.CalledOnValidThread()); 41 DCHECK(thread_checker_.CalledOnValidThread());
43 DCHECK(read_completed_); 42 DCHECK(!waiting_for_request_);
44 43
45 if (!read_completed_) {
46 return false;
47 }
48 if (!IsRequestComplete() || IsRequestTooLarge()) { 44 if (!IsRequestComplete() || IsRequestTooLarge()) {
49 return false; 45 return false;
50 } 46 }
51 // The request size is not part of the data; don't send it. 47 // The request size is not part of the data; don't send it.
52 data_out->assign(request_data_.begin() + kRequestSizeBytes, 48 data_out->assign(request_data_.begin() + kRequestSizeBytes,
53 request_data_.end()); 49 request_data_.end());
Sergey Ulanov 2016/12/19 23:19:18 If we get a request and some extra data at the end
joedow 2016/12/20 00:28:00 That's true, but it would have happened with the p
54 request_data_.clear(); 50 request_data_.clear();
55 return true; 51 return true;
56 } 52 }
57 53
58 void SecurityKeySocket::SendResponse(const std::string& response_data) { 54 void SecurityKeySocket::SendResponse(const std::string& response_data) {
59 DCHECK(thread_checker_.CalledOnValidThread()); 55 DCHECK(thread_checker_.CalledOnValidThread());
60 DCHECK(!write_buffer_); 56 DCHECK(!write_buffer_);
61 57
62 std::string response_length_string = GetResponseLengthAsBytes(response_data); 58 std::string response_length_string = GetResponseLengthAsBytes(response_data);
63 int response_len = response_length_string.size() + response_data.size(); 59 int response_len = response_length_string.size() + response_data.size();
64 std::unique_ptr<std::string> response( 60 std::unique_ptr<std::string> response(
65 new std::string(response_length_string + response_data)); 61 new std::string(response_length_string + response_data));
66 write_buffer_ = new net::DrainableIOBuffer( 62 write_buffer_ = new net::DrainableIOBuffer(
67 new net::StringIOBuffer(std::move(response)), response_len); 63 new net::StringIOBuffer(std::move(response)), response_len);
68 64
69 DCHECK(write_buffer_->BytesRemaining()); 65 DCHECK(write_buffer_->BytesRemaining());
70 DoWrite(); 66 DoWrite();
71 } 67 }
72 68
73 void SecurityKeySocket::SendSshError() { 69 void SecurityKeySocket::SendSshError() {
74 DCHECK(thread_checker_.CalledOnValidThread()); 70 DCHECK(thread_checker_.CalledOnValidThread());
75 71
76 SendResponse(std::string(kSshError, arraysize(kSshError))); 72 SendResponse(std::string(kSshError, arraysize(kSshError)));
77 } 73 }
78 74
79 void SecurityKeySocket::StartReadingRequest( 75 void SecurityKeySocket::StartReadingRequest(
Sergey Ulanov 2016/12/19 23:19:18 Maybe rename this to ReadRequest()? That would mak
80 const base::Closure& request_received_callback) { 76 const base::Closure& request_received_callback) {
81 DCHECK(thread_checker_.CalledOnValidThread()); 77 DCHECK(thread_checker_.CalledOnValidThread());
82 DCHECK(request_received_callback_.is_null()); 78 DCHECK(request_received_callback_.is_null());
83 79
80 waiting_for_request_ = true;
84 request_received_callback_ = request_received_callback; 81 request_received_callback_ = request_received_callback;
82
85 DoRead(); 83 DoRead();
Sergey Ulanov 2016/12/19 23:19:18 Do we need to check if there a complete request in
joedow 2016/12/20 00:28:00 Right now we drain everything from the buffer (lin
86 } 84 }
87 85
88 void SecurityKeySocket::OnDataWritten(int result) { 86 void SecurityKeySocket::OnDataWritten(int result) {
89 DCHECK(thread_checker_.CalledOnValidThread()); 87 DCHECK(thread_checker_.CalledOnValidThread());
90 DCHECK(write_buffer_); 88 DCHECK(write_buffer_);
91 89
92 if (result < 0) { 90 if (result < 0) {
93 LOG(ERROR) << "Error sending response: " << result; 91 LOG(ERROR) << "Error sending response: " << result;
94 return; 92 return;
95 } 93 }
(...skipping 19 matching lines...) Expand all
115 OnDataWritten(result); 113 OnDataWritten(result);
116 } 114 }
117 } 115 }
118 116
119 void SecurityKeySocket::OnDataRead(int result) { 117 void SecurityKeySocket::OnDataRead(int result) {
120 DCHECK(thread_checker_.CalledOnValidThread()); 118 DCHECK(thread_checker_.CalledOnValidThread());
121 119
122 if (result <= 0) { 120 if (result <= 0) {
123 if (result < 0) { 121 if (result < 0) {
124 LOG(ERROR) << "Error reading request: " << result; 122 LOG(ERROR) << "Error reading request: " << result;
123 socket_read_error_ = true;
125 } 124 }
126 read_completed_ = true; 125 waiting_for_request_ = false;
127 base::ResetAndReturn(&request_received_callback_).Run(); 126 base::ResetAndReturn(&request_received_callback_).Run();
128 return; 127 return;
129 } 128 }
130 129
131 ResetTimer(); 130 ResetTimer();
132 request_data_.insert(request_data_.end(), read_buffer_->data(), 131 request_data_.insert(request_data_.end(), read_buffer_->data(),
133 read_buffer_->data() + result); 132 read_buffer_->data() + result);
134 if (IsRequestComplete()) { 133 if (IsRequestComplete()) {
135 read_completed_ = true; 134 waiting_for_request_ = false;
136 base::ResetAndReturn(&request_received_callback_).Run(); 135 base::ResetAndReturn(&request_received_callback_).Run();
137 return; 136 return;
138 } 137 }
139 138
140 DoRead(); 139 DoRead();
141 } 140 }
142 141
143 void SecurityKeySocket::DoRead() { 142 void SecurityKeySocket::DoRead() {
144 DCHECK(thread_checker_.CalledOnValidThread()); 143 DCHECK(thread_checker_.CalledOnValidThread());
145 144
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 return response_len; 190 return response_len;
192 } 191 }
193 192
194 void SecurityKeySocket::ResetTimer() { 193 void SecurityKeySocket::ResetTimer() {
195 if (timer_->IsRunning()) { 194 if (timer_->IsRunning()) {
196 timer_->Reset(); 195 timer_->Reset();
197 } 196 }
198 } 197 }
199 198
200 } // namespace remoting 199 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698