@ -11,6 +11,7 @@ const TorControlClient = new Lang.Class({
this . _connect ( ) ;
this . _connect ( ) ;
this . _updateProtocolInfo ( ) ;
this . _updateProtocolInfo ( ) ;
this . _ensureProtocolCompatibility ( ) ;
this . _ensureProtocolCompatibility ( ) ;
this . authenticate ( ) ;
} ,
} ,
close : function ( ) {
close : function ( ) {
@ -20,6 +21,23 @@ const TorControlClient = new Lang.Class({
}
}
} ,
} ,
authenticate : function ( ) {
var cookie = this . _readAuthCookie ( ) ;
var reply = this . _runCommand ( 'AUTHENTICATE ' + cookie ) ;
if ( reply . statusCode != 250 ) {
throw 'Could not authenticate, reason: ' + reply . replyLines . join ( '\n' ) ;
}
} ,
switchIdentity : function ( ) {
var reply = this . _runCommand ( 'SIGNAL NEWNYM' ) ;
if ( reply . statusCode != 250 ) {
throw 'Could not change Tor identity, reason: ' + reply . replyLines . join ( '\n' ) ;
}
} ,
_connect : function ( ) {
_connect : function ( ) {
var socketClient = new Gio . SocketClient ( ) ;
var socketClient = new Gio . SocketClient ( ) ;
this . _connection = socketClient . connect _to _host ( '127.0.0.1:9051' , null , null ) ;
this . _connection = socketClient . connect _to _host ( '127.0.0.1:9051' , null , null ) ;
@ -51,7 +69,7 @@ const TorControlClient = new Lang.Class({
if ( authMethods . indexOf ( 'COOKIE' ) != - 1 || authMethods . indexOf ( 'SAFECOOKIE' ) != - 1 ) {
if ( authMethods . indexOf ( 'COOKIE' ) != - 1 || authMethods . indexOf ( 'SAFECOOKIE' ) != - 1 ) {
let cookieArg = tokens [ 2 ] . split ( '=' ) ;
let cookieArg = tokens [ 2 ] . split ( '=' ) ;
authCookieFile = cookieArg [ 1 ] ;
authCookieFile = cookieArg [ 1 ] .substr ( 1 , cookieArg [ 1 ] . length - 2 ) ; // strip quotes
}
}
break ;
break ;
}
}
@ -101,6 +119,24 @@ const TorControlClient = new Lang.Class({
isMidReplyLine : ( line [ 3 ] == '-' ) ,
isMidReplyLine : ( line [ 3 ] == '-' ) ,
replyLine : line . substring ( 4 )
replyLine : line . substring ( 4 )
}
}
} ,
_readAuthCookie : function ( ) {
var file = Gio . File . new _for _path ( this . _protocolInfo . authCookieFile ) ;
var inputStream = file . read ( null ) ;
var cookieData = inputStream . read _bytes ( 32 , null , null ) . get _data ( ) ;
inputStream . close ( null ) ;
var authCookie = '' ;
for ( var i = 0 ; i < cookieData . length ; i ++ ) {
let hexByte = cookieData [ i ] . toString ( 16 ) ;
if ( hexByte . length == 1 ) {
hexByte = '0' + hexByte ;
}
authCookie += hexByte ;
}
return authCookie ;
}
}
} ) ;
} ) ;