| 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 (function() { | 5 (function() { |
| 6 | 6 |
| 7 'use strict'; | 7 'use strict'; |
| 8 | 8 |
| 9 var testUsername = 'testUsername@gmail.com'; | 9 var testUsername = 'testUsername@gmail.com'; |
| 10 var testToken = 'testToken'; | 10 var testToken = 'testToken'; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 onHandshakeDone, onError); | 31 onHandshakeDone, onError); |
| 32 } | 32 } |
| 33 }); | 33 }); |
| 34 | 34 |
| 35 // Executes handshake base. | 35 // Executes handshake base. |
| 36 function handshakeBase() { | 36 function handshakeBase() { |
| 37 loginHandler.start(); | 37 loginHandler.start(); |
| 38 sinon.assert.calledWith( | 38 sinon.assert.calledWith( |
| 39 sendMessage, | 39 sendMessage, |
| 40 '<stream:stream to="google.com" version="1.0" xmlns="jabber:client" ' + | 40 '<stream:stream to="google.com" version="1.0" xmlns="jabber:client" ' + |
| 41 'xmlns:stream="http://etherx.jabber.org/streams">'); | 41 'xmlns:stream="http://etherx.jabber.org/streams">' + |
| 42 '<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>'); |
| 42 sendMessage.reset(); | 43 sendMessage.reset(); |
| 43 | 44 |
| 44 loginHandler.onDataReceived(base.encodeUtf8( | 45 loginHandler.onDataReceived(base.encodeUtf8( |
| 45 '<stream:stream from="google.com" id="78A87C70559EF28A" version="1.0" ' + | 46 '<stream:stream from="google.com" id="78A87C70559EF28A" version="1.0" ' + |
| 46 'xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">' + | 47 'xmlns:stream="http://etherx.jabber.org/streams"' + |
| 47 '<stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls">' + | 48 'xmlns="jabber:client">' + |
| 48 '<required/></starttls><mechanisms ' + | 49 '<stream:features>' + |
| 49 'xmlns="urn:ietf:params:xml:ns:xmpp-sasl">' + | 50 '<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls">' + |
| 50 '<mechanism>X-OAUTH2</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism>' + | 51 '<required/>' + |
| 51 '</mechanisms></stream:features>')); | 52 '</starttls>' + |
| 52 sinon.assert.calledWith( | 53 '<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">' + |
| 53 sendMessage, '<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>'); | 54 '<mechanism>X-OAUTH2</mechanism>' + |
| 54 sendMessage.reset(); | 55 '<mechanism>X-GOOGLE-TOKEN</mechanism>' + |
| 56 '</mechanisms>' + |
| 57 '</stream:features>')); |
| 55 | 58 |
| 56 loginHandler.onDataReceived( | 59 loginHandler.onDataReceived( |
| 57 base.encodeUtf8('<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>')); | 60 base.encodeUtf8('<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>')); |
| 58 sinon.assert.calledWith(startTls); | 61 sinon.assert.calledWith(startTls); |
| 59 startTls.reset(); | 62 startTls.reset(); |
| 60 | 63 |
| 61 loginHandler.onTlsStarted(); | 64 loginHandler.onTlsStarted(); |
| 65 var cookie = window.btoa("\0" + testUsername + "\0" + testToken); |
| 62 sinon.assert.calledWith( | 66 sinon.assert.calledWith( |
| 63 sendMessage, | 67 sendMessage, |
| 64 '<stream:stream to="google.com" version="1.0" xmlns="jabber:client" ' + | 68 '<stream:stream to="google.com" version="1.0" xmlns="jabber:client" ' + |
| 65 'xmlns:stream="http://etherx.jabber.org/streams">'); | 69 'xmlns:stream="http://etherx.jabber.org/streams">' + |
| 66 sendMessage.reset(); | |
| 67 | |
| 68 loginHandler.onDataReceived(base.encodeUtf8( | |
| 69 '<stream:stream from="google.com" id="DCDDE5171CB2154A" version="1.0" ' + | |
| 70 'xmlns:stream="http://etherx.jabber.org/streams" ' + | |
| 71 'xmlns="jabber:client"><stream:features>' + | |
| 72 '<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">' + | |
| 73 '<mechanism>X-OAUTH2</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism>' + | |
| 74 '<mechanism>PLAIN</mechanism></mechanisms></stream:features>')); | |
| 75 var cookie = window.btoa("\0" + testUsername + "\0" + testToken); | |
| 76 sinon.assert.calledWith( | |
| 77 sendMessage, | |
| 78 '<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="X-OAUTH2" ' + | 70 '<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="X-OAUTH2" ' + |
| 79 'auth:service="oauth2" auth:allow-generated-jid="true" ' + | 71 'auth:service="oauth2" auth:allow-generated-jid="true" ' + |
| 80 'auth:client-uses-full-bind-result="true" ' + | 72 'auth:client-uses-full-bind-result="true" ' + |
| 81 'auth:allow-non-google-login="true" ' + | 73 'auth:allow-non-google-login="true" ' + |
| 82 'xmlns:auth="http://www.google.com/talk/protocol/auth">' + cookie + | 74 'xmlns:auth="http://www.google.com/talk/protocol/auth">' + cookie + |
| 83 '</auth>'); | 75 '</auth>'); |
| 84 sendMessage.reset(); | 76 sendMessage.reset(); |
| 77 |
| 78 loginHandler.onDataReceived(base.encodeUtf8( |
| 79 '<stream:stream from="google.com" id="DCDDE5171CB2154A" version="1.0" ' + |
| 80 'xmlns:stream="http://etherx.jabber.org/streams" ' + |
| 81 'xmlns="jabber:client">' + |
| 82 '<stream:features>' + |
| 83 '<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">' + |
| 84 '<mechanism>X-OAUTH2</mechanism>' + |
| 85 '<mechanism>X-GOOGLE-TOKEN</mechanism>' + |
| 86 '<mechanism>PLAIN</mechanism>' + |
| 87 '</mechanisms>' + |
| 88 '</stream:features>')); |
| 85 } | 89 } |
| 86 | 90 |
| 87 test('should authenticate', function() { | 91 test('should authenticate', function() { |
| 88 handshakeBase(); | 92 handshakeBase(); |
| 89 | 93 |
| 90 loginHandler.onDataReceived( | 94 loginHandler.onDataReceived( |
| 91 base.encodeUtf8('<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>')); | 95 base.encodeUtf8('<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>')); |
| 92 sinon.assert.calledWith( | 96 sinon.assert.calledWith( |
| 93 sendMessage, | 97 sendMessage, |
| 94 '<stream:stream to="google.com" version="1.0" xmlns="jabber:client" ' + | 98 '<stream:stream to="google.com" version="1.0" xmlns="jabber:client" ' + |
| 95 'xmlns:stream="http://etherx.jabber.org/streams">'); | 99 'xmlns:stream="http://etherx.jabber.org/streams">' + |
| 100 '<iq type="set" id="0">' + |
| 101 '<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">' + |
| 102 '<resource>chromoting</resource>' + |
| 103 '</bind>' + |
| 104 '</iq>' + |
| 105 '<iq type="set" id="1">' + |
| 106 '<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>' + |
| 107 '</iq>'); |
| 96 sendMessage.reset(); | 108 sendMessage.reset(); |
| 97 | 109 |
| 98 loginHandler.onDataReceived(base.encodeUtf8( | 110 loginHandler.onDataReceived(base.encodeUtf8( |
| 99 '<stream:stream from="google.com" id="104FA10576E2AA80" version="1.0" ' + | 111 '<stream:stream from="google.com" id="104FA10576E2AA80" version="1.0" ' + |
| 100 'xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">' + | 112 'xmlns:stream="http://etherx.jabber.org/streams" ' + |
| 101 '<stream:features><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>' + | 113 'xmlns="jabber:client">' + |
| 102 '<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>' + | 114 '<stream:features>' + |
| 103 '</stream:features>')); | 115 '<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>' + |
| 104 sinon.assert.calledWith( | 116 '<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/>' + |
| 105 sendMessage, | 117 '</stream:features>' + |
| 106 '<iq type="set" id="0"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">' + | 118 '<iq id="0" type="result">' + |
| 107 '<resource>chromoting</resource></bind></iq>'); | 119 '<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">' + |
| 108 sendMessage.reset(); | 120 '<jid>' + testUsername + '/chromoting52B4920E</jid>' + |
| 121 '</bind>' + |
| 122 '</iq>' + |
| 123 '<iq type="result" id="1"/>')); |
| 109 | 124 |
| 110 loginHandler.onDataReceived( | |
| 111 base.encodeUtf8('<iq id="0" type="result">' + | |
| 112 '<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>' + | |
| 113 testUsername + '/chromoting52B4920E</jid></bind></iq>')); | |
| 114 sinon.assert.calledWith( | |
| 115 sendMessage, | |
| 116 '<iq type="set" id="1"><session ' + | |
| 117 'xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>'); | |
| 118 sendMessage.reset(); | |
| 119 | |
| 120 loginHandler.onDataReceived(base.encodeUtf8('<iq type="result" id="1"/>')); | |
| 121 sinon.assert.calledWith(onHandshakeDone); | 125 sinon.assert.calledWith(onHandshakeDone); |
| 122 }); | 126 }); |
| 123 | 127 |
| 124 test('should return AUTHENTICATION_FAILED error when failed to authenticate', | 128 test('should return AUTHENTICATION_FAILED error when failed to authenticate', |
| 125 function() { | 129 function() { |
| 126 handshakeBase(); | 130 handshakeBase(); |
| 127 | 131 |
| 128 loginHandler.onDataReceived( | 132 loginHandler.onDataReceived( |
| 129 base.encodeUtf8('<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl">' + | 133 base.encodeUtf8('<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl">' + |
| 130 '<not-authorized/></failure>')); | 134 '<not-authorized/></failure>')); |
| 131 sinon.assert.calledWith(onError, remoting.Error.AUTHENTICATION_FAILED); | 135 sinon.assert.calledWith(onError, remoting.Error.AUTHENTICATION_FAILED); |
| 132 }); | 136 }); |
| 133 | 137 |
| 134 test('should return UNEXPECTED error when failed to parse stream', | 138 test('should return UNEXPECTED error when failed to parse stream', |
| 135 function() { | 139 function() { |
| 136 loginHandler.start(); | 140 loginHandler.start(); |
| 137 loginHandler.onDataReceived( | 141 loginHandler.onDataReceived( |
| 138 base.encodeUtf8('BAD DATA')); | 142 base.encodeUtf8('BAD DATA')); |
| 139 sinon.assert.calledWith(onError, remoting.Error.UNEXPECTED); | 143 sinon.assert.calledWith(onError, remoting.Error.UNEXPECTED); |
| 140 }); | 144 }); |
| 141 | 145 |
| 142 })(); | 146 })(); |
| OLD | NEW |