2010-10-22 10 views
1

Je travaille sur l'intégration de tor à mon application Delphi; toute l'histoire is explained in this linkPortage du code PHP au code Delphi

Après que je cherché sur internet alors j'ai trouvé un code pour changer de nouvelle identité en PHP

function tor_new_identity($tor_ip='127.0.0.1', $control_port='9051', $auth_code=''){ 
    $fp = fsockopen($tor_ip, $control_port, $errno, $errstr, 30); 
    if (!$fp) return false; //can't connect to the control port 

    fputs($fp, "AUTHENTICATE $auth_code\r\n"); 
    $response = fread($fp, 1024); 
    list($code, $text) = explode(' ', $response, 2); 
    if ($code != '250') return false; //authentication failed 

    //send the request to for new identity 
    fputs($fp, "signal NEWNYM\r\n"); 
    $response = fread($fp, 1024); 
    list($code, $text) = explode(' ', $response, 2); 
    if ($code != '250') return false; //signal failed 

    fclose($fp); 
    return true; 
} 

Quelqu'un peut me aider portage cela à Delphi/Pascal

Je ne sais les bases PHP

merci à l'avance

concernant

Répondre

4

Attention: Je n'ai pas écrit cela dans un IDE, mais toute erreur de syntaxe devrait être facile à corriger. La logique autour de "envoyer une commande, lire une ligne, voir si c'est un code de réponse 250" devrait vraiment être retirée dans une fonction séparée. Je ne l'ai pas fait, donc le code ressemble un peu plus au PHP original. (J'ai un CheckOK parce que je ne pouvais pas m'arrêter.)

function CheckOK(Response: String): Boolean; 
var 
    Code: Integer; 
    SpacePos: Integer; 
    Token: String; 
begin 
    SpacePos := Pos(' ', Response); 
    Token := Copy(Response, 1, SpacePos); 
    Code := StrToIntDef(Token, -1); 
    Result := Code = 250; 
end; 

function TorNewIdentity(TorIP: String = '127.0.0.1'; ControlPort: Integer = 9051; AuthCode: String = ''): Boolean 
var 
    C: TIdTcpClient; 
    Response: String; 
begin 
    Result := true; 

    C := TIdTcpClient.Create(nil); 
    try 
    C.Host := TorIP; 
    C.Port := ControlPort; 
    C.Connect(5000); // milliseconds 

    C.WriteLn('AUTHENTICATE ' + AuthCode); 
    // I assume here that the response will be a single CRLF-terminated line. 
    Response := C.ReadLn; 
    if not CheckOK(Response) then begin 
     // Authentication failed. 
     Result := false; 
     Exit; 
    end; 

    C.WriteLn('signal NEWNYM'); 
    Response := C.ReadLn; 
    if not CheckOK(Response) then begin 
     // Signal failed. 
     Result := false; 
     Exit; 
    end; 
    finally 
    C.Free; 
    end; 
end; 
+0

Il y a une erreur évidente dans votre CheckOK: Elle est déclarée comme Integer mais le type 'Result' (et le type comme dans TorNewIdentity) est une expression booléenne. –

+0

+1 pour _ parce que je ne pouvais pas m'arrêter_: D – jachguate

+0

@Mason me sert bien pour l'écrire dans un éditeur de texte. Merci! –

1

Une petite erreur dans la réponse précédente. Dans la fonction CheckOK Résultat: = Code <> 250; doit être remplacé par Résultat: = (code = 250);

PS: Désolé, je ne vois aucun moyen de poster un commentaire à la réponse originale.

+0

Vous avez raison. Modifié en conséquence! –