bool CScrobbler::DoHandshake(time_t now) { XBMC::XBMC_MD5 authToken; CStdString strAuthToken; CStdString strTimeStamp; CStdString strResponse; CStdString strHandshakeRequest; // Create auth token. md5(md5(pass)+str(now)) strTimeStamp.Format("%d", now); authToken.append(m_strPasswordHash + strTimeStamp); authToken.getDigest(strAuthToken); strAuthToken.ToLower(); // Construct handshake URL. strHandshakeRequest.Format("http://%s/?hs=true"\ "&p=%s&c=%s&v=%s&u=%s&t=%d&a=%s", m_strHandshakeURL.c_str(), SCROBBLER_PROTOCOL, SCROBBLER_CLIENT, SCROBBLER_CLIENT_VERSION, m_strUsername.c_str(), now, strAuthToken.c_str()); // Make and handle request if (m_pHttp->Get(strHandshakeRequest, strResponse) && HandleHandshake(strResponse)) return true; m_failedHandshakeDelay = // 60, 120, 240, ... 7200s (m_failedHandshakeDelay) ? std::min(2*m_failedHandshakeDelay, 7200) : 60; m_lastFailedHandshake = now; if (!m_bBanned && !m_bBadAuth) CLog::Log(LOGDEBUG, "%s: A hard error has occurred during "\ "handshake. Sleeping for %d minutes.", m_strLogPrefix.c_str(), m_failedHandshakeDelay/60); return false; }
bool PPatchServer::ProcessClient(PClient *Client, PPatchState *State) { static const u8 HANDSHAKE0A[6]={0xfe, 0x03, 0x00, 0x80, 0x03, 0x6b}; if(!State) { PatchStateMap::iterator node = ClientStates.find(Client); if(node == ClientStates.end()) return false; State = node->second; } ConnectionTCP *Socket = Client->getTCPConn(); if(State->mWaitSend && Socket->getSendBufferSize()==0) return false; if(State->mState==PPatchState::PS_CONNECTED) { Console->Print("Sending Handshake 0A"); Socket->write(HANDSHAKE0A, sizeof(HANDSHAKE0A)); //short unsigned int packet = (short unsigned int) HANDSHAKE0A; //Socket->write(htons(packet)); State->mState = PPatchState::PS_HANDSHAKE0; Socket->flushSendBuffer(); } int PacketSize=0; const u8 *Packet = Socket->read(&PacketSize); if(PacketSize > 0) { switch(State->mState) { case PPatchState::PS_HANDSHAKE1 : case PPatchState::PS_HANDSHAKE0 : Console->Print("Handling Handshake 0 and 1"); return HandleHandshake(Client, State, Packet, PacketSize); case PPatchState::PS_VERSIONREQUEST : Console->Print("Handling Client Versionsrequest"); return HandleVersionRequest(Client, State, Packet, PacketSize); case PPatchState::PS_GETPATCHORFILE : case PPatchState::PS_SENDPATCH : case PPatchState::PS_SENDFILE : Console->Print("Getpatchforfile, sendpatch, sendfile"); return HandleFileRequests(Client, State, Packet, PacketSize); default: break; } } return true; }
bool PGameServer::ProcessClient( PClient *Client, PGameState *State ) { static const u8 HANDSHAKE0A[6] = {0xfe, 0x03, 0x00, 0x80, 0x01, 0x66}; if ( !State ) { GameStateMap::iterator node = ClientStates.find( Client ); if ( node == ClientStates.end() ) return ( false ); State = node->second; } ConnectionTCP *Socket = Client->getTCPConn(); if ( !Socket ) Console->Print( RED, BLACK, "PANIC: Client %d : TCP Socket is NULL !!!", Client->GetID() ); if ( State->TCP.mWaitSend && Socket->getSendBufferSize() == 0 ) return ( false ); if ( State->TCP.mState == PGameState::TCP::GS_CONNECTED ) { Socket->write( HANDSHAKE0A, 6 ); State->TCP.mState = PGameState::TCP::GS_HANDSHAKE0; } if ( State->TCP.mState == PGameState::TCP::GS_INGAME ) { return ( HandleGame( Client, State ) ); } else { int PacketSize = 0; const u8 *Packet = Socket->read( &PacketSize ); if ( PacketSize > 0 ) { switch ( State->TCP.mState ) { case PGameState::TCP::GS_HANDSHAKE0: return ( HandleHandshake( State, Packet, PacketSize ) ); case PGameState::TCP::GS_AUTHENTICATE: return ( HandleAuthenticate( Client, State, Packet, PacketSize ) ); case PGameState::TCP::GS_GAMEDATA: return ( HandleGameData( Client, State, Packet ) ); case PGameState::TCP::GS_REQUESTCHARS: return ( HandleRequestChars( Client, State, Packet ) ); case PGameState::TCP::GS_CHARLIST: return ( HandleCharList( Client, State, Packet, PacketSize ) ); case PGameState::TCP::GS_GETSTATUS: return ( HandleGetStatus( Client, State, Packet ) ); case PGameState::TCP::GS_GAMEINFO: return ( HandleGameInfo( Client, State, Packet ) ); default: break; } } } return ( true ); }