Пример #1
0
        /// <summary>
        /// Processes a notification of e-mail information change -- SNAC(18,07)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object containing SNAC(18,07)</param>
        public static void ProcessEmailInformation(DataPacket dp)
        {
            // There are 24 bytes of cookies prior to the TLV list, an 8-byte cookie
            // and a 16-byte cookie. The 16 byte cookie is identifying information
            // that may be useful
            byte[] cookie   = dp.Data.ReadByteArray(8);
            byte[] idcookie = dp.Data.ReadByteArray(16);

            TlvBlock tlvs        = new TlvBlock(dp.Data.ReadByteArrayToEnd());
            string   alertTitle  = tlvs.ReadString(0x0005, Encoding.ASCII);
            string   url         = tlvs.ReadString(0x0007, Encoding.ASCII);
            string   alertUrl    = tlvs.ReadString(0x000D, Encoding.ASCII);
            ushort   numMessages = tlvs.ReadUshort(0x0080);
            byte     unread      = tlvs.ReadByte(0x0081);

            if (unread == 0)
            {
                numMessages = 0;
            }
            string domain = tlvs.ReadString(0x0082, Encoding.ASCII);
            ushort flags  = tlvs.ReadUshort(0x0084);

            if (numMessages == 0xFFFF)
            {
                // If this message was received, at least one email message is available
                // even if TLV 0x0080 wasn't in the message
                numMessages = 1;
            }
        }
Пример #2
0
        /// <summary>
        /// Processes a popup message sent by the server -- SNAC(08,02)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object with a buffer containing SNAC(08,02)</param>
        public static void ProcessPopupMessage(DataPacket dp)
        {
            TlvBlock tlvs    = new TlvBlock(dp.Data.ReadByteArrayToEnd());
            string   message = tlvs.ReadString(0x0001, Encoding.ASCII);
            string   url     = tlvs.ReadString(0x0002, Encoding.ASCII);
            ushort   width   = tlvs.ReadUshort(0x0003);
            ushort   height  = tlvs.ReadUshort(0x0004);
            ushort   delay   = tlvs.ReadUshort(0x0005);

            dp.ParentSession.OnPopupMessage(width, height, delay, url, message);
        }
Пример #3
0
        /// <summary>
        /// Processes a popup message sent by the server -- SNAC(08,02)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object with a buffer containing SNAC(08,02)</param>
        public static void ProcessPopupMessage(DataPacket dp)
        {
            TlvBlock tlvs = new TlvBlock(dp.Data.ReadByteArrayToEnd());
            string message = tlvs.ReadString(0x0001, Encoding.ASCII);
            string url = tlvs.ReadString(0x0002, Encoding.ASCII);
            ushort width = tlvs.ReadUshort(0x0003);
            ushort height = tlvs.ReadUshort(0x0004);
            ushort delay = tlvs.ReadUshort(0x0005);

            dp.ParentSession.OnPopupMessage(width, height, delay, url, message);
        }
Пример #4
0
        /// <summary>
        /// Processes the Message Of The Day -- SNAC(01,13)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object with a buffer containing SNAC(01,13)</param>
        public static void ProcessMOTD(DataPacket dp)
        {
            ushort motdtype = dp.Data.ReadUshort();

            using (TlvBlock tlvs = new TlvBlock(dp.Data.ReadByteArrayToEnd()))
            {
                string messagestring = tlvs.ReadString(MOTD_MESSAGE, Encoding.ASCII);

                // Signal the client that the MOTD has come through
                dp.ParentSession.OnMessageOfTheDayReceived(motdtype, messagestring);
            }
        }
