
    kjDF                     h   d dl Z d dlmZ d dlZd dlZd dlZd dlZd dlm	Z	 d dlm
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ  G d dej2                        Z G d dej6                        Z G d dej:                  ej<                        Zy)    N)	lru_cache)contentviews)ctx)dns)http)tcp)udp)
DNSMessage)common)flowdetailview)layoutwidget)
searchable)tabs)strutilsc                   "    e Zd Z	 	 	 	 ddZd Zy)FlowViewHeaderNc                 2    || _         | j                          y N)masterfocus_changed)selfr   s     i/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/mitmproxy/tools/console/flowview.py__init__zFlowViewHeader.__init__   s         c                    | j                   j                  j                         \  }}| j                   j                  j                  j
                  r|t        j                  | j                   j                  j                  j
                  t        j                  j                  | j                   j                  j                        | _        y t        j                  g       | _        y )N)render_mode
hostheader)r   uiget_cols_rowsviewfocusflowr   format_flow
RenderMode
DETAILVIEWoptionsshowhost_wurwidPile)r   cols_s      r   r   zFlowViewHeader.focus_changed    s    ++....0a;;!!&&((  &&++"--88;;..77DG jjnDGr   )r   z,mitmproxy.tools.console.master.ConsoleMasterreturnN)__name__
__module____qualname__r   r    r   r   r   r      s    > 
	%r   r   c            
           e Zd Z fdZed        Zedej                  j                  fd       Zd Z	d Z
d Zd Zdefd	Zdefd
Zd Zd Zd Zd Zd Zd Zd Zd ZdedefdZdej4                   dfZdej8                   dfZd Zdej@                  fdZ!d Z"dede#jH                  de%ee&ejN                     f   fdZ( e)d      ded e*de%ee&ejN                     f   fd!       Z+d" Z,d#ede-d$z  de.j^                  fd%Z0 xZ1S )&FlowDetailsc                     || _         t        | 	  g        | j                          d | _        d | _        t        j                  j                  j                  | j                         y r   )r   superr   showlast_displayed_body!last_displayed_websocket_messagesr   registry	on_changeconnectcontentview_changedr   r   	__class__s     r   r   zFlowDetails.__init__-   sP    		#' 15.''//0H0HIr   c                 .    | j                   j                  S r   )r   r    r   s    r   r    zFlowDetails.view5   s    {{r   r-   c                 V    | j                   j                  j                  j                  S r   )r   r    r!   r"   r@   s    r   r"   zFlowDetails.flow9   s    {{%%***r   c                     | j                   j                          | j                  j                  j	                  d      r| j                          y y )Nflowview)_get_content_viewcache_clearr   windowcurrent_windowr6   )r   r    s     r   r<   zFlowDetails.contentview_changed=   s<     	**,;;,,Z8IIK 9r   c                    | j                   }|rt        |t        j                        r|j                  re| j
                  | j                  f| j                  | j                  f| j                  | j                  f| j                  | j                  fg| _        nT| j
                  | j                  f| j                  | j                  f| j                  | j                  fg| _        nt        |t        j                        r6| j                   | j"                  f| j                  | j                  fg| _        nt        |t$        j&                        r6| j(                  | j"                  f| j                  | j                  fg| _        nft        |t*        j,                        rL| j.                  | j0                  f| j2                  | j4                  f| j                  | j                  fg| _        | j7                          y | j8                  j:                  j=                         j>                  d   dk7  r%| j8                  j:                  jA                          y y )Nflowlist)!r"   
