
    6je                    f    d 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Z	ddZ
dd
ZddZddZdS )z!Hermes Web UI -- startup helpers.    )annotationsN)Path)z.envzgoogle_token.jsonzgoogle_client_secret.jsonz.signing_keyz	auth.jsonreturnNonec                    t           j                            dd                                          dv rdS d} t           j                            dd                                          }|r"	 t	          |d          } n# t
          $ r Y nw xY wt          t           j                            dt          t          j                    dz                                }|	                                sdS t          D ]}||z  }|                                s	 t          j        |                                j                  }| [|d	z  rU|                    |d
z             t!          d|j         dt%          |           dt%          |d
z             dd           nD|dz  r?|                    d           t!          d|j         dt%          |           dd           # t&          $ r Y w xY wdS )u#  Ensure sensitive files in HERMES_HOME have safe permissions.

    Respects:
      - HERMES_SKIP_CHMOD=1  → bypass entirely
      - HERMES_HOME_MODE     → group bits are allowed if set by the operator,
                               only world-readable/world-writable files are fixed
    HERMES_SKIP_CHMOD )1trueNHERMES_HOME_MODE   HERMES_HOME.hermes   iz#  [security] removed world bits on z (z -> )Tflush?   i  z"  [security] fixed permissions on z	 -> 0600))osenvirongetstripint
ValueErrorr   strhomeis_dir_SENSITIVE_FILESexistsstatS_IMODEst_modechmodprintnameoctOSError)declared_moderaw_modehermes_homer%   fpathcurrents         !/root/hermes-webui/api/startup.pyfix_credential_permissionsr.      s-    
z~~)2..4466-GG Mz~~0"55;;==H 	!,,MM 	 	 	D	 rz~~mSy9P5Q5QRRSSK    d"||~~ 		l5::<<#788G(U? FKK& 0111x
xxcRYllxx`cdkntdt`u`uxxx  AE  F  F  F  FU? rKK&&&duzddSQX\\dddlpqqqq 	 	 	D	 s%   .A? ?
BBCG$$
G10G1Path | Nonec            	        t          t          j                            dt	          t          j                    dz                                } t          j                            dd                                          t	          | dz            fD ]P}|st          |                                          }|                                r|	                                c S Qd S )Nr   r   HERMES_WEBUI_AGENT_DIRr	   zhermes-agent)
r   r   r   r   r   r   r   
expanduserr   resolve)r*   rawps      r-   
_agent_dirr6   :   s    rz~~mSy9P5Q5QRRSSK
7<<BBDDc+XfJfFgFgh   	II  ""88:: 	99;;	4    	agent_dirr   boolc                    	 |                                  }t          j        |j                  dz  rdS t          t          d          r|j        t	          j                    k    rdS dS # t          $ r Y dS w xY w)a  Return True if agent_dir passes ownership and permission checks.

    Validates that the directory is not world- or group-writable and,
    on POSIX systems, is owned by the current process user.

    Intentionally does NOT enforce a canonical path (i.e. does not require
    the dir to be ~/.hermes/hermes-agent), so custom HERMES_WEBUI_AGENT_DIR
    paths work correctly when HERMES_WEBUI_AUTO_INSTALL=1 is set.
       FgetuidT)r    r!   r"   hasattrr   st_uidr<   r'   )r8   sts     r-   _trusted_agent_dirr@   D   s    
^^<
##e+ 	52x   	RY")++%=%=5t   uus   0A) 1A) )
A76A7c            	     X   t           j                            dd                                                                          dv } | st          dd           dS t                      }|t          dd           dS t          |          st          d	d           dS |d
z  }|dz  }|                                r6t          j
        dddddt          |          g}t          d| dd           n\|                                r5t          j
        ddddt          |          g}t          d| dd           nt          dd           dS 	 t          j        |ddd          }|j        dk    rVt          d|j         dd           |j        pd                                dd          D ]}t          d| d           dS t          dd           dS # t          j        $ r t          dd           Y dS t$          $ r}t          d| d           Y d }~dS d }~ww xY w)NHERMES_WEBUI_AUTO_INSTALLr	   )r
   r   yeszF[!!] Auto-install disabled. Set HERMES_WEBUI_AUTO_INSTALL=1 to enable.Tr   Fz5[!!] Auto-install skipped: agent directory not found.z\[!!] Auto-install skipped: agent directory failed trust check (check ownership/permissions).zrequirements.txtzpyproject.tomlz-mpipinstallz--quietz-rz     Installing from z ...z (pyproject.toml) ...zN[!!] Auto-install skipped: no requirements.txt or pyproject.toml in agent dir.x   )capture_outputtexttimeoutr   z[!!] pip install failed (exit z):iz     z[ok] pip install completed.z'[!!] Auto-install timed out after 120s.z[!!] Auto-install error: )r   r   r   r   lowerr$   r6   r@   r   sys
executabler   
subprocessrun
returncodestderr
splitlinesTimeoutExpired	Exception)enabledr8   req_file	pyprojectinstall_argsresultlinees           r-   auto_install_agent_depsr[   [   s   jnn8"==CCEEKKMMQeeG V^bccccuIETRRRRui(( ltxyyyyu--H,,I eY	4QTU]Q^Q^_4h444DAAAAA					 eY	3y>>ZFiFFFdSSSSS^fjkkkkuTVYZZZ!!H63DHHHPTUUUU,"88::344@ 2 2ndnnD111115+48888t$   7tDDDDuu   -!--T::::uuuuus%   A7G G  H)	H)
H$$H))r   r   )r   r/   )r8   r   r   r9   )r   r9   )__doc__
__future__r   r   r    rM   rK   pathlibr   r   r.   r6   r@   r[    r7   r-   <module>r`      s    ' ' " " " " " "                                       ' ' ' 'T      .% % % % % %r7   