Esempio n. 1
0
bool CWalletDB::ReadAccount(const string& strAccount, CAccount& account)
{
    account.SetNull();
    return Read(make_pair(string("acc"), strAccount), account);
}
Esempio n. 2
0
void CSchedule::executeTask(CTask * paramTask)
{
	string sendString;
	char sendBuffer[1000];
	
	CModificationInformation * modificationInformation;
	CAccount * account;
	
	int i;
	
	switch(paramTask->type)
	{
		case 1:
			if (!paramTask->correctPassword)
			{
				sendString = "02524fThe password is wrong.";
				strcpy(sendBuffer, sendString.c_str());
				sendCommand(paramTask->socketFd, sendBuffer, 28);
				
				break;
			}
			
			modificationInformation = paramTask->modificationInformation;
			
			if (modificationInformation->nrOfExpectedDescriptionLines != modificationInformation->nrOfReceivedDescriptionLines)
			{
				sendString = "05024fCould not receive all lines of the description.";
				strcpy(sendBuffer, sendString.c_str());
				sendCommand(paramTask->socketFd, sendBuffer, 53);
				
				break;
			}
			
			account = getAccountFromId(paramTask->id);
			
			if (((i = getIdFromName(modificationInformation->firstName)) > 0) && (i != modificationInformation->id))
			{
				sendString = "04924fAn account with the first Name already exists.";
				strcpy(sendBuffer, sendString.c_str());
				sendCommand(paramTask->socketFd, sendBuffer, 52);
				
				break;
			}
			
			if (((i = getIdFromName(modificationInformation->secondName)) > 0) && (i != modificationInformation->id))
			{
				sendString = "05024fAn account with the second Name already exists.";
				strcpy(sendBuffer, sendString.c_str());
				sendCommand(paramTask->socketFd, sendBuffer, 53);
				
				break;
			}
			
			if (((i = getIdFromName(modificationInformation->thirdName)) > 0) && (i != modificationInformation->id))
			{
				sendString = "04924fAn account with the third Name already exists.";
				strcpy(sendBuffer, sendString.c_str());
				sendCommand(paramTask->socketFd, sendBuffer, 52);
				
				break;
			}
			
			account->setFirstName(modificationInformation->firstName);
			account->setSecondName(modificationInformation->secondName);
			account->setThirdName(modificationInformation->thirdName);
			account->setPrivateNrOfEvaluatedTtrsGames(modificationInformation->privateNrOfEvaluatedTtrsGames);
			account->setDescription(modificationInformation->description);
			
			sendString = "00324s";
			strcpy(sendBuffer, sendString.c_str());
			sendCommand(paramTask->socketFd, sendBuffer, 6);
			
			// Protocol Send-Syntax:	24:{s,f}ErrorMessage
			
			saveToFile(pathToFileToSaveTo);
			
			cout << "Modified account:" << endl;
			account->printDetails();
			
			break;
			
		case 2:
			if (!paramTask->correctPassword)
			{
				sendString = "02529fThe password is wrong.";
				strcpy(sendBuffer, sendString.c_str());
				sendCommand(paramTask->socketFd, sendBuffer, 28);
				
				break;
			}
			
			account = getAccountFromId(paramTask->id);
			
			account->setPassword(paramTask->string1);
			
			sendString = "00329s";
			strcpy(sendBuffer, sendString.c_str());
			sendCommand(paramTask->socketFd, sendBuffer, 6);
			
			// Protocol Send-Syntax:	29:{s,f}ErrorMessage
			
			saveToFile(pathToFileToSaveTo);
			
			cout << "Changed password of account (id = " << paramTask->id << ")." << endl << endl;
			
			break;
			
		case 3:
			if (!paramTask->correctPassword)
			{
				sendString = "02531fThe password is wrong.";
				strcpy(sendBuffer, sendString.c_str());
				sendCommand(paramTask->socketFd, sendBuffer, 28);
				
				break;
			}
			
			removeAccount(paramTask->id);
			
			sendString = "00331s";
			strcpy(sendBuffer, sendString.c_str());
			sendCommand(paramTask->socketFd, sendBuffer, 6);
			
			// Protocol Send-Syntax:	31:{s,f}ErrorMessage
			
			saveToFile(pathToFileToSaveTo);
			
			break;
			
		default:
			break;
	}
}
Esempio n. 3
0
bool CAccountManager::LogIn(CClient* pClient, CClient* pEchoClient, const char* szAccountName, const char* szPassword)
{
    // Is he already logged in?
    if (pClient->IsRegistered())
    {
        if (pEchoClient)
            pEchoClient->SendEcho("login: You are already logged in");
        return false;
    }

    if (pClient->GetClientType() != CClient::CLIENT_PLAYER)
    {
        if (pEchoClient)
            pEchoClient->SendEcho("login: Only players can log in");
        return false;
    }

    // Get the players details
    CPlayer* pPlayer = static_cast<CPlayer*>(pClient);
    SString  strPlayerName = pPlayer->GetNick();
    SString  strPlayerIP = pPlayer->GetSourceIP();
    SString  strPlayerSerial = pPlayer->GetSerial();

    if (m_AccountProtect.IsFlooding(strPlayerIP.c_str()))
    {
        if (pEchoClient)
            pEchoClient->SendEcho(SString("login: Account locked", szAccountName).c_str());
        CLogger::AuthPrintf("LOGIN: Ignoring %s trying to log in as '%s' (IP: %s  Serial: %s)\n", strPlayerName.c_str(), szAccountName, strPlayerIP.c_str(),
                            strPlayerSerial.c_str());
        return false;
    }

    // Grab the account on his nick if any
    CAccount* pAccount = g_pGame->GetAccountManager()->Get(szAccountName);
    if (!pAccount)
    {
        if (pEchoClient)
            pEchoClient->SendEcho(SString("login: No known account for '%s'", szAccountName).c_str());
        CLogger::AuthPrintf("LOGIN: %s tried to log in as '%s' (Unknown account) (IP: %s  Serial: %s)\n", strPlayerName.c_str(), szAccountName,
                            strPlayerIP.c_str(), strPlayerSerial.c_str());
        return false;
    }

    if (pAccount->GetClient())
    {
        if (pEchoClient)
            pEchoClient->SendEcho(SString("login: Account for '%s' is already in use", szAccountName).c_str());
        return false;
    }
    if (!IsValidPassword(szPassword) || !pAccount->IsPassword(szPassword))
    {
        if (pEchoClient)
            pEchoClient->SendEcho(SString("login: Invalid password for account '%s'", szAccountName).c_str());
        CLogger::AuthPrintf("LOGIN: %s tried to log in as '%s' with an invalid password (IP: %s  Serial: %s)\n", strPlayerName.c_str(), szAccountName,
                            strPlayerIP.c_str(), strPlayerSerial.c_str());
        m_AccountProtect.AddConnect(strPlayerIP.c_str());
        return false;
    }

    // Check serial authorization
    if (IsAuthorizedSerialRequired(pAccount))
    {
        pAccount->AddSerialForAuthorization(strPlayerSerial, strPlayerIP);
        if (!pAccount->IsSerialAuthorized(strPlayerSerial))
        {
            if (pEchoClient)
                pEchoClient->SendEcho(
                    SString("login: Serial pending authorization for account '%s' - See https:"
                            "//mtasa.com/authserial",
                            szAccountName));
            CLogger::AuthPrintf("LOGIN: %s tried to log in as '%s' with an unauthorized serial (IP: %s  Serial: %s)\n", *strPlayerName, szAccountName,
                                *strPlayerIP, *strPlayerSerial);
            CLogger::AuthPrintf(
                "LOGIN: See https:"
                "//mtasa.com/authserial\n");
            return false;
        }
    }

    // Log him in
    CAccount* pCurrentAccount = pClient->GetAccount();
    pClient->SetAccount(pAccount);
    pAccount->SetClient(pClient);

    // Call the onPlayerLogin script event
    CLuaArguments Arguments;
    Arguments.PushAccount(pCurrentAccount);
    Arguments.PushAccount(pAccount);
    Arguments.PushBoolean(false);            // was bAutoLogin
    if (!pPlayer->CallEvent("onPlayerLogin", Arguments))
    {
        // DENIED!
        pClient->SetAccount(pCurrentAccount);
        pAccount->SetClient(NULL);
        return false;
    }

    // Success is here
    pAccount->OnLoginSuccess(strPlayerSerial, strPlayerIP);

    SString strGroupList =
        SString::Join(", ", g_pGame->GetACLManager()->GetObjectGroupNames(pAccount->GetName(), CAccessControlListGroupObject::OBJECT_TYPE_USER));
    CLogger::AuthPrintf("LOGIN: (%s) %s successfully logged in as '%s' (IP: %s  Serial: %s)\n", strGroupList.c_str(), pClient->GetNick(),
                        pAccount->GetName().c_str(), strPlayerIP.c_str(), strPlayerSerial.c_str());

    // Tell the player
    if (pEchoClient)
    {
        pEchoClient->SendEcho("login: You successfully logged in");
    }

    // Delete the old account if it was a guest account
    if (!pCurrentAccount->IsRegistered())
        delete pCurrentAccount;

    return true;
}
Esempio n. 4
0
bool WalletBatch::ReadAccount(const std::string& strAccount, CAccount& account)
{
    account.SetNull();
    return m_batch.Read(std::make_pair(std::string("acc"), strAccount), account);
}
Esempio n. 5
0
bool CAccountManager::Load(void)
{
    // Create a registry result
    CRegistryResult result;
    // Select all our required information from the accounts database
    m_pDatabaseManager->QueryWithResultf(m_hDbConnection, &result, "SELECT id,name,password,ip,serial,httppass from accounts");

    // Initialize all our variables
    m_iAccounts = 0;
    bool         bNeedsVacuum = false;
    CElapsedTime activityTimer;
    bool         bOutputFeedback = false;
    for (CRegistryResultIterator iter = result->begin(); iter != result->end(); ++iter)
    {
        const CRegistryResultRow& row = *iter;
        // Fill User ID, Name & Password (Required data)
        int     iUserID = static_cast<int>(row[0].nVal);
        SString strName = (const char*)row[1].pVal;
        SString strPassword = (const char*)row[2].pVal;
        SString strIP = (const char*)row[3].pVal;
        SString strSerial = (const char*)row[4].pVal;
        SString strHttpPassAppend = (const char*)row[5].pVal;

        // Check for overlong names and incorrect escapement
        bool bRemoveAccount = false;
        bool bChanged = false;
        if (strName.length() > 64)
        {
            // Try to repair name
            if (strName.length() <= 256)
            {
                strName = strName.Replace("\"\"", "\"", true).substr(0, 64);
                bChanged = true;
            }

            // If name gone doolally or account with this name already exists, remove account
            if (strName.length() > 256 || Get(strName))
            {
                bNeedsVacuum = true;
                bRemoveAccount = true;
                CLogger::LogPrintf("Removed duplicate or damaged account for %s\n", strName.substr(0, 64).c_str());
            }
        }

        // Check for disallowed account names
        if (strName == "*****" || strName == CONSOLE_ACCOUNT_NAME)
            bRemoveAccount = true;

        // Do account remove if required
        if (bRemoveAccount)
        {
            m_pDatabaseManager->Execf(m_hDbConnection, "DELETE FROM accounts WHERE id=?", SQLITE_INTEGER, iUserID);
            m_pDatabaseManager->Execf(m_hDbConnection, "DELETE FROM userdata WHERE userid=?", SQLITE_INTEGER, iUserID);
            m_pDatabaseManager->Execf(m_hDbConnection, "DELETE FROM serialusage WHERE userid=?", SQLITE_INTEGER, iUserID);
            continue;
        }

        // Create a new account with the specified information
        CAccount* pAccount = g_pGame->GetAccountManager()->AddPlayerAccount(strName, strPassword, iUserID, strIP, strSerial, strHttpPassAppend);

        if (bChanged)
            pAccount->SetChanged(bChanged);
        m_iAccounts = std::max(m_iAccounts, iUserID);

        // Feedback for the user
        if (activityTimer.Get() > 5000)
        {
            activityTimer.Reset();
            bOutputFeedback = true;
            CLogger::LogPrintf("Reading accounts %d/%d\n", m_List.size(), result->nRows);
        }
    }
    if (bOutputFeedback)
        CLogger::LogPrintf("Reading accounts done.\n");
    if (bNeedsVacuum)
        m_pDatabaseManager->Execf(m_hDbConnection, "VACUUM");

    // Save any upgraded accounts
    {
        CElapsedTime activityTimer;
        bool         bOutputFeedback = false;
        uint         uiSaveCount = 0;
        for (CMappedAccountList::const_iterator iter = m_List.begin(); iter != m_List.end(); iter++)
        {
            CAccount* pAccount = *iter;
            if (pAccount->IsRegistered() && pAccount->HasChanged() && !pAccount->IsConsoleAccount())
            {
                uiSaveCount++;
                Save(pAccount, false);
                // Feedback for the user
                if (activityTimer.Get() > 5000)
                {
                    activityTimer.Reset();
                    bOutputFeedback = true;
                    CLogger::LogPrintf("Saving upgraded accounts %d\n", uiSaveCount);
                }
            }
        }

        if (uiSaveCount > 100)
        {
            bOutputFeedback = true;
            CLogger::LogPrintf("Finishing accounts upgrade...\n");
            for (uint i = 0; i < 10; i++)
            {
                Sleep(10);
                m_pDatabaseManager->DoPulse();
            }
        }

        if (bOutputFeedback)
            CLogger::LogPrintf("Completed accounts upgrade.\n");
    }

    return true;
}