
    i]0                        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
 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mZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZm Z m!Z! ddl"m#Z# ddl$m%Z%m&Z&m'Z'  ejP                  e)      Z*de+de,fdZ-dede,fdZ. G d de      Z/ G d dej`                        Z1 G d de1      Z2 G d de'e1ejf                  d      Z4y)    N)basename)TemporaryDirectory)Sequence)ferny)make_bootloader)BusVariantbus   )BridgeBeibootHelper)
JsonObjectget_str)BridgeConfig)ConfiguredPeerPeer	PeerError)PolkitAgent)RouterRoutingErrorRoutingRule	sudo_pathreturnc                     	 t        j                  | ddgt         j                  t         j                  t         j                  d       y# t         j                  t        f$ r Y yw xY w)Nz-Az--helpT)stdinstdoutstderrcheckF)
subprocessrunDEVNULLCalledProcessErrorOSError)r   s    3/usr/lib/python3/dist-packages/cockpit/superuser.pysudo_supports_askpassr$   !   s]    h'$$%%%%	
 ))73 s   AA
 
A&%A&configc                     | j                   syt        j                  | j                  d         }|yt	        |      dk(  rt        |      syy)NFr   sudoT)
privilegedshutilwhichspawnr   r$   )r%   commands     r#   is_valid_superuser_configr-   0   sG    ll6<<?+GF"+@+I    c                        e Zd ZU ej                  ed<   dededej                  f fdZddde	de
j                  fd	Zdd
Z xZS )SuperuserPeer	responderrouterr%   c                 4    t         |   ||       || _        y N)super__init__r1   )selfr2   r%   r1   	__class__s       r#   r6   zSuperuserPeer.__init__>   s    ("r.   argszSequence[str]r   r   c                 ^   K   t        j                  t         j                  t         j                        \  }}t	        j
                         }dt        j                          d}t        j                         }|j                  ddddd|dd	d
ddfdd
ddfdd
ddfdd|dfdd|dfdd|dfddt        j                  |d         |dfgdfgg 	      }|j                  d       |j                  |       d {    |j                   fd|       d {   \  }	}
|
 u sJ |	S 7 -7 w)Nzcockpit-superuser-z.servicezorg.freedesktop.systemd1z/org/freedesktop/systemd1z org.freedesktop.systemd1.ManagerStartTransientUnitzssa(sv)a(sa(sv))failDescriptionszCockpit privileged bridge)tvTypeexecUserrootStandardInputFileDescriptorhStandardOutputFileDescriptorStandardErrorFileDescriptor	ExecStartza(sasb)r   FTc                       S r4    r7   s   r#   <lambda>z4SuperuserPeer.start_transient_unit.<locals>.<lambda>h   s    4 r.   )sock)socket
