
\\c                 @   s   d  Z  d d l Z d d l Z d d l m Z m Z d d l m Z d d l m Z e j	 e
  Z Gd d   d e  Z d d	   Z d S)
z*Tools for checking certificate revocation.    N)PopenPIPE)errors)utilc               @   s:   e  Z d  Z d Z d d   Z d d   Z d d   Z d S)	RevocationCheckerzEThis class figures out OCSP checking on this system, and performs it.c             C   s   d |  _  t j d  s2 t j d  d |  _  d  St d d d d d g d	 t d
 t d d } | j   \ } } d | k r d d   |  _ n d d   |  _ d  S)NFopensslz-openssl not installed, can't check revocationTocspz-headervarvalstdoutstderrZuniversal_newlinesz	Missing =c             S   s   d |  g S)NzHost= )hostr   r   ./usr/lib/python3/dist-packages/certbot/ocsp.py<lambda>   s    z,RevocationChecker.__init__.<locals>.<lambda>c             S   s
   d |  g S)NZHostr   )r   r   r   r   r      s    )	brokenr   Z
exe_existsloggerinfor   r   Zcommunicate	host_args)selfZtest_host_formatZ_outerrr   r   r   __init__   s    		zRevocationChecker.__init__c             C   s   |  j  r d S|  j |  \ } } | s, d Sd d d d | d | d | d | d	 | d
 d g |  j |  } t j d |  t j d j |   y" t j | d t j \ } } Wn) t j	 k
 r t j
 d |  d SYn Xt | | |  S)a;  Get revoked status for a particular cert version.

        .. todo:: Make this a non-blocking call

        :param str cert_path: Path to certificate
        :param str chain_path: Path to intermediate cert
        :rtype bool or None:
        :returns: True if revoked; False if valid or the check failed

        Fr   r   z	-no_noncez-issuerz-certz-urlz-CAfilez-verify_otherz-trust_otherz-headerzQuerying OCSP for %s logz*OCSP check failed for %s (are we offline?))r   determine_ocsp_serverr   r   debugjoinr   
run_scriptr   SubprocessErrorr   _translate_ocsp_query)r   	cert_pathZ
chain_pathurlr   cmdoutputr   r   r   r   ocsp_revoked!   s,    	"	zRevocationChecker.ocsp_revokedc             C   s   y4 t  j d d d | d d g d t j \ } } Wn) t j k
 r_ t j d |  d SYn X| j   } | j d	  d
 j d  } | r | | f St j d | |  d Sd S)zExtract the OCSP server host from a certificate.

        :param str cert_path: Path to the cert we're checking OCSP for
        :rtype tuple:
        :returns: (OCSP server URL or None, OCSP server host or None)

        r   Zx509z-inz-nooutz	-ocsp_urir   zCannot extract OCSP URI from %sNz://   /z4Cannot process OCSP host from URL (%s) in cert at %s)NN)NN)	r   r   r   r   r   r   r   rstrip	partition)r   r    r!   Z_errr   r   r   r   r   H   s    	
z'RevocationChecker.determine_ocsp_serverN)__name__
__module____qualname____doc__r   r$   r   r   r   r   r   r      s   'r   c       	         s   d }   f d d   | D }  f d d   | D \ } } } | rV | j  d  n d	 } d
 | k sz | rt | sz | r t j d    t j d  |  d S| r | r d S| r | j  d  } | r t j d |  d St j d  |  d Sd	 S)z7Parse openssl's weird output to work out what it means.goodrevokedunknownc                s"   g  |  ] } d  j    |   q S)z{0}: (WARNING.*)?{1})format).0s)r    r   r   
<listcomp>d   s   	 z)_translate_ocsp_query.<locals>.<listcomp>c             3   s*   |  ]  } t  j |   d  t  j Vq d S)flagsN)researchDOTALL)r1   p)ocsp_outputr   r   	<genexpr>e   s    z(_translate_ocsp_query.<locals>.<genexpr>   NzResponse verify OKz#Revocation status for %s is unknownzUncertain output:
%s
stderr:
%sFzOCSP revocation warning: %sTz2Unable to properly parse OCSP output: %s
stderr:%s)zgoodzrevokedzunknown)groupr   r   r   warning)	r    r9   Zocsp_errorsZstatesZpatternsr-   r.   r/   r=   r   )r    r9   r   r   `   s$    "	
r   )r,   Zloggingr5   
subprocessr   r   Zcertbotr   r   Z	getLoggerr)   r   objectr   r   r   r   r   r   <module>   s   T