All pastes #799596 Raw Edit

Mine

public cpp v1 · immutable
#799596 ·published 2007-11-27 19:35 UTC
rendered paste body
/// Ban an account or ban an IP address, duration will be parsed using TimeStringToSecs if it is positive, otherwise permbanuint8 World::BanAccount(std::string type, std::string nameOrIP, std::string duration, std::string reason, std::string author){    loginDatabase.escape_string(nameOrIP);    loginDatabase.escape_string(reason);    std::string safe_author=author;    loginDatabase.escape_string(safe_author);    normalizePlayerName(nameOrIP);    uint32 duration_secs = TimeStringToSecs(duration);    QueryResult *resultAccounts = NULL;                     //used for kicking        ///- Update the database with ban information    if (!reason)    	return BAN_SYNTAX ERROR;        if(type=="ip")    {        //No SQL injection as strings are escaped        resultAccounts = loginDatabase.PQuery("SELECT `id` FROM `account` WHERE `last_ip` = '%s'",nameOrIP.c_str());    }    else if(type=="account")    {        //No SQL injection as string is escaped        resultAccounts = loginDatabase.PQuery("SELECT `id` FROM `account` WHERE `username` = '%s'",nameOrIP.c_str());    }    else if(type=="character")    {        //No SQL injection as string is escaped        resultAccounts = CharacterDatabase.PQuery("SELECT `account` FROM `character` WHERE `name` = '%s'",nameOrIP.c_str());    }    else        return BAN_SYNTAX_ERROR;                            //Syntax problem    if(!resultAccounts)        return BAN_NOTFOUND;                                // Nobody to ban    ///- Disconnect all affected players (for IP it can be several)    do    {        Field* fieldsAccount = resultAccounts->Fetch();        uint32 account = fieldsAccount->GetUInt32();        uint32 banType = (type=="account") ? 1 : 2;                loginDatabase.PExecute("INSERT INTO `banned` VALUES ('%u', '%u', '%u', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+%u, '%s', '%s', '1')",account,ip,banType,duration_secs,safe_author.c_str(),reason.c_str());        WorldSession* sess = FindSession(account);        if( sess )            if(std::string(sess->GetPlayerName()) != author)                sess->KickPlayer();    }    while( resultAccounts->NextRow() );    delete resultAccounts;    return BAN_SUCCESS;}