Пример #5
0
        /// <summary>
        /// Processes the server response to a new family request -- SNAC(01,05)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object containing SNAC(01,05)</param>
        public static void ProcessNewServiceResponse(DataPacket dp)
        {
            int startIndex = 0;

            byte[] SNACData = dp.Data.ReadByteArrayToEnd();
            if (SNACData[0] == 0x00 && SNACData[1] == 0x06)
            {
                startIndex += 2; // What the heck is this...0x0006, some families, some of the time?
            }

            using (TlvBlock tlvs = new TlvBlock(SNACData, startIndex))
            {
                ushort family     = tlvs.ReadUshort(SERVICE_RESPONSE_FAMILY);
                string BOSaddress = tlvs.ReadString(SERVICE_RESPONSE_ADDRESS, Encoding.ASCII);
                byte[] cookie     = tlvs.ReadByteArray(SERVICE_RESPONSE_COOKIE);

                Connection newconn = null;
                object     store   = dp.ParentSession.RetrieveRequestID(dp.SNAC.RequestID);

                if (family != 0x000E)
                {
                    newconn = dp.ParentSession.Connections.CreateNewConnection(family);
                }
                else
                {
                    ChatRoom roominfo = (ChatRoom)store;
                    dp.ParentSession.Connections.CreateNewChatConnection(roominfo);
                    newconn = roominfo.Connection;
                }

                string[] bosinfo = BOSaddress.Split(':');
                int      port    = 0;
                if (bosinfo.Length == 2)
                {
                    port = Int32.Parse(bosinfo[1]);
                }
                else
                {
                    port = dp.ParentSession.LoginPort;
                }

                newconn.ServerConnectionCompleted +=
                    new ServerConnectionCompletedHandler(newconn_ServerConnnectionCompleted);
                newconn.Server = bosinfo[0];
                newconn.Port   = port;
                newconn.Cookie = new Cookie(cookie);
                newconn.ConnectToServer();
            }

            // The connection process continues when the server sends SNAC(01,03)
        }
Пример #6
0
        /// <summary>
        /// Processes a login response -- SNAC(17,03)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object containing SNAC(17,03)</param>
        public static void ProcessLoginResponse(DataPacket dp)
        {
            // Pull apart SNAC(17,03)
            Cookie cookie;
            string BOSaddress;

            using (TlvBlock tlvs = new TlvBlock(dp.Data.ReadByteArrayToEnd()))
            {
                if (tlvs.HasTlv(0x0008))
                {
                    ushort errorcode = tlvs.ReadUshort(0x0008);
                    dp.ParentSession.OnLoginFailed((LoginErrorCode)errorcode);
                    return;
                }

                BOSaddress = tlvs.ReadString(0x0005, Encoding.ASCII);
                cookie = Cookie.GetReceivedCookie(tlvs.ReadByteArray(0x0006));
            }

            // Shut down the authorization connection
            // Socket shutdown is initiated by the server
            dp.ParentSession.OnLoginStatusUpdate("Authorized", 0.33);
            dp.ParentConnection.DisconnectFromServer(false);

            // Create a new connection to the BOS server
            Connection newconn = dp.ParentSession.Connections.CreateNewConnection(0x0001);

            string[] bosinfo = BOSaddress.Split(':');

            newconn.ServerConnectionCompleted +=
                new ServerConnectionCompletedHandler(newconn_ServerConnnectionCompleted);
            newconn.Server = bosinfo[0];
            newconn.Port = Int32.Parse(bosinfo[1]);
            newconn.Cookie = cookie;
            newconn.ConnectToServer();

            // The connection process continues when the server sends SNAC(01,03)
        }
