|
|
@@ -431,14 +431,9 @@ class ApiController { |
|
|
us.avatarURL = meeting.defaultAvatarURL |
|
|
} |
|
|
|
|
|
// Register user into the meeting. |
|
|
meetingService.registerUser(us.meetingID, us.internalUserId, us.fullname, us.role, us.externUserID, |
|
|
us.authToken, us.avatarURL, us.guest, us.authed, guestStatusVal) |
|
|
String meetingId = meeting.getInternalId() |
|
|
|
|
|
// Validate if the maxParticipants limit has been reached based on registeredUsers. If so, complain. |
|
|
// when maxUsers is set to 0, the validation is ignored |
|
|
int maxUsers = meeting.getMaxUsers(); |
|
|
if (maxUsers > 0 && meeting.getRegisteredUsers().size() >= maxUsers) { |
|
|
if (hasReachedMaxParticipants(meeting, us)) { |
|
|
// BEGIN - backward compatibility |
|
|
invalid("maxParticipantsReached", "The number of participants allowed for this meeting has been reached.", REDIRECT_RESPONSE); |
|
|
return |
|
|
@@ -449,6 +444,20 @@ class ApiController { |
|
|
return; |
|
|
} |
|
|
|
|
|
// Register user into the meeting. |
|
|
meetingService.registerUser( |
|
|
us.meetingID, |
|
|
us.internalUserId, |
|
|
us.fullname, |
|
|
us.role, |
|
|
us.externUserID, |
|
|
us.authToken, |
|
|
us.avatarURL, |
|
|
us.guest, |
|
|
us.authed, |
|
|
guestStatusVal |
|
|
) |
|
|
|
|
|
//Identify which of these to logs should be used. sessionToken or user-token |
|
|
log.info("Session sessionToken for " + us.fullname + " [" + session[sessionToken] + "]") |
|
|
log.info("Session user-token for " + us.fullname + " [" + session['user-token'] + "]") |
|
|
@@ -1170,31 +1179,16 @@ class ApiController { |
|
|
|
|
|
String logoutUrl = paramsProcessorUtil.getDefaultLogoutUrl() |
|
|
boolean reject = false |
|
|
String sessionToken = null |
|
|
UserSession us = null |
|
|
|
|
|
if (StringUtils.isEmpty(params.sessionToken)) { |
|
|
log.info("No session for user in conference.") |
|
|
reject = true |
|
|
} else { |
|
|
sessionToken = StringUtils.strip(params.sessionToken) |
|
|
log.info("Getting ConfigXml for SessionToken = " + sessionToken) |
|
|
if (!session[sessionToken]) { |
|
|
reject = true |
|
|
} else { |
|
|
us = meetingService.getUserSessionWithAuthToken(sessionToken); |
|
|
if (us == null) reject = true |
|
|
} |
|
|
} |
|
|
|
|
|
if (reject) { |
|
|
String sessionToken = sanitizeSessionToken(params.sessionToken) |
|
|
if (!hasValidSession(sessionToken)) { |
|
|
response.addHeader("Cache-Control", "no-cache") |
|
|
withFormat { |
|
|
xml { |
|
|
render(text: responseBuilder.buildConfgXmlReject("Could not find conference.", logoutUrl, RESP_CODE_FAILED), contentType: "text/xml") |
|
|
} |
|
|
} |
|
|
} else { |
|
|
UserSession us = getUserSession(sessionToken) |
|
|
if (StringUtils.isEmpty(us.configXML)) { |
|
|
// BEGIN - backward compatibility |
|
|
invalid("noConfigFound", "We could not find a config for this request.", REDIRECT_RESPONSE); |
|
|
@@ -1232,44 +1226,26 @@ class ApiController { |
|
|
log.debug CONTROLLER_NAME + "#${API_CALL}" |
|
|
ApiErrors errors = new ApiErrors() |
|
|
boolean reject = false; |
|
|
String sessionToken = sanitizeSessionToken(params.sessionToken) |
|
|
|
|
|
if (StringUtils.isEmpty(params.sessionToken)) { |
|
|
log.debug("SessionToken is missing.") |
|
|
} |
|
|
|
|
|
String sessionToken = StringUtils.strip(params.sessionToken) |
|
|
|
|
|
UserSession us = null; |
|
|
UserSession us = getUserSession(sessionToken); |
|
|
Meeting meeting = null; |
|
|
UserSession userSession = null; |
|
|
|
|
|
if (sessionToken == null || meetingService.getUserSessionWithAuthToken(sessionToken) == null) { |
|
|
if (us == null) { |
|
|
log.debug("No user with session token.") |
|
|
reject = true; |
|
|
} else { |
|
|
us = meetingService.getUserSessionWithAuthToken(sessionToken); |
|
|
meeting = meetingService.getMeeting(us.meetingID); |
|
|
if (meeting == null || meeting.isForciblyEnded()) { |
|
|
log.debug("Meeting not found.") |
|
|
reject = true |
|
|
} |
|
|
userSession = meetingService.getUserSessionWithAuthToken(sessionToken) |
|
|
if (userSession == null) { |
|
|
log.debug("Session with user not found.") |
|
|
reject = true |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
// Determine the logout url so we can send the user there. |
|
|
String logoutUrl = paramsProcessorUtil.getDefaultLogoutUrl() |
|
|
|
|
|
if (us != null) { |
|
|
logoutUrl = us.logoutUrl |
|
|
} |
|
|
String logoutUrl = us != null ? us.logoutUrl : paramsProcessorUtil.getDefaultLogoutUrl() |
|
|
|
|
|
if (reject) { |
|
|
log.info("No session for user in conference.") |
|
|
response.addHeader("Cache-Control", "no-cache") |
|
|
withFormat { |
|
|
json { |
|
|
@@ -1305,7 +1281,7 @@ class ApiController { |
|
|
clientURL = params.clientURL; |
|
|
} |
|
|
|
|
|
String guestWaitStatus = userSession.guestStatus |
|
|
String guestWaitStatus = us.guestStatus |
|
|
|
|
|
log.debug("GuestWaitStatus = " + guestWaitStatus) |
|
|
|
|
|
@@ -1393,48 +1369,34 @@ class ApiController { |
|
|
def enter = { |
|
|
boolean reject = false; |
|
|
|
|
|
if (StringUtils.isEmpty(params.sessionToken)) { |
|
|
println("SessionToken is missing.") |
|
|
} |
|
|
|
|
|
String sessionToken = StringUtils.strip(params.sessionToken) |
|
|
|
|
|
UserSession us = null; |
|
|
String sessionToken = sanitizeSessionToken(params.sessionToken) |
|
|
UserSession us = getUserSession(sessionToken); |
|
|
Meeting meeting = null; |
|
|
UserSession userSession = null; |
|
|
|
|
|
Boolean allowEnterWithoutSession = false; |
|
|
// Depending on configuration, allow ENTER requests to proceed without session |
|
|
if (paramsProcessorUtil.getAllowRequestsWithoutSession()) { |
|
|
allowEnterWithoutSession = paramsProcessorUtil.getAllowRequestsWithoutSession(); |
|
|
} |
|
|
|
|
|
String respMessage = "Session " + sessionToken + " not found." |
|
|
|
|
|
if (!sessionToken || meetingService.getUserSessionWithAuthToken(sessionToken) == null || (!allowEnterWithoutSession && !session[sessionToken])) { |
|
|
if (!hasValidSession(sessionToken)) { |
|
|
reject = true; |
|
|
respMessage = "Session " + sessionToken + " not found." |
|
|
} else { |
|
|
us = meetingService.getUserSessionWithAuthToken(sessionToken); |
|
|
if (us == null) { |
|
|
respMessage = "Session " + sessionToken + " not found." |
|
|
meeting = meetingService.getMeeting(us.meetingID); |
|
|
if (meeting == null || meeting.isForciblyEnded()) { |
|
|
reject = true |
|
|
respMessage = "Meeting not found or ended for session " + sessionToken + "." |
|
|
} else { |
|
|
meeting = meetingService.getMeeting(us.meetingID); |
|
|
if (meeting == null || meeting.isForciblyEnded()) { |
|
|
reject = true |
|
|
respMessage = "Meeting not found or ended for session " + sessionToken + "." |
|
|
} |
|
|
if (us.guestStatus.equals(GuestPolicy.DENY)) { |
|
|
respMessage = "User denied for user with session " + sessionToken + "." |
|
|
reject = true |
|
|
if (hasReachedMaxParticipants(meeting, us)) { |
|
|
reject = true; |
|
|
respMessage = "The number of participants allowed for this meeting has been reached."; |
|
|
} else { |
|
|
meeting.userEntered(us.internalUserId); |
|
|
} |
|
|
} |
|
|
if (us.guestStatus.equals(GuestPolicy.DENY)) { |
|
|
respMessage = "User denied for user with session " + sessionToken + "." |
|
|
reject = true |
|
|
} |
|
|
} |
|
|
|
|
|
if (reject) { |
|
|
log.info("No session for user in conference.") |
|
|
|
|
|
// Determine the logout url so we can send the user there. |
|
|
String logoutUrl = paramsProcessorUtil.getDefaultLogoutUrl() |
|
|
|
|
|
@@ -1549,34 +1511,20 @@ class ApiController { |
|
|
def stuns = { |
|
|
boolean reject = false; |
|
|
|
|
|
UserSession us = null; |
|
|
String sessionToken = sanitizeSessionToken(params.sessionToken) |
|
|
UserSession us = getUserSession(sessionToken); |
|
|
Meeting meeting = null; |
|
|
String sessionToken = null |
|
|
|
|
|
if (!StringUtils.isEmpty(params.sessionToken)) { |
|
|
sessionToken = StringUtils.strip(params.sessionToken) |
|
|
println("Session token = [" + sessionToken + "]") |
|
|
} |
|
|
|
|
|
Boolean allowStunsWithoutSession = false; |
|
|
// Depending on configuration, allow STUNS requests to proceed without session |
|
|
if (paramsProcessorUtil.getAllowRequestsWithoutSession()) { |
|
|
allowStunsWithoutSession = paramsProcessorUtil.getAllowRequestsWithoutSession(); |
|
|
} |
|
|
|
|
|
if (sessionToken == null || meetingService.getUserSessionWithAuthToken(sessionToken) == null || (!allowStunsWithoutSession && !session[sessionToken])) { |
|
|
if (!hasValidSession(sessionToken)) { |
|
|
reject = true; |
|
|
} else { |
|
|
us = meetingService.getUserSessionWithAuthToken(sessionToken); |
|
|
meeting = meetingService.getMeeting(us.meetingID); |
|
|
if (meeting == null || meeting.isForciblyEnded()) { |
|
|
reject = true |
|
|
} |
|
|
} |
|
|
|
|
|
if (reject) { |
|
|
log.info("No session for user in conference.") |
|
|
|
|
|
String logoutUrl = paramsProcessorUtil.getDefaultLogoutUrl() |
|
|
|
|
|
response.addHeader("Cache-Control", "no-cache") |
|
|
@@ -1633,12 +1581,7 @@ class ApiController { |
|
|
*************************************************/ |
|
|
def signOut = { |
|
|
|
|
|
String sessionToken = null |
|
|
|
|
|
if (!StringUtils.isEmpty(params.sessionToken)) { |
|
|
sessionToken = StringUtils.strip(params.sessionToken) |
|
|
println("SessionToken = " + sessionToken) |
|
|
} |
|
|
String sessionToken = sanitizeSessionToken(params.sessionToken) |
|
|
|
|
|
Meeting meeting = null; |
|
|
|
|
|
@@ -2155,6 +2098,76 @@ class ApiController { |
|
|
} |
|
|
} |
|
|
|
|
|
def getUserSession(token) { |
|
|
if (token == null) { |
|
|
return null |
|
|
} |
|
|
|
|
|
UserSession us = meetingService.getUserSessionWithAuthToken(token) |
|
|
if (us == null) { |
|
|
log.info("Cannot find UserSession for token ${token}") |
|
|
} |
|
|
|
|
|
return us |
|
|
} |
|
|
|
|
|
def sanitizeSessionToken(param) { |
|
|
if (param == null) { |
|
|
log.info("sanitizeSessionToken: token is null") |
|
|
return null |
|
|
} |
|
|
|
|
|
if (StringUtils.isEmpty(param)) { |
|
|
log.info("sanitizeSessionToken: token is empty") |
|
|
return null |
|
|
} |
|
|
|
|
|
return StringUtils.strip(param) |
|
|
} |
|
|
|
|
|
private Boolean hasValidSession(token) { |
|
|
UserSession us = getUserSession(token) |
|
|
if (us == null) { |
|
|
return false |
|
|
} |
|
|
|
|
|
if (!session[token]) { |
|
|
log.info("Session for token ${token} not found") |
|
|
|
|
|
Boolean allowRequestsWithoutSession = paramsProcessorUtil.getAllowRequestsWithoutSession() |
|
|
if (!allowRequestsWithoutSession) { |
|
|
log.info("Meeting related to ${token} doesn't allow requests without session") |
|
|
return false |
|
|
} |
|
|
} |
|
|
|
|
|
log.info("Token ${token} is valid") |
|
|
return true |
|
|
} |
|
|
|
|
|
// Validate maxParticipants constraint |
|
|
private Boolean hasReachedMaxParticipants(meeting, us) { |
|
|
// Meeting object calls it maxUsers to build up the drama |
|
|
int maxParticipants = meeting.getMaxUsers(); |
|
|
// When is set to 0, the validation is ignored |
|
|
Boolean enabled = maxParticipants > 0; |
|
|
// Users refreshing page or reconnecting must be identified |
|
|
Boolean rejoin = meeting.getUserById(us.internalUserId) != null; |
|
|
// Users that passed enter once, still not joined but somehow re-entered |
|
|
Boolean reenter = meeting.getEnteredUserById(us.internalUserId) != null; |
|
|
// Users that already joined the meeting |
|
|
int joinedUsers = meeting.getUsers().size() |
|
|
// Users that are entering the meeting |
|
|
int enteredUsers = meeting.getEnteredUsers().size() |
|
|
|
|
|
Boolean reachedMax = (joinedUsers + enteredUsers) >= maxParticipants; |
|
|
if (enabled && !rejoin && !reenter && reachedMax) { |
|
|
return true; |
|
|
} |
|
|
|
|
|
return false; |
|
|
} |
|
|
|
|
|
private void respondWithErrors(errorList, redirectResponse = false) { |
|
|
log.debug CONTROLLER_NAME + "#invalid" |
|
|
if (redirectResponse) { |
|
|
|