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); } }
public void InviteUser(Message msg, User user, XmppStream stream) { if (RoomSettings.CanInvite) { Message inviteMsg = new Message(user.Invite.To, Jid, MessageType.normal, null); User userElement = new User(); userElement.Invite = new Invite(); MucRoomMember member = GetRealMember(msg.From); userElement.Invite.From = member == null ? msg.From : member.Jid; userElement.Invite.Reason = user.Invite.Reason; inviteMsg.RemoveAllChildNodes(); inviteMsg.AddChild(userElement); if (!Send(inviteMsg)) { // Return error msg.SwitchDirection(); msg.Type = MessageType.error; msg.Error = new Error(ErrorType.cancel, ErrorCondition.ItemNotFound); Sender.SendTo(stream, msg); } } else { msg.SwitchDirection(); msg.Type = MessageType.error; msg.Error = new Error(ErrorType.cancel, ErrorCondition.NotAllowed); Sender.SendTo(stream, msg); } }
public void OwnerCommand(IQ iq, MucRoomMember member) { Owner owner = iq.Query as Owner; // look for destroy if (owner != null) { Destroy destroy = owner.SelectSingleElement(typeof(Destroy)) as Destroy; if (destroy != null) { DestroyRoom(destroy); return; } if (!owner.HasChildElements) { // Return config owner.AddChild(RoomSettings.GetDataForm(member.Jid)); } Data dataSubmit = (Data)owner.SelectSingleElement(typeof(Data)); // form config if (dataSubmit != null && dataSubmit.Type == XDataFormType.submit) { RoomSettings.SubmitForm(dataSubmit); SettingsSave(); iq.Query.RemoveAllChildNodes(); } } iq.Type = IqType.result; iq.SwitchDirection(); }
private void SetMemberEvents(MucRoomMember member) { member.PresenceBroadcasted += MemberPresenceBroadcasted; member.PresenceChanged += MemberPresenceChanged; member.AddressChanged += MemberAddressChanged; member.Unavailible += MemberUnavailible; member.RoleChanged += MemberRoleChanged; member.AffilationChanged += MemberAffilationChanged; }
void members_MemberRemoved(MucRoomMember member) { member.PresenceType = PresenceType.unavailable; if (members.Count == 0 && !RoomSettings.Persistent) { //Say goodbuy to our room DestroyRoom(new Destroy("temporary room is empty")); } }
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 void BroadcastMessage(Message msg, MucRoomMember member) { msg.From = member.Jid; //store if (RoomSettings.Logging) { mucService.MucStorage.AddMucMessages(Jid, msg); } Broadcast(member, true, msg); }
void BroadcastPresencesToMember(MucRoomMember member) { //Send all ocupant presence to new foreach (MucRoomMember existingMember in members) { if (!ReferenceEquals(member, existingMember)) { member.Send(existingMember.Presence); } } }
void MemberAffilationChanged(MucRoomMember member) { if (member.Affiliation == Affiliation.none || member.Affiliation == Affiliation.outcast) { //remove members.Remove(member); } else { BroadcastPresence(member, true); } }
void MemberRoleChanged(MucRoomMember member) { //Broadcast presence if (member.Role == Role.none) { //remove members.Remove(member); } else { BroadcastPresence(member, true); } }
public bool TryNickChange(Presence presence) { MucRoomMember member = members.FindByRealJid(presence.From); if (!presence.To.Resource.Equals(member.Nick)) { if (!RoomSettings.UserNamesOnly) { //Nick change member.Nick = presence.To.Resource; return(true); } } return(false); }
private void Broadcast(MucRoomMember member, bool includeSender, Stanza stanza) { foreach (MucRoomMember existingMember in members) { if (!ReferenceEquals(member, existingMember) || includeSender) { existingMember.Send(stanza); } } //send to self if was removed already if (!members.Contains(member) && includeSender) { member.Send(stanza); } }
private void MemberEnter(MucRoomMember member) { member.EnterRoom(RoomSettings.GetEnterStatusCodes()); //Send history if (RoomSettings.Logging) { foreach (var msg in mucService.MucStorage.GetMucMessages(Jid, RoomSettings.HistoryCountOnEnter)) { member.Send(msg); } } //Send subject member.Send(new Message() { From = Jid, Subject = RoomSettings.Subject }); }
private MucRoomMemberInfo FindMemberInfo(Core.protocol.x.muc.iq.admin.Item item) { MucRoomMemberInfo memberToModify = null; if (item.Jid != null) { memberToModify = GetMemberinfo(item.Jid); } else if (item.Nickname != null) { MucRoomMember roomMember = members.FindByNick(item.Nickname); if (roomMember != null && roomMember.RealJid != null) { memberToModify = GetMemberinfo(roomMember.RealJid); } } return(memberToModify); }
public override void HandleMessage(Streams.XmppStream stream, Message msg, XmppHandlerContext context) { User user = (User)msg.SelectSingleElement(typeof(User)); if (user != null) { HandleUserMessage(msg, user, stream); } else { //Groupchat message MucRoomMember member = Room.GetRealMember(msg.From); if (member != null && ReferenceEquals(member.Stream, stream) && member.Role != Role.none) { if (msg.Type == MessageType.groupchat) { if (msg.Subject != null) { Room.ChangeSubject(member, msg.Subject); } else { MessageBroadcast(msg, member); } } else { msg.SwitchDirection(); msg.Type = MessageType.error; msg.Error = new Error(ErrorCondition.NotAcceptable); context.Sender.SendTo(stream, msg); } } else { msg.SwitchDirection(); msg.Type = MessageType.error; msg.Error = new Error(ErrorCondition.Forbidden); context.Sender.SendTo(stream, msg); } } }
public void ChangeSubject(MucRoomMember member, string subject) { if (RoomSettings.CanChangeSubject) { RoomSettings.Subject = subject; Message msg = new Message(); msg.From = member.Jid; msg.Type = MessageType.groupchat; msg.Subject = subject; Broadcast(member, true, msg); } else { Message msg = new Message(); msg.From = Jid; msg.Type = MessageType.error; msg.Error = new Error(ErrorCondition.NotAllowed); member.Send(msg); } }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { //Admins iq //New member MucRoomMember member = Room.GetRealMember(iq.From); if (member != null) { if (iq.Query != null) { if (iq.Query is Admin && (member.Affiliation == Affiliation.admin || member.Affiliation == Affiliation.owner)) { Room.AdminCommand(iq, member); } else if (iq.Query is Owner && (member.Affiliation == Affiliation.owner)) { Room.OwnerCommand(iq, member); } else { XmppStanzaError.ToForbidden(iq); } } else { XmppStanzaError.ToBadRequest(iq); } } else { XmppStanzaError.ToForbidden(iq); } if (!iq.Switched) { iq.SwitchDirection(); } iq.From = Room.Jid; return(iq); }
public override void HandlePresence(Streams.XmppStream stream, Presence presence, XmppHandlerContext context) { string userName = presence.To.Resource; if (!string.IsNullOrEmpty(userName) && presence.Type == PresenceType.available) { //New member MucRoomMember member = Room.GetRealMember(presence.From); if (member != null) { if (ReferenceEquals(stream, member.Stream)) { if (!Room.TryNickChange(presence)) { ErrorPresence(presence, ErrorCondition.NotAcceptable); context.Sender.SendTo(stream, presence); } } else { //Conflict. user with this jid already in room ErrorPresence(presence, ErrorCondition.Conflict); context.Sender.SendTo(stream, presence); } } else { //Doesn't exists MucRoomMember newMember = new MucRoomMember(Room, presence.To, presence.From, stream, context); Room.TryEnterRoom(newMember, presence); } } else { ErrorPresence(presence, ErrorCondition.BadRequest); context.Sender.SendTo(stream, presence); } }
private void BroadcastPresence(MucRoomMember member, bool includeSender) { Broadcast(member, includeSender, member.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; }
private void MemberPresenceBroadcasted(MucRoomMember member) { MemberPresenceBroadcasted(member, member.Presence); }
void MemberPresenceChanged(MucRoomMember member) { //Send new ocupant presence to all BroadcastPresence(member); }
void MemberUnavailible(MucRoomMember member) { members.Remove(member); }
void members_MemberRemoved(MucRoomMember member) { member.PresenceType = PresenceType.unavailable; if (members.Count==0 && !RoomSettings.Persistent) { //Say goodbuy to our room DestroyRoom(new Destroy("temporary room is empty")); } }
public void AdminCommand(IQ iq, MucRoomMember member) { Admin admin = iq.Query as Admin; Admin returnAdmin = new Admin(); if (admin != null) { if (iq.Type == IqType.get) { foreach (Core.protocol.x.muc.iq.admin.Item item in admin.GetItems()) { if (item.Actor == null && item.Affiliation != Affiliation.none) { foreach (MucRoomMemberInfo mucRoomMember in RoomSettings.Members) { if (mucRoomMember.Affiliation == item.Affiliation) { returnAdmin.AddItem( new Core.protocol.x.muc.iq.admin.Item(mucRoomMember.Affiliation, mucRoomMember.Role, mucRoomMember.Jid)); } } } } iq.Query = returnAdmin; iq.Type = IqType.result; } else if (iq.Type == IqType.set) { // Change affilation foreach (Core.protocol.x.muc.iq.admin.Item item in admin.GetItems()) { if (item.Actor == null) { Actor actor = new Actor() { Jid = iq.From }; MucRoomMemberInfo memberToModify = FindMemberInfo(item); if (memberToModify != null) { //Get member if ((int)item.Affiliation != -1) { if (RoomSettings.CanChangeAffilation(memberToModify.Affiliation, item.Affiliation, member.Affiliation)) { memberToModify.Affiliation = item.Affiliation; //Try notify online MucRoomMember onlineMember = members.FindByBareJid(memberToModify.Jid); if (onlineMember != null) { onlineMember.Affiliation = item.Affiliation; } } else { // Error! XmppStanzaError.ToErrorStanza(iq, new Error(ErrorCondition.NotAllowed)); return; } } if ((int)item.Role != -1) { if (RoomSettings.CanChangeRole(memberToModify.Role, item.Role, member.Role, member.Affiliation)) { memberToModify.Role = item.Role; MucRoomMember onlineMember = members.FindByBareJid(memberToModify.Jid); if (onlineMember != null) { if (item.Role != Role.none) { onlineMember.Role = item.Role; } else { //Role == none it's a kick onlineMember.Kick(actor, item.Reason); } } } else { // Error! XmppStanzaError.ToErrorStanza(iq, new Error(ErrorCondition.NotAllowed)); return; } } } } } SettingsSave(); iq.RemoveAllChildNodes(); iq.Type = IqType.result; } } }
void MemberAddressChanged(MucRoomMember member, Jid newAddress) { members.RebindAddress(member, newAddress); }
void MemberPresenceBroadcasted(MucRoomMember member, Presence presence) { Broadcast(member, true, presence); }
public Vcard GetMemberVcard(MucRoomMember member) { return(mucService.VcardStorage.GetVCard(member.RealJid)); }
internal MucRoomMemberStanzaHandler(MucRoomMember member) { Member = member; }
private void BroadcastPresence(MucRoomMember member) { Broadcast(member, true, member.Presence); }
internal void MemberReenter(MucRoomMember member) { MemberEnter(member); BroadcastPresencesToMember(member); }
private void MessageBroadcast(Message msg, MucRoomMember member) { Room.BroadcastMessage(msg, member); }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { //Admins iq //New member MucRoomMember member = Room.GetRealMember(iq.From); if (member != null) { if (iq.Query != null) { if (iq.Query is Admin && (member.Affiliation == Affiliation.admin || member.Affiliation == Affiliation.owner)) { Room.AdminCommand(iq, member); } else if (iq.Query is Owner && (member.Affiliation == Affiliation.owner)) { Room.OwnerCommand(iq, member); } else if (iq.Query is Core.protocol.x.tm.history.History && iq.Type == IqType.get) { Jid jid = iq.To; var mucStore = new DbMucStore(); var properties = new Dictionary <string, string>(1) { { "connectionStringName", "core" } }; mucStore.Configure(properties); var history = (Core.protocol.x.tm.history.History)iq.Query; foreach (var msg in mucStore.GetMucMessages(jid, history.Count, history.StartIndex)) { if (msg == null) { continue; } history.AddChild(HistoryItem.FromMessage(msg)); } iq.Type = IqType.result; iq.SwitchDirection(); return(iq); } else { XmppStanzaError.ToForbidden(iq); } } else { XmppStanzaError.ToBadRequest(iq); } } else { XmppStanzaError.ToForbidden(iq); } if (!iq.Switched) { iq.SwitchDirection(); } iq.From = Room.Jid; return(iq); }
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); } }
public void AdminCommand(IQ iq, MucRoomMember member) { Admin admin = iq.Query as Admin; Admin returnAdmin = new Admin(); if (admin != null) { if (iq.Type == IqType.get) { foreach (Core.protocol.x.muc.iq.admin.Item item in admin.GetItems()) { if (item.Actor == null && item.Affiliation != Affiliation.none) { foreach (MucRoomMemberInfo mucRoomMember in RoomSettings.Members) { if (mucRoomMember.Affiliation == item.Affiliation) { returnAdmin.AddItem( new Core.protocol.x.muc.iq.admin.Item(mucRoomMember.Affiliation, mucRoomMember.Role, mucRoomMember.Jid)); } } } } iq.Query = returnAdmin; iq.Type = IqType.result; } else if (iq.Type == IqType.set) { // Change affilation foreach (Core.protocol.x.muc.iq.admin.Item item in admin.GetItems()) { if (item.Actor == null) { Actor actor = new Actor(){Jid = iq.From}; MucRoomMemberInfo memberToModify = FindMemberInfo(item); if (memberToModify != null) { //Get member if ((int)item.Affiliation != -1) { if (RoomSettings.CanChangeAffilation(memberToModify.Affiliation, item.Affiliation, member.Affiliation)) { memberToModify.Affiliation = item.Affiliation; //Try notify online MucRoomMember onlineMember = members.FindByBareJid(memberToModify.Jid); if (onlineMember != null) { onlineMember.Affiliation = item.Affiliation; } } else { // Error! XmppStanzaError.ToErrorStanza(iq, new Error(ErrorCondition.NotAllowed)); return; } } if ((int)item.Role != -1) { if (RoomSettings.CanChangeRole(memberToModify.Role, item.Role, member.Role, member.Affiliation)) { memberToModify.Role = item.Role; MucRoomMember onlineMember = members.FindByBareJid(memberToModify.Jid); if (onlineMember != null) { if (item.Role != Role.none) { onlineMember.Role = item.Role; } else { //Role == none it's a kick onlineMember.Kick(actor,item.Reason); } } } else { // Error! XmppStanzaError.ToErrorStanza(iq, new Error(ErrorCondition.NotAllowed)); return; } } } } } SettingsSave(); iq.RemoveAllChildNodes(); iq.Type = IqType.result; } } }
public Vcard GetMemberVcard(MucRoomMember member) { return mucService.VcardStorage.GetVCard(member.RealJid); }