Пример #7
0
        /// <summary>
        /// Processes a login response -- SNAC(17,03)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object containing SNAC(17,03)</param>
        public static void ProcessLoginResponse(DataPacket dp)
        {
            // Pull apart SNAC(17,03)
            Cookie cookie;
            string BOSaddress;

            using (TlvBlock tlvs = new TlvBlock(dp.Data.ReadByteArrayToEnd()))
            {
                if (tlvs.HasTlv(0x0008))
                {
                    ushort errorcode = tlvs.ReadUshort(0x0008);
                    dp.ParentSession.OnLoginFailed((LoginErrorCode)errorcode);
                    return;
                }

                BOSaddress = tlvs.ReadString(0x0005, Encoding.ASCII);
                cookie     = Cookie.GetReceivedCookie(tlvs.ReadByteArray(0x0006));
            }

            // Shut down the authorization connection
            // Socket shutdown is initiated by the server
            dp.ParentSession.OnLoginStatusUpdate("Authorized", 0.33);
            dp.ParentConnection.DisconnectFromServer(false);

            // Create a new connection to the BOS server
            Connection newconn = dp.ParentSession.Connections.CreateNewConnection(0x0001);

            string[] bosinfo = BOSaddress.Split(':');

            newconn.ServerConnectionCompleted +=
                new ServerConnectionCompletedHandler(newconn_ServerConnnectionCompleted);
            newconn.Server = bosinfo[0];
            newconn.Port   = Int32.Parse(bosinfo[1]);
            newconn.Cookie = cookie;
            newconn.ConnectToServer();

            // The connection process continues when the server sends SNAC(01,03)
        }
Пример #8
0
        /// <summary>
        /// Processes a login response -- SNAC(17,03)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object containing SNAC(17,03)</param>
        internal void ProcessLoginResponse(DataPacket dp)
        {
            // Pull apart SNAC(17,03)
            Cookie cookie;
            string BOSaddress;

            using (TlvBlock tlvs = new TlvBlock(dp.Data.ReadByteArrayToEnd()))
            {
                if (tlvs.HasTlv(0x0008))
                {
                    ushort errorcode = tlvs.ReadUshort(0x0008);
                    parent.OnLoginFailed((LoginErrorCode)errorcode);
                    return;
                }

                BOSaddress = tlvs.ReadString(0x0005, Encoding.ASCII);
                cookie = Cookie.GetReceivedCookie(tlvs.ReadByteArray(0x0006));
            }

            // Shut down the authorization connection
            // Socket shutdown is initiated by the server
            parent.OnLoginStatusUpdate("Authorized", 0.33);
            dp.ParentConnection.DisconnectFromServer(false);

            // Create a new connection to the BOS server
            Connection newconn = parent.Connections.CreateNewConnection(0x0001);

            string[] bosinfo = BOSaddress.Split(':');

            newconn.ServerConnectionCompleted += delegate(Connection conn) { conn.ReadyForData = true; conn.ReadHeader(); };
            newconn.Server = bosinfo[0];
            if (bosinfo.Length == 2)
                newconn.Port = Int32.Parse(bosinfo[1]);
            else
                newconn.Port = dp.ParentConnection.Port;

            Logging.WriteString("Connect to Server after auth. Address from dp: {0} - Address to connect: {1}:{2}", BOSaddress, newconn.Server, newconn.Port);

            newconn.Cookie = cookie;
            newconn.ConnectToServer();

            // The login process continues when the server sends SNAC(01,03) on the new connection
        }
Пример #9
0
        /// <summary>
        /// Processes the server response to a new family request -- SNAC(01,05)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object containing SNAC(01,05)</param>
        private void ProcessNewServiceResponse(DataPacket dp)
        {
            int startIndex = 0;
            byte[] SNACData = dp.Data.ReadByteArrayToEnd();
            if (SNACData[0] == 0x00 && SNACData[1] == 0x06)
            {
                startIndex += 2; // What the heck is this...0x0006, some families, some of the time?
            }

            using (TlvBlock tlvs = new TlvBlock(SNACData, startIndex))
            {
                ushort family = tlvs.ReadUshort(NEW_SERVICE_FAMILY);
                string BOSaddress = tlvs.ReadString(NEW_SERVICE_ADDRESS, Encoding.ASCII);
                byte[] cookie = tlvs.ReadByteArray(NEW_SERVICE_COOKIE);

                Connection newconn = null;
                object store = dp.ParentSession.RetrieveRequestID(dp.SNAC.RequestID);

                if (family != 0x000E)
                {
                    newconn = dp.ParentSession.Connections.CreateNewConnection(family);
                }
                else
                {
                    ChatRoom roominfo = (ChatRoom)store;
                    newconn = dp.ParentSession.Connections.CreateNewChatConnection(roominfo);
                }

                string[] bosinfo = BOSaddress.Split(':');
                int port = 0;
                if (bosinfo.Length == 2)
                {
                    port = Int32.Parse(bosinfo[1]);
                }
                else
                {
                    port = dp.ParentSession.ServerSettings.LoginPort;
                }

                newconn.ServerConnectionCompleted += delegate { newconn.ReadHeader(); };
                newconn.Server = bosinfo[0];
                newconn.Port = port;
                newconn.Cookie = new Cookie(cookie);
                newconn.ConnectToServer();
            }

            // The connection process continues when the server sends SNAC(01,03)
        }
