public void notify(Packet packet) {
            Packet query = packet.getFirstChild("query");
            foreach (Packet item in query.Children) {
                String jid = item["jid"];
                String name = item["name"];
                String subscribtion = item["subscription"];
                String ask = item["ask"];						// TODO: Revise (can be null sometimes and brakes the execution)
                String group = item.getChildValue("group");
                Status status = Status.unavailable;

				if(subscribtion.Equals("none") && ask != null && ask.Equals("subscribe")) {
					status = Status.inviteSent;
				} else if (subscribtion.Equals("to")) {
					status = Status.inviteAccepted;
				} else if (subscribtion.Equals("both")) {
					status = Status.unavailable;
					model.sendPresence(model.Me.Status, model.Me.StatusMessage);
				} else if (subscribtion.Equals("none")) {//unsubscribed
					RemoveContactDelegate rcd = new RemoveContactDelegate(model.gui.RemoveContact);
					model.gui.Invoke(rcd, new Object[] { jid });

					//remove from client
					//send roster-remove
					//model.sendRosterRemove(jid);   DO NOT !!!!!!!!!!!  UNCOMMENT THIS LINE IN ANY CASE
					return;
				} else {
					return;
				}
				UpdateContactDelegate del = new UpdateContactDelegate(model.gui.UpdateContact);
				model.gui.Invoke(del, new Object[] { jid, name, group, status });                
            }
        }
Пример #2
0
        public override void run()
        {
            for (Packet packet = packetQueue.dequeue(); packet != null; packet = packetQueue.dequeue())
            {
                Packet child;
                String matchString;
                Console.WriteLine("Receiving packet: " + packet.ToString());
                if (packet.Element.Equals("iq", StringComparison.OrdinalIgnoreCase))
                {
                    child = packet.getFirstChild("query");
                    if (child == null)
                    {
                        matchString = "jabber:iq:register";
                    }
                    else
                    {
                        matchString = child.Namespace;
                    }
                }
                else
                {
                    matchString = packet.Element;
                }

/*
 *                              if (matchString.Equals("terminate")) {
 *                                      saveToFile();
 *                                      return;
 *                              }
 */

                try {
                    lock (packetListeners) {
                        foreach (PacketListener listener in packetListeners[matchString])
                        {
                            listener.notify(packet);
                        }
                    }
                } catch (Exception ex) {
                    Console.WriteLine("Exception in QueueThread: " + ex.ToString());
                }                 // try/catch 1
                try {
                    lock (packetListeners) {
                        foreach (PacketListener listener in packetListeners[""])
                        {
                            listener.notify(packet);
                        }
                    }
                } catch (Exception ex) {
                }         // try/catch 2
            }             // for
        }
Пример #3
0
        /// <summary>
        /// Главниот дел - хендлерот за пакети
        /// </summary>
        /// <param name="packet"></param>
        public void notify(Packet packet)
        {
		
            String type = packet.Type;
            Packet query = packet.getFirstChild("query");
            username = query.getChildValue("username");
            iq.setID(packet.getID());
            iq.Session = packet.Session;
            iq.getChildren().Clear();
            iq.Type = "result";

            reply = new Packet("query");
            reply.setAttribute("xmlns", "jabber:iq:auth");
            reply.Parent = iq;

            user = userIndex.getUser(username);
            if (user == null)
            {
                sendErrorPacket(404, "User not found");
                return;
            }

            if (userIndex.sessionIndex.ContainsValue(user) == true)
            {
                sendErrorPacket(404, "User already Logged In");
                return;
            }
            

            if (type.Equals("get"))
            {
                sendGetPacket();
                return;
            }
            else if (type.Equals("set"))
            {
                session = packet.Session;
					 if (session.Status != Session.SessionStatus.streaming) {
						 sendErrorPacket(400, "Server name does not match");
						 return;
					 }
                resource = query.getChildValue("resource");
                if (resource == null)
                {
                    sendErrorPacket(404, "You must send resource");
                    return;
                }
                handleSetPacket(query);
                return;
            }
        }
