Exemplo n.º 1
0
        private List <UserRosterItem> GetASCRosterItems(string userName)
        {
            var items  = new List <UserRosterItem>();
            var domain = Core.Server.ServerDomain;

            foreach (var u in CoreContext.UserManager.GetUsers())
            {
                if (string.Compare(userName, u.UserName, true) == 0)
                {
                    continue;
                }

                var item = new UserRosterItem(new Jid(u.UserName, domain, null).ToString())
                {
                    Name         = string.Format("{0} {1}", u.LastName, u.FirstName),
                    Subscribtion = SubscriptionType.both,
                    Ask          = AskType.NONE,
                    Groups       = null
                };
                foreach (var g in CoreContext.UserManager.GetUserGroups(u.ID, CoreContext.GroupManager.MainGroupCategory.ID))
                {
                    if (item.Groups == null)
                    {
                        item.Groups = new List <string>();
                    }
                    item.Groups.Add(g.Name);
                }
                items.Add(item);
            }
            return(items);
        }
Exemplo n.º 2
0
        private IDictionary <string, UserRosterItemDic> LoadRosterItems()
        {
            var items = new Dictionary <string, UserRosterItemDic>();

            using (var connect = GetDbConnection())
                using (var command = connect.CreateCommand())
                {
                    command.CommandText = "select Jid, Name, Subscription, Ask, Groups, UserName from Roster";
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var item = new UserRosterItem(reader.GetString(0))
                            {
                                Name         = reader[1] as string,
                                Subscribtion = !reader.IsDBNull(2) ? (SubscriptionType)reader.GetInt32(2) : default(SubscriptionType),
                                Ask          = !reader.IsDBNull(3) ? (AskType)reader.GetInt32(3) : default(AskType),
                                Groups       = !reader.IsDBNull(4) ?
                                               new List <string>(((string)reader[4]).Split(new[] { GroupSeparator }, StringSplitOptions.RemoveEmptyEntries)) :
                                               null
                            };
                            var userName = reader.GetString(5);
                            if (!items.ContainsKey(userName))
                            {
                                items[userName] = new UserRosterItemDic();
                            }
                            items[userName][item.Jid] = item;
                        }
                    }
                }
            return(items);
        }
Exemplo n.º 3
0
        private void SetState(State state, UserRosterItem itemSendingPresence, UserRosterItem itemRecivingPresence)
        {
            Debug.Assert(itemSendingPresence != null);
            if (state == State.None)
            {
                itemSendingPresence.Subscribtion = SubscriptionType.none;
                itemSendingPresence.Ask          = AskType.NONE;
            }
            else if (state == State.None_PendingIn)
            {
                itemSendingPresence.Subscribtion = SubscriptionType.none;
                itemSendingPresence.Ask          = AskType.subscribe;
            }
            else if (state == State.None_PendingInOut)
            {
                itemSendingPresence.Subscribtion = SubscriptionType.none;
                itemSendingPresence.Ask          = AskType.subscribe;

                Debug.Assert(itemRecivingPresence != null);

                itemRecivingPresence.Ask = AskType.subscribe;
            }
            else if (state == State.From)
            {
                itemSendingPresence.Subscribtion = SubscriptionType.from;
                itemSendingPresence.Ask          = AskType.NONE;
            }
            else if (state == State.From_PendingOut)
            {
                itemSendingPresence.Subscribtion = SubscriptionType.from;
                itemSendingPresence.Ask          = AskType.NONE;
                Debug.Assert(itemRecivingPresence != null);

                itemRecivingPresence.Ask = AskType.subscribe;
            }
            else if (state == State.To)
            {
                itemSendingPresence.Subscribtion = SubscriptionType.to;
                itemSendingPresence.Ask          = AskType.NONE;
            }
            else if (state == State.To_PendingIn)
            {
                itemSendingPresence.Subscribtion = SubscriptionType.to;
                itemSendingPresence.Ask          = AskType.subscribe;
            }
            else if (state == State.Both)
            {
                itemSendingPresence.Subscribtion = SubscriptionType.both;
                itemSendingPresence.Ask          = AskType.NONE;
                Debug.Assert(itemRecivingPresence != null);

                itemRecivingPresence.Subscribtion = SubscriptionType.both;
                itemRecivingPresence.Ask          = AskType.NONE;
            }
        }