Пример #10
0
        /// <summary>
        /// Processes user information sent by the server -- SNAC(02,06)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object with a buffer containing SNAC(02,06)</param>
        private void ProcessUserInfo(DataPacket dp)
        {
            if (dp.SNAC.Flags != 0)
            {
                Logging.DumpFLAP(dp.Data.GetBytes(), "You've got to be s******g me");
            }

            // Apparently, the userinfo block will always be first,
            // and then possibly TLVs 0x0001 - 0x0005, depending on the request
            byte[] awaymessage = null;
            Encoding awaymessageencoding = Encoding.ASCII;
            byte[] profile = null;
            Encoding profileencoding = Encoding.ASCII;
            Capabilities caps = Capabilities.None;

            UserInfo ui = dp.Data.ReadUserInfo();
            using (TlvBlock tlvs = new TlvBlock(dp.Data.ReadByteArrayToEnd()))
            {
                profileencoding = Marshal.AolMimeToEncoding(tlvs.ReadString(LOCATION_PROFILE_ENCODING, Encoding.ASCII));
                profile = tlvs.ReadByteArray(LOCATION_PROFILE);
                awaymessageencoding = Marshal.AolMimeToEncoding(tlvs.ReadString(LOCATION_AWAYMESSAGE_ENCODING, Encoding.ASCII));
                awaymessage = tlvs.ReadByteArray(LOCATION_AWAYMESSAGE);
                caps = CapabilityProcessor.ProcessCLSIDList(tlvs.ReadByteArray(LOCATION_CAPABILITIES));
            }

            UserInfoResponse uir = new UserInfoResponse();
            uir.Info = ui;
            if (profile != null)
            {
                uir.Profile = profileencoding.GetString(profile, 0, profile.Length);
                uir.ProfileEncoding = profileencoding;
            }
            if (awaymessage != null)
            {
                uir.AwayMessage = awaymessageencoding.GetString(awaymessage, 0, awaymessage.Length);
                uir.AwayMessageEncoding = awaymessageencoding;
            }
            uir.ClientCapabilities = caps;

            if (UserInfoReceived != null)
            {
                UserInfoReceived(this, uir);
            }
        }
Пример #11
0
        /// <summary>
        /// Processes the Message Of The Day -- SNAC(01,13)
        /// </summary>
        /// <param name="dp">A <see cref="DataPacket"/> object with a buffer containing SNAC(01,13)</param>
        public static void ProcessMOTD(DataPacket dp)
        {
            ushort motdtype = dp.Data.ReadUshort();
            using (TlvBlock tlvs = new TlvBlock(dp.Data.ReadByteArrayToEnd()))
            {
                string messagestring = tlvs.ReadString(MOTD_MESSAGE, Encoding.ASCII);

                // Signal the client that the MOTD has come through
                dp.ParentSession.OnMessageOfTheDayReceived(motdtype, messagestring);
            }
        }
