Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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 );
}