/// <summary>
        /// Creates a standard Version 2 Battle.net FTP request.
        /// </summary>
        /// <param name="productId">The four-character identifier for the product being emulated by this request.</param>
        /// <param name="fileName">The full or relative path to the file as it is to be stored on the local 
        /// machine.  The name portion of the file must be the filename being requested from the service.</param>
        /// <param name="fileTime">The last-write time of the file.  If the file is not available, this parameter
        /// can be <b>null</b> (<b>Nothing</b> in Visual Basic).</param>
        /// <param name="cdKey">The CD key of the client being emulated.</param>
        public BnFtpVersion2Request(string productId, string fileName, DateTime fileTime, string cdKey)
            : base(fileName, productId, fileTime)
        {
            string prod = Product;
            if (prod != Resources.war3 &&
                prod != Resources.w3xp)
            {
                throw new ArgumentOutOfRangeException(Resources.param_productId, productId, Resources.bnftp_ver2invalidProduct);
            }

            m_key = new CdKey(cdKey);
        }
Beispiel #2
0
        private static void ValidateSettings(IBattleNetSettings settings)
        {
            BattleNetSettingsErrors errors = BattleNetSettingsErrors.None;

            if (!File.Exists(settings.GameExe))
                errors |= BattleNetSettingsErrors.GameExeMissingOrNotFound;
            if (!File.Exists(settings.GameFile2))
                errors |= BattleNetSettingsErrors.GameFile2MissingOrNotFound;
            if (!File.Exists(settings.GameFile3))
                errors |= BattleNetSettingsErrors.GameFile3MissingOrNotFound;
            if (string.IsNullOrEmpty(settings.Username))
                errors |= BattleNetSettingsErrors.UserNameNull;
            if (!Enum.IsDefined(typeof(PingType), settings.PingMethod))
                errors |= BattleNetSettingsErrors.InvalidPingType;
            if (string.IsNullOrEmpty(settings.Gateway.ServerHost))
                errors |= BattleNetSettingsErrors.InvalidGatewayServer;

            if (settings.CdKeyOwner == null)
                settings.CdKeyOwner = string.Empty;
            if (settings.Password == null)
                settings.Password = string.Empty;

            Product productToUse = Product.GetByProductCode(settings.Client);
            if (productToUse == null)
                errors |= BattleNetSettingsErrors.InvalidEmulationClient;
            else
            {
                if (!productToUse.CanConnect)
                    errors |= BattleNetSettingsErrors.InvalidEmulationClient;
                if (string.IsNullOrEmpty(settings.CdKey1))
                    errors |= BattleNetSettingsErrors.PrimaryCdKeyMissingOrInvalid;
                else
                {
                    try
                    {
                        CdKey test = new CdKey(settings.CdKey1);
                        if (!test.IsValid)
                            errors |= BattleNetSettingsErrors.PrimaryCdKeyMissingOrInvalid;
                    }
                    catch
                    {
                        errors |= BattleNetSettingsErrors.PrimaryCdKeyMissingOrInvalid;
                    }
                }
                if (productToUse.NeedsTwoKeys && string.IsNullOrEmpty(settings.CdKey2))
                    errors |= BattleNetSettingsErrors.SecondaryCdKeyMissingOrInvalid;
                else
                {
                    if (productToUse.NeedsTwoKeys)
                    {
                        try
                        {
                            CdKey test2 = new CdKey(settings.CdKey2);
                            if (!test2.IsValid)
                                errors |= BattleNetSettingsErrors.SecondaryCdKeyMissingOrInvalid;
                        }
                        catch
                        {
                            errors |= BattleNetSettingsErrors.SecondaryCdKeyMissingOrInvalid;
                        }
                    }
                }
                if (productToUse.NeedsLockdown)
                {
                    if (string.IsNullOrEmpty(settings.ImageFile) || !File.Exists(settings.ImageFile))
                        errors |= BattleNetSettingsErrors.LockdownFileMissingOrNotFound;
                }
            }

            if (errors != BattleNetSettingsErrors.None)
                throw new BattleNetSettingsErrorsException(errors);
        }
        private void HandleAuthInfo(ParseData data)
        {
            try
            {
                DataReader dr = new DataReader(data.Data);
                if (m_pingPck != null)
                {
                    Send(m_pingPck);
                    m_pingPck = null;
                }
                m_received0x50 = true;

                m_loginType = dr.ReadUInt32();
                m_srvToken = dr.ReadUInt32();
                m_udpVal = dr.ReadUInt32();
                m_mpqFiletime = dr.ReadInt64();
                m_versioningFilename = dr.ReadCString();
                m_usingLockdown = m_versioningFilename.StartsWith("LOCKDOWN", StringComparison.OrdinalIgnoreCase);

                int crResult = -1, exeVer = -1;
                string exeInfo = null;

                if (!m_usingLockdown)
                {
                    m_valString = dr.ReadCString();
                    int mpqNum = CheckRevision.ExtractMPQNumber(m_versioningFilename);
                    crResult = CheckRevision.DoCheckRevision(m_valString, new string[] { m_settings.GameExe, m_settings.GameFile2, m_settings.GameFile3 }, mpqNum);
                    exeVer = CheckRevision.GetExeInfo(m_settings.GameExe, out exeInfo);
                }
                else
                {
                    m_ldValStr = dr.ReadNullTerminatedByteArray();
                    string dllName = m_versioningFilename.Replace(".mpq", ".dll");

                    BnFtpVersion1Request req = new BnFtpVersion1Request(m_settings.Client, m_versioningFilename, null);
                    req.Server = m_settings.Gateway.ServerHost;
                    req.LocalFileName = Path.Combine(Path.GetTempPath(), m_versioningFilename);
                    req.ExecuteRequest();

                    string ldPath = null;
                    using (MpqArchive arch = MpqServices.OpenArchive(req.LocalFileName))
                    {
                        if (arch.ContainsFile(dllName))
                        {
                            ldPath = Path.Combine(Path.GetTempPath(), dllName);
                            arch.SaveToPath(dllName, Path.GetTempPath(), false);
                        }
                    }

                    m_ldDigest = CheckRevision.DoLockdownCheckRevision(m_ldValStr, new string[] { m_settings.GameExe, m_settings.GameFile2, m_settings.GameFile3 },
                                    ldPath, m_settings.ImageFile, ref exeVer, ref crResult);
                }

                m_prodCode = m_settings.Client;

                if (m_prodCode == "WAR3" ||
                    m_prodCode == "W3XP")
                {
                    m_w3srv = dr.ReadByteArray(128);

                    if (!NLS.ValidateServerSignature(m_w3srv, RemoteEP.Address.GetAddressBytes()))
                    {
                        OnError(new ErrorEventArgs(ErrorType.Warcraft3ServerValidationFailure, Strings.War3ServerValidationFailed, false));
                        //Close();
                        //return;
                    }
                }

                BattleNetClientResources.IncomingBufferPool.FreeBuffer(data.Data);

                CdKey key1, key2 = null;
                key1 = new CdKey(m_settings.CdKey1);
                if (m_prodCode == "D2XP" || m_prodCode == "W3XP")
                {
                    key2 = new CdKey(m_settings.CdKey2);
                }

                m_clientToken = unchecked((uint)new Random().Next());

                byte[] key1Hash = key1.GetHash(m_clientToken, m_srvToken);
                if (m_warden != null)
                {
                    try
                    {
                        if (!m_warden.InitWarden(BitConverter.ToInt32(key1Hash, 0)))
                        {
                            m_warden.UninitWarden();
                            OnError(new ErrorEventArgs(ErrorType.WardenModuleFailure, "The Warden module failed to initialize.  You will not be immediately disconnected; however, you may be disconnected after a short period of time.", false));
                            m_warden = null;
                        }
                    }
                    catch (Win32Exception we)
                    {
                        OnError(new ErrorEventArgs(ErrorType.WardenModuleFailure, "The Warden module failed to initialize.  You will not be immediately disconnected; however, you may be disconnected after a short period of time.", false));
                        OnError(new ErrorEventArgs(ErrorType.WardenModuleFailure, string.Format(CultureInfo.CurrentCulture, "Additional information: {0}", we.Message), false));
                        m_warden.UninitWarden();
                        m_warden = null;
                    }
                }

                BncsPacket pck0x51 = new BncsPacket((byte)BncsPacketId.AuthCheck);
                pck0x51.Insert(m_clientToken);
                pck0x51.Insert(exeVer);
                pck0x51.Insert(crResult);
                if (m_prodCode == "D2XP" || m_prodCode == "W3XP")
                    pck0x51.Insert(2);
                else
                    pck0x51.Insert(1);
                pck0x51.Insert(false);
                pck0x51.Insert(key1.Key.Length);
                pck0x51.Insert(key1.Product);
                pck0x51.Insert(key1.Value1);
                pck0x51.Insert(0);
                pck0x51.Insert(key1Hash);
                if (key2 != null)
                {
                    pck0x51.Insert(key2.Key.Length);
                    pck0x51.Insert(key2.Product);
                    pck0x51.Insert(key2.Value1);
                    pck0x51.Insert(0);
                    pck0x51.Insert(key2.GetHash(m_clientToken, m_srvToken));
                }

                if (m_usingLockdown)
                {
                    pck0x51.InsertByteArray(m_ldDigest);
                    pck0x51.InsertByte(0);
                }
                else
                    pck0x51.InsertCString(exeInfo);

                pck0x51.InsertCString(m_settings.CdKeyOwner);

                Send(pck0x51);
            }
            catch (Exception ex)
            {
                OnError(new ErrorEventArgs(ErrorType.General, "There was an error while initializing your client.  Refer to the exception message for more information.\n" + ex.ToString(), true));
                Close();
            }
        }