bigbluebutton-Github/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js

136 lines
4.1 KiB
JavaScript
Raw Normal View History

import { check } from 'meteor/check';
import Logger from '/imports/startup/server/logger';
import Users from '/imports/api/users';
import userJoin from './userJoin';
import pendingAuthenticationsStore from '../store/pendingAuthentications';
import createDummyUser from '../modifiers/createDummyUser';
import ClientConnections from '/imports/startup/server/ClientConnections';
2017-10-12 09:02:23 +08:00
import upsertValidationState from '/imports/api/auth-token-validation/server/modifiers/upsertValidationState';
import { ValidationStates } from '/imports/api/auth-token-validation';
const clearOtherSessions = (sessionUserId, current = false) => {
const serverSessions = Meteor.server.sessions;
Object.keys(serverSessions)
.filter(i => serverSessions[i].userId === sessionUserId)
.filter(i => i !== current)
.forEach(i => serverSessions[i].close());
};
2017-10-12 09:02:23 +08:00
export default function handleValidateAuthToken({ body }, meetingId) {
const {
userId,
valid,
authToken,
waitForApproval,
registeredOn,
authTokenValidatedOn,
reasonCode,
} = body;
check(userId, String);
check(authToken, String);
2017-10-12 09:02:23 +08:00
check(valid, Boolean);
check(waitForApproval, Boolean);
check(registeredOn, Number);
check(authTokenValidatedOn, Number);
check(reasonCode, String);
const pendingAuths = pendingAuthenticationsStore.take(meetingId, userId, authToken);
Logger.info(`PendingAuths length [${pendingAuths.length}]`);
if (pendingAuths.length === 0) return;
if (!valid) {
pendingAuths.forEach(
(pendingAuth) => {
try {
const { methodInvocationObject } = pendingAuth;
const connectionId = methodInvocationObject.connection.id;
upsertValidationState(meetingId, userId, ValidationStates.INVALID, connectionId, reasonCode);
// Schedule socket disconnection for this user, giving some time for client receiving the reason of disconnection
Meteor.setTimeout(() => {
methodInvocationObject.connection.close();
}, 2000);
Logger.info(`Closed connection ${connectionId} due to invalid auth token.`);
} catch (e) {
Logger.error(`Error closing socket for meetingId '${meetingId}', userId '${userId}', authToken ${authToken}`);
}
},
);
return;
}
// Define user ID on connections
pendingAuths.forEach(
(pendingAuth) => {
const { methodInvocationObject } = pendingAuth;
/* Logic migrated from validateAuthToken method ( postponed to only run in case of success response ) - Begin */
const sessionId = `${meetingId}--${userId}`;
2020-09-30 05:02:03 +08:00
methodInvocationObject.setUserId(sessionId);
const User = Users.findOne({
meetingId,
userId,
});
if (!User) {
createDummyUser(meetingId, userId, authToken);
}
ClientConnections.add(sessionId, methodInvocationObject.connection);
upsertValidationState(meetingId, userId, ValidationStates.VALIDATED, methodInvocationObject.connection.id);
/* End of logic migrated from validateAuthToken */
},
);
const selector = {
meetingId,
userId,
clientType: 'HTML5',
};
const User = Users.findOne(selector);
2017-03-11 02:33:46 +08:00
// If we dont find the user on our collection is a flash user and we can skip
if (!User) return;
2017-10-12 09:02:23 +08:00
// Publish user join message
if (!waitForApproval) {
2019-02-14 03:44:21 +08:00
Logger.info('User=', User);
2017-10-12 09:02:23 +08:00
userJoin(meetingId, userId, User.authToken);
}
const modifier = {
$set: {
2017-10-12 09:02:23 +08:00
validated: valid,
approved: !waitForApproval,
loginTime: registeredOn,
authTokenValidatedTime: authTokenValidatedOn,
2019-02-27 01:40:01 +08:00
inactivityCheck: false,
},
};
try {
const numberAffected = Users.update(selector, modifier);
if (numberAffected) {
const sessionUserId = `${meetingId}-${userId}`;
const currentConnectionId = User.connectionId ? User.connectionId : false;
clearOtherSessions(sessionUserId, currentConnectionId);
Logger.info(`Validated auth token as ${valid} user=${userId} meeting=${meetingId}`);
} else {
Logger.info('No auth to validate');
}
} catch (err) {
Logger.error(`Validating auth token: ${err}`);
}
}