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); }
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); }
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; } }
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); }
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); }
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); } }
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)); }
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); }
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); } }
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); }
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; }
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; }
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); } }
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; }
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; } } }
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; } } }