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); }
private IQ SetRegister(XmppStream stream, IQ iq, XmppHandlerContext context) { var register = (Register)iq.Query; iq.Type = IqType.result; if (register.RemoveAccount) { if (!stream.Authenticated || !iq.From.HasUser) { context.Sender.SendToAndClose(stream, XmppStreamError.NotAuthorized); } context.UserManager.RemoveUser(iq.From); foreach (var s in context.SessionManager.GetBareJidSessions(iq.From)) { if (s.Stream.Id == stream.Id) { continue; } context.Sender.SendToAndClose(s.Stream, XmppStreamError.Conflict); } //TODO: remove roster subscriptions register.RemoveAllChildNodes(); iq.SwitchDirection(); return(iq); } if (string.IsNullOrEmpty(register.Username) || Stringprep.NamePrep(register.Username) != register.Username) { var error = XmppStanzaError.ToNotAcceptable(iq); if (string.IsNullOrEmpty(register.Username)) { error.Error.Message = "Empty required field Username."; } else if (Stringprep.NamePrep(register.Username) != register.Username) { error.Error.Message = "Invalid character."; } return(error); } var userJid = new Jid(register.Username, stream.Domain, null); if (context.UserManager.IsUserExists(userJid)) { return(XmppStanzaError.ToConflict(iq)); } var user = new User(userJid); context.UserManager.SaveUser(user); register.RemoveAllChildNodes(); if (stream.Authenticated) { iq.SwitchDirection(); } else { iq.To = null; } iq.From = null; return(iq); }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { var answer = new IQ(IqType.result) { Id = iq.Id, To = iq.From, From = iq.To, }; //iq sended to server if (iq.Type == IqType.get && (!iq.HasTo || iq.To.IsServer || iq.To == iq.From)) { if (iq.GetTag(typeof(Version)) != null) { answer.Query = new Version() { Name = "OnlyOffice Jabber Server", Os = System.Environment.OSVersion.ToString(), Ver = "1.0", }; return(answer); } else if (iq.GetTag(typeof(Ping)) != null) { return(answer); } return(XmppStanzaError.ToServiceUnavailable(iq)); } if (iq.Type == IqType.get && iq.HasTo) { //resend iq var sessionTo = context.SessionManager.GetSession(iq.To); var sessionFrom = context.SessionManager.GetSession(iq.From); if (sessionTo != null && sessionFrom != null) { if (string.IsNullOrEmpty(iq.Id)) { iq.Id = System.Guid.NewGuid().ToString("N"); } IdleWatcher.StartWatch( iq.Id + iq.From, System.TimeSpan.FromSeconds(3), (s, e) => { context.Sender.SendTo(sessionFrom, XmppStanzaError.ToServiceUnavailable(iq)); }); context.Sender.SendTo(sessionTo, iq); } else { return(XmppStanzaError.ToRecipientUnavailable(iq)); } } if (iq.Type == IqType.error || iq.Type == IqType.result) { if (!iq.HasTo) { return(XmppStanzaError.ToBadRequest(iq)); } IdleWatcher.StopWatch(iq.Id + iq.To); var session = context.SessionManager.GetSession(iq.To); if (session != null) { context.Sender.SendTo(session, iq); } } return(null); }
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) { lock (RoomSettings.Members) { 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 void ProcessStreamElement(Node node, XmppStream stream) { if (node == null) { throw new ArgumentNullException("node"); } if (stream == null) { throw new ArgumentNullException("stream"); } try { var address = new Jid(stream.Domain); foreach (var handler in HandlerStorage.GetStreamHandlers(address, node.GetType())) { handler.ElementHandle(stream, (Element)node.Clone(), context); } if (node is Stanza) { var stanza = (Stanza)node; if (!validator.ValidateStanza(stanza, stream, context)) { return; } if (stanza.HasTo) { address = stanza.To; } var handlres = HandlerStorage.GetStanzaHandlers(address, GetStanzaType(stanza)); if (handlres.Count == 0) { if (stanza is IQ) { var iq = (IQ)stanza; if ((iq.Type == IqType.error || iq.Type == IqType.result) && iq.HasTo && iq.To.HasUser) { //result and error retranslate to user var session = context.SessionManager.GetSession(iq.To); if (session != null) { sender.SendTo(session, iq); return; } } //result and error ignored by server } sender.SendTo(stream, XmppStanzaError.ToServiceUnavailable(stanza)); log.DebugFormat("Stanza handler not found for address '{0}'", address); return; } bool iqHandled = true; Stopwatch stopwatch = null; foreach (var handler in handlres) { if (log.IsDebugEnabled) { stopwatch = Stopwatch.StartNew(); } if (stanza is IQ) { var answer = handler.HandleIQ(stream, (IQ)stanza.Clone(), context); if (answer != null) { sender.SendTo(stream, answer); iqHandled = answer.Id == stanza.Id; } } else if (stanza is Message) { handler.HandleMessage(stream, (Message)stanza.Clone(), context); } else if (stanza is Presence) { handler.HandlePresence(stream, (Presence)stanza.Clone(), context); } else { sender.SendTo(stream, XmppStanzaError.ToNotAcceptable(stanza)); return; } if (log.IsDebugEnabled) { stopwatch.Stop(); log.DebugFormat("Process stanza handler '{1}' on address '{0}', time: {2}ms", address, handler.GetType().FullName, stopwatch.Elapsed.TotalMilliseconds); } } if (!iqHandled) { sender.SendTo(stream, XmppStanzaError.ToServiceUnavailable(stanza)); return; } } } catch (Exception ex) { ProcessException(ex, node, stream); } }
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 { pushStore = new DbPushStore(); var properties = new Dictionary <string, string>(1); properties.Add("connectionStringName", "default"); pushStore.Configure(properties); if (message.HasTag("active")) { var fromFullName = message.HasAttribute("username") ? message.GetAttribute("username") : message.From.ToString(); var messageToDomain = message.To.ToString().Split(new char[] { '@' })[1]; var tenant = CoreContext.TenantManager.GetTenant(messageToDomain); var tenantId = tenant != null ? tenant.TenantId : -1; var userPushList = new List <UserPushInfo>(); userPushList = pushStore.GetUserEndpoint(message.To.ToString().Split(new char[] { '@' })[0]); var firebaseAuthorization = ""; try { CallContext.SetData(TenantManager.CURRENT_TENANT, new Tenant(tenantId, "")); firebaseAuthorization = FireBase.Instance.Authorization; } catch (Exception exp) { log.DebugFormat("firebaseAuthorizationERROR: {0}", exp); } foreach (var user in userPushList) { try { var from = message.From.ToString().Split(new char[] { '@' })[0]; List <string> userId; string photoPath = ""; using (var db = new DbManager("core")) using (var command = db.Connection.CreateCommand()) { var q = new SqlQuery("core_user").Select("id").Where(Exp.Like("username", from)).Where("tenant", tenantId); userId = command.ExecuteList(q, DbRegistry.GetSqlDialect(db.DatabaseId)) .ConvertAll(r => Convert.ToString(r[0])) .ToList(); } if (userId.Count != 0) { var guid = new Guid(userId[0]); photoPath = UserPhotoManager.GetBigPhotoURL(guid); } var tRequest = WebRequest.Create("https://fcm.googleapis.com/fcm/send"); tRequest.Method = "post"; tRequest.ContentType = "application/json"; var data = new { to = user.endpoint, data = new { msg = message.Body, fromFullName = fromFullName, photoPath = photoPath } }; var serializer = new JavaScriptSerializer(); var json = serializer.Serialize(data); var byteArray = Encoding.UTF8.GetBytes(json); tRequest.Headers.Add(string.Format("Authorization: key={0}", firebaseAuthorization)); tRequest.ContentLength = byteArray.Length; using (var dataStream = tRequest.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); using (var tResponse = tRequest.GetResponse()) { using (var dataStreamResponse = tResponse.GetResponseStream()) { using (var tReader = new StreamReader(dataStreamResponse)) { var sResponseFromServer = tReader.ReadToEnd(); var str = sResponseFromServer; } } } } } catch (Exception ex) { var str = ex.Message; log.DebugFormat("PushRequestERROR: {0}", str); } } } StoreOffline(message, context.StorageManager.OfflineStorage); } }