//------------------------------------------------------------------------------------- void Dbmgr::syncEntityStreamTemplate(Mercury::Channel* pChannel, KBEngine::MemoryStream& s) { KBEAccountTable* pTable = static_cast<KBEAccountTable*>(EntityTables::getSingleton().findKBETable("kbe_accountinfos")); KBE_ASSERT(pTable); pTable->accountDefMemoryStream(s); s.opfini(); }
//------------------------------------------------------------------------------------- void Dbmgr::syncEntityStreamTemplate(Network::Channel* pChannel, KBEngine::MemoryStream& s) { int rpos = s.rpos(); EntityTables::ENTITY_TABLES_MAP::iterator iter = EntityTables::sEntityTables.begin(); for (; iter != EntityTables::sEntityTables.end(); ++iter) { KBEAccountTable* pTable = static_cast<KBEAccountTable*>(iter->second.findKBETable("kbe_accountinfos")); KBE_ASSERT(pTable); s.rpos(rpos); pTable->accountDefMemoryStream(s); } s.done(); }
//------------------------------------------------------------------------------------- bool KBEEmailVerificationTableRedis::activateAccount(DBInterface * pdbi, const std::string& code, ACCOUNT_INFOS& info) { /* kbe_email_verification:code = hashes(accountName, type, datas, logtime) kbe_email_verification:accountName = code */ redisReply* pRedisReply = NULL; if (!static_cast<DBInterfaceRedis*>(pdbi)->query(fmt::format("HMGET kbe_email_verification:{} accountName type, datas logtime", code), &pRedisReply, false)) return false; uint64 logtime = 1; int type = -1; if(pRedisReply) { if(pRedisReply->type == REDIS_REPLY_ARRAY) { if(RedisHelper::check_array_results(pRedisReply)) { info.name = pRedisReply->element[0]->str; StringConv::str2value(type, pRedisReply->element[1]->str); info.password = pRedisReply->element[2]->str; StringConv::str2value(logtime, pRedisReply->element[3]->str); } } freeReplyObject(pRedisReply); } if(logtime > 0 && time(NULL) - logtime > g_kbeSrvConfig.emailAtivationInfo_.deadline) { ERROR_MSG(fmt::format("KBEEmailVerificationTableMysql::activateAccount({}): is expired! {} > {}.\n", code, (time(NULL) - logtime), g_kbeSrvConfig.emailAtivationInfo_.deadline)); return false; } if(info.name.size() == 0) { ERROR_MSG(fmt::format("KBEEmailVerificationTableMysql::activateAccount({}): name is NULL.\n", code)); return false; } if((int)KBEEmailVerificationTable::V_TYPE_CREATEACCOUNT != type) { ERROR_MSG(fmt::format("KBEEmailVerificationTableMysql::activateAccount({}): type({}) error!\n", code, type)); return false; } std::string password = info.password; // 寻找dblog是否有此账号 KBEAccountTable* pTable = static_cast<KBEAccountTable*>(EntityTables::findByInterfaceName(pdbi->name()).findKBETable("kbe_accountinfos")); KBE_ASSERT(pTable); info.flags = 0; if(!pTable->queryAccount(pdbi, info.name, info)) { return false; } if((info.flags & ACCOUNT_FLAG_NOT_ACTIVATED) <= 0) { ERROR_MSG(fmt::format("KBEEmailVerificationTableRedis::activateAccount({}): Has been activated, flags={}.\n", code, info.flags)); return false; } info.flags &= ~ACCOUNT_FLAG_NOT_ACTIVATED; if(!pTable->setFlagsDeadline(pdbi, info.name, info.flags, info.deadline)) { ERROR_MSG(fmt::format("KBEEmailVerificationTableRedis::activateAccount({}): set deadline is error({})!\n", code, pdbi->getstrerror())); return false; } if(!pTable->updatePassword(pdbi, info.name, password)) { ERROR_MSG(fmt::format("KBEEmailVerificationTableRedis::activateAccount({}): update password is error({})!\n", code, pdbi->getstrerror())); return false; } info.dbid = 0; ScriptDefModule* pModule = EntityDef::findScriptModule(DBUtil::accountScriptName()); // 防止多线程问题, 这里做一个拷贝。 MemoryStream copyAccountDefMemoryStream(pTable->accountDefMemoryStream()); info.dbid = EntityTables::findByInterfaceName(pdbi->name()).writeEntity(pdbi, 0, -1, ©AccountDefMemoryStream, pModule); KBE_ASSERT(info.dbid > 0); /* kbe_accountinfos:accountName = hashes(password, bindata, email, entityDBID, flags, deadline, regtime, lasttime, numlogin) */ // 如果查询失败则返回存在, 避免可能产生的错误 if(!pdbi->query(fmt::format("HSET kbe_accountinfos:{} entityDBID {}", info.name, info.dbid), false)) { ERROR_MSG(fmt::format("KBEEmailVerificationTableRedis::activateAccount({}): update kbe_accountinfos is error({})!\n", code, pdbi->getstrerror())); return false; } delAccount(pdbi, (int8)V_TYPE_CREATEACCOUNT, info.name); return true; }
//------------------------------------------------------------------------------------- bool KBEEmailVerificationTableMysql::activateAccount(DBInterface * dbi, const std::string& code, ACCOUNT_INFOS& info) { std::string sqlstr = "select accountName, datas, logtime from kbe_email_verification where code like \""; char* tbuf = new char[code.size() * 2 + 1]; mysql_real_escape_string(static_cast<DBInterfaceMysql*>(dbi)->mysql(), tbuf, code.c_str(), code.size()); sqlstr += tbuf; sqlstr += "\" and type="; kbe_snprintf(tbuf, MAX_BUF, "%d", (int)KBEEmailVerificationTable::V_TYPE_CREATEACCOUNT); sqlstr += tbuf; SAFE_RELEASE_ARRAY(tbuf); if(!dbi->query(sqlstr.c_str(), sqlstr.size(), false)) { ERROR_MSG(fmt::format("KBEEmailVerificationTableMysql::activateAccount({}): sql({}) is failed({})!\n", code, sqlstr, dbi->getstrerror())); return false; } uint64 logtime = 1; MYSQL_RES * pResult = mysql_store_result(static_cast<DBInterfaceMysql*>(dbi)->mysql()); if(pResult) { MYSQL_ROW arow; while((arow = mysql_fetch_row(pResult)) != NULL) { info.name = arow[0]; info.password = arow[1]; KBEngine::StringConv::str2value(logtime, arow[2]); } mysql_free_result(pResult); } if(logtime > 0 && time(NULL) - logtime > g_kbeSrvConfig.emailAtivationInfo_.deadline) { ERROR_MSG(fmt::format("KBEEmailVerificationTableMysql::activateAccount({}): is expired! {} > {}.\n", code, (time(NULL) - logtime), g_kbeSrvConfig.emailAtivationInfo_.deadline)); return false; } if(info.name.size() == 0) { ERROR_MSG(fmt::format("KBEEmailVerificationTableMysql::activateAccount({}): name is NULL.\n", code)); return false; } std::string password = info.password; // 寻找dblog是否有此账号 KBEAccountTable* pTable = static_cast<KBEAccountTable*>(EntityTables::getSingleton().findKBETable("kbe_accountinfos")); KBE_ASSERT(pTable); info.flags = 0; if(!pTable->queryAccount(dbi, info.name, info)) { return false; } if((info.flags & ACCOUNT_FLAG_NOT_ACTIVATED) <= 0) { ERROR_MSG(fmt::format("KBEEmailVerificationTableMysql::activateAccount({}): Has been activated, flags={}.\n", code, info.flags)); return false; } info.flags &= ~ACCOUNT_FLAG_NOT_ACTIVATED; if(!pTable->setFlagsDeadline(dbi, info.name, info.flags, info.deadline)) { ERROR_MSG(fmt::format("KBEEmailVerificationTableMysql::activateAccount({}): set deadline is error({})!\n", code, dbi->getstrerror())); return false; } if(!pTable->updatePassword(dbi, info.name, password)) { ERROR_MSG(fmt::format("KBEEmailVerificationTableMysql::activateAccount({}): update password is error({})!\n", code, dbi->getstrerror())); return false; } info.dbid = 0; ScriptDefModule* pModule = EntityDef::findScriptModule(DBUtil::accountScriptName()); // 防止多线程问题, 这里做一个拷贝。 MemoryStream copyAccountDefMemoryStream(pTable->accountDefMemoryStream()); info.dbid = EntityTables::getSingleton().writeEntity(dbi, 0, -1, ©AccountDefMemoryStream, pModule); KBE_ASSERT(info.dbid > 0); // 如果查询失败则返回存在, 避免可能产生的错误 tbuf = new char[MAX_BUF * 3]; mysql_real_escape_string(static_cast<DBInterfaceMysql*>(dbi)->mysql(), tbuf, info.name.c_str(), info.name.size()); if(!dbi->query(fmt::format("update kbe_accountinfos set entityDBID={} where accountName like \"{}\"", info.dbid, tbuf), false)) { ERROR_MSG(fmt::format("KBEEmailVerificationTableMysql::activateAccount({}): update kbe_accountinfos is error({})!\n", code, dbi->getstrerror())); SAFE_RELEASE_ARRAY(tbuf); return false; } SAFE_RELEASE_ARRAY(tbuf); try { delAccount(dbi, (int8)V_TYPE_CREATEACCOUNT, info.name); } catch (...) { } return true; }