Fix bug, Support thirdparty streaming access
This commit is contained in:
@ -2,6 +2,7 @@ import * as http from 'http';
|
||||
import * as websocket from 'websocket';
|
||||
import * as redis from 'redis';
|
||||
import User from './models/user';
|
||||
import Userkey from './models/userkey';
|
||||
|
||||
import homeStream from './stream/home';
|
||||
import messagingStream from './stream/messaging';
|
||||
@ -17,7 +18,13 @@ module.exports = (server: http.Server) => {
|
||||
ws.on('request', async (request) => {
|
||||
const connection = request.accept();
|
||||
|
||||
const user = await authenticate(connection);
|
||||
const user = await authenticate(connection, request.resourceURL.query.i);
|
||||
|
||||
if (user == null) {
|
||||
connection.send('authentication-failed');
|
||||
connection.close();
|
||||
return;
|
||||
}
|
||||
|
||||
// Connect to Redis
|
||||
const subscriber = redis.createClient(
|
||||
@ -41,29 +48,36 @@ module.exports = (server: http.Server) => {
|
||||
});
|
||||
};
|
||||
|
||||
function authenticate(connection: websocket.connection): Promise<any> {
|
||||
return new Promise((resolve, reject) => {
|
||||
// Listen first message
|
||||
connection.once('message', async (data) => {
|
||||
const msg = JSON.parse(data.utf8Data);
|
||||
|
||||
function authenticate(connection: websocket.connection, token: string): Promise<any> {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
if (token[0] == '!') {
|
||||
// Fetch user
|
||||
// SELECT _id
|
||||
const user = await User
|
||||
.findOne({
|
||||
token: msg.i
|
||||
token: token
|
||||
}, {
|
||||
_id: true
|
||||
});
|
||||
|
||||
if (user === null) {
|
||||
connection.close();
|
||||
return;
|
||||
resolve(user);
|
||||
} else {
|
||||
const userkey = await Userkey.findOne({
|
||||
key: token
|
||||
});
|
||||
|
||||
if (userkey == null) {
|
||||
return reject('invalid userkey');
|
||||
}
|
||||
|
||||
connection.send('authenticated');
|
||||
// Fetch user
|
||||
// SELECT _id
|
||||
const user = await User
|
||||
.findOne({ _id: userkey.user_id }, {
|
||||
_id: true
|
||||
});
|
||||
|
||||
resolve(user);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
Reference in New Issue
Block a user