Пример #4
0
        public void notify(Packet packet) {
			try {
				if (packet.ID.StartsWith("auth_get")) {
					Packet query = packet.getFirstChild("query");
					String token = query.getChildValue("token");
                    int sequence = Convert.ToInt32(query.getChildValue("sequence"));
                    String hash = auth.getZeroKHash(sequence, Encoding.UTF8.GetBytes(token), Encoding.UTF8.GetBytes(jabberModel.Password));
                    jabberModel.addResultHandler("0k_auth_" + Convert.ToString(counter), this);
                    StreamWriter output = packet.Session.Writer;
                    output.Write("<iq type='set' id='0k_auth_");
                    output.Write(Convert.ToString(counter++));
                    output.Write("'><query xmlns='jabber:iq:auth'><username>");
                    output.Write(jabberModel.User);
                    output.Write("</username><resource>");
                    output.Write(jabberModel.Resource);                    
                    output.Write("</resource><hash>");
                    output.Write(hash);
                    output.Write("</hash></query></iq>");
                    output.Flush();
                } else if (packet.Type.Equals("result")) {
					Console.WriteLine("Auth Handler passed");
					packet.Session.Status = Session.SessionStatus.authenticated;
					AuthenticateDelegate ad = new AuthenticateDelegate(jabberModel.gui.Authenticated);
					jabberModel.gui.Invoke(ad);
                } else if (packet.Type.Equals("error")) {
                    Console.WriteLine("Failed to authenticate: " + packet.getChildValue("error"));
					AuthenticationFailedDelegate afd = new AuthenticationFailedDelegate(jabberModel.gui.AuthenticationFailed);
					jabberModel.gui.Invoke(afd);
                }

                else

                {

                    Console.WriteLine("Unknown result: " + packet.ToString());

                }

            }

            catch (IOException ex)

            {

                Console.WriteLine(ex.StackTrace);

            }

        }
		public void notify(Packet packet) {
			try {
				if(packet.Type.Equals("result")) {
					voidDel vd = new voidDel(jaberModel.gui.Registered);
					jaberModel.gui.Invoke(vd);
				} else {
					String message = null;
					if(packet.Type.Equals("error")) {
						Packet err = packet.getFirstChild("error");
						message = err["code"] + " : " + err.getValue();

						RegisterFailedDelegate rfd = new RegisterFailedDelegate(jaberModel.gui.RegistrationFailed);
						jaberModel.gui.Invoke(rfd, new Object[] {message});
					}
					Console.WriteLine(message);
				}
			} catch(Exception ex) {
				Console.WriteLine(ex.ToString());
			}
		}