isinstancer   HTTPFlow	websockettab_http_requestview_requesttab_http_responseview_responsetab_websocket_messagesview_websocket_messagestab_detailsview_detailsr   r   TCPFlowtab_tcp_streamview_message_streamr	   UDPFlowtab_udp_streamr   DNSFlowtab_dns_requestview_dns_requesttab_dns_responseview_dns_responser6   r   rF   focus_stackstackpop)r   fs     r   r   zFlowDetails.focus_changedD   s   II!T]]+;;..0A0AB//1C1CD44d6R6RS))4+<+<=	!DI ..0A0AB//1C1CD))4+<+<=!DI
 As{{+(($*B*BC%%t'8'89	 As{{+(($*B*BC%%t'8'89	 As{{+))4+@+@A**D,B,BC%%t'8'89	
 IIK {{!!--/55b9ZG""&&( Hr   c                     | j                   }t        |t        j                        sJ | j                   j                  r|j
                  syyNzRequest interceptedRequest)r"   rK   r   rL   interceptedresponser   r"   s     r   rN   zFlowDetails.tab_http_requestn   s8    yy$...99  (r   c                    | j                   }t        |t        j                        sJ |j                  xr" t        |j                  j                        dk7  }| j                   j                  xr |j                  xr | }|ryy)Nr   Response interceptedResponse)	r"   rK   r   rL   rM   lenmessagesrg   rh   )r   r"   websocket_startedresponse_is_intercepteds       r   rP   zFlowDetails.tab_http_responsev   ss    yy$... !NNPs4>>3J3J/Kq/PII!!MdmmM<M8M 	  #)r   c                     | j                   }t        |t        j                        sJ | j                   j                  r|j
                  syyre   r"   rK   r   r[   rg   rh   ri   s     r   r\   zFlowDetails.tab_dns_request   s8    yy$,,,99  (r   c                     | j                   }t        |t        j                        sJ | j                   j                  r|j
                  ryy)Nrk   rl   rr   ri   s     r   r^   zFlowDetails.tab_dns_response   s8    yy$,,,99  T]])r   c                      y)Nz
TCP Streamr1   r@   s    r   rW   zFlowDetails.tab_tcp_stream       r   c                      y)Nz
UDP Streamr1   r@   s    r   rZ   zFlowDetails.tab_udp_stream   ru   r   c                     | j                   }t        |t        j                        sJ |j                  sJ | j                   j
                  r#t        |j                  j                        dk7  ryy)Nr   zWebSocket Messages interceptedzWebSocket Messages)r"   rK   r   rL   rM   rg   rm   rn   ri   s     r   rR   z"FlowDetails.tab_websocket_messages   sT    yy$...~~~99  S)@)@%AQ%F3'r   c                      y)NDetailr1   r@   s    r   rT   zFlowDetails.tab_details   s    r   c                     | j                   }t        |t        j                        sJ | j	                  |j
                        S r   )r"   rK   r   rL   	conn_textrequestri   s     r   rO   zFlowDetails.view_request   s2    yy$...~~dll++r   c                     | j                   }t        |t        j                        sJ | j	                  |j
                        S r   )r"   rK   r   rL   r{   rh   ri   s     r   rQ   zFlowDetails.view_response   s2    yy$...~~dmm,,r   c                     | j                   }t        |t        j                        sJ | j	                  d|j
                        S )Nr|   )r"   rK   r   r[   dns_message_textr|   ri   s     r   r]   zFlowDetails.view_dns_request   s6    yy$,,,$$Y==r   c                     | j                   }t        |t        j                        sJ | j	                  d|j
                        S )Nrh   )r"   rK   r   r[   r   rh   ri   s     r   r_   zFlowDetails.view_dns_response   s6    yy$,,,$$Z??r   descriptionviewmodec           	          t        j                  d|fg      t        j                  ddddd|z  fgd      g}t        j                  t        j                  |      d      }|S )Nheading )r   [)heading_keymz:%s]right)align)r)   TextAttrMapColumns)r   r   r   r+   contentview_status_bars        r   _contentview_status_barz#FlowDetails._contentview_status_bar   sr    JJ,
 JJ$((!24	 
  "'u}}T/BI!N%%r   from_clientr   	to_clientc           
      R   | j                   }t        |t        j                        sJ |j                  J |j                  j
                  s)t        j                  t        j                  d      g      S | j                  j                  j                  d      }g }|j                  j
                  D ]  }t        j                  |||      }t        j                   j#                  |j$                  |j                         }|j&                  r| j(                  }n| j*                  }|j-                  t        j                  |g|              |j                  j.                  |j-                  t        j                  |j                  j.                  r| j(                  n| j*                  |j                  j0                  dv rdndd|j                  j0                   d|j                  j2                   fg             |j4                  r,|d	   j7                         d
   }|d	   j9                  d|f       |j;                  d
| j=                  |j?                         |             | j@                  x}	||	jB                  d d  |	}
|
S t        j                  |      }
|
| _         |
S )N	highlightzNo messages.console.flowview.modelanguage)i  i  i  alerterrorzConnection closed: r   rI   r   	intercept)"r"   rK   r   rL   rM   rn   r   
Searchabler)   r   r   commandscallr   prettify_messagemitmproxy_rssyntax_highlightr   textr   FROM_CLIENT_MARKERTO_CLIENT_MARKERappendclosed_by_client
close_codeclose_reasonrg   get_textset_textinsertr   
capitalizer8   walker)r   r"   r   widget_linesr   prettychunksmarkermarkup	last_viewr    s              r   rS   z#FlowDetails.view_websocket_messages   s^   yy$...~~)))~~&&((%**5R*S)TUU;;'',,-DE(( 
	?A!221dHEF!22<<00 = F }}00..

