a
    漰i                     @   s   d dl mZmZ d dlZd dlmZmZ d dlmZm	Z	 d dl
Z
d dlZd dlZd dlZd dlm  m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
ddZdddZddddZG dd deZdS )    )BaseHTTPRequestHandler
HTTPServerN)urlparseparse_qs)Requesturlopen)serialization)hashes)padding)	b64encodez,https://widevine.keyos.com/api/v4/getLicensez-https://playready.keyos.com/api/v4/getLicensez,https://fairplay.keyos.com/api/v4/getLicense)widevine	playreadyfairplayz0https://widevine.keyos.com/api/v4/getCertificatez0https://fairplay.keyos.com/api/v4/getCertificate)r   r   application/octet-streamtext/xml; charset=utf-8text/plain; charset=utf-8c                   @   sb   e Zd ZdZe Zde_eje_	dd Z
dd Zddd	Zd
d ZdddZdd Zdd ZdS )LAProxy_RequestHandlerZ(5448EC23A7492E3CB26596ACEA7B0D6B2A91206AFc                 C   s  t dd}t|}W d    n1 s*0    Y  |d}t |d"}tj| d d}W d    n1 sp0    Y  td}t	j	
t	jj}|t	jdd }|d	d
 dd }	|ddd t|d_|ddd t|d_tt t|d_|	t|d_t|dddd}
t|dddi}dt|d_t|dddi t|d t|t|t t }td }|| | t|d!_tt|d"}|S )#Nzconfig.jsonrZKEYOS_KEY_FILErb)passwordZData   )minutes/.r   z%Y-%m-%d %H:%M:%S.%f   ZGenerationTimeZExpirationTimeZUniqueIdZRSAPubKeyIdZWidevinePolicytruefalse)Z
fl_CanPlayZfl_CanPersistZWidevineContentKeySpecZ	TrackTypeZHD1ZSecurityLevelZLicensetypesimpleZFairPlayPolicyZKeyOSAuthenticationXMLZ	Signaturezutf-8)openjsonloadgetr   Zload_pem_private_keyreadETZElementdatetimenowtimezoneutc	timedeltasplitstrftimeZ
SubElementtextstruuidZuuid4r   signZtostringr
   ZPKCS1v15r	   SHA1appenddecode)selffZconfig_dataZkeyos_key_filekey_fileZprivate_keyZdata_elZgeneration_timeZexpiration_timeZkey_nameZwv_content_policyZwv_content_key_spec_elZ	signatureZroot_elZauth_xml r8   0/home/ec2-user/fah_poc_player/drm/keyos_proxy.py_fetch_auth_xml?   s0    (
0
 

z&LAProxy_RequestHandler._fetch_auth_xmlc                 C   s(   |  dd |  dd |  dd d S )NzAccess-Control-Allow-Origin*zAccess-Control-Allow-MethodszGET, POST, OPTIONSzAccess-Control-Allow-HeadersContent-Type)send_headerr5   r8   r8   r9   _send_cors_headersb   s    z)LAProxy_RequestHandler._send_cors_headerstext/html; charset=utf-8c                 C   s\   t |tu rt|d}| | | d| | dt| |   |   | j	| d S )NzUTF-8r<   Content-Length)
r   r/   bytessend_responser=   lenr?   end_headerswfilewrite)r5   dataZ
error_codecontent_typer8   r8   r9   _respondg   s    

zLAProxy_RequestHandler._respondc                 C   s   |  d |   |   d S )N   )rC   r?   rE   r>   r8   r8   r9   
do_OPTIONSr   s    
z!LAProxy_RequestHandler.do_OPTIONSNPOSTc              
   C   s   t ||||d}z<t| }| |jfW  d   W S 1 s@0    Y  W nJ ty } z2t|dr| |jfW  Y d}~S  W Y d}~n
d}~0 0 dS )z9Sends a request to KeyOS and returns (body, status_code).)rH   headersmethodNr%   )r   r   r%   status	Exceptionhasattrcode)r5   urlrN   payloadrO   ZreqZresper8   r8   r9   _forward_to_keyosw   s    
2
z(LAProxy_RequestHandler._forward_to_keyosc              
   C   s   zft | jj}|dkr$| ddW S td d| j }d|  i}| j||dd\}}| ||d	W S  ty } z<t	d
 t
jtjd t	d
 | d|dW  Y d}~S d}~0 0 dS )zHandles FairPlay certificate request.
        The playback client fetches the FPS certificate before it can generate the license challenge (SPC).z/fps/certificatez
Not found.i  r   z?certHash={}x-keyos-authorizationGET)rO   r   <------------------------------------------------------------fileSorry, there was an error. {}  N)r   pathrJ   	CERT_URLSformat_fps_cert_hashr:   rW   rQ   print	traceback	print_excsysstdout)r5   r_   Zcert_urlrN   bodyrP   rV   r8   r8   r9   do_GET   s    zLAProxy_RequestHandler.do_GETc              
   C   sl  zt | jd }| j|}|s0| ddW S t| jj}t|}d|vrZ| ddW S |d d 	 }t
|}|s| ddW S dd	i}|d
kr|dkr|  |d< | td
 ||\}}	| ||	dW S |  |d< |dkrd|d< | |||\}}	| ||	t| W S  tyf }
 z<td tjtjd td | d|
dW  Y d }
~
S d }
~
0 0 d S )NrA   z!Can't read the license challenge.r^   zdrm-typez'drm-type' query param not set.r   z,Can't determine the license acquisition URL.r<   r   r   s   rX   r   r   zAhttp://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicenseZ
soapactionrZ   r[   r]   )intrN   rfiler%   rJ   r   r_   queryr   lowerLA_URLSr$   r:   rW   r`   RESPONSE_TYPESrQ   rc   rd   re   rf   rg   ra   )r5   content_lengthrU   rl   Zquery_componentsZdrm_typeZla_urlrN   rh   rP   rV   r8   r8   r9   do_POST   s8    
zLAProxy_RequestHandler.do_POST)r@   )NrM   )__name__
__module____qualname__rb   sslcreate_default_contextZ_ssl_ctxcheck_hostname	CERT_NONEverify_moder:   r?   rJ   rL   rW   ri   rq   r8   r8   r8   r9   r   (   s   #

r   )http.serverr   r   r"   urllib.parser   r   Zurllib.requestr   r   ru   rf   rd   Zxml.etree.ElementTreeZetreeZElementTreer&   r'   r0   Zcryptography.hazmat.primitivesr   r	   Z)cryptography.hazmat.primitives.asymmetricr
   base64r   rn   r`   ro   r   r8   r8   r8   r9   <module>   s2   	