
    hk/                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Zddl
ZddlZddlmZmZmZmZmZ ddlmZ 	 ddlmZ dZd Zej4                  d        Z G d	 d
ej8                        Zy# e$ r	 ddlmZ Y :w xY w)z7
Handles making requests and formatting the responses.
    N)STANDARD_OUTPUTBOLD_OUTPUTERROR_OUTPUTuses_settingsmsg)format)StringIOd   c                    | s	 |j                  d      S t        j                  j                  j                  |       r| S t        j                  j                  j                  |       r	 |j                  |       j                  S d| v s*t        j                  j                  j                  |       rfd| v r| j                  dd      \  }}t        j                  j                  j                  |      st        d|z        |r7t        j                  j                  j                  |      st        d|z        t        |      }n| d}}i }|j                         D ]=  }|j                  |k(  s|r|j                   |k(  s%|j                  ||j                   <   ? t#        |      d	k(  rt        d
| z        t#        |      dk(  rt%        |j'                               d	   S d| z  }t)        |      D ]  \  }}|d|dz   ||||   fz  z  } t        |      t        d| z        #  t        d      xY w#  t        d| z        xY w)a  
  Resolves user input into a relay fingerprint. This accepts...

    * Fingerprints
    * Nicknames
    * IPv4 addresses, either with or without an ORPort
    * Empty input, which is resolved to ourselves if we're a relay

  :param str arg: input to be resolved to a relay fingerprint
  :param stem.control.Controller controller: tor control connection

  :returns: **str** for the relay fingerprint

  :raises: **ValueError** if we're unable to resolve the input to a relay
  fingerprintz,We aren't a relay, no information to providez0Unable to find a relay with the nickname of '%s':   z'%s' isn't a valid IPv4 addressz'%s' isn't a valid portNr   zNo relays found at %szAThere's multiple relays at %s, include a port to specify which.

z  %i. %s:%s, fingerprint: %s
z1'%s' isn't a fingerprint, nickname, or IP address)get_info
ValueErrorstemutil	tor_toolsis_valid_fingerprintis_valid_nicknameget_network_statusr   
connectionis_valid_ipv4_addressrsplitis_valid_portintget_network_statusesaddressor_portlenlistvalues	enumerate)	arg
controllerr   portmatchesdescresponseir   s	            c/var/www/betterdocs.net/sherlock_api/venv/lib/python3.12/site-packages/stem/interpreter/commands.py_get_fingerprintr+       s4   " 
G  // yy//4Jyy,,S1Q**3/;;; czTYY))??D
czjja(mgtYY!!77@:WDEE		,,::4@2T9::Yd4tgG//1 3		 t||t+"&"2"2'$,,
3
 7|q.455	W	'.."#A&&VY\\h!'* c*!W4AwQXY`Qa7bbbc x  
H3N
OOSGEFFQICOPPs   H' *H7 'H47Ic              #      K   t         j                  t         j                  f}| |ct         _        t         _        	 d  |\  t         _        t         _        y # |\  t         _        t         _        w xY wwN)sysstdoutstderr)r/   r0   originals      r*   redirectr2   `   sL     ZZ#(!6#*cj&	%CJ
XCJ
s   8A3A A3A00A3c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	e
d
d       Zy	)ControlInterpreterzw
  Handles issuing requests and providing nicely formed responses, with support
  for special irc style subcommands.
  c                     g  _         t        j                  j                   t        t        j
                  | j                  d       | _        d _        d _	         j                  j                   fd}| j                  _
        y )N)r   zstem.controlr$   eventsTFc                      |        j                   j                  d|        t        j                         t        kD  rj                   j	                          y y )Nr   )_received_eventsinsertr   