Exemplo n.º 4
0
        private UserRosterItem GetUserRosterItem(Jid user, Jid userInRoster)
        {
            var rosterItem = storages.RosterStorage.GetRosterItem(user, userInRoster);

            if (rosterItem == null)
            {
                rosterItem = new UserRosterItem(userInRoster);
                rosterItem.Subscribtion = SubscriptionType.none;
                rosterItem.Ask          = AskType.NONE;
            }
            return(rosterItem);
        }
Exemplo n.º 5
0
        public void RosterTest()
        {
            foreach (var i in store.GetRosterItems(jid))
            {
                store.RemoveRosterItem(jid, i.Jid);
            }

            var roster = store.GetRosterItems(jid);

            CollectionAssert.IsEmpty(roster);

            var r = new UserRosterItem(new Jid("x"))
            {
                Name         = "y",
                Subscribtion = SubscriptionType.from,
                Ask          = AskType.subscribe,
            };

            r.Groups.AddRange(new[] { "g1", "g2" });
            store.SaveRosterItem(jid, r);
            store.SaveRosterItem(jid, r);

            roster = store.GetRosterItems(jid);
            Assert.AreEqual(1, roster.Count);
            Assert.AreEqual("x", roster[0].Jid.ToString());
            Assert.AreEqual("y", roster[0].Name);
            Assert.AreEqual(SubscriptionType.from, roster[0].Subscribtion);
            Assert.AreEqual(AskType.subscribe, roster[0].Ask);
            CollectionAssert.AreEqual(new[] { "g1", "g2" }, roster[0].Groups);

            r = store.GetRosterItem(jid, new Jid("x"));
            Assert.IsNotNull(r);

            roster = store.GetRosterItems(jid, SubscriptionType.from);
            Assert.AreEqual(1, roster.Count);
            roster = store.GetRosterItems(jid, SubscriptionType.both);
            Assert.AreEqual(0, roster.Count);

            foreach (var i in store.GetRosterItems(jid))
            {
                store.RemoveRosterItem(jid, i.Jid);
            }

            store.SaveRosterItem(jid, new UserRosterItem(new Jid("x")));
            roster = store.GetRosterItems(jid);
            Assert.AreEqual(1, roster.Count);
            Assert.AreEqual("x", roster[0].Jid.ToString());
            Assert.AreEqual("x", roster[0].Name);
            Assert.AreEqual(default(SubscriptionType), roster[0].Subscribtion);
            Assert.AreEqual(default(AskType), roster[0].Ask);
            CollectionAssert.IsEmpty(roster[0].Groups);
        }
Exemplo n.º 6
0
 private void UpdateItems(Presence presence, ref UserRosterItem fromRosterItem, ref UserRosterItem toRosterItem)
 {
     try
     {
         storages.RosterStorage.SaveRosterItem(presence.From, toRosterItem);
         storages.RosterStorage.SaveRosterItem(presence.To, fromRosterItem);
     }
     catch (JabberException)
     {
         //Load back
         toRosterItem   = GetUserRosterItem(presence.From, presence.To);
         fromRosterItem = GetUserRosterItem(presence.To, presence.From);
     }
 }
Exemplo n.º 7
0
        public override UserRosterItem SaveRosterItem(Jid rosterJid, UserRosterItem item)
        {
            if (item == null)
            {
                throw new ArgumentNullException("item");
            }

            ASCContext.SetCurrentTenant(rosterJid.Server);
            if (IsASCRosterItem(rosterJid, item.Jid))
            {
                throw new JabberException(ErrorCode.Forbidden);
            }

            return(base.SaveRosterItem(rosterJid, item));
        }
Exemplo n.º 8
0
        private UserRosterItem ToUserRosterItem(UserInfo u, string server)
        {
            var item = new UserRosterItem(new Jid(u.UserName + "@" + server))
            {
                Name         = UserFormatter.GetUserName(u),
                Subscribtion = SubscriptionType.both,
                Ask          = AskType.NONE,
            };

            foreach (var g in ASCContext.UserManager.GetUserGroups(u.ID))
            {
                item.Groups.Add(g.Name);
            }
            return(item);
        }