Пример #6
0
        }//getPacket

        public void updateRoster(Packet packet)
        {
            //Extract the query packet
            Packet rosterQuery = packet.getFirstChild("query");
            rosterQuery.setAttribute("xmlns", "jabber:iq:roster");
            foreach (object rosterItems in rosterQuery.getChildren())
            {
                //for each <item> packet in the query
                Object child = rosterItems;
                if (child is Packet)
                {
                    Packet itemPacket = child as Packet;
                    String subJID = itemPacket.getAttribute("jid");



                    //create Subscriber object if needed
                    //Subscriber sendersSubscriberItem = this.subscribers[subJID] as Subscriber;
                    if ((Server.JabberServer.RosterHashtable[this.user] as UserRoster) == null)
                    {
                        Server.JabberServer.RosterHashtable[this.user] = new UserRoster();
                    }
                    Subscriber sub = (Server.JabberServer.RosterHashtable[this.user] as UserRoster).subscribers[subJID] as Subscriber;
                    if (sub == null)
                    {
                        sub = new Subscriber();
                        sub.subscription = "none";
                        sub.ask = null;
                        (Server.JabberServer.RosterHashtable[this.user] as UserRoster).subscribers.Add(subJID, sub);
                    }

                    if (itemPacket.getAttribute("subscription") != null)
                    {
                        //signal to remove
                        if (itemPacket.getAttribute("subscription").Equals("remove"))
                        {
                            //remove from subscribers item
                            JabberID otherID = new JabberID(subJID);
                            (Server.JabberServer.RosterHashtable[this.user] as UserRoster).subscribers.Remove(otherID.ToString());
                            if ((Server.JabberServer.RosterHashtable[this.user] as UserRoster).items.ContainsKey(subJID))
                            {
                                //remove <item> packet
                                (Server.JabberServer.RosterHashtable[this.user] as UserRoster).items.Remove(subJID);
                            }

                            if ((Server.JabberServer.RosterHashtable[otherID.User] as UserRoster) == null)
                            {
                                Server.JabberServer.RosterHashtable[otherID.User] = new UserRoster();
                            }
                            //set only subscription=none from other item
                            sub = ((Server.JabberServer.RosterHashtable[otherID.User] as UserRoster).subscribers[this.user + "@" + Server.JabberServer.server_name]) as Subscriber;
                            if (sub == null)
                            {
                                sub = new Subscriber();
                            }
                            sub.subscription = "none";
                            sub.ask = null;
                            (Server.JabberServer.RosterHashtable[otherID.User] as UserRoster).subscribers[this.user + "@" + Server.JabberServer.server_name] = sub;
                            //(Server.JabberServer.RosterHashtable[subJID] as UserRoster).subscribers.Add(subJID, sendersSubscriberItem);
                            //}
                            if ((Server.JabberServer.RosterHashtable[otherID.User] as UserRoster).items.ContainsKey(this.user + "@" + Server.JabberServer.server_name))
                            {
                                //update <item> packet
                                //itemPacket.removeAttribute("subscription");

                                Packet mypacket = (Server.JabberServer.RosterHashtable[otherID.User] as UserRoster).items[this.user + "@" + Server.JabberServer.server_name] as Packet;
                                mypacket.setAttribute("subscription", "none");
                                mypacket.setAttribute("ask", null);
                                (Server.JabberServer.RosterHashtable[otherID.User] as UserRoster).items[this.user + "@" + Server.JabberServer.server_name] = mypacket;
                            }
                        }



                    }
                    else
                    {

                        //update <item> with the subscriber info for roster push
                        itemPacket.setAttribute("subscription", sub.subscription);
                        itemPacket.setAttribute("ask", sub.ask);

                        //Packet test = items[subJID];
                        if (!(Server.JabberServer.RosterHashtable[this.user] as UserRoster).items.ContainsKey(subJID))
                        {
                            //store updated <item> packet
                            (Server.JabberServer.RosterHashtable[this.user] as UserRoster).items.Add(subJID, itemPacket);
                        }
                        else
                        {
                            (Server.JabberServer.RosterHashtable[this.user] as UserRoster).items[subJID] = itemPacket;
                        }
                    }
                }
            }
            //Roster push
            packet.Type = "set";
            JabberID jidTo = packet.getSession().getJID();
            packet.To = jidTo.User + "@" + jidTo.Domain;
            packet.removeAttribute("from");
            //needs to be verified
            MessageHandler.deliverPacket(packet);
        }//update roster
        public void notify(Packet packet) {
            JabberServer.output.WriteLine("Register handling" + packet.ToString());

            String type = packet.getType();
            Packet query = packet.getFirstChild("query");

            if (type.Equals("get")) {
                required.setSession(packet.getSession());
                required.setID(packet.getID());
                MessageHandler.deliverPacket(required);
                return;
            } else if (type.Equals("set")) {
                String username = query.getChildValue("username");
                User user = userIndex.getUser(username);
                if (user != null) {
                    if (packet.getSession().getStatus() != Session.SessionStatus.authenticated || !username.Equals(packet.getSession().getJID().getUser())) {
                        Packet iq = new Packet("iq");
                        iq.setSession(packet.getSession());
                        iq.setID(packet.getID());
                        iq.Type = "error";
                        ErrorTool.setError(iq, 401, "User account already exists");
                        MessageHandler.deliverPacket(iq);
                        return;
                    }
                } else {
                    user = userIndex.addUser(username);
                }
                user.setPassword(query.getChildValue("password"));
                user.setHash(query.getChildValue("hash"));
                user.setSequence(query.getChildValue("sequence"));
                user.setToken(query.getChildValue("token"));
                if (user.getHash() == null || user.getSequence() == null || user.getToken() == null) {
                    if (user.getPassword() != null) {
                        user.setToken("randomtoken");// ovde smeni
                        user.setSequence("99");
                        user.setHash(auth.getZeroKHash(100, Encoding.UTF8.GetBytes(user.getToken()), Encoding.UTF8.GetBytes(user.getPassword())
                            /* ovde da se proveri isprakjanjeto !!! */                                         
                                             ));
                        
                    }
                } else {
                    // Adjust sequence number to be ready for next request.
                    // Book readers.  In the book this was listed earlier resulting in a thrown
                    // exception if 0k registration was not used.  This fixes it.  :)
                    int i = (int.Parse(user.getSequence()) - 1);
                    user.setSequence(i.ToString());
                }
                Packet iqpacket = new Packet("iq");
                iqpacket.setSession(packet.getSession());
                iqpacket.setID(packet.getID());
                iqpacket.setType("result");
                MessageHandler.deliverPacket(iqpacket);

                // Temporarily needed as we'll use registration as authentication until Chp7.
                // packet.getSession().getJID().setResource("none");
                // userIndex.addSession(packet.getSession());
                //Log.trace("Register successfully registered " + username + " with password " + query.getChildValue("password"));
                JabberServer.output.WriteLine("Register successfully registered " + username + " with password " + query.getChildValue("password"));

            } else {
                JabberServer.output.WriteLine("Register ignoring " + packet.ToString());
            }
        }
		public void notify(Packet packet) {
			String from = packet["from"];

		
			String type = packet["type"];
			if (type == null) {
				type = "available";
			}

			String show = packet.getChildValue("show");
			if (show == null) {
				show = "chat";
			}

			String statusMessage = packet.getChildValue("status");
			
			//test whether the presence is a groupchat presence or regular presence
			JabberID jid = new JabberID(from);
			String user = jid.User;
			if (user != null && user.EndsWith(".group")) { // groupchat presence
				Packet error = packet.getFirstChild("error"); // possible error packet
				if (error != null) {  // there was an error
					String code = error["code"];
					String description = error.getValue();
					ShowGroupErrorDelegate sged = new ShowGroupErrorDelegate(model.gui.ShowGroupError);
					model.gui.Invoke(sged, new Object[] { code, description });
					//delegate : ShowError(String code, String description);
					return;
				}

				// delegate signature : void UpdateGroupPresence(String groupJID, String userNick, Show show, String statusMessage) 
				UpdateGroupPresenceDelegate ugpd = new UpdateGroupPresenceDelegate(model.gui.UpdateGroupPresence);

				Goodware.Jabber.GUI.Show showStatus = Show.chat;
				String groupName = user.Substring(0, user.LastIndexOf(".group"));
				String userNick = jid.Resource;
				

				if (show.Equals("chat")) {
					showStatus = Show.chat;
				} else if (show.Equals("away")) {
					showStatus = Show.away;
				} else if (show.Equals("xa")) {
					showStatus = Show.xa;
				} else if (show.Equals("dnd")) {
					showStatus = Show.dnd;
				}


				if (type.Equals("available")) {
					// UpdateGroupPresence(groupName, userNick, showStatus, statusMessage);
					model.gui.Invoke(ugpd, new Object[] { groupName, userNick, showStatus, statusMessage });
					// UpdateGroupPresence(groupName, userNick, showStatus, statusMessage);
				} else if (type.Equals("unavailable")) {
					RemoveGroupMemberDelegate rgmd = new RemoveGroupMemberDelegate(model.gui.RemoveGroupMember);
					model.gui.Invoke(rgmd, new Object[] {groupName, userNick});
					// RemoveGroupMember(groupName, userNick);
				}



			} else { // regular presence


				GetContactDelegate del = new GetContactDelegate(model.gui.GetContact);
				Contact contact = (Contact)model.gui.Invoke(del, new Object[] { from });

				UpdateContactPresenceDelegate ucpd = new UpdateContactPresenceDelegate(model.gui.UpdateContactPresence);

				//two cases : presence update & presence subscription
				if (type.Equals("available") || type.Equals("unavailable")) {  // presence update
					Status status;

					if (type.Equals("unavailable")) {
						status = Status.unavailable;
					} else if (show.Equals("chat")) {
						status = Status.chat;
					} else if (show.Equals("away")) {
						status = Status.away;
					} else if (show.Equals("xa")) {
						status = Status.xa;
					} else if (show.Equals("dnd")) {
						status = Status.dnd;
					} else {
						status = Status.unavailable; // some default - execution should never come to this case
					}
					model.gui.Invoke(ucpd, new Object[] { from, status, statusMessage }); 	//delegate : UpdateContactPresence(from, Status.unavailable, null)
				} else {  // presence subscription or unsubscription

					if (type.Equals("subscribe")) {

						if (contact == null) { // this is the first invitation
							AcceptInvitationDelegate aid = new AcceptInvitationDelegate(model.gui.AcceptInvitation);
							if ((bool)model.gui.Invoke(aid, new Object[] { from })) { //invitation accepted
								model.sendPresence(from, "subscribed", null, null, null);
								model.sendPresence(from, "subscribe", null, null, null);
							} else { //invitation refused
								model.sendPresence(from, "unsubscribed", null, null, null);
							}
						} else {  // the contact is already invited
							model.sendPresence(from, "subscribed", null, null, null);
							//contact.Status = Status.unavailable;
							model.gui.Invoke(ucpd, new Object[] { from, Status.unavailable, null }); 	//delegate : UpdateContactPresence(from, Status.unavailable, null)
							model.sendPresence(model.Me.Status, model.Me.StatusMessage);
							//model.sendPresence - presence packet with current presence information for the user (type, status, show)
						}

					} else if (type.Equals("subscribed")) {

						Status status = contact.Status;
						if (status == Status.inviteSent) { //the second stage in the "three-way handshake"
							// do Nothing : immediately after this packet comes a "subscribe" packet and then things are handled
						} else if (status == Status.inviteAccepted) { // the third stage in the "three-way handshake"
							//contact.Status = Status.unavailable;
							model.gui.Invoke(ucpd, new Object[] { from, Status.unavailable, null });   // delegate : UpdateContactPresence(from, Status.unavailable, null)
						}

					} else if (type.Equals("unsubscribe")) {

						// do Nothing : immediately after this packet comes an "unsubscribed" packet and then things are handled
					
					} else if (type.Equals("unsubscribed")) {

						RemoveContactDelegate rcd = new RemoveContactDelegate(model.gui.RemoveContact);
						model.gui.Invoke(rcd, new Object[] { from });

						// delegate : void removeContact(String jid) - actual invocation : removeContact(from)
						// removes the contact <jid> from the structures containing the contacts
					
					} // type of presence

				} // presence update or subscription

			} // groupchat presence or regular presence
		}