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;
        }
Beispiel #4
0
		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;
		}
Beispiel #5
0
		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;
 }