Exemplo n.º 9
0
        public UserRosterItem SaveOrUpdateRosterItem(string userName, UserRosterItem item)
        {
            if (item == null)
            {
                throw new ArgumentNullException("item");
            }
            if (IsASCRosterItem(userName, item.Jid))
            {
                throw new JabberForbiddenException();
            }

            try
            {
                lock (syncRoot)
                {
                    if (string.IsNullOrEmpty(item.Name))
                    {
                        item.Name = item.Jid;
                    }

                    ExecuteNonQuery(
                        "insert or replace into Roster(UserName, Jid, Name, Subscription, Ask, Groups) values (@userName, @jid, @name, @subscription, @ask, @groups)",
                        new[] { "userName", "jid", "name", "subscription", "ask", "groups" },
                        new object[] { userName, item.Jid, item.Name, (Int32)item.Subscribtion, (Int32)item.Ask, item.Groups != null ? item.Groups.ToArray() : null }
                        );
                    if (!RosterItems.ContainsKey(userName))
                    {
                        RosterItems[userName] = new UserRosterItemDic();
                    }
                    RosterItems[userName][item.Jid] = item;

                    return(item);
                }
            }
            catch (Exception e)
            {
                throw new JabberServiceUnavailableException("Could not save or update roster item.", e);
            }
        }
Exemplo n.º 10
0
        private State GetState(UserRosterItem itemSendingPresence, UserRosterItem itemRecivingPresence)
        {
            var state = State.None;

            Debug.Assert(itemSendingPresence != null);
            if (itemSendingPresence.Subscribtion == SubscriptionType.none)
            {
                if (itemSendingPresence.Ask == AskType.subscribe)
                {
                    state = itemRecivingPresence != null && itemRecivingPresence.Ask == AskType.subscribe ?
                            State.None_PendingInOut :
                            State.None_PendingIn;
                }
                else
                {
                    state = itemRecivingPresence.Ask == AskType.subscribe ?
                            State.None_PendingOut :
                            State.None;
                }
            }
            else if (itemSendingPresence.Subscribtion == SubscriptionType.to)
            {
                state = itemSendingPresence.Ask == AskType.subscribe ?
                        State.To_PendingIn :
                        State.To;
            }
            else if (itemSendingPresence.Subscribtion == SubscriptionType.from)
            {
                state = itemRecivingPresence != null && itemRecivingPresence.Ask == AskType.subscribe ?
                        State.From_PendingOut :
                        State.From;
            }
            else if (itemSendingPresence.Subscribtion == SubscriptionType.both)
            {
                state = State.Both;
            }
            return(state);
        }
Exemplo n.º 11
0
		private List<UserRosterItem> GetASCRosterItems(string userName)
		{
			var items = new List<UserRosterItem>();
			var domain = Core.Server.ServerDomain;

			foreach (var u in CoreContext.UserManager.GetUsers())
			{
				if (string.Compare(userName, u.UserName, true) == 0) continue;

				var item = new UserRosterItem(new Jid(u.UserName, domain, null).ToString())
				{
					Name = string.Format("{0} {1}", u.LastName, u.FirstName),
					Subscribtion = SubscriptionType.both,
					Ask = AskType.NONE,
					Groups = null
				};
				foreach (var g in CoreContext.UserManager.GetUserGroups(u.ID, CoreContext.GroupManager.MainGroupCategory.ID))
				{
					if (item.Groups == null) item.Groups = new List<string>();
					item.Groups.Add(g.Name);
				}
				items.Add(item);
			}
			return items;
		}
Exemplo n.º 12
0
		private IDictionary<string, UserRosterItemDic> LoadRosterItems()
		{
			var items = new Dictionary<string, UserRosterItemDic>();
			using (var connect = GetDbConnection())
			using (var command = connect.CreateCommand())
			{
				command.CommandText = "select Jid, Name, Subscription, Ask, Groups, UserName from Roster";
				using (var reader = command.ExecuteReader())
				{
					while (reader.Read())
					{
						var item = new UserRosterItem(reader.GetString(0))
						{
							Name = reader[1] as string,
							Subscribtion = !reader.IsDBNull(2) ? (SubscriptionType)reader.GetInt32(2) : default(SubscriptionType),
							Ask = !reader.IsDBNull(3) ? (AskType)reader.GetInt32(3) : default(AskType),
							Groups = !reader.IsDBNull(4) ?
								new List<string>(((string)reader[4]).Split(new[] { GroupSeparator }, StringSplitOptions.RemoveEmptyEntries)) :
								null
						};
						var userName = reader.GetString(5);
						if (!items.ContainsKey(userName)) items[userName] = new UserRosterItemDic();
						items[userName][item.Jid] = item;
					}
				}
			}
			return items;
		}