MAX_EVENTSpop)event_messagehandle_event_realselfs    r*   handle_event_wrapperz9ControlInterpreter.__init__.<locals>.handle_event_wrapper   sK    &
""1m4	T""	#j	0!!# 
1    )r8   codeInteractiveConsole__init__r   control
get_events_controller_run_python_commandsis_multiline_context_handle_event)r>   r$   r?   r=   s   `  @r*   rC   zControlInterpreter.__init__q   s    D$$Tll	,  "D $D
 !&D
 ((66$ &:D"r@   c                     t        | j                        }t        t        t        j                  |            }|r|D cg c]  }|j
                  |v s| }}|S c c}w r-   )r    r8   mapstruppertype)r>   event_typesr6   es       r*   rE   zControlInterpreter.get_events   sR    $''(Fs399k23K!;aQVV{%:;f;M <s   AAc                 j    t         j                  j                  j                  | j                  |      S )z
    Performs the '/help' operation, giving usage information for the given
    argument or a general summary if there wasn't one.
    )r   interpreterhelpr(   rF   )r>   r#   s     r*   do_helpzControlInterpreter.do_help   s)       ))$*:*:C@@r@   c           
         |j                         j                         }d|v r| j                  dd= t        dgt         S dj                   | j                  | D cg c]  }t        t        |      gt          c}      S c c}w )a  
    Performs the '/events' operation, dumping the events that we've received
    belonging to the given types. If no types are specified then this provides
    all buffered events.

    If the user runs '/events clear' then this clears the list of events we've
    received.
    CLEARNzcleared event backlog
)rM   splitr8   r   r   joinrE   rL   )r>   r#   rO   rP   s       r*   	do_eventszControlInterpreter.do_events   sv     ))+##%K+



"+>o>>99Q\@]^1fSV6o6^__^s    Bc           	         	 t        || j                        }| j                  j                  |d      }| j                  j                  |d      }d}| j                  j                  |d      }|st        d|z  gt
         S t        j                  j                  j                  d      }|j                  |      }	|j                  |      }
|	D ]  }|} |
D ]  }|} g }	 |j                  t!        j"                  |j$                        d          	 |j                  | j                  j'                  d|j$                  z               |rddj)                  |      z  nd	}|rt	        |j*                        }n|rt	        |j*                        }nd
}|j,                  d|dt        dgt.         |j$                  d|j0                  |z   g}|r5|j                  t        dgt.         t	        |j2                        z          |j                  t        dgt.         dj)                  |j4                        z          |j                  t        dgt.         |z          |r|j6                  rt        j8                  j:                  j=                  |j6                        }dD ]  }|j?                  |d      } dD ]  }|j?                  |d      } |j                  t        dgt.         |z          d|fd|fd|fd|fg}t        dgt@         }|D ]X  \  }}|s	|d	|t        |gt.         |d	gz  }|t	        |      jC                         D cg c]  }t        |gt@          c}z  }Z dj)                  |      S # t        $ r#}t        t	        |      gt
         cY d}~S d}~ww xY w#  Y xY w#  Y {xY wc c}w )z
    Performs the '/info' operation, looking up a relay by fingerprint, IP
    address, or nickname and printing its descriptor and consensus entries in a
    pretty fashion.
    Nz+Unable to find consensus information for %s   )timeoutr   zip-to-country/%sz (%s)z,  Unknownz ()z	address: r   ztor version: zflags: zexit policy: )z at z AT @)z dot z DOT .z	contact: zServer Descriptor:zExtrainfo Descriptor:zMicrodescriptor:zRouter Status Entry:zP--------------------------------------------------------------------------------rW   )"r+   rF   r   r   rL   r   r   get_server_descriptorget_microdescriptorr   
descriptorremoteDescriptorDownloaderget_server_descriptorsget_extrainfo_descriptorsappendsocketgethostbyaddrr   r   rY   exit_policynicknamer   r   tor_versionflagscontactr   	str_tools_to_unicodereplacer   
splitlines)r>   r#   r   excns_descserver_descextrainfo_desc
micro_desc
downloaderserver_desc_queryextrainfo_desc_queryr'   address_extrainfoaddress_extrainfo_labelexit_policy_labellinesrq   aliasdescriptor_sectiondivlabellines                         r*   do_infozControlInterpreter.do_info   s   -$S$*:*:;k 11+tDG""88dKKN!!55k4HJ AKO_R^__
 ''<<q<IJ"99+F%??L! k % n v33GOODQGHt//889Kgoo9]^_ IZg		2C(DD_ak556	j445# ##[1[';'wYp*qqE
 ll6/8K83{?V?V;WWX	LL	0K0499W]]3KKL	LL6+69JJK{**		##//0C0CDg $ .%//%-. & .%//%-. ll6+44w>? [)/:&w'	 
,O
,C) Ut	"c6%6+6R@@SY=Q=Q=STT&00TTU
 99Uo  -CH,|,,-@

^ Us;   N $1N; 7O O	N8N3-N83N8;O Oc                     |s#| j                   rdnd}t        d|z  gt         S |j                         dk(  rd| _         n.|j                         dk(  rd| _         nt        d|z  gt         S | j                   rd	}nd
}t        |gt         S )z]
    Performs the '/python' operation, toggling if we accept python commands or
    not.
    enableddisabledzPython support is currently %s.enableTdisableFzP'%s' is not recognized. Please run either '/python enable' or '/python disable'.zIPython support enabled, we'll now run non-interpreter commands as python.zBPython support disabled, we'll now pass along all commands to tor.)rG   r   r   lowerr   )r>   r#   statusr(   s       r*   	do_pythonzControlInterpreter.do_python  s      55y:f5>QQQ		 "&d			!"'dfill|o{||  \hUh(-_--r@   c                 L   |j                         d}}d|v r|j                  dd      \  }}d}|j                  d      r|j                         }|dk(  rt	        j
                         |dk(  r| j                  |      }n|dk(  r| j                  |      }n|dk(  r| j                  |      }n|d	k(  r| j                  |      }nht        d
|z  gt         }nS|j                         }|j                  dd      dv rt        t        d      gt         }n|dk(  r/| j                  j                  |       t	        j
                         ||j!                  di       v xr |j                         dk7  }| j"                  re|sct%               }t'        ||      5  t(        j*                  j-                  | |      | _        ddd       |j1                         j                         }nF	 t        | j                  j                  |      j3                         j                         gt4         }|r|dz  }|rt=        |       |S # 1 sw Y   xY w# t        j6                  $ r>}	t9        |	t        j
                        r t        t;        |	      gt         }Y d}	~	nd}	~	ww xY w)a  
    Runs the given command. Requests starting with a '/' are special commands
    to the interpreter, and anything else is sent to the control port.

    :param stem.control.Controller controller: tor control connection
    :param str command: command to be processed
    :param bool print_response: prints the response to stdout if true

    :returns: **list** out output lines, each line being a list of
      (msg, format) tuples

    :raises: **stem.SocketClosed** if the control connection has been severed
    r^    r   /z/quitz/eventsz/infoz/pythonz/helpz'%s' isn't a recognized command+)LOADCONFPOSTDESCRIPTORz"msg.multiline_unimplemented_noticeQUITz
help.usager6   NrW   )striprX   
startswithr   r   SocketClosedrZ   r   r   rT   r   r   rM   rt   r   rF   getrG   r	   r2   rA   rB   pushrH   getvalueraw_contentr   ControllerError
isinstancerL   print)
r>   commandconfigprint_responsecmdr#   outputis_tor_commandconsole_outputrv   s
             r*   run_commandzControlInterpreter.run_command-  sJ   4 }}C
cz3"hc3F
~~cIIKc	!!)$'>c")$'>c"9GCSlSIIKc	S"	!?	?@AQLQ&=W%!!

< <<XPXAX$$^#:.7 T(,(?(?(D(DT7(SD%T "**,224&7D,,009EEGMMObRabF nf	fM'T T %% 7#t001c#h66f	7s%   &I+AI IJ#%4JJ#N)F)__name__
__module____qualname____doc__rC   rE   rT   rZ   r   r   r   r    r@   r*   r4   r4   k   s@    
:@A`$`D.. Q Qr@   r4   )r   rA   
contextlibrk   r.   r   stem.controlstem.descriptor.remotestem.interpreter.helpstem.util.connectionstem.util.str_toolsstem.util.tor_toolsstem.interpreterr   r   r   r   r   stem.util.termr   	cStringIOr	   ImportErrorior:   r+   contextmanagerr2   rB   r4   r   r@   r*   <module>r      s       
        [ [ !  
=P@ & &T00 Tc  s   A7 7BB