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

Side by Side Diff: remoting/protocol/validating_authenticator.cc

Issue 2724223003: Disconnect all users if too many connection requests are received for It2Me (Closed)
Patch Set: Fixing another non-Windows build error Created 3 years, 9 months 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/protocol/validating_authenticator.h" 5 #include "remoting/protocol/validating_authenticator.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/callback.h" 12 #include "base/callback.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/macros.h" 14 #include "base/macros.h"
15 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
16 #include "base/memory/weak_ptr.h" 16 #include "base/memory/weak_ptr.h"
17 #include "remoting/protocol/authenticator.h" 17 #include "remoting/protocol/authenticator.h"
18 #include "remoting/protocol/channel_authenticator.h" 18 #include "remoting/protocol/channel_authenticator.h"
19 #include "third_party/libjingle_xmpp/xmllite/xmlelement.h" 19 #include "third_party/libjingle_xmpp/xmllite/xmlelement.h"
20 20
21 namespace remoting { 21 namespace remoting {
22 namespace protocol { 22 namespace protocol {
23 23
24 ValidatingAuthenticator::ValidatingAuthenticator( 24 ValidatingAuthenticator::ValidatingAuthenticator(
25 const std::string& remote_jid, 25 const std::string& remote_jid,
26 const ValidationCallback& validation_callback, 26 const ValidationCallback& incoming_callback,
27 const ValidationCallback& accepted_callback,
27 std::unique_ptr<Authenticator> current_authenticator) 28 std::unique_ptr<Authenticator> current_authenticator)
28 : remote_jid_(remote_jid), 29 : remote_jid_(remote_jid),
29 validation_callback_(validation_callback), 30 incoming_callback_(incoming_callback),
31 accepted_callback_(accepted_callback),
30 current_authenticator_(std::move(current_authenticator)), 32 current_authenticator_(std::move(current_authenticator)),
31 weak_factory_(this) { 33 weak_factory_(this) {
32 DCHECK(!remote_jid_.empty()); 34 DCHECK(!remote_jid_.empty());
33 DCHECK(!validation_callback_.is_null()); 35 DCHECK(incoming_callback_);
36 DCHECK(accepted_callback_);
34 DCHECK(current_authenticator_); 37 DCHECK(current_authenticator_);
35 } 38 }
36 39
37 ValidatingAuthenticator::~ValidatingAuthenticator() {} 40 ValidatingAuthenticator::~ValidatingAuthenticator() {}
38 41
39 Authenticator::State ValidatingAuthenticator::state() const { 42 Authenticator::State ValidatingAuthenticator::state() const {
40 return state_; 43 return pending_auth_message_ ? MESSAGE_READY : state_;
41 } 44 }
42 45
43 bool ValidatingAuthenticator::started() const { 46 bool ValidatingAuthenticator::started() const {
44 return current_authenticator_->started(); 47 return current_authenticator_->started();
45 } 48 }
46 49
47 Authenticator::RejectionReason ValidatingAuthenticator::rejection_reason() 50 Authenticator::RejectionReason ValidatingAuthenticator::rejection_reason()
48 const { 51 const {
49 return rejection_reason_; 52 return rejection_reason_;
50 } 53 }
(...skipping 12 matching lines...) Expand all
63 const base::Closure& resume_callback) { 66 const base::Closure& resume_callback) {
64 DCHECK_EQ(state_, WAITING_MESSAGE); 67 DCHECK_EQ(state_, WAITING_MESSAGE);
65 state_ = PROCESSING_MESSAGE; 68 state_ = PROCESSING_MESSAGE;
66 69
67 if (first_message_received_) { 70 if (first_message_received_) {
68 current_authenticator_->ProcessMessage( 71 current_authenticator_->ProcessMessage(
69 message, base::Bind(&ValidatingAuthenticator::UpdateState, 72 message, base::Bind(&ValidatingAuthenticator::UpdateState,
70 weak_factory_.GetWeakPtr(), resume_callback)); 73 weak_factory_.GetWeakPtr(), resume_callback));
71 } else { 74 } else {
72 first_message_received_ = true; 75 first_message_received_ = true;
73 validation_callback_.Run( 76 incoming_callback_.Run(
74 remote_jid_, base::Bind(&ValidatingAuthenticator::OnValidateComplete, 77 remote_jid_,
75 weak_factory_.GetWeakPtr(), 78 base::Bind(
76 base::Owned(new buzz::XmlElement(*message)), 79 &ValidatingAuthenticator::OnValidateComplete,
77 resume_callback)); 80 weak_factory_.GetWeakPtr(),
81 base::Bind(&Authenticator::ProcessMessage,
82 base::Unretained(current_authenticator_.get()),
83 base::Owned(new buzz::XmlElement(*message)),
84 base::Bind(&ValidatingAuthenticator::UpdateState,
85 weak_factory_.GetWeakPtr(), resume_callback)),
86 resume_callback));
78 } 87 }
79 } 88 }
80 89
81 std::unique_ptr<buzz::XmlElement> ValidatingAuthenticator::GetNextMessage() { 90 std::unique_ptr<buzz::XmlElement> ValidatingAuthenticator::GetNextMessage() {
91 if (pending_auth_message_) {
92 DCHECK(state_ == ACCEPTED || state_ == WAITING_MESSAGE);
93 return std::move(pending_auth_message_);
94 }
95
82 std::unique_ptr<buzz::XmlElement> result( 96 std::unique_ptr<buzz::XmlElement> result(
83 current_authenticator_->GetNextMessage()); 97 current_authenticator_->GetNextMessage());
84 state_ = current_authenticator_->state(); 98 state_ = current_authenticator_->state();
85 DCHECK(state_ == ACCEPTED || state_ == WAITING_MESSAGE); 99 DCHECK(state_ == ACCEPTED || state_ == WAITING_MESSAGE);
86 100
87 return result; 101 return result;
88 } 102 }
89 103
90 void ValidatingAuthenticator::OnValidateComplete( 104 void ValidatingAuthenticator::OnValidateComplete(
91 const buzz::XmlElement* message, 105 const base::Closure& success_callback,
92 const base::Closure& resume_callback, 106 const base::Closure& failure_callback,
93 Result validation_result) { 107 Result validation_result) {
94 // Process the original message in the success case, otherwise map 108 // Map |rejection_reason_| to a known reason, set |state_| to REJECTED and
95 // |rejection_reason_| to a known reason, set |state_| to REJECTED and notify 109 // notify the listener of the connection error via the callback.
96 // the listener of the connection error via the callback.
97 switch (validation_result) { 110 switch (validation_result) {
98 case Result::SUCCESS: 111 case Result::SUCCESS:
99 current_authenticator_->ProcessMessage( 112 success_callback.Run();
100 message, base::Bind(&ValidatingAuthenticator::UpdateState,
101 weak_factory_.GetWeakPtr(), resume_callback));
102 return; 113 return;
103 114
104 case Result::ERROR_INVALID_CREDENTIALS: 115 case Result::ERROR_INVALID_CREDENTIALS:
105 rejection_reason_ = Authenticator::INVALID_CREDENTIALS; 116 rejection_reason_ = Authenticator::INVALID_CREDENTIALS;
106 break; 117 break;
107 118
108 case Result::ERROR_INVALID_ACCOUNT: 119 case Result::ERROR_INVALID_ACCOUNT:
109 rejection_reason_ = Authenticator::INVALID_ACCOUNT; 120 rejection_reason_ = Authenticator::INVALID_ACCOUNT;
110 break; 121 break;
111 122
123 case Result::ERROR_TOO_MANY_CONNECTIONS:
124 rejection_reason_ = Authenticator::TOO_MANY_CONNECTIONS;
125 break;
126
112 case Result::ERROR_REJECTED_BY_USER: 127 case Result::ERROR_REJECTED_BY_USER:
113 rejection_reason_ = Authenticator::REJECTED_BY_USER; 128 rejection_reason_ = Authenticator::REJECTED_BY_USER;
114 break; 129 break;
115 } 130 }
116 131
117 state_ = Authenticator::REJECTED; 132 state_ = Authenticator::REJECTED;
118 resume_callback.Run(); 133 failure_callback.Run();
119 } 134 }
120 135
121 void ValidatingAuthenticator::UpdateState( 136 void ValidatingAuthenticator::UpdateState(
122 const base::Closure& resume_callback) { 137 const base::Closure& resume_callback) {
123 DCHECK_EQ(state_, PROCESSING_MESSAGE); 138 DCHECK_EQ(state_, PROCESSING_MESSAGE);
124 139
125 // Update our current state before running |resume_callback|. 140 // Update our current state before running |resume_callback|.
126 state_ = current_authenticator_->state(); 141 state_ = current_authenticator_->state();
127 if (state_ == REJECTED) { 142 if (state_ == REJECTED) {
128 rejection_reason_ = current_authenticator_->rejection_reason(); 143 rejection_reason_ = current_authenticator_->rejection_reason();
144 } else if (state_ == MESSAGE_READY) {
145 DCHECK(!pending_auth_message_);
146 pending_auth_message_ = current_authenticator_->GetNextMessage();
147 state_ = current_authenticator_->state();
129 } 148 }
130 149
131 resume_callback.Run(); 150 if (state_ == ACCEPTED) {
151 accepted_callback_.Run(
152 remote_jid_, base::Bind(&ValidatingAuthenticator::OnValidateComplete,
153 weak_factory_.GetWeakPtr(), resume_callback,
154 resume_callback));
155 } else {
156 resume_callback.Run();
157 }
132 } 158 }
133 159
134 } // namespace protocol 160 } // namespace protocol
135 } // namespace remoting 161 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698