public void StreamStartHandle(XmppStream xmppStream, Stream stream, XmppHandlerContext context) { var streamHeader = new StringBuilder(); streamHeader.AppendLine("<?xml version='1.0' encoding='UTF-8'?>"); streamHeader.AppendFormat("<stream:{0} xmlns:{0}='{1}' xmlns='{2}' from='{3}' id='{4}' version='1.0'>", Uri.PREFIX, Uri.STREAM, Uri.CLIENT, stream.To, xmppStream.Id); context.Sender.SendTo(xmppStream, streamHeader.ToString()); var features = new Features(); features.Prefix = Uri.PREFIX; if (xmppStream.Authenticated) { features.AddChild(new Bind()); features.AddChild(new Core.protocol.iq.session.Session()); } else { features.Mechanisms = new Mechanisms(); var listener = (BoshXmppListener)(context.XmppGateway.GetXmppListener("Bosh Listener")); var storage = new DbLdapSettingsStore(); storage.GetLdapSettings(xmppStream.Domain); if (!storage.EnableLdapAuthentication || listener.GetXmppConnection(xmppStream.ConnectionId) != null) { features.Mechanisms.AddChild(new Mechanism(MechanismType.DIGEST_MD5)); } else { features.Mechanisms.AddChild(new Mechanism(MechanismType.PLAIN)); } features.Mechanisms.AddChild(new Element("required")); features.Register = new Register(); } streamHeader.Append(features.ToString()); context.Sender.SendTo(xmppStream, features); }
public override void HandleMessage(XmppStream stream, Message message, XmppHandlerContext context) { if (!message.HasTo || message.To.IsServer) { context.Sender.SendTo(stream, XmppStanzaError.ToServiceUnavailable(message)); return; } var sessions = context.SessionManager.GetBareJidSessions(message.To); if (0 < sessions.Count) { foreach(var s in sessions) { try { context.Sender.SendTo(s, message); } catch { context.Sender.SendToAndClose(s.Stream, message); } } } else { StoreOffline(message, context.StorageManager.OfflineStorage); } }
public override void HandleMessage(XmppStream stream, Message message, XmppHandlerContext context) { if (!message.HasTo || !message.To.HasResource) return; string[] commands = message.To.Resource.Split('/'); if (commands.Length == 1 && commands[0] == ANNOUNCE) { Announce(stream, message, context); } else if (commands.Length == 2 && commands[1] == ONLINE) { AnnounceOnline(stream, message, context); } else if (commands.Length == 2 && commands[1] == ONLINEBROADCAST) { AnnounceOnlineBroadcast(stream, message, context); } else if (commands.Length == 2 && commands[1] == SERVICE) { AnnounceService(stream, message, context); } else { context.Sender.SendTo(stream, XmppStanzaError.ToServiceUnavailable(message)); } }
public override void HandleMessage(XmppStream stream, Message message, XmppHandlerContext context) { if (!message.HasTo) return; if (archiveStore.GetMessageLogging(message.From, message.To)) { if (!string.IsNullOrEmpty(message.Body) || !string.IsNullOrEmpty(message.Subject) || !string.IsNullOrEmpty(message.Thread) || message.Html != null) { var flush = false; lock (messageBuffer) { //Add xdelay if (message.XDelay == null) { message.XDelay = new Delay(); message.XDelay.Stamp = DateTime.UtcNow; } messageBuffer.Add(message); flush = BUFFER_SIZE <= messageBuffer.Count; } if (flush) FlushMessageBuffer(); } } }
private void ProcessAuthIQSet(XmppStream stream, AuthIq iq, XmppHandlerContext context) { if (string.IsNullOrEmpty(iq.Query.Username) || string.IsNullOrEmpty(iq.Query.Resource)) { context.Sender.SendTo(stream, XmppStanzaError.ToNotAcceptable(iq)); return; } bool authorized = false; if (!string.IsNullOrEmpty(iq.Query.Digest)) { authorized = AuthDigest(iq.Query.Username, iq.Query.Digest, stream, context.UserManager); } if (!string.IsNullOrEmpty(iq.Query.Password)) { authorized = AuthPlain(iq.Query.Username, iq.Query.Password, stream, context.UserManager); } if (authorized) { stream.Authenticate(iq.Query.Username); var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.To = iq.From; answer.From = iq.To; context.Sender.SendTo(stream, answer); } else { context.Sender.SendTo(stream, XmppStanzaError.ToNotAuthorized(iq)); } }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (!iq.HasTo) iq.To = iq.From; if (iq.Type == IqType.get) return GetVCardSearch(stream, iq, context); else if (iq.Type == IqType.set) return SetVCardSearch(stream, iq, context); else return XmppStanzaError.ToBadRequest(iq); }
public override void HandleMessage(XmppStream stream, Message msg, XmppHandlerContext context) { msg.SwitchDirection(); msg.Type = MessageType.error; msg.Error = new Error(ErrorType.cancel, ErrorCondition.ItemNotFound); context.Sender.SendTo(stream, msg); }
public override void StreamEndHandle(XmppStream stream, ICollection<Node> notSendedBuffer, XmppHandlerContext context) { lock (authData) { authData.Remove(stream.Id); } }
private void ProcessAuth(XmppStream stream, Auth auth, XmppHandlerContext context) { AuthData authStep; lock (authData) { authData.TryGetValue(stream.Id, out authStep); } if (auth.MechanismType != MechanismType.DIGEST_MD5) { context.Sender.SendToAndClose(stream, XmppFailureError.InvalidMechanism); } else if (authStep != null) { context.Sender.SendToAndClose(stream, XmppFailureError.TemporaryAuthFailure); } else { lock (authData) { authData[stream.Id] = new AuthData(); } var challenge = GetChallenge(stream.Domain); context.Sender.SendTo(stream, challenge); } }
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 IQ GetPrivate(XmppStream stream, IQ iq, XmppHandlerContext context) { var privateStore = (Private)iq.Query; if (!privateStore.HasChildElements) return XmppStanzaError.ToNotAcceptable(iq); var retrived = new List<Element>(); foreach (var childNode in privateStore.ChildNodes) { if (childNode is Element) { var elementToRetrive = (Element)childNode; var elementRestored = context.StorageManager.PrivateStorage.GetPrivate(iq.From, elementToRetrive); retrived.Add(elementRestored ?? elementToRetrive); } } privateStore.RemoveAllChildNodes(); foreach (var element in retrived) { privateStore.AddChild(element); } iq.SwitchDirection(); iq.Type = IqType.result; return iq; }
public override void ElementHandle(XmppStream stream, Element element, XmppHandlerContext context) { context.Sender.SendTo(stream, new Compressed()); var connection = context.Sender.GetXmppConnection(stream.ConnectionId); connection.SetStreamTransformer(new GZipTransformer()); context.Sender.ResetStream(stream); }
public void StreamStartHandle(XmppStream xmppStream, Stream stream, XmppHandlerContext context) { var streamHeader = new StringBuilder(); streamHeader.AppendLine("<?xml version='1.0' encoding='UTF-8'?>"); streamHeader.AppendFormat("<stream:{0} xmlns:{0}='{1}' xmlns='{2}' from='{3}' id='{4}' version='1.0'>", Uri.PREFIX, Uri.STREAM, Uri.CLIENT, stream.To, xmppStream.Id); context.Sender.SendTo(xmppStream, streamHeader.ToString()); var features = new Features(); features.Prefix = Uri.PREFIX; if (xmppStream.Authenticated) { features.AddChild(new Bind()); features.AddChild(new Core.protocol.iq.session.Session()); } else { features.Mechanisms = new Mechanisms(); features.Mechanisms.AddChild(new Mechanism(MechanismType.DIGEST_MD5)); features.Mechanisms.AddChild(new Element("required")); features.Register = new Register(); } streamHeader.Append(features.ToString()); context.Sender.SendTo(xmppStream, features); }
public void StreamStartHandle(XmppStream xmppStream, Stream stream, XmppHandlerContext context) { lock (this) { //Check tennats here if (ValidateHost(stream.To)) { //Create new services foreach (var template in templates) { var service = (IXmppService)Activator.CreateInstance(template.Value); service.Jid = new Jid(Stringprep.NamePrep(string.Format("{0}.{1}", template.Key, stream.To.Server).Trim('.'))); if (serviceManager.GetService(service.Jid) != null) { continue; } service.Name = service.Jid.ToString(); if (!string.IsNullOrEmpty(template.Key)) { service.ParentService = serviceManager.GetService(new Jid(Stringprep.NamePrep(stream.To.Server))); } service.Configure(new Dictionary<string, string>()); serviceManager.RegisterService(service); } //Reroute handlerManager.ProcessStreamStart(stream, Uri.CLIENT, xmppStream); } else { context.Sender.SendToAndClose(xmppStream, XmppStreamError.HostUnknown); } } }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.HasTo && iq.To != Jid) return XmppStanzaError.ToServiceUnavailable(iq); if (iq.Query is DiscoInfo && iq.Type == IqType.get) return GetDiscoInfo(stream, iq, context); if (iq.Query is DiscoItems && iq.Type == IqType.get) return GetDiscoItems(stream, iq, context); return XmppStanzaError.ToServiceUnavailable(iq); }
public override void HandleMessage(XmppStream stream, Message message, XmppHandlerContext context) { if (!message.HasTo) return; if (archiveStore == null) { archiveStore = new DbMessageArchive(); var properties = new Dictionary<string, string>(1); properties.Add("connectionStringName", "core"); archiveStore.Configure(properties); } if (archiveStore.GetMessageLogging(message.From, message.To)) { if (!string.IsNullOrEmpty(message.Body) || !string.IsNullOrEmpty(message.Subject) || !string.IsNullOrEmpty(message.Thread) || message.Html != null) { var flush = false; lock (messageBuffer) { //Add xdelay if (message.XDelay == null) { message.XDelay = new Delay(); message.XDelay.Stamp = DateTime.UtcNow; } messageBuffer.Add(message); flush = BUFFER_SIZE <= messageBuffer.Count; } if (flush) FlushMessageBuffer(); } } }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (!iq.HasTo || !iq.To.HasUser) return XmppStanzaError.ToServiceUnavailable(iq); var session = context.SessionManager.GetSession(iq.To); if (session != null) context.Sender.SendTo(session, iq); return null; }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.Query is PrivateLog && iq.Type == IqType.get) return GetPrivateLog(stream, iq, context); if (iq.Query is PrivateLog && iq.Type == IqType.set) return SetPrivateLog(stream, iq, context); if (iq.Query is PrivateLog && (iq.Type == IqType.result || iq.Type == IqType.error)) return null; if (iq.Query is History && iq.Type == IqType.get) return GetHistory(stream, iq, context); return XmppStanzaError.ToServiceUnavailable(iq); }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.To != null && iq.From != iq.To) return XmppStanzaError.ToForbidden(iq); if (iq.Type == IqType.get) return GetPrivate(stream, iq, context); else if (iq.Type == IqType.set) return SetPrivate(stream, iq, context); else return XmppStanzaError.ToBadRequest(iq); }
public override void ElementHandle(XmppStream stream, Element element, XmppHandlerContext context) { if (stream.Authenticated) return; if (element is Auth) ProcessAuth(stream, (Auth)element, context); if (element is Response) ProcessResponse(stream, (Response)element, context); if (element is Abort) ProcessAbort(stream, (Abort)element, context); }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.HasTo && iq.To != iq.From) return XmppStanzaError.ToForbidden(iq); if (iq.Type == IqType.get) return GetRoster(stream, iq, context); else if (iq.Type == IqType.set) return SetRoster(stream, iq, context); else return null; }
public void StreamStartHandle(XmppStream xmppStream, Stream stream, XmppHandlerContext context) { var streamHeader = new StringBuilder(); streamHeader.AppendLine("<?xml version='1.0' encoding='UTF-8'?>"); streamHeader.AppendFormat("<stream:{0} xmlns:{0}='{1}' xmlns='{2}' ", Uri.PREFIX, Uri.STREAM, Uri.ACCEPT); streamHeader.AppendFormat("from='{0}' id='{1}' version='1.0'>", stream.To, xmppStream.Id); context.Sender.SendTo(xmppStream, streamHeader.ToString()); }
private void ProcessAuthIQGet(XmppStream stream, AuthIq iq, XmppHandlerContext context) { iq.SwitchDirection(); iq.Type = IqType.result; iq.Query.AddChild(new Element("password")); iq.Query.AddChild(new Element("digest")); iq.Query.AddChild(new Element("resource")); context.Sender.SendTo(stream, iq); }
public void ResetStream(XmppStream stream) { if (stream == null) throw new ArgumentNullException("stream"); var connection = GetXmppConnection(stream.ConnectionId); if (connection != null) { connection.Reset(); } }
private IQ ProcessSession(XmppStream stream, IQ iq, XmppHandlerContext context) { var session = context.SessionManager.GetSession(iq.From); if (session == null) return XmppStanzaError.ToItemNotFound(iq); var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.Session = new Core.protocol.iq.session.Session(); session.Active = true; return answer; }
public void SendTo(XmppStream to, string text) { if (to == null) throw new ArgumentNullException("to"); if (string.IsNullOrEmpty(text)) throw new ArgumentNullException("text"); var connection = GetXmppConnection(to.ConnectionId); if (connection != null) { log.DebugFormat(SEND_FORMAT, to.ConnectionId, to.Namespace, text); connection.Send(text, Encoding.UTF8); } }
private IQ SetVCard(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.From != iq.To) return XmppStanzaError.ToForbidden(iq); var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.To = iq.From; answer.From = iq.To; context.StorageManager.VCardStorage.SetVCard(iq.To, iq.Vcard); answer.Vcard = iq.Vcard; return answer; }
public XmppSession(Jid jid, XmppStream stream) { if (jid == null) throw new ArgumentNullException("jid"); if (stream == null) throw new ArgumentNullException("stream"); Id = UniqueId.CreateNewId(); Jid = jid; Stream = stream; Active = false; RosterRequested = false; ClientInfo = new ClientInfo(); }
public void SendTo(XmppStream to, Node node) { if (to == null) throw new ArgumentNullException("to"); if (node == null) throw new ArgumentNullException("node"); var connection = GetXmppConnection(to.ConnectionId); if (connection != null) { _log.DebugFormat(SEND_FORMAT, to.ConnectionId, to.Namespace, node.ToString(Formatting.Indented)); connection.Send(node, Encoding.UTF8); } }
private IQ GetPrivateLog(XmppStream stream, IQ iq, XmppHandlerContext context) { if (!iq.HasTo) return XmppStanzaError.ToBadRequest(iq); var privateLog = (PrivateLog)iq.Query; privateLog.RemoveAllChildNodes(); var logging = archiveStore.GetMessageLogging(iq.From, iq.To); privateLog.AddChild(new PrivateLogItem() { Jid = iq.To, Log = logging }); iq.SwitchDirection(); iq.Type = IqType.result; return iq; }