Core Account Authentication error
Dobrý den, zdravím všechny. Píši s nutnou prosbou o pomoc.
Na mém 3.3.5a TC serveru se mi objevila závažná chyba v core s kterou si nikdo koho znám neví rady, nevím přesně od kdy tam tato chyba je, je možné že už od začátku co jsme začal pracovat na této verzi core, ale nemusel sem si ji všimnout. Cirka z 40% hráče nepustí server do hry, při logování na herní account zůstane přihlášení vyset na authetication nebo Retriving Character List, do logu se loguje chyba:
WorldSocket::HandleAuthSession: Authentication failed for account:
Někdo to do hry nepustí a chybu to ani nezaloguje.
Myslím že kdybych stáhl nejnovější core problém by tam už nebyl, ale bohužel world database má zřejmě lehce pofidérní strukturu a nelze ji updatovat na vyšší verzy.
Nevím přesně kde se chyba nachází každopádně to má něco společného s chary, protože když tato chyba nastane a já manuálně v db odstraním charactery z accountu, jde se normálně přihlásit, poté charactery dám zpět a chyba je pryč. Někdy pomůže vypnout wow a smazat cache, někdy ne. Někdy pomůže několikrát za sebou pustit wow zkusit se přihlásti vypnout wow a znovu, někdy ne.
Někdy to na acc nepustí po dobu několika sekund někdy ani po pul hodině.
Žádné zásahy jsem v core neprováděl, vlastní scripty jsem odstranil a chyba je tu pořád, jediné co je upravené je že:
BG dává item za kill a při přijmutí duelu se resetne mana/hp a resetnou se all cd.
Databasi mám updatovanou, auth i char jsem kontroloval ještě znovu dodatečně (world je samozřejmě také updatovaný na verzy TDB 335a.50)
Os našeho serveru na kterém běží wow server je Ubuntu.
Verze: TDB 335.50 - 2013/01/14
1 parent cdafb60 d4398eaafe54d7b358766d587aafd0579c280e61
Logování errou je v \src\server\game\Server\WorldSocket.cpp
// Check that Key and account name are the same on client and server
uint32 t = 0;
uint32 seed = m_Seed;
sha.UpdateData(account);
sha.UpdateData((uint8*)&t, 4);
sha.UpdateData((uint8*)&clientSeed, 4);
sha.UpdateData((uint8*)&seed, 4);
sha.UpdateBigNumbers(&k, NULL);
sha.Finalize();
std::string address = GetRemoteAddress();
if (memcmp(sha.GetDigest(), digest, 20))
{
SendAuthResponseError(AUTH_FAILED);
TC_LOG_ERROR(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: Authentication failed for account: %u ('%s') address: %s", id, account.c_str(), address.c_str());
return -1;
}
TC_LOG_DEBUG(LOG_FILTER_NETWORKIO, "WorldSocket::HandleAuthSession: Client '%s' authenticated successfully from %s.",
account.c_str(),
address.c_str());
Ale nevím co tento script přesně volá a kde by tedy mohla být chyba, nebo čím je způsobena...
Dále nevím jestli je možné že to dělá špatná web registrace??? Ale ta by měla být v pořádku...
mysql_connect($ip,$user,$pass) or die ("Spojení se serverem $ip nebylo uspěšné");
mysql_select_db($auth) or die ("Spojení s databasí nebylo uspěšné");
function validateEmail($mail){if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $mail)) return true;else return false;}
function hashPassword($account,$password){return sha1(strtoupper($account).':'.strtoupper($password));}
// sem kokot ..
// #total_wasted_time 1h30m
if($_POST){
$_SESSION['data0']=$_POST;
$error = 0;
if(!strlen($_POST['acc']) || strlen($_POST['acc'])!=strlen(addslashes($_POST['acc']))){
$_SESSION['error']= "<font color=FF4242>Uživatelské jméno je špatně zadané!</font><br />";
$error++;
} else if(mysql_num_rows(mysql_query("SELECT id FROM account WHERE username LIKE '".mysql_escape_string(strtoupper($_POST['acc']))."' LIMIT 1;"))){
$_SESSION['error']= "<font color=FF4242>Uživatelské jméno už používá někdo jiný!!!</font><br />";
$error++;
} else if($_POST['pass']!=$_POST['pass2']){
$_SESSION['error']= "<font color=FF4242>Zadaná hesla se neshodují!</font><br />";
$error++;
} else if(!strlen($_POST['pass'])) {
$_SESSION['error']= "<font color=FF4242>Heslo není vyplněno!</font><br />";
$error++;
} else if(!validateEmail($_POST['email'])){
$_SESSION['error'] = "<font color=FF4242>Emailová adresa je neplatná!</font><br />";
$error++;
} else if(mysql_num_rows(mysql_query("SELECT id FROM account WHERE email LIKE '".mysql_escape_string($_POST['email'])."' LIMIT 1;"))){
$_SESSION['error']= "<font color=FF4242>Emailovou adresu už používá někdo jiný!!!</font>";
$error++;
}
// konec validace
if(!$error){
mysql_query("INSERT INTO account (username,sha_pass_hash,email,expansion,locked) VALUES('".mysql_escape_string($_POST['acc'])."','".hashPassword($_POST['acc'], $_POST['pass'])."','".mysql_escape_string($_POST['email'])."','2','0');");
$_SESSION['registred']=$_POST['acc'];
unset($_SESSION['data0']);
header("location: register.php");
exit;
}
}
Někdo mi říkal že by to mohla dělat neshoda ipek a portu v db a v configach, ale to jsem také vše překontroloval a mělo by to být v pořádku.
CFG:
RealmID = 1
LoginDatabaseInfo = "127.0.0.2;3306;root;root;auth"
WorldDatabaseInfo = "127.0.0.2;3306;root;root;world"
CharacterDatabaseInfo = "127.0.0.2;3306;root;root;characters"
WorldServerPort = 8086
BindIP = "0.0.0.0"
DB:
Opravdu už nemám nejmenší tušení jak bych tuto chybu vyřešil, pokud někdo bude tak hodný a pomůže my nebo alespoň poradí, byl bych opravdu velice vděčný... Mám v serveru už přes 1000 hodin práce, dělám ho přes třičtvrtě roku, kvůli osobnímu životu jsem při práci měl občas několika týdenní pauzy, nyní jsem se dostal do fáze kdy je server připravený k hraní. Snažím se ho rozjet, ale bohužel s touto chybou je velice těžké nabrat populaci, zatím se držím kolem 10 online, ale bohužel spousty hráčů odradí jen to že je to nepustí do hry, moc my na tom záleží, děkuji předem všem alespoň za snahu, s pozdravem InnI.
Odkaz na download mé revize: TrinityCore
Web: InfinityWoW