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