| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 'use strict'; | 5 'use strict'; |
| 6 | 6 |
| 7 /** @suppress {duplicate} */ | 7 /** @suppress {duplicate} */ |
| 8 var remoting = remoting || {}; | 8 var remoting = remoting || {}; |
| 9 | 9 |
| 10 /** | 10 /** |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 /** | 144 /** |
| 145 * @param {Element} stanza | 145 * @param {Element} stanza |
| 146 * @private | 146 * @private |
| 147 */ | 147 */ |
| 148 remoting.XmppLoginHandler.prototype.onStanza_ = function(stanza) { | 148 remoting.XmppLoginHandler.prototype.onStanza_ = function(stanza) { |
| 149 switch (this.state_) { | 149 switch (this.state_) { |
| 150 case remoting.XmppLoginHandler.State.WAIT_STREAM_HEADER: | 150 case remoting.XmppLoginHandler.State.WAIT_STREAM_HEADER: |
| 151 if (stanza.querySelector('features>starttls')) { | 151 if (stanza.querySelector('features>starttls')) { |
| 152 this.state_ = remoting.XmppLoginHandler.State.WAIT_STARTTLS_RESPONSE; | 152 this.state_ = remoting.XmppLoginHandler.State.WAIT_STARTTLS_RESPONSE; |
| 153 } else { | 153 } else { |
| 154 this.onError_(remoting.Error.UNEXPECTED, "Server doesn't support TLS."); | 154 this.onError_( |
| 155 remoting.Error.unexpected(), |
| 156 "Server doesn't support TLS."); |
| 155 } | 157 } |
| 156 break; | 158 break; |
| 157 | 159 |
| 158 case remoting.XmppLoginHandler.State.WAIT_STARTTLS_RESPONSE: | 160 case remoting.XmppLoginHandler.State.WAIT_STARTTLS_RESPONSE: |
| 159 if (stanza.localName == "proceed") { | 161 if (stanza.localName == "proceed") { |
| 160 this.state_ = remoting.XmppLoginHandler.State.STARTING_TLS; | 162 this.state_ = remoting.XmppLoginHandler.State.STARTING_TLS; |
| 161 this.startTlsCallback_(); | 163 this.startTlsCallback_(); |
| 162 } else { | 164 } else { |
| 163 this.onError_(remoting.Error.UNEXPECTED, | 165 this.onError_(remoting.Error.unexpected(), |
| 164 "Failed to start TLS: " + | 166 "Failed to start TLS: " + |
| 165 (new XMLSerializer().serializeToString(stanza))); | 167 (new XMLSerializer().serializeToString(stanza))); |
| 166 } | 168 } |
| 167 break; | 169 break; |
| 168 | 170 |
| 169 case remoting.XmppLoginHandler.State.WAIT_STREAM_HEADER_AFTER_TLS: | 171 case remoting.XmppLoginHandler.State.WAIT_STREAM_HEADER_AFTER_TLS: |
| 170 var mechanisms = Array.prototype.map.call( | 172 var mechanisms = Array.prototype.map.call( |
| 171 stanza.querySelectorAll('features>mechanisms>mechanism'), | 173 stanza.querySelectorAll('features>mechanisms>mechanism'), |
| 172 /** @param {Element} m */ | 174 /** @param {Element} m */ |
| 173 function(m) { return m.textContent; }); | 175 function(m) { return m.textContent; }); |
| 174 if (mechanisms.indexOf("X-OAUTH2")) { | 176 if (mechanisms.indexOf("X-OAUTH2")) { |
| 175 this.onError_(remoting.Error.UNEXPECTED, | 177 this.onError_(remoting.Error.unexpected(), |
| 176 "OAuth2 is not supported by the server."); | 178 "OAuth2 is not supported by the server."); |
| 177 return; | 179 return; |
| 178 } | 180 } |
| 179 | 181 |
| 180 this.state_ = remoting.XmppLoginHandler.State.WAIT_AUTH_RESULT; | 182 this.state_ = remoting.XmppLoginHandler.State.WAIT_AUTH_RESULT; |
| 181 | 183 |
| 182 break; | 184 break; |
| 183 | 185 |
| 184 case remoting.XmppLoginHandler.State.WAIT_AUTH_RESULT: | 186 case remoting.XmppLoginHandler.State.WAIT_AUTH_RESULT: |
| 185 if (stanza.localName == 'success') { | 187 if (stanza.localName == 'success') { |
| 186 this.state_ = | 188 this.state_ = |
| 187 remoting.XmppLoginHandler.State.WAIT_STREAM_HEADER_AFTER_AUTH; | 189 remoting.XmppLoginHandler.State.WAIT_STREAM_HEADER_AFTER_AUTH; |
| 188 this.startStream_( | 190 this.startStream_( |
| 189 '<iq type="set" id="0">' + | 191 '<iq type="set" id="0">' + |
| 190 '<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">' + | 192 '<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">' + |
| 191 '<resource>chromoting</resource>'+ | 193 '<resource>chromoting</resource>'+ |
| 192 '</bind>' + | 194 '</bind>' + |
| 193 '</iq>' + | 195 '</iq>' + |
| 194 '<iq type="set" id="1">' + | 196 '<iq type="set" id="1">' + |
| 195 '<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>' + | 197 '<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>' + |
| 196 '</iq>'); | 198 '</iq>'); |
| 197 } else { | 199 } else { |
| 198 this.onError_(remoting.Error.AUTHENTICATION_FAILED, | 200 this.onError_( |
| 199 'Failed to authenticate: ' + | 201 new remoting.Error(remoting.Error.Tag.AUTHENTICATION_FAILED), |
| 200 (new XMLSerializer().serializeToString(stanza))); | 202 'Failed to authenticate: ' + |
| 203 (new XMLSerializer().serializeToString(stanza))); |
| 201 } | 204 } |
| 202 break; | 205 break; |
| 203 | 206 |
| 204 case remoting.XmppLoginHandler.State.WAIT_STREAM_HEADER_AFTER_AUTH: | 207 case remoting.XmppLoginHandler.State.WAIT_STREAM_HEADER_AFTER_AUTH: |
| 205 if (stanza.querySelector('features>bind')) { | 208 if (stanza.querySelector('features>bind')) { |
| 206 this.state_ = remoting.XmppLoginHandler.State.WAIT_BIND_RESULT; | 209 this.state_ = remoting.XmppLoginHandler.State.WAIT_BIND_RESULT; |
| 207 } else { | 210 } else { |
| 208 this.onError_(remoting.Error.UNEXPECTED, | 211 this.onError_(remoting.Error.unexpected(), |
| 209 "Server doesn't support bind after authentication."); | 212 "Server doesn't support bind after authentication."); |
| 210 } | 213 } |
| 211 break; | 214 break; |
| 212 | 215 |
| 213 case remoting.XmppLoginHandler.State.WAIT_BIND_RESULT: | 216 case remoting.XmppLoginHandler.State.WAIT_BIND_RESULT: |
| 214 var jidElement = stanza.querySelector('iq>bind>jid'); | 217 var jidElement = stanza.querySelector('iq>bind>jid'); |
| 215 if (stanza.getAttribute('id') != '0' || | 218 if (stanza.getAttribute('id') != '0' || |
| 216 stanza.getAttribute('type') != 'result' || !jidElement) { | 219 stanza.getAttribute('type') != 'result' || !jidElement) { |
| 217 this.onError_(remoting.Error.UNEXPECTED, | 220 this.onError_(remoting.Error.unexpected(), |
| 218 'Received unexpected response to bind: ' + | 221 'Received unexpected response to bind: ' + |
| 219 (new XMLSerializer().serializeToString(stanza))); | 222 (new XMLSerializer().serializeToString(stanza))); |
| 220 return; | 223 return; |
| 221 } | 224 } |
| 222 this.jid_ = jidElement.textContent; | 225 this.jid_ = jidElement.textContent; |
| 223 this.state_ = remoting.XmppLoginHandler.State.WAIT_SESSION_IQ_RESULT; | 226 this.state_ = remoting.XmppLoginHandler.State.WAIT_SESSION_IQ_RESULT; |
| 224 break; | 227 break; |
| 225 | 228 |
| 226 case remoting.XmppLoginHandler.State.WAIT_SESSION_IQ_RESULT: | 229 case remoting.XmppLoginHandler.State.WAIT_SESSION_IQ_RESULT: |
| 227 if (stanza.getAttribute('id') != '1' || | 230 if (stanza.getAttribute('id') != '1' || |
| 228 stanza.getAttribute('type') != 'result') { | 231 stanza.getAttribute('type') != 'result') { |
| 229 this.onError_(remoting.Error.UNEXPECTED, | 232 this.onError_(remoting.Error.unexpected(), |
| 230 'Failed to start session: ' + | 233 'Failed to start session: ' + |
| 231 (new XMLSerializer().serializeToString(stanza))); | 234 (new XMLSerializer().serializeToString(stanza))); |
| 232 return; | 235 return; |
| 233 } | 236 } |
| 234 this.state_ = remoting.XmppLoginHandler.State.DONE; | 237 this.state_ = remoting.XmppLoginHandler.State.DONE; |
| 235 this.onHandshakeDoneCallback_(this.jid_, this.streamParser_); | 238 this.onHandshakeDoneCallback_(this.jid_, this.streamParser_); |
| 236 break; | 239 break; |
| 237 | 240 |
| 238 default: | 241 default: |
| 239 base.debug.assert(false); | 242 base.debug.assert(false); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 256 'xmlns:auth="http://www.google.com/talk/protocol/auth">' + | 259 'xmlns:auth="http://www.google.com/talk/protocol/auth">' + |
| 257 cookie + | 260 cookie + |
| 258 '</auth>'); | 261 '</auth>'); |
| 259 }; | 262 }; |
| 260 | 263 |
| 261 /** | 264 /** |
| 262 * @param {string} text | 265 * @param {string} text |
| 263 * @private | 266 * @private |
| 264 */ | 267 */ |
| 265 remoting.XmppLoginHandler.prototype.onParserError_ = function(text) { | 268 remoting.XmppLoginHandler.prototype.onParserError_ = function(text) { |
| 266 this.onError_(remoting.Error.UNEXPECTED, text); | 269 this.onError_(remoting.Error.unexpected(), text); |
| 267 } | 270 } |
| 268 | 271 |
| 269 /** | 272 /** |
| 270 * @param {string} firstMessage Message to send after stream header. | 273 * @param {string} firstMessage Message to send after stream header. |
| 271 * @private | 274 * @private |
| 272 */ | 275 */ |
| 273 remoting.XmppLoginHandler.prototype.startStream_ = function(firstMessage) { | 276 remoting.XmppLoginHandler.prototype.startStream_ = function(firstMessage) { |
| 274 this.sendMessageCallback_('<stream:stream to="' + this.server_ + | 277 this.sendMessageCallback_('<stream:stream to="' + this.server_ + |
| 275 '" version="1.0" xmlns="jabber:client" ' + | 278 '" version="1.0" xmlns="jabber:client" ' + |
| 276 'xmlns:stream="http://etherx.jabber.org/streams">' + | 279 'xmlns:stream="http://etherx.jabber.org/streams">' + |
| 277 firstMessage); | 280 firstMessage); |
| 278 this.streamParser_ = new remoting.XmppStreamParser(); | 281 this.streamParser_ = new remoting.XmppStreamParser(); |
| 279 this.streamParser_.setCallbacks(this.onStanza_.bind(this), | 282 this.streamParser_.setCallbacks(this.onStanza_.bind(this), |
| 280 this.onParserError_.bind(this)); | 283 this.onParserError_.bind(this)); |
| 281 } | 284 } |
| 282 | 285 |
| 283 /** | 286 /** |
| 284 * @param {!remoting.Error} error | 287 * @param {!remoting.Error} error |
| 285 * @param {string} text | 288 * @param {string} text |
| 286 * @private | 289 * @private |
| 287 */ | 290 */ |
| 288 remoting.XmppLoginHandler.prototype.onError_ = function(error, text) { | 291 remoting.XmppLoginHandler.prototype.onError_ = function(error, text) { |
| 289 if (this.state_ != remoting.XmppLoginHandler.State.ERROR) { | 292 if (this.state_ != remoting.XmppLoginHandler.State.ERROR) { |
| 290 this.onErrorCallback_(error, text); | 293 this.onErrorCallback_(error, text); |
| 291 this.state_ = remoting.XmppLoginHandler.State.ERROR; | 294 this.state_ = remoting.XmppLoginHandler.State.ERROR; |
| 292 } else { | 295 } else { |
| 293 console.error(text); | 296 console.error(text); |
| 294 } | 297 } |
| 295 } | 298 } |
| OLD | NEW |