public void TryEnterRoom(MucRoomMember member, Presence presence) { if (MucHelpers.IsJoinRequest(presence)) { if (CanEnterRoom(member, presence)) { if (RoomSettings.IsNew) { member.Affiliation = Affiliation.owner; member.Role = Role.moderator; } //enter members.Add(member); RoomSettings.UpdateMemberInfo(member.RealJid, member.Affiliation, member.Role); //Update settings on enter //subscribe to events SetMemberEvents(member); MemberEnter(member); } } else { ErrorPresence(presence, ErrorCondition.BadRequest); member.Send(presence); } }
private bool CanEnterRoom(MucRoomMember member, Presence presence) { if (RoomSettings.PasswordProtected) { string password = MucHelpers.GetPassword(presence); if (!RoomSettings.Password.Equals(password, StringComparison.Ordinal)) { // Return error ErrorPresence(presence, ErrorCondition.NotAuthorized, 401); member.Send(presence); return(false); } } if (RoomSettings.UserNamesOnly) { if (!presence.From.User.Equals(presence.To.Resource)) { // username tries to enter with not his username ErrorPresence(presence, ErrorCondition.Conflict, 406); member.Send(presence); return(false); } } // Check member if (RoomSettings.IsMember(presence.From)) { // Add new member.Affiliation = RoomSettings.GetMemeberAffilation(presence.From); member.Role = RoomSettings.GetMemeberRole(member.Affiliation); if (member.Affiliation == Affiliation.outcast) { ErrorPresence(presence, ErrorCondition.Conflict, 403); member.Send(presence); return(false); } if (member.Role == Role.none) { ErrorPresence(presence, ErrorCondition.Conflict, 403); member.Send(presence); return(false); } } else { // Return error ErrorPresence(presence, ErrorCondition.RegistrationRequired, 407); member.Send(presence); return(false); } return(true); }
public override void HandlePresence(XmppStream stream, Presence presence, XmppHandlerContext context) { //Presence to open new room if (MucHelpers.IsJoinRequest(presence)) { //Register Service.CreateRoom(new Jid(presence.To.Bare), null); Service.HandlerManager.ProcessStreamElement(presence, stream);//Forward to room } else { //Return error presence.Type = PresenceType.error; presence.Error = new Error(ErrorType.cancel, ErrorCondition.NotAllowed); presence.SwitchDirection(); context.Sender.SendTo(stream, presence); } }