Пример #1
0
        public XmppHandlerResult ProcessElement(BindIq element, XmppSession session, XmppHandlerContext context)
        {
            if (element.Query.TagName.Equals("bind", StringComparison.OrdinalIgnoreCase))
            {
                if (session.Binded)
                {
                    return(Error(session, ErrorCondition.Conflict, element));
                }

                session.Bind(!string.IsNullOrEmpty(element.Query.Resource) ? element.Query.Resource : session.Jid.User);
                element.From  = element.To = null;
                element.Query = new Bind(session.Jid);
                var result = Component(Send(session, element.ToResult()));
                foreach (var s in context.Sessions.GetSessions(session.Jid))
                {
                    if (!session.Equals(s))
                    {
                        result.Add(Close(s));
                    }
                }
                return(result);
            }
            else
            {
                var resource = element.Query.Resource;
                return(session.Jid.Resource == resource?Close(session) : Error(session, ErrorCondition.ItemNotFound, element));
            }
        }
Пример #2
0
        public XmppHandlerResult ProcessElement(RegisterIq element, XmppSession session, XmppHandlerContext context)
        {
            if (element.Type == IqType.get)
            {
                element.Query.Instructions = RS.RegisterInstructions;
                element.Query.Username     = string.Empty;
                element.Query.Password     = string.Empty;
                element.ToResult();
                if (session.Jid.HasUser && context.Storages.Users.GetUser(session.Jid.User) != null)
                {
                    element.Query.Username = session.Jid.User;
                    element.Query.AddChild(new Element("registered"));
                }
                else
                {
                    element.To = null;
                }
                element.From = null;
                return(Send(session, element));
            }
            else
            {
                if (element.Query.RemoveAccount)
                {
                    if (!session.Authenticated || !session.Jid.HasUser)
                    {
                        return(Error(session, StreamErrorCondition.NotAuthorized));
                    }

                    context.Storages.Users.RemoveUser(session.Jid.User);
                    var errors = Component();
                    foreach (var s in context.Sessions.GetSessions(session.Jid.BareJid))
                    {
                        if (!session.Equals(s))
                        {
                            errors.Add(Error(s, StreamErrorCondition.NotAuthorized));
                        }
                    }

                    element.Query.Remove();
                    element.ToResult();
                    element.From = element.To = null;
                    return(Component(Send(session, element), errors));
                }

                if (string.IsNullOrEmpty(element.Query.Username))
                {
                    return(Error(session, ErrorCondition.NotAcceptable, element, RS.RegisterEmptyUsername));
                }
                if (string.IsNullOrEmpty(element.Query.Password))
                {
                    return(Error(session, ErrorCondition.NotAcceptable, element, RS.RegisterEmptyPassword));
                }
                if (Stringprep.NamePrep(element.Query.Username) != element.Query.Username)
                {
                    return(Error(session, ErrorCondition.NotAcceptable, element, RS.RegisterInvalidCharacter));
                }

                var user = context.Storages.Users.GetUser(element.Query.Username);
                if (user != null && user.Name != session.Jid.User)
                {
                    return(Error(session, ErrorCondition.Conflict, element));
                }

                context.Storages.Users.SaveUser(new XmppUser(element.Query.Username, element.Query.Password));

                element.Query.Remove();
                element.ToResult();
                if (!session.Authenticated)
                {
                    element.To = null;
                }
                element.From = null;
                return(Send(session, element));
            }
        }