ResponseCode CResourceHTMLItem::Request ( HttpRequest * ipoHttpRequest, HttpResponse * ipoHttpResponse, CAccount * account ) { if ( !m_pVM ) Start (); if ( m_bIsBeingRequested ) { ipoHttpResponse->SetBody ( "Busy!", strlen("Busy!") ); return HTTPRESPONSECODE_500_INTERNALSERVERERROR; } m_bIsBeingRequested = true; m_responseCode = HTTPRESPONSECODE_200_OK; if ( !m_bIsRaw ) { ipoHttpResponse->oResponseHeaders [ "content-type" ] = m_strMime; CLuaArguments formData; for ( FormValueMap::iterator iter = ipoHttpRequest->oFormValueMap.begin(); iter != ipoHttpRequest->oFormValueMap.end(); iter++ ) { formData.PushString ( (*iter).first.c_str() ); formData.PushString ( ((FormValue)(*iter).second).sBody.c_str() ); } CLuaArguments cookies; for ( CookieMap::iterator iter = ipoHttpRequest->oCookieMap.begin(); iter != ipoHttpRequest->oCookieMap.end(); iter++ ) { cookies.PushString ( (*iter).first.c_str() ); cookies.PushString ( (*iter).second.c_str() ); } CLuaArguments headers; for ( StringMap::iterator iter = ipoHttpRequest->oRequestHeaders.begin(); iter != ipoHttpRequest->oRequestHeaders.end(); iter++ ) { headers.PushString ( (*iter).first.c_str() ); headers.PushString ( (*iter).second.c_str() ); } m_currentResponse = ipoHttpResponse; CLuaArguments querystring ( formData ); CLuaArguments args; args.PushTable ( &headers ); // requestHeaders args.PushTable ( &formData ); // form args.PushTable ( &cookies ); // cookies args.PushString ( ipoHttpRequest->GetAddress().c_str() ); // hostname args.PushString ( ipoHttpRequest->sOriginalUri.c_str() ); // url args.PushTable ( &querystring ); // querystring args.PushAccount ( account ); // g_pGame->Lock(); // get the mutex (blocking) args.CallGlobal ( m_pVM, "renderPage" ); // g_pGame->Unlock(); // release the mutex ipoHttpResponse->SetBody ( m_strPageBuffer.c_str (), m_strPageBuffer.size () ); m_strPageBuffer.clear (); } else { // its a raw page FILE * file = fopen ( m_strResourceFileName.c_str (), "rb" ); if ( file ) { fseek ( file, 0, SEEK_END ); long lBufferLength = ftell ( file ); char* pBuffer = new char [ lBufferLength ]; rewind ( file ); fread ( pBuffer, 1, lBufferLength, file ); fclose ( file ); ipoHttpResponse->oResponseHeaders [ "content-type" ] = m_strMime; ipoHttpResponse->SetBody ( pBuffer, lBufferLength ); delete[] pBuffer; } else { ipoHttpResponse->SetBody ( "Can't read file!", strlen("Can't read file!") ); } } m_bIsBeingRequested = false; return m_responseCode; }
bool CAccountManager::LogIn ( CClient* pClient, CClient* pEchoClient, CAccount* pAccount, bool bAutoLogin ) { // Log him in CAccount* pCurrentAccount = pClient->GetAccount (); pClient->SetAccount ( pAccount ); pAccount->SetClient ( pClient ); string strPlayerIP, strPlayerSerial; if ( pClient->GetClientType () == CClient::CLIENT_PLAYER ) { CPlayer* pPlayer = static_cast < CPlayer* > ( pClient ); // Get the players details strPlayerIP = pPlayer->GetSourceIP () ; strPlayerSerial = pPlayer->GetSerial (); // Set in account pAccount->SetIP ( strPlayerIP ); pAccount->SetSerial ( strPlayerSerial ); } // Call the onClientLogin script event CElement* pClientElement = NULL; switch ( pClient->GetClientType () ) { case CClient::CLIENT_PLAYER: { CPlayer* pPlayer = static_cast < CPlayer* > ( pClient ); pClientElement = static_cast < CElement* > ( pPlayer ); break; } case CClient::CLIENT_CONSOLE: { CConsoleClient* pConsoleClient = static_cast < CConsoleClient* > ( pClient ); pClientElement = static_cast < CElement* > ( pConsoleClient ); break; } } if ( pClientElement ) { CLuaArguments Arguments; Arguments.PushAccount ( pCurrentAccount ); Arguments.PushAccount ( pAccount ); Arguments.PushBoolean ( bAutoLogin ); if ( !pClientElement->CallEvent ( "onPlayerLogin", Arguments ) ) { // DENIED! pClient->SetAccount ( pCurrentAccount ); pAccount->SetClient ( NULL ); return false; } } // Get the names of the groups the client belongs to - I did it like this for a larf string strGroupList; for ( list <CAccessControlListGroup* > ::const_iterator iterg = g_pGame->GetACLManager ()->Groups_Begin () ; iterg != g_pGame->GetACLManager ()->Groups_End (); iterg++ ) for ( list <CAccessControlListGroupObject* > ::iterator itero = (*iterg)->IterBeginObjects () ; itero != (*iterg)->IterEndObjects (); itero++ ) if ( (*itero)->GetObjectType () == CAccessControlListGroupObject::OBJECT_TYPE_USER ) if ( (*itero)->GetObjectName () == pAccount->GetName () || strcmp ( (*itero)->GetObjectName (), "*" ) == 0 ) strGroupList = string( (*iterg)->GetGroupName () ) + ( strGroupList.length() ? ", " : "" ) + strGroupList; 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 ) { if ( bAutoLogin ) pEchoClient->SendEcho ( "auto-login: You successfully logged in" ); else pEchoClient->SendEcho ( "login: You successfully logged in" ); } // Update who was info if ( pClient->GetClientType () == CClient::CLIENT_PLAYER ) g_pGame->GetConsole ()->GetWhoWas ()->OnPlayerLogin ( static_cast < CPlayer* > ( pClient ) ); // Delete the old account if it was a guest account if ( !pCurrentAccount->IsRegistered () ) delete pCurrentAccount; return true; }
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" ); } // Update who was info if ( pClient->GetClientType () == CClient::CLIENT_PLAYER ) g_pGame->GetConsole ()->GetWhoWas ()->OnPlayerLogin ( static_cast < CPlayer* > ( pClient ) ); // Delete the old account if it was a guest account if ( !pCurrentAccount->IsRegistered () ) delete pCurrentAccount; return true; }