F+<V+< =>
	? >>**6

  $~~>> !33!%!6!6  $~~88<NN $!(1$..2K2K1LAdnnNiNiMjk	$ !"%..03F%%{F&;<t++H,?,?,A8L	
 ???IL".IQD
  ((6D59D2r   c                 v   | j                   }t        |t        j                  t        j
                  f      sJ |j                  s)t        j                  t        j                  d      g      S | j                  j                  j                  d      }g }|j                  D ]  }|j                  r| j                  }n| j                   }t#        j$                  |||      }t&        j(                  j+                  |j,                  |j(                        }|j/                  t        j                  |g|              |j0                  r,|d   j3                         d   }|d   j5                  d|f       |j7                  d| j9                  |j;                         |             t        j                  |      S )Nr   r   r   rI   r   r   )r"   rK   r   rV   r	   rY   rn   r   r   r)   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   r   r   r   r   r   )	r   r"   r   r   r   r   r   r   r   s	            r   rX   zFlowDetails.view_message_stream  st   yy$ckk :;;;}}((%**5R*S)TUU;;'',,-DE 	?A}}00..!221dHEF!22<<00 = F
 

F+<V+< =>	? !"%..03F%%{F&;<t++H,?,?,A8L	
 $$\22r   c                 V    t        j                  | j                  | j                        S r   )r   flowdetailsr    r"   r@   s    r   rU   zFlowDetails.view_details/  s    ))$))TYY??r   messagec           	      h   |j                   dt        j                  dg      gfS |j                   dk(  rYt        |t        j
                        r't        |dd      }|s0dt        j                  d      gfS dt        j                  d      gfS | j                  j                  j                  d      }|dk(  rt        j                  }nt        j                  j                  }t        |j                   |j                   j"                  t        |d	d       f      }|| _        | j'                  |||      S )
N )r   z[content missing]r   queryzNo request contentz
No contentz.view.settings.getval @focus fullcontents falsetruepath)raw_contentr)   r   rK   r   rf   getattrr   r   executesysmaxsizer   r&   content_view_lines_cutoffhashheadersfields_get_content_view_messagerD   )r   r   r   r   fulllimitflow_modify_cache_invalidations          r   content_viewzFlowDetails.content_view2  s    &

$B#CDEEE#%'4<<0"5

+? @AAA EJJ|4555{{##++<
 6>KKEKK99E)-##&&.*
& *1&%%h7UVVr      )r   	max_linesc                     | j                   }d | _         t        j                  || j                  |      }t	        j
                  |j                  |      }t        j                  j                  ||j                        }t        j                  |      g}t        |      t        |j                        k  r,|j                  t        j                  dd|z  fddg             |j                   d|j                   |fS )Nr   r   z.Stopped displaying data after %d lines. Press )keyrc   )r   z to load all data.r   )r   r   r   r"   r   cut_after_n_linesr   r   r   r   r)   r   rm   r   	view_namer   )	r   r   r   r,   r   r   cut_offr   text_objectss	            r   rD   zFlowDetails._get_content_viewV  s     !% > >)-&..w		8L,,V[[)D..88,, 9 

 