Exemplo n.º 13
0
		public UserRosterItem SaveOrUpdateRosterItem(string userName, UserRosterItem item)
		{
			if (item == null) throw new ArgumentNullException("item");
			if (IsASCRosterItem(userName, item.Jid)) throw new JabberForbiddenException();

			try
			{
				lock (syncRoot)
				{
					if (string.IsNullOrEmpty(item.Name)) item.Name = item.Jid;

					ExecuteNonQuery(
						"insert or replace into Roster(UserName, Jid, Name, Subscription, Ask, Groups) values (@userName, @jid, @name, @subscription, @ask, @groups)",
						new[] { "userName", "jid", "name", "subscription", "ask", "groups" },
						new object[] { userName, item.Jid, item.Name, (Int32)item.Subscribtion, (Int32)item.Ask, item.Groups != null ? item.Groups.ToArray() : null }
					);
					if (!RosterItems.ContainsKey(userName)) RosterItems[userName] = new UserRosterItemDic();
					RosterItems[userName][item.Jid] = item;

					return item;
				}
			}
			catch (Exception e)
			{
				throw new JabberServiceUnavailableException("Could not save or update roster item.", e);
			}
		}
Exemplo n.º 14
0
		private IQ SetRoster(XmppStream stream, IQ iq, XmppHandlerContext context)
		{
			var answer = new IQ(IqType.result);
			answer.Id = iq.Id;
			answer.To = iq.From;
			answer.From = iq.To;

			iq.Id = UniqueId.CreateNewId();
			var roster = (Roster)iq.Query;
			UserRosterItem item = null;
			try
			{
				var rosterItems = roster.GetRoster();
				if (rosterItems.Length != 1) throw new JabberException(ErrorCode.BadRequest);

				var rosterItem = rosterItems[0];
				item = UserRosterItem.FromRosterItem(rosterItem);

				if (rosterItem.Subscription == SubscriptionType.remove)
				{
					context.StorageManager.RosterStorage.RemoveRosterItem(iq.From, item.Jid);

					//Send presences
					var unsubscribe = new Presence() { Type = PresenceType.unsubscribe, To = item.Jid, From = iq.From };
					var unsubscribed = new Presence() { Type = PresenceType.unsubscribed, To = item.Jid, From = iq.From };
					var unavailable = new Presence() { Type = PresenceType.unavailable, To = item.Jid, From = iq.From };

					bool sended = false;
					foreach (var session in context.SessionManager.GetBareJidSessions(item.Jid))
					{
						if (session.RosterRequested)
						{
							context.Sender.SendTo(session, unsubscribe);
							context.Sender.SendTo(session, unsubscribed);
							sended = true;
						}
						context.Sender.SendTo(session, unavailable);
					}
					if (!sended)
					{
						context.StorageManager.OfflineStorage.SaveOfflinePresence(unsubscribe);
						context.StorageManager.OfflineStorage.SaveOfflinePresence(unsubscribed);
					}
				}
				else
				{
					item = context.StorageManager.RosterStorage.SaveRosterItem(iq.From, item);
					roster.RemoveAllChildNodes();
					roster.AddRosterItem(item.ToRosterItem());
				}
				//send all available user's resources
				context.Sender.Broadcast(context.SessionManager.GetBareJidSessions(iq.From), iq);
			}
			catch (System.Exception)
			{
				roster.RemoveAllChildNodes();
				item = context.StorageManager.RosterStorage.GetRosterItem(iq.From, item.Jid);
				if (item != null)
				{
					roster.AddRosterItem(item.ToRosterItem());
					context.Sender.Broadcast(context.SessionManager.GetBareJidSessions(iq.From), iq);
				}
				throw;
			}

			return answer;
		}
