private Element ValidateClientStanza(Stanza stanza, XmppStream stream) { if (!stream.Authenticated) { if (!(stanza is AuthIq) && (stanza is IQ && !(((IQ)stanza).Query is Register))) return XmppStanzaError.ToNotAuthorized(stanza); } //remove empty jids if (stanza.HasFrom && string.IsNullOrEmpty(stanza.From.ToString())) stanza.From = null; if (stanza.HasTo && string.IsNullOrEmpty(stanza.To.ToString())) stanza.To = null; //prep strings stanza.From = NodePrep(stanza.From); stanza.To = NodePrep(stanza.To); if (!ValidateJid(stanza.From) || !ValidateJid(stanza.To)) return XmppStanzaError.ToBadRequest(stanza); if (stanza.HasFrom) { if (!stream.JidBinded(stanza.From)) return XmppStreamError.InvalidFrom; } else { if (stream.MultipleResources) return XmppStanzaError.ToConflict(stanza); stanza.From = new Jid(string.Format("{0}@{1}/{2}", stream.User, stream.Domain, 0 < stream.Resources.Count ? stream.Resources[0] : null)); } if (stanza is Message) { var message = (Message)stanza; if (message.Type == MessageType.chat && message.To == null) return XmppStanzaError.ToRecipientUnavailable(stanza); } return null; }
private void HandleMulticastStanza(XmppStream stream, Stanza stanza, XmppHandlerContext context) { var addresses = stanza.SelectSingleElement<Addresses>(); if (addresses != null) { var jids = addresses.GetAddressList(); addresses.RemoveAllBcc(); Array.ForEach(addresses.GetAddresses(), a => a.Delivered = true); var handlerManager = (XmppHandlerManager)context.ServiceProvider.GetService(typeof(XmppHandlerManager)); foreach (var to in jids) { stanza.To = to; handlerManager.ProcessStreamElement(stanza, stream); } } }
public bool ValidateStanza(Stanza stanza, XmppStream stream, XmppHandlerContext context) { Element result = null; if (stream.Namespace == Uri.CLIENT) result = ValidateClientStanza(stanza, stream); if (stream.Namespace == Uri.SERVER) result = ValidateServerStanza(stanza, stream); if (result == null) return true; if (result is Stanza) { context.Sender.SendTo(stream, result); } else if (result is Error) { context.Sender.SendToAndClose(stream, result); } else { return true; } return false; }
private bool Send(Stanza stanza) { if (stanza.To == null) { XmppStanzaError.ToForbidden(stanza); } XmppSession session = SessionManager.GetSession(stanza.To); if (session != null) { Sender.SendTo(session.Stream, stanza); } return session != null; }
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 Element ValidateServerStanza(Stanza stanza, XmppStream stream) { if (!stanza.HasTo || !stanza.HasFrom) return XmppStreamError.ImproperAddressing; return null; }