public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.HasTo && iq.To != Jid) return XmppStanzaError.ToServiceUnavailable(iq); if (iq.Query is DiscoInfo && iq.Type == IqType.get) return GetDiscoInfo(stream, iq, context); if (iq.Query is DiscoItems && iq.Type == IqType.get) return GetDiscoItems(stream, iq, context); return XmppStanzaError.ToServiceUnavailable(iq); }
private IQ GetPrivate(XmppStream stream, IQ iq, XmppHandlerContext context) { var privateStore = (Private)iq.Query; if (!privateStore.HasChildElements) return XmppStanzaError.ToNotAcceptable(iq); var retrived = new List<Element>(); foreach (var childNode in privateStore.ChildNodes) { if (childNode is Element) { var elementToRetrive = (Element)childNode; var elementRestored = context.StorageManager.PrivateStorage.GetPrivate(iq.From, elementToRetrive); retrived.Add(elementRestored ?? elementToRetrive); } } privateStore.RemoveAllChildNodes(); foreach (var element in retrived) { privateStore.AddChild(element); } iq.SwitchDirection(); iq.Type = IqType.result; return iq; }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (!iq.HasTo) iq.To = iq.From; if (iq.Type == IqType.get) return GetVCardSearch(stream, iq, context); else if (iq.Type == IqType.set) return SetVCardSearch(stream, iq, context); else return XmppStanzaError.ToBadRequest(iq); }
private void ProcessAuthIQSet(XmppStream stream, AuthIq iq, XmppHandlerContext context) { if (string.IsNullOrEmpty(iq.Query.Username) || string.IsNullOrEmpty(iq.Query.Resource)) { context.Sender.SendTo(stream, XmppStanzaError.ToNotAcceptable(iq)); return; } bool authorized = false; if (!string.IsNullOrEmpty(iq.Query.Digest)) { authorized = AuthDigest(iq.Query.Username, iq.Query.Digest, stream, context.UserManager); } if (!string.IsNullOrEmpty(iq.Query.Password)) { authorized = AuthPlain(iq.Query.Username, iq.Query.Password, stream, context.UserManager); } if (authorized) { stream.Authenticate(iq.Query.Username); var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.To = iq.From; answer.From = iq.To; context.Sender.SendTo(stream, answer); } else { context.Sender.SendTo(stream, XmppStanzaError.ToNotAuthorized(iq)); } }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.To != null && iq.From != iq.To) return XmppStanzaError.ToForbidden(iq); if (iq.Type == IqType.get) return GetPrivate(stream, iq, context); else if (iq.Type == IqType.set) return SetPrivate(stream, iq, context); else return XmppStanzaError.ToBadRequest(iq); }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.HasTo && iq.To != iq.From) return XmppStanzaError.ToForbidden(iq); if (iq.Type == IqType.get) return GetRoster(stream, iq, context); else if (iq.Type == IqType.set) return SetRoster(stream, iq, context); else return null; }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (!iq.HasTo || !iq.To.HasUser) return XmppStanzaError.ToServiceUnavailable(iq); var session = context.SessionManager.GetSession(iq.To); if (session != null) context.Sender.SendTo(session, iq); return null; }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.Query is PrivateLog && iq.Type == IqType.get) return GetPrivateLog(stream, iq, context); if (iq.Query is PrivateLog && iq.Type == IqType.set) return SetPrivateLog(stream, iq, context); if (iq.Query is PrivateLog && (iq.Type == IqType.result || iq.Type == IqType.error)) return null; if (iq.Query is History && iq.Type == IqType.get) return GetHistory(stream, iq, context); return XmppStanzaError.ToServiceUnavailable(iq); }
private IQ ProcessSession(XmppStream stream, IQ iq, XmppHandlerContext context) { var session = context.SessionManager.GetSession(iq.From); if (session == null) return XmppStanzaError.ToItemNotFound(iq); var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.Session = new Core.protocol.iq.session.Session(); session.Active = true; return answer; }
private IQ SetVCard(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.From != iq.To) return XmppStanzaError.ToForbidden(iq); var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.To = iq.From; answer.From = iq.To; context.StorageManager.VCardStorage.SetVCard(iq.To, iq.Vcard); answer.Vcard = iq.Vcard; return answer; }
public override IQ HandleIQ(ASC.Xmpp.Server.Streams.XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.Vcard!=null && iq.Type==IqType.get) { //Handle vcard iq.Vcard = Member.GetVcard(); iq.Type = IqType.result; iq.SwitchDirection(); return iq; } return base.HandleIQ(stream, iq, context); }
private IQ GetPrivateLog(XmppStream stream, IQ iq, XmppHandlerContext context) { if (!iq.HasTo) return XmppStanzaError.ToBadRequest(iq); var privateLog = (PrivateLog)iq.Query; privateLog.RemoveAllChildNodes(); var logging = archiveStore.GetMessageLogging(iq.From, iq.To); privateLog.AddChild(new PrivateLogItem() { Jid = iq.To, Log = logging }); iq.SwitchDirection(); iq.Type = IqType.result; return iq; }
protected virtual IQ GetDiscoInfo(XmppStream stream, IQ iq, XmppHandlerContext context) { if (((DiscoInfo)iq.Query).Node != null) return XmppStanzaError.ToServiceUnavailable(iq); var service = ServiceManager.GetService(Jid); if (service == null) return XmppStanzaError.ToItemNotFound(iq); var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.From = Jid; answer.To = iq.From; answer.Query = service.DiscoInfo; return answer; }
private IQ GetVCard(XmppStream stream, IQ iq, XmppHandlerContext context) { var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.To = iq.From; answer.From = iq.To; answer.Vcard = iq.To.HasUser ? context.StorageManager.VCardStorage.GetVCard(iq.To) : GetServiceVcard(iq.To, context); if (answer.Vcard == null) return XmppStanzaError.ToNotFound(iq); return answer; }
private IQ ProcessBind(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.Type != IqType.set) return XmppStanzaError.ToBadRequest(iq); var answer = new IQ(IqType.result); answer.Id = iq.Id; var bind = (Bind)iq.Bind; var resource = !string.IsNullOrEmpty(bind.Resource) ? bind.Resource : stream.User; if (bind.TagName.Equals("bind", StringComparison.OrdinalIgnoreCase)) { var jid = new Jid(stream.User, stream.Domain, resource); var session = context.SessionManager.GetSession(jid); if (session != null) { if (session.Stream.Id != stream.Id) { context.Sender.SendToAndClose(session.Stream, XmppStreamError.Conflict); } else { return XmppStanzaError.ToConflict(iq); } } stream.BindResource(resource); context.SessionManager.AddSession(new XmppSession(jid, stream)); answer.Bind = new Bind(jid); } else if (bind.TagName.Equals("unbind", StringComparison.OrdinalIgnoreCase)) { if (!stream.Resources.Contains(resource)) return XmppStanzaError.ToNotFound(iq); context.SessionManager.CloseSession(iq.From); stream.UnbindResource(resource); if (stream.Resources.Count == 0) { context.Sender.CloseStream(stream); } } else { return XmppStanzaError.ToBadRequest(iq); } if (stream.MultipleResources) answer.To = iq.From; return answer; }
private IQ GetVCardSearch(XmppStream stream, IQ iq, XmppHandlerContext context) { var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.To = iq.From; answer.From = iq.To; var search = new Search(); search.Nickname = string.Empty; search.Firstname = string.Empty; search.Lastname = string.Empty; answer.Query = search; return answer; }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { Unique unique = (Unique)iq.SelectSingleElement(typeof(Unique)); if (unique != null) { // Gen unique id unique.Value = UniqueId.CreateNewId(16); iq.Type = IqType.result; iq.SwitchDirection(); return iq; } iq.SwitchDirection(); iq.Type = IqType.error; iq.Error = new Error(ErrorType.cancel, ErrorCondition.ItemNotFound); return iq; }
protected virtual IQ GetDiscoItems(XmppStream stream, IQ iq, XmppHandlerContext context) { if (((DiscoItems)iq.Query).Node != null) return XmppStanzaError.ToServiceUnavailable(iq); var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.From = Jid; answer.To = iq.From; var items = new DiscoItems(); answer.Query = items; foreach (var service in ServiceManager.GetChildServices(Jid)) { if (service.DiscoItem != null) items.AddDiscoItem(service.DiscoItem); } return answer; }
protected override IQ GetDiscoItems(XmppStream stream, IQ iq, XmppHandlerContext context) { if (((DiscoItems)iq.Query).Node != null) return XmppStanzaError.ToServiceUnavailable(iq); var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.From = Jid; answer.To = iq.From; var items = new DiscoItems(); answer.Query = items; if (realJid != null) { items.AddDiscoItem().Jid = realJid; } return answer; }
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) || string.IsNullOrEmpty(register.Password) || 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 (string.IsNullOrEmpty(register.Password)) error.Error.Message = "Empty required field Password."; 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, register.Password); context.UserManager.SaveUser(user); register.RemoveAllChildNodes(); if (stream.Authenticated) iq.SwitchDirection(); else iq.To = null; iq.From = null; return iq; }
private IQ GetRoster(XmppStream stream, IQ iq, XmppHandlerContext context) { var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.To = iq.From; var roster = new Roster(); answer.Query = roster; foreach (var item in context.StorageManager.RosterStorage.GetRosterItems(iq.From)) { roster.AddRosterItem(item.ToRosterItem()); } var session = context.SessionManager.GetSession(iq.From); session.RosterRequested = true; session.GetRosterTime = DateTime.UtcNow; return answer; }
private IQ SetPrivate(XmppStream stream, IQ iq, XmppHandlerContext context) { var @private = (Private)iq.Query; if ([email protected]) return XmppStanzaError.ToNotAcceptable(iq); foreach (var childNode in @private.ChildNodes) { if (childNode is Element) { context.StorageManager.PrivateStorage.SetPrivate(iq.From, (Element)childNode); } } iq.Query = null; iq.SwitchDirection(); iq.Type = IqType.result; return iq; }
private IQ GetRegister(XmppStream stream, IQ iq, XmppHandlerContext context) { var register = (Register)iq.Query; register.Username = string.Empty; register.Password = string.Empty; iq.Type = IqType.result; if (iq.From.HasUser && context.UserManager.IsUserExists(iq.From)) { register.Username = iq.From.User; register.AddChild(new Element("registered")); iq.SwitchDirection(); iq.From = null; } else { iq.From = iq.To = null; } return iq; }
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 { XmppStanzaError.ToForbidden(iq); } } else { XmppStanzaError.ToBadRequest(iq); } } else { XmppStanzaError.ToForbidden(iq); } if (!iq.Switched) { iq.SwitchDirection(); } iq.From = Room.Jid; return iq; }
private IQ GetUserDisco(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.To.HasResource) { var session = context.SessionManager.GetSession(iq.To); if (session != null && iq.Query is DiscoInfo) { var discoInfo = session.ClientInfo.GetDiscoInfo(((DiscoInfo)iq.Query).Node); if (discoInfo != null) { iq.Query = discoInfo; return ToResult(iq); } } if (session == null) return XmppStanzaError.ToRecipientUnavailable(iq); context.Sender.SendTo(session, iq); IdleWatcher.StartWatch(iq.Id, TimeSpan.FromSeconds(4.5f), IQLost, iq); } else { if (iq.Query is DiscoInfo && context.UserManager.IsUserExists(iq.To)) { ((DiscoInfo)iq.Query).AddIdentity(new DiscoIdentity("registered", "account")); return ToResult(iq); } else if (iq.Query is DiscoItems) { foreach (var s in context.SessionManager.GetBareJidSessions(iq.To)) { ((DiscoItems)iq.Query).AddDiscoItem(new DiscoItem() { Jid = s.Jid }); } return ToResult(iq); } return XmppStanzaError.ToServiceUnavailable(iq); } return null; }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.Type != IqType.get || !iq.HasTo) return XmppStanzaError.ToNotAcceptable(iq); var currSession = context.SessionManager.GetSession(iq.From); if (currSession == null || !currSession.Available) return XmppStanzaError.ToForbidden(iq); double seconds = 0;//available if (iq.To.IsServer) { seconds = (DateTime.UtcNow - startedTime).TotalSeconds; } else { var session = context.SessionManager.GetSession(iq.To); if (session == null || !session.Available) { var lastActivity = context.StorageManager.OfflineStorage.GetLastActivity(iq.To); if (lastActivity != null) { seconds = (DateTime.UtcNow - lastActivity.LogoutDateTime).TotalSeconds; iq.Query.Value = lastActivity.Status; } else { return XmppStanzaError.ToRecipientUnavailable(iq); } } } ((Last)(iq.Query)).Seconds = (int)seconds; iq.Type = IqType.result; iq.SwitchDirection(); return iq; }
private IQ SetVCardSearch(XmppStream stream, IQ iq, XmppHandlerContext context) { var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.To = iq.From; answer.From = iq.To; var search = (Search)iq.Query; var pattern = new Vcard(); pattern.Nickname = search.Nickname; pattern.Name = new Name(search.Lastname, search.Firstname, null); //pattern.AddEmailAddress(new Email() { UserId = search.Email }); search = new Search(); foreach (var vcard in context.StorageManager.VCardStorage.Search(pattern)) { var item = new SearchItem(); item.Jid = vcard.JabberId; item.Nickname = vcard.Nickname; if (vcard.Name != null) { item.Firstname = vcard.Name.Given; item.Lastname = vcard.Name.Family; } var email = vcard.GetPreferedEmailAddress(); if (email != null) { item.Email = email.UserId; } search.AddChild(item); } answer.Query = search; return answer; }
public override IQ HandleIQ(XmppStream stream, IQ iq, XmppHandlerContext context) { if (iq.Type == IqType.result || iq.Type == IqType.error) { IdleWatcher.StopWatch(iq.Id); var session = context.SessionManager.GetSession(iq.From); if (session != null && iq.Query is DiscoInfo) { session.ClientInfo.SetDiscoInfo((DiscoInfo)iq.Query); } if (iq.HasTo) { session = context.SessionManager.GetSession(iq.To); if (session != null) context.Sender.SendTo(session, iq); return null; } } else if (iq.HasTo && iq.To.HasUser) { return GetUserDisco(stream, iq, context); } return base.HandleIQ(stream, iq, context); }
public void OwnerCommand(IQ iq, MucRoomMember member) { Owner owner = iq.Query as Owner; // look for destroy if (owner != null) { Destroy destroy = owner.SelectSingleElement(typeof(Destroy)) as Destroy; if (destroy != null) { DestroyRoom(destroy); return; } if (!owner.HasChildElements) { // Return config owner.AddChild(RoomSettings.GetDataForm(member.Jid)); } Data dataSubmit = (Data)owner.SelectSingleElement(typeof(Data)); // form config if (dataSubmit != null && dataSubmit.Type == XDataFormType.submit) { RoomSettings.SubmitForm(dataSubmit); SettingsSave(); iq.Query.RemoveAllChildNodes(); } } iq.Type = IqType.result; iq.SwitchDirection(); }
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) { 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; } } }