Пример #12
0
        /// <summary>
        /// Processes the inner TLV list in TLV 0x0005 and returns a new DirectConnection
        /// </summary>
        private DirectConnection ProcessChannel2Tlv05(ByteStream stream, UserInfo ui, DataPacket dp)
        {
            byte[] invitemessage;
                    Encoding encoding = Encoding.ASCII;
                    string language = "en";

                    DirectConnection directconn = null;

                    // Pull the type, cookie, and capability array
                    RendezvousType rtype = RendezvousData.TypeFromUshort(stream.ReadUshort());
                    Cookie cookie = Cookie.GetReceivedCookie(stream.ReadByteArray(8));
                    byte[] capabilitiesArray = stream.ReadByteArray(16);
                    Capabilities capabilities = CapabilityProcessor.ProcessCLSIDList(capabilitiesArray);

                    // Create the correct type of connection based on the capability
                    if (capabilities == Capabilities.SendFiles)
                    {
                        if ((directconn = parent.Connections.GetDirectConnectionByCookie(cookie)) == null)
                        {
                            directconn = parent.Connections.CreateNewFileTransferConnection(
                                DirectConnectionMethod.Direct, DirectConnectRole.Receiver);
                        }
                    }
                    else if (capabilities == Capabilities.DirectIM)
                    {
                        if ((directconn = parent.Connections.GetDirectConnectionByCookie(cookie)) == null)
                        {
                            directconn = parent.Connections.CreateNewDirectIMConnection(
                                DirectConnectionMethod.Direct, DirectConnectRole.Receiver);
                        }
                    }
                    else if (capabilities == Capabilities.Chat)
                    {
                        directconn = parent.Connections.CreateNewChatInvitationConnection(DirectConnectRole.Receiver);
                    }
                    else
                    {
                        // Currently unsupported
                        parent.OnWarning(ServerErrorCode.UnknownRendezvousChannel, dp);
                        return null;
                    }

                    directconn.Other = ui;
                    directconn.Cookie = cookie;
                    directconn.Type = rtype;

                    ByteStream serviceData = null;
                    Encoding serviceDataEncoding = Encoding.ASCII;

                    // Process the inner TLV list
                    using (TlvBlock tlvs = new TlvBlock(stream.ReadByteArrayToEnd()))
                    {
                        directconn.AOLProxyIP = tlvs.ReadIPAddress(DC_PROXY_IP_ADDRESS);        // proxy ip
                        directconn.ClientIP = tlvs.ReadIPAddress(DC_CLIENT_IP_ADDRESS);         // internal ip
                        directconn.VerifiedIP = tlvs.ReadIPAddress(0x0004);                     // external ip
                        directconn.Port = tlvs.ReadUshort(DC_PORT);
                        directconn.Sequence = RendezvousData.SequenceFromUshort(tlvs.ReadUshort(DC_SEQUENCE_NUMBER));
                        invitemessage = tlvs.ReadByteArray(DC_MESSAGE);
                        if (tlvs.HasTlv(0x000D))
                        {
                            encoding = Encoding.GetEncoding(tlvs.ReadString(0x000D, Encoding.ASCII));
                        }
                        language = tlvs.ReadString(0x000E, Encoding.ASCII);
                        directconn.Method = (tlvs.HasTlv(DC_USE_PROXY_FLAG))
                            ?
                            DirectConnectionMethod.Proxied
                            : DirectConnectionMethod.Direct;

                        serviceData = new ByteStream(tlvs.ReadByteArray(0x2711));
                        if (tlvs.HasTlv(0x2712))
                        {
                            serviceDataEncoding = Encoding.GetEncoding(tlvs.ReadString(0x2712, Encoding.ASCII));
                        }
                    }

                    if (invitemessage != null)
                    {
                        directconn.Message = encoding.GetString(invitemessage, 0, invitemessage.Length);
                    }

                    // Process the extra data, if necessary
                    if (directconn is FileTransferConnection || directconn is DirectIMConnection)
                    {
                        ProcessDirectConnectionRequest(directconn, serviceData);
                    }
                    else if (directconn is ChatInvitationConnection)
                    {
                        ChatInvitationConnection cic = directconn as ChatInvitationConnection;
                        cic.ChatInvite = new ChatInvitation();
                        cic.ChatInvite.Message = directconn.Message;
                        cic.ChatInvite.Encoding = encoding;
                        cic.ChatInvite.Language = language;
                        ProcessChatInvitationRequest(cic, serviceData);
                    }

                    return directconn;
        }