socketpairAF_UNIXSOCK_STREAMasyncioget_running_looposgetpidr   default_systemmessage_new_method_callr)   r*   #set_allow_interactive_authorization
call_asynccreate_connection)r7   r9   r   ourstheirsloop	unit_namesystemmsg	transportprotocols   `          r#   start_transient_unitz"SuperuserPeer.start_transient_unitB   sZ    ((9K9KLf'')(X>	##%,,&'. c0K LMs01s01.c0GH/s1HI.c0GHIfll476KTSX5Y4Z[\ #
& 	//5 $$$$($:$:<d$:$SS	84	 	%Ss$   C8D-;D)<D-D+D-+D-c                    K   t        j                         4 d {   }| j                  j                  rMt        j                  d| j                         |j                  t        | j                               d {    n t        j                  d| j                         | j                  g}d| j                  v rrt        j                  d| j                         t        | dg      }|j                  |       t        |j                  t        j                        j!                         }nd }t        j"                  |      }d| j$                  v r5|j'                  t)                     }t        j*                  |      }d| g}n| j$                  }| j                  j,                  d	k(  r&| j/                  | j                  |
       d {   }	n'| j1                  | j                  ||d       d {   }	||	j3                  |       	 |j5                          d {    d d d       d {    y 7 7 7 o7 I7 # t        j6                  $ r}
t9        dt;        |
            |
d }
~
ww xY w7 C# 1 d {  7  sw Y   y xY ww)Nz-connecting polkit superuser peer transport %rz1connecting non-polkit superuser peer transport %rz# cockpit-bridgez$going to beiboot superuser bridge %rz--privileged)gadgetszSUDO_ASKPASS=ferny-askpasszSUDO_ASKPASS=r;   )r   T)r   start_new_sessionzauthentication-failed)message)
contextlibAsyncExitStackr%   polkitloggerdebugr9   enter_async_contextr   r1   r   appendr   stepsr   BEIBOOT_GADGETSencodeInteractionAgentenventer_contextr   write_askpass_to_tmpdirmethodrd   r+   writecommunicateInteractionErrorr   str)r7   context
respondershelperstage1agenttmpdirferny_askpassrt   rb   excs              r#   do_connect_transportz"SuperuserPeer.do_connect_transportl   s     ,,. %	T %	T'{{!!LdiiX11+dnn2MNNNPRVR[R[\<@NN;KJ!TYY.CTYYO,TN3CD!!&)(u?T?TU\\^**:6E+txx7 ../A/CD % = =f E(5m_&E%Fhh{{!!%99"&";";DIIe";"TT	"&**TYYE]a*"bb	!'T'')))G%	T %	T %	T O0 Ub *)) T 7SJPSSTI%	T %	T %	T %	Ts   JH9JAI9=H<>EI9H?'I97I8I9I#I$I(J3I74J<I9?I9I9II4I//I44I97J9J?J JJr   N)__name__
__module____qualname__r   AskpassHandler__annotations__r   r   r6   objectrS   	Transportrd   r   __classcell__r8   s   @r#   r0   r0   ;   sW    ####v #| #H\H\ #( ( (SZSdSd (T&Tr.   r0   c            
       ,    e Zd ZdZdedddddedd	f
d
Zy	)CockpitResponder)zferny.askpasscockpit.send-stderrr,   r9   ztuple[object, ...]fdsz	list[int]r   r   Nc           
      &  K   |dk(  r|t        j                   |d         5 }|j                  d       |j                  dgt         j                  t         j                  t        j
                  ddg      fg       d d d        y y # 1 sw Y   y xY ww)Nr   r   )fileno    i   )rO   popsendmsg
SOL_SOCKET
SCM_RIGHTSarray)r7   r,   r9   r   r   rN   s         r#   do_custom_commandz"CockpitResponder.do_custom_command   s      ++c!f- g
eW(9(96;L;LekkZ]`a_bNc'd&efg g ,g gs   BAB;
BB
B)r   r   r   commandsr{   r   rK   r.   r#   r   r      s:    7Hgg"6g=HgRUg	gr.   r   c                   0    e Zd ZdefdZdedededdfdZy	)
AuthorizeResponderr2   c                      || _         d| _        y )NF)r2   authorize_attempted)r7   r2   s     r#   r6   zAuthorizeResponder.__init__   s    #( r.   messagesprompthintr   
str | Nonec                 0  K   | j                   rt        j                  d       y d| _         dj                  d t	        j
                         j                  d      D              }| j                  j                  d|        d {   }|dk(  rd S |S 7 w)NzAnoninteractive authorize during init already attempted, rejectingT c              3   $   K   | ]  }|d  
 yw)02xNrK   ).0cs     r#   	<genexpr>z0AuthorizeResponder.do_askpass.<locals>.<genexpr>   s     PQsG*Ps   asciizplain1:)	r   rl   infojoingetpassgetuserrr   r2   request_authorization)r7   r   r   r   hexuserpasswords         r#   
do_askpasszAuthorizeResponder.do_askpass   s     ##KK[\#' ''Pgoo.?.F.Fw.OPP::WWI;NOO2~t383 Ps   BBBBN)r   r   r   r   r6   r{   r   rK   r.   r#   r   r      s/    )v )	4 	4c 	4 	4 	4r.   r   c                       e Zd ZU dZee   ed<   ded<   ded<   ej                  j                  ddddd      Z
ej                  j                  d	g 
      Zej                  j                  dd
      Zej                  j                  di 
      ZdeddfdZdedededdfdZdddedef fdZd,dZdedej0                  ddfdZd ee   ddfd!Zd,d"Zd,d#Zd$eddfd%Zd-d&Zej                  j?                  dg'      deddfd(       Z ej                  j?                         d,d)       Z!ej                  j?                  dg'      d*eddfd+       Z" xZ#S ).SuperuserRoutingRulerK   superuser_configszasyncio.Future[str] | Nonepending_promptzSuperuserPeer | Nonepeerr>   bas)valuenonea{sv}optionsr   zPeer | Nonec                     |j                  d      }|r| j                  dk(  ry | j                  s|dk(  r| j                  S t        d      )N	superuserrD   tryzaccess-denied)getcurrentr   r   )r7   r   r   s      r#   
apply_rulezSuperuserRoutingRule.apply_rule   sH    KK,	DLLF2YY)u, 99 //r.   r   r   r   r   c                 (  K   | j                   J |dk(  }t        j                         j                         | _         	 t        j                  d|       | j                  d|d||       | j                    d {   d | _         S 7 # d | _         w xY ww)Nconfirmzprompting for %sr   )r   rS   rT   create_futurerl   rm   r   )r7   r   r   r   echos        r#   r   zSuperuserRoutingRule.do_askpass   s     ""***y %668FFH	'LL+V4 KKFBh7,,,"&D -"&Ds.   ;B:B 8B9B <BB 	BBF)r(   r2   r(   c                    t         |   |       d | _        d | _        d | _        |st        j                         dk(  rd| _        y y )Nr   rD   )r5   r6   r   r   startuprU   getuidr   )r7   r2   r(   r8   s      r#   r6   zSuperuserRoutingRule.__init__   sB     "	)!DL *r.   Nc                      d| _         d | _        y )Nr   )r   r   rL   s    r#   	peer_donezSuperuserRoutingRule.peer_done   s    	r.   namer1   c                   K   | j                   dk7  rt        j                  dd      | j                  J | j                  J | j
                  D ]  }||j                  dfv s n t        j                  dd| d      d| _         t        | j                  ||      | _        | j                  j                  | j                         	 | j                  j                  | j                  j                         d {    | j                  j$                  j                  | _         y 7 *# t        j                  $ r t        j                  d	d
      d t        t         f$ r%}t        j                  dt#        |            |d }~ww xY ww)Nr   zcockpit.Superuser.Errorz Superuser bridge already runninganyzUnknown superuser bridge type ""init)	init_hostz!cockpit.Superuser.Error.CancelledzOperation aborted)r   r
   BusErrorr   r   r   r   r0   r2   add_done_callbackr   startr   rS   CancelledErrorr"   r   r{   r%   )r7   r   r1   r%   r   s        r#   gozSuperuserRoutingRule.go   s\    <<6!,,8:\]]yy   ||###,, 	eFU++	e ,,8<[\`[aab:cdd!$++vyA			##DNN3	M))//DKK,A,A/BBB yy'',, C%% 	c,,BDWX^bb# 	M,,8#c(CL	MsC   A!F