6*+w<#fkk**

 (L'(
 %;
 ""#1V%7%7$89<GGr   c                 P   |rg }|j                   j                  D ]E  \  }}t        j                  |      dz   }t        j                  |      }|j	                  ||f       G t        j                  |d      }| j                  j                  j                  d      }| j                  ||      \  }}|j	                  | j                  ||             |j                  |       n,t        j                  d      t        j                  g d      g}t        j                   |      S )N:header)
key_formatr   r   ))r   zNo response. Press )r   e)r   z  and edit any aspect to add one.)r   r   r   bytes_to_escaped_strr   r   format_keyvalsr   r   r   r   r   extendr)   r   r   r   )	r   connhdrskvtxtr   msgbodys	            r   r{   zFlowDetails.conn_textw  s    D++ $1$ 11!4s:11!4QF#)$* ''BC{{++001HIH))(D9ICJJt33CBCJJt 

2

	C $$S))r   typeNc                 l   |rdt         j                  fd}g }|j                  t        j                  dj                  |j                  rdnd                   |j                  d |j                  D               |j                  t        j                  d             |j                  t        j                  dj                  |j                  rd	nd|j                  rdnd
                   |j                  t        ||j                               |j                  t        j                  d             |j                  t        j                  d             |j                  t        ||j                               |j                  t        j                  d             |j                  t        j                  d             |j                  t        ||j                               t        j                   |      S t        j                   t        j                  dd| df      g      S )ae  
        Alternative:
        if not message:
            return searchable.Searchable([urwid.Text(("highlight", f"No {typ}."))])

        viewmode = self.master.commands.call("console.flowview.mode")
        pretty = contentviews.prettify_message(message, flow, viewmode)
        chunks = mitmproxy_rs.syntax_highlight.highlight(
            pretty.text,
            language=pretty.syntax_highlight,
        )

        widget_lines = [
            self._contentview_status_bar(viewmode.capitalize(), viewmode),
            urwid.Text(chunks)
        ]
        return searchable.Searchable(widget_lines)
        rrc                    t        j                  d| j                   dt        j                  j                  | j                         dt        j                  j                  | j                         d| j                   d|  
      S )N  r   )
r)   r   namer   typesto_strr   classesclass_ttl)r   s    r   rr_textz-FlowDetails.dns_message_text.<locals>.rr_text  sp    zz	399#3#3BGG#<"=Qs{{?Q?QRTR[R[?\>]]^_a_e_e^ffghjgkl r   z{recursive}Questionz
Recursive r   )	recursivec              3     K   | ]z  }t        j                  d |j                   dt        j                  j                  |j                         dt        j                  j                  |j                                | yw)r   r   N)	r)   r   r   r   r   r   r   r   r   ).0qs     r   	<genexpr>z/FlowDetails.dns_message_text.<locals>.<genexpr>  sh        

#))"2"2166":!;1S[[=O=OPQPXPX=Y<Z[s   B Bz {authoritative}{recursive}AnswerzAuthoritative )authoritativer   	AuthorityAdditionr   zNo .)r   ResourceRecordr   r)   r   formatrecursion_desiredr   	questionsauthoritative_answerrecursion_availablemapanswersauthoritiesadditionalsr   r   )r   r   r   r   r   s        r   r   zFlowDetails.dns_message_text  s   , C.. 
 CJJ

)00292K2K,QS 1  JJ  !**	  JJuzz"~&JJ

6=="77 '7292M2M,SU	 > 	 JJs7GOO45JJuzz"~&JJuzz+./JJs7G$7$789JJuzz"~&JJuzz*-.JJs7G$7$789((--((%**kSa=5Q*R)STTr   )2r.   r/   r0   r   propertyr    	mitmproxyr"   Flowr<   r   rN   rP   strr\   r^   rW   rZ   rR   rT   rO   rQ   r]   r_   r   r   SYMBOL_FROM_CLIENTr   SYMBOL_TO_CLIENTr   rS   r)   WidgetrX   rU   r   Messagetuplelistr   r   r   intrD   r{   r
   r   r   r   __classcell__r>   s   @r   r3   r3   ,   s   J     +inn)) + +&)T # (,
-
>
@
&3 &# &( (F,E,E+Fa)HI#(?(?'@%BC9v3U\\ 3B@"W"W&*ll"W	sD$$	%"WH sHH(+H	sD$$	%H H@)*V?U?U",t"3?U			?Ur   r3   c                   ,     e Zd ZdZdZ fdZd Z xZS )FlowViewrC   zFlow Detailsc                 Z    t         |   t        |      t        |             || _        y )N)r   )r5   r   r3   r   r   r=   s     r   r   zFlowView.__init__  s.    !&) 	 	
 r   c                 l    | j                   j                          | j                  j                          y r   )r   r   r   )r   argskwargss      r   r   zFlowView.focus_changed  s"    		!!!#r   )r.   r/   r0   keyctxtitler   r   r  r  s   @r   r  r    s    FE$r   r  ) r   	functoolsr   r)   mitmproxy.flowr  mitmproxy.tools.console.mastermitmproxy_rs.syntax_highlightr   r   r   r   r   r   r	   mitmproxy.dnsr
   mitmproxy.tools.consoler   r   r   r   r   mitmproxy.utilsr   
WidgetWrapr   Tabsr3   FrameLayoutWidgetr  r1   r   r   <module>r      s}    
    % $ "      $ * 2 0 . ( $%U%% %(uU$)) uUp$u{{L55 $r   