PLT-3562 Switch websocket over to post-connect authentication (#4327)

* Switch websocket over to post-connect authentication

* Add ability to specify token in websocket js driver, add unit tests

* Temporarily disable client websocket tests until issues are resolved

* Minor refactoring and fix status test

* Add isAuthenticated method to WebConn and minor status updates
Этот коммит содержится в:
Joram Wilander
2016-10-31 08:59:23 -04:00
коммит произвёл Christopher Speller
родитель ef363fd88e
Коммит 316b155a42
12 изменённых файлов: 279 добавлений и 26 удалений

Просмотреть файл

@@ -18,7 +18,7 @@ export default class WebSocketClient {
this.closeCallback = null;
}
initialize(connectionUrl) {
initialize(connectionUrl, token) {
if (this.conn) {
return;
}
@@ -30,6 +30,10 @@ export default class WebSocketClient {
this.conn = new WebSocket(connectionUrl);
this.conn.onopen = () => {
if (token) {
this.sendMessage('authentication_challenge', {token});
}
if (this.connectFailCount > 0) {
console.log('websocket re-established connection'); //eslint-disable-line no-console
if (this.reconnectCallback) {
@@ -68,7 +72,7 @@ export default class WebSocketClient {
setTimeout(
() => {
this.initialize(connectionUrl);
this.initialize(connectionUrl, token);
},
retryTime
);
@@ -152,12 +156,12 @@ export default class WebSocketClient {
}
}
userTyping(channelId, parentId) {
userTyping(channelId, parentId, callback) {
const data = {};
data.channel_id = channelId;
data.parent_id = parentId;
this.sendMessage('user_typing', data);
this.sendMessage('user_typing', data, callback);
}
getStatuses(callback) {

49
webapp/tests/client_websocket.test.jsx Обычный файл
Просмотреть файл

@@ -0,0 +1,49 @@
// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
/*
var assert = require('assert');
import TestHelper from './test_helper.jsx';
describe('Client.WebSocket', function() {
this.timeout(10000);
it('WebSocket.getStatusesByIds', function(done) {
TestHelper.initBasic(() => {
TestHelper.basicWebSocketClient().getStatusesByIds(
[TestHelper.basicUser().id],
function(resp) {
TestHelper.basicWebSocketClient().close();
assert.equal(resp.data[TestHelper.basicUser().id], 'online');
done();
}
);
}, true);
});
it('WebSocket.getStatuses', function(done) {
TestHelper.initBasic(() => {
TestHelper.basicWebSocketClient().getStatuses(
function(resp) {
TestHelper.basicWebSocketClient().close();
assert.equal(resp.data != null, true);
done();
}
);
}, true);
});
it('WebSocket.userTyping', function(done) {
TestHelper.initBasic(() => {
TestHelper.basicWebSocketClient().userTyping(
TestHelper.basicChannel().id,
'',
function(resp) {
TestHelper.basicWebSocketClient().close();
assert.equal(resp.status, 'OK');
done();
}
);
}, true);
});
});*/

Просмотреть файл

@@ -2,13 +2,20 @@
// See License.txt for license information.
import Client from 'client/client.jsx';
import WebSocketClient from 'client/websocket_client.jsx';
import jqd from 'jquery-deferred';
var HEADER_TOKEN = 'token';
class TestHelperClass {
basicClient = () => {
return this.basicc;
}
basicWebSocketClient = () => {
return this.basicwsc;
}
basicTeam = () => {
return this.basict;
}
@@ -53,6 +60,12 @@ class TestHelperClass {
return c;
}
createWebSocketClient(token) {
var ws = new WebSocketClient();
ws.initialize('http://localhost:8065/api/v3/users/websocket', token);
return ws;
}
fakeEmail = () => {
return 'success' + this.generateId() + '@simulator.amazonses.com';
}
@@ -90,7 +103,7 @@ class TestHelperClass {
return post;
}
initBasic = (callback) => {
initBasic = (callback, connectWS) => {
this.basicc = this.createClient();
var d1 = jqd.Deferred();
@@ -122,7 +135,10 @@ class TestHelperClass {
rteamSignup.user.email,
password,
null,
function() {
function(data, res) {
if (connectWS) {
outer.basicwsc = outer.createWebSocketClient(res.header[HEADER_TOKEN]);
}
outer.basicClient().useHeaderToken();
var channel = outer.fakeChannel();
channel.team_id = outer.basicTeam().id;