Exemplo n.º 15
0
        private void ChangeOutboundPresence(State state, UserRosterItem itemSendingPresence, UserRosterItem itemRecivingPresence, PresenceType newType, out bool bRoute)
        {
            //Change state of sending presence!
            bRoute = false;

            if (newType == PresenceType.subscribed)
            {
                switch (state)
                {
                case State.None_PendingIn:
                    bRoute = true;
                    SetState(State.From, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.None_PendingInOut:
                    bRoute = true;
                    SetState(State.From_PendingOut, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.To_PendingIn:
                    bRoute = true;
                    SetState(State.Both, itemSendingPresence, itemRecivingPresence);
                    break;
                }
            }
            if (newType == PresenceType.unsubscribed)
            {
                switch (state)
                {
                case State.None_PendingIn:
                    bRoute = true;
                    SetState(State.None, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.None_PendingInOut:
                    bRoute = true;
                    SetState(State.None_PendingOut, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.To_PendingIn:
                    bRoute = true;
                    SetState(State.To, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.From:
                    bRoute = true;
                    SetState(State.None, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.From_PendingOut:
                    bRoute = true;
                    SetState(State.None_PendingOut, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.Both:
                    bRoute = true;
                    SetState(State.To, itemSendingPresence, itemRecivingPresence);
                    break;
                }
            }
        }
Exemplo n.º 16
0
        private void ChangeInboundPresence(State state, UserRosterItem itemSendingPresence, UserRosterItem itemRecivingPresence, PresenceType newType, out bool bRoute, out bool bAutoReply)
        {
            bRoute     = false;
            bAutoReply = false;
            //Inbound! change state of reciving item!!!
            if (newType == PresenceType.subscribe)
            {
                switch (state)
                {
                case State.None:
                    SetState(State.None_PendingIn, itemSendingPresence, itemRecivingPresence);
                    bRoute = true;
                    break;

                case State.None_PendingOut:
                    SetState(State.None_PendingInOut, itemSendingPresence, itemRecivingPresence);
                    bRoute = true;
                    break;

                case State.To:
                    SetState(State.To_PendingIn, itemSendingPresence, itemRecivingPresence);
                    bRoute = true;
                    break;

                case State.From:
                case State.From_PendingOut:
                case State.Both:
                    bAutoReply = true;
                    break;
                }
            }
            if (newType == PresenceType.unsubscribe)
            {
                switch (state)
                {
                case State.None_PendingIn:
                    bRoute     = true;
                    bAutoReply = true;
                    SetState(State.None, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.None_PendingInOut:
                    bRoute     = true;
                    bAutoReply = true;
                    SetState(State.None_PendingOut, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.To_PendingIn:
                    bRoute     = true;
                    bAutoReply = true;
                    SetState(State.To, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.From:
                    bRoute     = true;
                    bAutoReply = true;
                    SetState(State.None, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.From_PendingOut:
                    bRoute     = true;
                    bAutoReply = true;
                    SetState(State.None_PendingOut, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.Both:
                    bRoute     = true;
                    bAutoReply = true;
                    SetState(State.To, itemSendingPresence, itemRecivingPresence);
                    break;
                }
            }
            if (newType == PresenceType.subscribed)
            {
                switch (state)
                {
                case State.None_PendingOut:
                    bRoute = true;
                    SetState(State.To, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.None_PendingInOut:
                    bRoute = true;
                    SetState(State.To_PendingIn, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.From_PendingOut:
                    bRoute = true;
                    SetState(State.Both, itemSendingPresence, itemRecivingPresence);
                    break;
                }
            }
            if (newType == PresenceType.unsubscribed)
            {
                switch (state)
                {
                case State.None_PendingOut:
                    bRoute = true;
                    SetState(State.None, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.None_PendingInOut:
                    bRoute = true;
                    SetState(State.None_PendingIn, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.To:
                    bRoute = true;
                    SetState(State.None, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.To_PendingIn:
                    bRoute = true;
                    SetState(State.None_PendingIn, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.From_PendingOut:
                    bRoute = true;
                    SetState(State.From, itemSendingPresence, itemRecivingPresence);
                    break;

                case State.Both:
                    bRoute = true;
                    SetState(State.From, itemSendingPresence, itemRecivingPresence);
                    break;
                }
            }
        }