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

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

Issue 2562473002: Fixing SecurityKeySocket unit test issues and cleanup (Closed)
Patch Set: Fixing some comments and unnecessary headers 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 24 matching lines...) Expand all
35 timer_.reset(new base::Timer(false, false)); 35 timer_.reset(new base::Timer(false, false));
36 timer_->Start(FROM_HERE, timeout, timeout_callback); 36 timer_->Start(FROM_HERE, timeout, timeout_callback);
37 } 37 }
38 38
39 SecurityKeySocket::~SecurityKeySocket() {} 39 SecurityKeySocket::~SecurityKeySocket() {}
40 40
41 bool SecurityKeySocket::GetAndClearRequestData(std::string* data_out) { 41 bool SecurityKeySocket::GetAndClearRequestData(std::string* data_out) {
42 DCHECK(thread_checker_.CalledOnValidThread()); 42 DCHECK(thread_checker_.CalledOnValidThread());
43 DCHECK(read_completed_); 43 DCHECK(read_completed_);
44 44
45 if (!read_completed_) 45 if (!read_completed_) {
46 return false; 46 return false;
47 if (!IsRequestComplete() || IsRequestTooLarge()) 47 }
48 if (!IsRequestComplete() || IsRequestTooLarge()) {
48 return false; 49 return false;
50 }
49 // The request size is not part of the data; don't send it. 51 // The request size is not part of the data; don't send it.
50 data_out->assign(request_data_.begin() + kRequestSizeBytes, 52 data_out->assign(request_data_.begin() + kRequestSizeBytes,
51 request_data_.end()); 53 request_data_.end());
52 request_data_.clear(); 54 request_data_.clear();
53 return true; 55 return true;
54 } 56 }
55 57
56 void SecurityKeySocket::SendResponse(const std::string& response_data) { 58 void SecurityKeySocket::SendResponse(
59 const std::string& response_data,
60 const base::Closure& response_written_callback) {
57 DCHECK(thread_checker_.CalledOnValidThread()); 61 DCHECK(thread_checker_.CalledOnValidThread());
58 DCHECK(!write_buffer_); 62 DCHECK(!write_buffer_);
59 63
64 response_written_callback_ = response_written_callback;
Sergey Ulanov 2016/12/07 20:41:36 If SendResponse() is called before previous respon
joedow 2016/12/13 20:30:44 Removed the callback mechanism. Based on having r
60 std::string response_length_string = GetResponseLengthAsBytes(response_data); 65 std::string response_length_string = GetResponseLengthAsBytes(response_data);
61 int response_len = response_length_string.size() + response_data.size(); 66 int response_len = response_length_string.size() + response_data.size();
62 std::unique_ptr<std::string> response( 67 std::unique_ptr<std::string> response(
63 new std::string(response_length_string + response_data)); 68 new std::string(response_length_string + response_data));
64 write_buffer_ = new net::DrainableIOBuffer( 69 write_buffer_ = new net::DrainableIOBuffer(
65 new net::StringIOBuffer(std::move(response)), response_len); 70 new net::StringIOBuffer(std::move(response)), response_len);
71
72 DCHECK(write_buffer_->BytesRemaining());
66 DoWrite(); 73 DoWrite();
67 } 74 }
68 75
69 void SecurityKeySocket::SendSshError() { 76 void SecurityKeySocket::SendSshError(const base::Closure& complete_callback) {
70 DCHECK(thread_checker_.CalledOnValidThread()); 77 DCHECK(thread_checker_.CalledOnValidThread());
71 78
72 SendResponse(std::string(kSshError, arraysize(kSshError))); 79 SendResponse(std::string(kSshError, arraysize(kSshError)), complete_callback);
73 } 80 }
74 81
75 void SecurityKeySocket::StartReadingRequest( 82 void SecurityKeySocket::StartReadingRequest(
76 const base::Closure& request_received_callback) { 83 const base::Closure& request_received_callback) {
77 DCHECK(thread_checker_.CalledOnValidThread()); 84 DCHECK(thread_checker_.CalledOnValidThread());
78 DCHECK(request_received_callback_.is_null()); 85 DCHECK(request_received_callback_.is_null());
79 86
80 request_received_callback_ = request_received_callback; 87 request_received_callback_ = request_received_callback;
81 DoRead(); 88 DoRead();
82 } 89 }
83 90
84 void SecurityKeySocket::OnDataWritten(int result) { 91 void SecurityKeySocket::OnDataWritten(int result) {
85 DCHECK(thread_checker_.CalledOnValidThread()); 92 DCHECK(thread_checker_.CalledOnValidThread());
86 DCHECK(write_buffer_); 93 DCHECK(write_buffer_);
87 94
88 if (result < 0) { 95 if (result < 0) {
89 LOG(ERROR) << "Error sending response: " << result; 96 LOG(ERROR) << "Error sending response: " << result;
97 if (response_written_callback_) {
98 base::ResetAndReturn(&response_written_callback_).Run();
99 }
90 return; 100 return;
91 } 101 }
92 ResetTimer(); 102 ResetTimer();
93 write_buffer_->DidConsume(result); 103 write_buffer_->DidConsume(result);
94 DoWrite(); 104
105 if (write_buffer_->BytesRemaining()) {
106 DoWrite();
107 return;
108 }
109
110 write_buffer_ = nullptr;
111 if (response_written_callback_) {
112 base::ResetAndReturn(&response_written_callback_).Run();
113 }
95 } 114 }
96 115
97 void SecurityKeySocket::DoWrite() { 116 void SecurityKeySocket::DoWrite() {
98 DCHECK(thread_checker_.CalledOnValidThread()); 117 DCHECK(thread_checker_.CalledOnValidThread());
99 DCHECK(write_buffer_); 118 DCHECK(write_buffer_);
100 119
101 if (!write_buffer_->BytesRemaining()) {
102 write_buffer_ = nullptr;
103 return;
104 }
105 int result = socket_->Write( 120 int result = socket_->Write(
106 write_buffer_.get(), write_buffer_->BytesRemaining(), 121 write_buffer_.get(), write_buffer_->BytesRemaining(),
107 base::Bind(&SecurityKeySocket::OnDataWritten, base::Unretained(this))); 122 base::Bind(&SecurityKeySocket::OnDataWritten, base::Unretained(this)));
108 if (result != net::ERR_IO_PENDING) 123 if (result != net::ERR_IO_PENDING) {
109 OnDataWritten(result); 124 OnDataWritten(result);
125 }
110 } 126 }
111 127
112 void SecurityKeySocket::OnDataRead(int result) { 128 void SecurityKeySocket::OnDataRead(int result) {
113 DCHECK(thread_checker_.CalledOnValidThread()); 129 DCHECK(thread_checker_.CalledOnValidThread());
114 130
115 if (result <= 0) { 131 if (result <= 0) {
116 if (result < 0) 132 if (result < 0) {
117 LOG(ERROR) << "Error reading request: " << result; 133 LOG(ERROR) << "Error reading request: " << result;
134 }
118 read_completed_ = true; 135 read_completed_ = true;
119 base::ResetAndReturn(&request_received_callback_).Run(); 136 base::ResetAndReturn(&request_received_callback_).Run();
120 return; 137 return;
121 } 138 }
122 139
123 ResetTimer(); 140 ResetTimer();
124 request_data_.insert(request_data_.end(), read_buffer_->data(), 141 request_data_.insert(request_data_.end(), read_buffer_->data(),
125 read_buffer_->data() + result); 142 read_buffer_->data() + result);
126 if (IsRequestComplete()) { 143 if (IsRequestComplete()) {
127 read_completed_ = true; 144 read_completed_ = true;
128 base::ResetAndReturn(&request_received_callback_).Run(); 145 base::ResetAndReturn(&request_received_callback_).Run();
129 return; 146 return;
130 } 147 }
131 148
132 DoRead(); 149 DoRead();
133 } 150 }
134 151
135 void SecurityKeySocket::DoRead() { 152 void SecurityKeySocket::DoRead() {
136 DCHECK(thread_checker_.CalledOnValidThread()); 153 DCHECK(thread_checker_.CalledOnValidThread());
137 154
138 int result = socket_->Read( 155 int result = socket_->Read(
139 read_buffer_.get(), kRequestReadBufferLength, 156 read_buffer_.get(), kRequestReadBufferLength,
140 base::Bind(&SecurityKeySocket::OnDataRead, base::Unretained(this))); 157 base::Bind(&SecurityKeySocket::OnDataRead, base::Unretained(this)));
141 if (result != net::ERR_IO_PENDING) 158 if (result != net::ERR_IO_PENDING) {
142 OnDataRead(result); 159 OnDataRead(result);
160 }
143 } 161 }
144 162
145 bool SecurityKeySocket::IsRequestComplete() const { 163 bool SecurityKeySocket::IsRequestComplete() const {
146 DCHECK(thread_checker_.CalledOnValidThread()); 164 DCHECK(thread_checker_.CalledOnValidThread());
147 165
148 if (request_data_.size() < kRequestSizeBytes) 166 if (request_data_.size() < kRequestSizeBytes) {
149 return false; 167 return false;
168 }
150 return GetRequestLength() <= request_data_.size(); 169 return GetRequestLength() <= request_data_.size();
151 } 170 }
152 171
153 bool SecurityKeySocket::IsRequestTooLarge() const { 172 bool SecurityKeySocket::IsRequestTooLarge() const {
154 DCHECK(thread_checker_.CalledOnValidThread()); 173 DCHECK(thread_checker_.CalledOnValidThread());
155 174
156 if (request_data_.size() < kRequestSizeBytes) 175 if (request_data_.size() < kRequestSizeBytes) {
157 return false; 176 return false;
177 }
158 return GetRequestLength() > kMaxRequestLength; 178 return GetRequestLength() > kMaxRequestLength;
159 } 179 }
160 180
161 size_t SecurityKeySocket::GetRequestLength() const { 181 size_t SecurityKeySocket::GetRequestLength() const {
162 DCHECK(request_data_.size() >= kRequestSizeBytes); 182 DCHECK(request_data_.size() >= kRequestSizeBytes);
163 183
164 return ((request_data_[0] & 255) << 24) + ((request_data_[1] & 255) << 16) + 184 return ((request_data_[0] & 255) << 24) + ((request_data_[1] & 255) << 16) +
165 ((request_data_[2] & 255) << 8) + (request_data_[3] & 255) + 185 ((request_data_[2] & 255) << 8) + (request_data_[3] & 255) +
166 kRequestSizeBytes; 186 kRequestSizeBytes;
167 } 187 }
168 188
169 std::string SecurityKeySocket::GetResponseLengthAsBytes( 189 std::string SecurityKeySocket::GetResponseLengthAsBytes(
170 const std::string& response) const { 190 const std::string& response) const {
171 std::string response_len; 191 std::string response_len;
172 response_len.reserve(kRequestSizeBytes); 192 response_len.reserve(kRequestSizeBytes);
173 int len = response.size(); 193 int len = response.size();
174 194
175 response_len.push_back((len >> 24) & 255); 195 response_len.push_back((len >> 24) & 255);
176 response_len.push_back((len >> 16) & 255); 196 response_len.push_back((len >> 16) & 255);
177 response_len.push_back((len >> 8) & 255); 197 response_len.push_back((len >> 8) & 255);
178 response_len.push_back(len & 255); 198 response_len.push_back(len & 255);
179 199
180 return response_len; 200 return response_len;
181 } 201 }
182 202
183 void SecurityKeySocket::ResetTimer() { 203 void SecurityKeySocket::ResetTimer() {
184 if (timer_->IsRunning()) 204 if (timer_->IsRunning()) {
185 timer_->Reset(); 205 timer_->Reset();
206 }
186 } 207 }
187 208
188 } // namespace remoting 209 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698