From 519872cf97dd574106c5a0a24822776429c96280 Mon Sep 17 00:00:00 2001
From: Joao Siebel <joaos_desenv@imdt.com.br>
Date: Wed, 5 May 2021 13:47:43 -0300
Subject: [PATCH] Add try/catch on users methods

---
 .../users/server/methods/assignPresenter.js   | 59 +++++++-------
 .../api/users/server/methods/changeRole.js    | 38 +++++----
 .../api/users/server/methods/removeUser.js    | 32 +++++---
 .../users/server/methods/setEmojiStatus.js    | 35 ++++----
 .../api/users/server/methods/setMobileUser.js | 14 ++--
 .../api/users/server/methods/setRandomUser.js | 25 +++---
 .../methods/setUserEffectiveConnectionType.js | 34 ++++----
 .../users/server/methods/toggleUserLock.js    | 39 ++++-----
 .../users/server/methods/userActivitySign.js  | 44 +++++-----
 .../api/users/server/methods/userLeaving.js   | 80 ++++++++++---------
 .../users/server/methods/userLeftMeeting.js   | 20 ++---
 .../users/server/methods/validateAuthToken.js | 32 ++++----
 12 files changed, 249 insertions(+), 203 deletions(-)

diff --git a/bigbluebutton-html5/imports/api/users/server/methods/assignPresenter.js b/bigbluebutton-html5/imports/api/users/server/methods/assignPresenter.js
index 6cf198ec48..f17e93c1f6 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/assignPresenter.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/assignPresenter.js
@@ -6,33 +6,36 @@ import Users from '/imports/api/users';
 import { extractCredentials } from '/imports/api/common/server/helpers';
 
 export default function assignPresenter(userId) { // TODO-- send username from client side
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'AssignPresenterReqMsg';
-
-  const { meetingId, requesterUserId } = extractCredentials(this.userId);
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(userId, String);
-
-  const User = Users.findOne({
-    meetingId,
-    userId,
-  });
-
-  if (!User) {
-    throw new Meteor.Error('user-not-found', 'You need a valid user to be able to set presenter');
+  try {
+    const REDIS_CONFIG = Meteor.settings.private.redis;
+    const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+    const EVENT_NAME = 'AssignPresenterReqMsg';
+    const { meetingId, requesterUserId } = extractCredentials(this.userId);
+
+    check(meetingId, String);
+    check(requesterUserId, String);
+    check(userId, String);
+
+    const User = Users.findOne({
+      meetingId,
+      userId,
+    });
+
+    if (!User) {
+      throw new Meteor.Error('user-not-found', 'You need a valid user to be able to set presenter');
+    }
+
+    const payload = {
+      newPresenterId: userId,
+      newPresenterName: User.name,
+      assignedBy: requesterUserId,
+      requesterId: requesterUserId,
+    };
+
+    Logger.verbose('User set as presenter', { userId, meetingId, setBy: requesterUserId });
+
+    RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+  } catch (err) {
+    Logger.error(`Exception while invoking method assignPresenter ${err.stack}`);
   }
-
-  const payload = {
-    newPresenterId: userId,
-    newPresenterName: User.name,
-    assignedBy: requesterUserId,
-    requesterId: requesterUserId,
-  };
-
-  Logger.verbose('User set as presenter', { userId, meetingId, setBy: requesterUserId });
-
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/changeRole.js b/bigbluebutton-html5/imports/api/users/server/methods/changeRole.js
index 78705e80d7..65cd2fbc5c 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/changeRole.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/changeRole.js
@@ -5,26 +5,30 @@ import Logger from '/imports/startup/server/logger';
 import { extractCredentials } from '/imports/api/common/server/helpers';
 
 export default function changeRole(userId, role) {
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'ChangeUserRoleCmdMsg';
+  try {
+    const REDIS_CONFIG = Meteor.settings.private.redis;
+    const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+    const EVENT_NAME = 'ChangeUserRoleCmdMsg';
 
-  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+    const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(userId, String);
-  check(role, String);
+    check(meetingId, String);
+    check(requesterUserId, String);
+    check(userId, String);
+    check(role, String);
 
-  const payload = {
-    userId,
-    role,
-    changedBy: requesterUserId,
-  };
+    const payload = {
+      userId,
+      role,
+      changedBy: requesterUserId,
+    };
 
-  Logger.verbose('Changed user role', {
-    userId, role, changedBy: requesterUserId, meetingId,
-  });
+    Logger.verbose('Changed user role', {
+      userId, role, changedBy: requesterUserId, meetingId,
+    });
 
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+    RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+  } catch (err) {
+    Logger.error(`Exception while invoking method changeRole ${err.stack}`);
+  }
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/removeUser.js b/bigbluebutton-html5/imports/api/users/server/methods/removeUser.js
index 21e5427f5e..7a8c222b0c 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/removeUser.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/removeUser.js
@@ -2,23 +2,29 @@ import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import RedisPubSub from '/imports/startup/server/redis';
 import { extractCredentials } from '/imports/api/common/server/helpers';
+import Logger from '/imports/startup/server/logger';
 
 export default function removeUser(userId, banUser) {
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'EjectUserFromMeetingCmdMsg';
+  try {
+    const REDIS_CONFIG = Meteor.settings.private.redis;
+    const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+    const EVENT_NAME = 'EjectUserFromMeetingCmdMsg';
 
-  const { meetingId, requesterUserId: ejectedBy } = extractCredentials(this.userId);
+    const { meetingId, requesterUserId: ejectedBy } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(ejectedBy, String);
-  check(userId, String);
+    check(meetingId, String);
+    check(ejectedBy, String);
+    check(userId, String);
+    check(banUser, Boolean);
 
-  const payload = {
-    userId,
-    ejectedBy,
-    banUser,
-  };
+    const payload = {
+      userId,
+      ejectedBy,
+      banUser,
+    };
 
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, ejectedBy, payload);
+    RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, ejectedBy, payload);
+  } catch (err) {
+    Logger.error(`Exception while invoking method removeUser ${err.stack}`);
+  }
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/setEmojiStatus.js b/bigbluebutton-html5/imports/api/users/server/methods/setEmojiStatus.js
index d96cd78d96..dd799886ce 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/setEmojiStatus.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/setEmojiStatus.js
@@ -5,24 +5,29 @@ import Logger from '/imports/startup/server/logger';
 import { extractCredentials } from '/imports/api/common/server/helpers';
 
 export default function setEmojiStatus(userId, status) {
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'ChangeUserEmojiCmdMsg';
+  try {
+    const REDIS_CONFIG = Meteor.settings.private.redis;
+    const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+    const EVENT_NAME = 'ChangeUserEmojiCmdMsg';
 
-  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+    const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(userId, String);
+    check(meetingId, String);
+    check(requesterUserId, String);
+    check(userId, String);
+    check(status, String);
 
-  const payload = {
-    emoji: status,
-    userId,
-  };
+    const payload = {
+      emoji: status,
+      userId,
+    };
 
-  Logger.verbose('User emoji status updated', {
-    userId, status, requesterUserId, meetingId,
-  });
+    Logger.verbose('User emoji status updated', {
+      userId, status, requesterUserId, meetingId,
+    });
 
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+    RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+  } catch (err) {
+    Logger.error(`Exception while invoking method setEmojiStatus ${err.stack}`);
+  }
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/setMobileUser.js b/bigbluebutton-html5/imports/api/users/server/methods/setMobileUser.js
index 7bd73e7b50..fa6dd68dc1 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/setMobileUser.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/setMobileUser.js
@@ -4,12 +4,16 @@ import setMobile from '../modifiers/setMobile';
 import { extractCredentials } from '/imports/api/common/server/helpers';
 
 export default function setMobileUser() {
-  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+  try {
+    const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
+    check(meetingId, String);
+    check(requesterUserId, String);
 
-  Logger.verbose(`Mobile user ${requesterUserId} from meeting ${meetingId}`);
+    Logger.verbose(`Mobile user ${requesterUserId} from meeting ${meetingId}`);
 
-  setMobile(meetingId, requesterUserId);
+    setMobile(meetingId, requesterUserId);
+  } catch (err) {
+    Logger.error(`Exception while invoking method setMobileUser ${err.stack}`);
+  }
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/setRandomUser.js b/bigbluebutton-html5/imports/api/users/server/methods/setRandomUser.js
index 34ed860118..aa751daa0d 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/setRandomUser.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/setRandomUser.js
@@ -2,20 +2,25 @@ import { Meteor } from 'meteor/meteor';
 import RedisPubSub from '/imports/startup/server/redis';
 import { extractCredentials } from '/imports/api/common/server/helpers';
 import { check } from 'meteor/check';
+import Logger from '/imports/startup/server/logger';
 
 export default function setRandomUser() {
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'SelectRandomViewerReqMsg';
+  try {
+    const REDIS_CONFIG = Meteor.settings.private.redis;
+    const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+    const EVENT_NAME = 'SelectRandomViewerReqMsg';
 
-  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+    const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
+    check(meetingId, String);
+    check(requesterUserId, String);
 
-  const payload = {
-    requestedBy: requesterUserId,
-  };
+    const payload = {
+      requestedBy: requesterUserId,
+    };
 
-  RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+    RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+  } catch (err) {
+    Logger.error(`Exception while invoking method setRandomUser ${err.stack}`);
+  }
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/setUserEffectiveConnectionType.js b/bigbluebutton-html5/imports/api/users/server/methods/setUserEffectiveConnectionType.js
index f2bfaa949e..c6e9218f16 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/setUserEffectiveConnectionType.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/setUserEffectiveConnectionType.js
@@ -6,24 +6,28 @@ import { extractCredentials } from '/imports/api/common/server/helpers';
 import setEffectiveConnectionType from '../modifiers/setUserEffectiveConnectionType';
 
 export default function setUserEffectiveConnectionType(effectiveConnectionType) {
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'ChangeUserEffectiveConnectionMsg';
-  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+  try {
+    const REDIS_CONFIG = Meteor.settings.private.redis;
+    const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+    const EVENT_NAME = 'ChangeUserEffectiveConnectionMsg';
+    const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(effectiveConnectionType, String);
+    check(meetingId, String);
+    check(requesterUserId, String);
+    check(effectiveConnectionType, String);
 
-  const payload = {
-    meetingId,
-    userId: requesterUserId,
-    effectiveConnectionType,
-  };
+    const payload = {
+      meetingId,
+      userId: requesterUserId,
+      effectiveConnectionType,
+    };
 
-  setEffectiveConnectionType(meetingId, requesterUserId, effectiveConnectionType);
+    setEffectiveConnectionType(meetingId, requesterUserId, effectiveConnectionType);
 
-  Logger.verbose('Updated user effective connection', { requesterUserId, effectiveConnectionType });
+    Logger.verbose('Updated user effective connection', { requesterUserId, effectiveConnectionType });
 
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+    RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+  } catch (err) {
+    Logger.error(`Exception while invoking method setUserEffectiveConnectionType ${err.stack}`);
+  }
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/toggleUserLock.js b/bigbluebutton-html5/imports/api/users/server/methods/toggleUserLock.js
index 5e34f4dc61..ccb9efc233 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/toggleUserLock.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/toggleUserLock.js
@@ -5,27 +5,30 @@ import Logger from '/imports/startup/server/logger';
 import { extractCredentials } from '/imports/api/common/server/helpers';
 
 export default function toggleUserLock(userId, lock) {
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'LockUserInMeetingCmdMsg';
+  try {
+    const REDIS_CONFIG = Meteor.settings.private.redis;
+    const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+    const EVENT_NAME = 'LockUserInMeetingCmdMsg';
 
-  const { meetingId, requesterUserId: lockedBy } = extractCredentials(this.userId);
+    const { meetingId, requesterUserId: lockedBy } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(lockedBy, String);
-  check(userId, String);
-  check(lock, Boolean);
+    check(meetingId, String);
+    check(lockedBy, String);
+    check(userId, String);
+    check(lock, Boolean);
 
-  const payload = {
-    lockedBy,
-    userId,
-    lock,
-  };
+    const payload = {
+      lockedBy,
+      userId,
+      lock,
+    };
 
-  Logger.verbose('Updated lock status for user', {
-    meetingId, userId, lock, lockedBy,
-  });
+    Logger.verbose('Updated lock status for user', {
+      meetingId, userId, lock, lockedBy,
+    });
 
-
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, lockedBy, payload);
+    RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, lockedBy, payload);
+  } catch (err) {
+    Logger.error(`Exception while invoking method toggleUserLock ${err.stack}`);
+  }
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/userActivitySign.js b/bigbluebutton-html5/imports/api/users/server/methods/userActivitySign.js
index 7bf68cd519..6d6b6f0b91 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/userActivitySign.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/userActivitySign.js
@@ -6,31 +6,35 @@ import { extractCredentials } from '/imports/api/common/server/helpers';
 import { check } from 'meteor/check';
 
 export default function userActivitySign() {
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'UserActivitySignCmdMsg';
-  const { meetingId, requesterUserId: userId } = extractCredentials(this.userId);
+  try {
+    const REDIS_CONFIG = Meteor.settings.private.redis;
+    const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+    const EVENT_NAME = 'UserActivitySignCmdMsg';
+    const { meetingId, requesterUserId: userId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(userId, String);
+    check(meetingId, String);
+    check(userId, String);
 
-  const payload = {
-    userId,
-  };
+    const payload = {
+      userId,
+    };
 
-  const selector = {
-    userId,
-  };
+    const selector = {
+      userId,
+    };
 
-  const modifier = {
-    $set: {
-      inactivityCheck: false,
-    },
-  };
+    const modifier = {
+      $set: {
+        inactivityCheck: false,
+      },
+    };
 
-  Users.update(selector, modifier); // TODO-- we should move this to a modifier
+    Users.update(selector, modifier); // TODO-- we should move this to a modifier
 
-  Logger.info(`User ${userId} sent a activity sign for meeting ${meetingId}`);
+    Logger.info(`User ${userId} sent a activity sign for meeting ${meetingId}`);
 
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, userId, payload);
+    RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, userId, payload);
+  } catch (err) {
+    Logger.error(`Exception while invoking method userActivitySign ${err.stack}`);
+  }
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/userLeaving.js b/bigbluebutton-html5/imports/api/users/server/methods/userLeaving.js
index 5f67ed8185..92133df8fb 100755
--- a/bigbluebutton-html5/imports/api/users/server/methods/userLeaving.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/userLeaving.js
@@ -7,43 +7,47 @@ import Users from '/imports/api/users';
 import ClientConnections from '/imports/startup/server/ClientConnections';
 
 export default function userLeaving(meetingId, userId, connectionId) {
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'UserLeaveReqMsg';
-
-  check(userId, String);
-
-  const selector = {
-    meetingId,
-    userId,
-  };
-
-  const user = Users.findOne(selector);
-
-  if (!user) {
-    Logger.info(`Skipping userLeaving. Could not find ${userId} in ${meetingId}`);
-    return;
-  }
-
-  const auth = AuthTokenValidation.findOne({
-    meetingId,
-    userId,
-  }, { sort: { updatedAt: -1 } });
-
-  // If the current user connection is not the same that triggered the leave we skip
-  if (auth?.connectionId !== connectionId) {
-    Logger.info(`Skipping userLeaving. User connectionId=${user.connectionId} is different from requester connectionId=${connectionId}`);
-    return false;
+  try {
+    const REDIS_CONFIG = Meteor.settings.private.redis;
+    const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+    const EVENT_NAME = 'UserLeaveReqMsg';
+
+    check(userId, String);
+
+    const selector = {
+      meetingId,
+      userId,
+    };
+
+    const user = Users.findOne(selector);
+
+    if (!user) {
+      Logger.info(`Skipping userLeaving. Could not find ${userId} in ${meetingId}`);
+      return;
+    }
+
+    const auth = AuthTokenValidation.findOne({
+      meetingId,
+      userId,
+    }, { sort: { updatedAt: -1 } });
+
+    // If the current user connection is not the same that triggered the leave we skip
+    if (auth?.connectionId !== connectionId) {
+      Logger.info(`Skipping userLeaving. User connectionId=${user.connectionId} is different from requester connectionId=${connectionId}`);
+      return false;
+    }
+
+    const payload = {
+      userId,
+      sessionId: meetingId,
+      loggedOut: user.loggedOut,
+    };
+
+    ClientConnections.removeClientConnection(`${meetingId}--${userId}`, connectionId);
+
+    Logger.info(`User '${userId}' is leaving meeting '${meetingId}'`);
+    RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, userId, payload);
+  } catch (err) {
+    Logger.error(`Exception while invoking method userLeaving ${err.stack}`);
   }
-
-  const payload = {
-    userId,
-    sessionId: meetingId,
-    loggedOut: user.loggedOut,
-  };
-
-  ClientConnections.removeClientConnection(`${meetingId}--${userId}`, connectionId);
-
-  Logger.info(`User '${userId}' is leaving meeting '${meetingId}'`);
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, userId, payload);
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/userLeftMeeting.js b/bigbluebutton-html5/imports/api/users/server/methods/userLeftMeeting.js
index dabec39187..6d83b5c48e 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/userLeftMeeting.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/userLeftMeeting.js
@@ -5,18 +5,18 @@ import ClientConnections from '/imports/startup/server/ClientConnections';
 import { check } from 'meteor/check';
 
 export default function userLeftMeeting() { // TODO-- spread the code to method/modifier/handler
-  // so we don't update the db in a method
-  const { meetingId, requesterUserId } = extractCredentials(this.userId);
+  try {
+    // so we don't update the db in a method
+    const { meetingId, requesterUserId } = extractCredentials(this.userId);
 
-  check(meetingId, String);
-  check(requesterUserId, String);
+    check(meetingId, String);
+    check(requesterUserId, String);
 
-  const selector = {
-    meetingId,
-    userId: requesterUserId,
-  };
+    const selector = {
+      meetingId,
+      userId: requesterUserId,
+    };
 
-  try {
     const numberAffected = Users.update(selector, { $set: { loggedOut: true } });
 
     if (numberAffected) {
@@ -24,6 +24,6 @@ export default function userLeftMeeting() { // TODO-- spread the code to method/
       ClientConnections.removeClientConnection(this.userId, this.connection.id);
     }
   } catch (err) {
-    Logger.error(`Error on user left: ${err}`);
+    Logger.error(`Exception while invoking method userLeftMeeting ${err.stack}`);
   }
 }
diff --git a/bigbluebutton-html5/imports/api/users/server/methods/validateAuthToken.js b/bigbluebutton-html5/imports/api/users/server/methods/validateAuthToken.js
index 251724aef8..914382cde4 100644
--- a/bigbluebutton-html5/imports/api/users/server/methods/validateAuthToken.js
+++ b/bigbluebutton-html5/imports/api/users/server/methods/validateAuthToken.js
@@ -6,24 +6,28 @@ import { ValidationStates } from '/imports/api/auth-token-validation';
 import pendingAuthenticationsStore from '../store/pendingAuthentications';
 
 export default function validateAuthToken(meetingId, requesterUserId, requesterToken, externalId) {
-  const REDIS_CONFIG = Meteor.settings.private.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'ValidateAuthTokenReqMsg';
+  try {
+    const REDIS_CONFIG = Meteor.settings.private.redis;
+    const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+    const EVENT_NAME = 'ValidateAuthTokenReqMsg';
 
-  Logger.debug('ValidateAuthToken method called', { meetingId, requesterUserId, requesterToken, externalId });
+    Logger.debug('ValidateAuthToken method called', { meetingId, requesterUserId, requesterToken, externalId });
 
-  if (!meetingId) return false;
+    if (!meetingId) return false;
 
-  // Store reference of methodInvocationObject ( to postpone the connection userId definition )
-  pendingAuthenticationsStore.add(meetingId, requesterUserId, requesterToken, this);
-  upsertValidationState(meetingId, requesterUserId, ValidationStates.VALIDATING, this.connection.id);
+    // Store reference of methodInvocationObject ( to postpone the connection userId definition )
+    pendingAuthenticationsStore.add(meetingId, requesterUserId, requesterToken, this);
+    upsertValidationState(meetingId, requesterUserId, ValidationStates.VALIDATING, this.connection.id);
 
-  const payload = {
-    userId: requesterUserId,
-    authToken: requesterToken,
-  };
+    const payload = {
+      userId: requesterUserId,
+      authToken: requesterToken,
+    };
 
-  Logger.info(`User '${requesterUserId}' is trying to validate auth token for meeting '${meetingId}' from connection '${this.connection.id}'`);
+    Logger.info(`User '${requesterUserId}' is trying to validate auth token for meeting '${meetingId}' from connection '${this.connection.id}'`);
 
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+    return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
+  } catch (err) {
+    Logger.error(`Exception while invoking method validateAuthToken ${err.stack}`);
+  }
 }
-- 
GitLab