Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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;
                }
            }
        }
Пример #5
0
        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);
            }
        }
Пример #6
0
        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);
            }
        }