$A%F

3D* =D(>D* &F
(D* *8F" FFF
configsc           
         t         j                  dt        |             |D cg c]  }t        |      s| }}t	        |      | _        | j
                  D cg c]  }|j                   c}| _        |D ci c];  }|j                  s|j                  t        dt        |j                        id      = c}| _
        t         j                  d| j                         | j                  h| j                  j                  | j
                  vrEt         j                  d| j                  j                  j                         | j                          y y y c c}w c c}w c c}w )Nzset_configs() with %d itemslabelr   z  bridges are now %sz=  stopping superuser bridge '%s': it disappeared from configs)rl   rm   lenr-   tupler   r   bridgesr   r	   methodsr   r%   shutdown)r7   r   r%   r   s       r#   set_configsz SuperuserRoutingRule.set_configs  s
   2CLA(/Uf3LV3T6UU!&w262H2HIIX_kSTcdcjcj'71773C)Dg!NNk+T\\: 99 yyt'='==\^b^g^g^n^n^s^st > ! VIks   EEE8E
.Ec                 `    | j                   "| j                   j                          d | _         y y r4   )r   cancelrL   s    r#   cancel_promptz"SuperuserRoutingRule.cancel_prompt  s-    *&&("&D +r.   c                     | j                          | j                  | j                  j                          | j                  J y r4   )r   r   closerL   s    r#   r   zSuperuserRoutingRule.shutdown  s8    99 IIOO yy   r.   paramsc                     t        |dd      }t        | j                        }t        j                  | j                  ||            | _        | j                  j                  | j                         y )Nidr   )	r   r   r2   rS   create_taskr   
_init_taskr   
_init_done)r7   r   r   r1   s       r#   r   zSuperuserRoutingRule.init#  sQ    vtU+&t{{3	!--dggdI.FG))$//:r.   c                     t         j                  d|j                                | j                  j	                  d       | `y )Nzsuperuser init done! %szsuperuser-init-done)r,   )rl   rm   	exceptionr2   write_controlr   )r7   tasks     r#   r   zSuperuserRoutingRule._init_done)  s3    .0@A!!*?!@Or.   )in_typesc                 D   K   | j                  ||        d {    y 7 wr4   )r   )r7   r   s     r#   r   zSuperuserRoutingRule.start/  s     ggdD!!!s     c                 $    | j                          y r4   )r   rL   s    r#   stopzSuperuserRoutingRule.stop3  s    r.   replyc                     | j                   1t        j                  d       | j                   j                  |       y t        j                  d       y )Nzresponding to pending promptz!got Answer, but no prompt pending)r   rl   rm   
set_result)r7   r   s     r#   answerzSuperuserRoutingRule.answer7  s<    *LL78**51LL<=r.   r   )r   zasyncio.Task[None]r   N)$r   r   r   r   r   r   r   r
   	InterfaceSignalr   Propertyr   r   r   r   r   r{   r   r   boolr6   r   r   r   r   r   r   r   r   r   Methodr   r   r   r   r   s   @r#   r   r      s   02x-200
   ]]!!#sCc:F mm$$T$4Gmm$$S$7Gmm$$WB$7G0* 0 0' 'c ' ' ' >C "v "d "-S -U-A-A -d -4 8L#9  d  '
!;: ;$ ; 	]]C5)" " " *" 	]]  	]]C5)>C >D > *>r.   r   zcockpit.Superuser)	interface)5r   rS   ri   r   loggingrU   r)   rO   r   os.pathr   tempfiler   typingr   cockpit._vendorr   cockpit._vendor.bei.bootloaderr   cockpit._vendor.systemd_ctypesr   r	   r
   beipackr   jsonutilr   r   packagesr   r   r   r   r   rk   r   r2   r   r   r   	getLoggerr   rl   r{   r   r$   r-   r0   r   r   r   Objectr   rK   r.   r#   <module>r     s         	     '  ! : < < ( ) " 1 1  5 5			8	$S T l t WTN WTt
gu++ 
g4) 4"J>;(8#**Pc J>r.   