
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
Ö;jÚ/  ã               @   sà   d dl Z d dlZd dlZd dlZddlmZmZmZmZm	Z	m
Z
mZmZmZ ddlmZmZmZ d"dd„Zdd	„ Zd
d„ Zdd„ Zd#dd„Zejdd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd$dd„Zd d!„ Z dS )%é    Né   )	ÚconfigÚ	constantsÚerrorsÚ
http_utilsÚipv6_supportÚ	log_utilsÚplatform_utilsÚserveridÚutils)Ú	HTTPErrorÚURLErrorÚ	urlencodeFc             C   sâ   d }y¦t jƒ }|d kr(| s$tjdƒ d S tjƒ dj|ƒ }tj|ƒ}t	j
|jƒ ƒ}t	j|ƒ}|d dkrˆt jƒ  tjƒ  | s¨tjdƒ n | s¨tj|ƒ tjd|d  ƒ W n2 tk
rÜ } z| sÌtj||ƒ W Y d d }~X nX d S )Nz1Error unregistering server: cannot find server idz&/unregister_server.plain?server_id={0}ÚsuccessÚtruezServer was unregisteredzError unregistering server: Úmessage)r
   Úget_serveridr   Úlogerrorr   Úget_registration_urlÚformatr   Úurlopenr   ÚnstrÚreadÚdata_as_dictZrm_serveridÚclear_cacheÚloginfor   Úprint_cln_http_error)ZsilentÚurlÚ	server_idÚresponseÚcontentÚresÚe© r#   ú*/usr/libexec/kcare/python/kcarectl/auth.pyÚ
unregister   s,    



r%   c             C   sú   t jdƒ tjƒ }|dkrd S tjƒ  tjƒ }dd l}|dkrH|jdƒ |jjƒ  t	ddƒ}t	ddƒ}tj
|jƒ |jjƒ ƒ tj
|jƒ |jjƒ ƒ tj
|jƒ |jjƒ ƒ xLtjd	ƒ t| ƒ\}}}|dkrª|rªtj|ƒ t|ƒ tjƒ  |jdƒ qªW d S )
NzHRegister auto-retry has been enabled, the system can be registered laterr   z	/dev/nullÚrza+é<   é   i  i   )r   Úprint_wrapperÚosÚforkÚsetsidÚsysÚexitÚstdoutÚflushÚopenÚdup2ÚfilenoÚstdinÚstderrÚtimeÚsleepÚ_try_registerr
   Úset_server_idÚ_set_auth_tokenr   r   )r   Úpidr-   ÚsiÚsoÚcoder   Ú
auth_tokenr#   r#   r$   Ú_register_retry)   s.    






r@   c             C   s&   | d k	r"t jd| ƒ r"td|  ƒ‚| S )Nz	^[\w.-]+$zInvalid value received: %s)ÚreÚmatchÚ
ValueError)Úvaluer#   r#   r$   Ú_validate_urlsafe_encodingG   s    rE   c             C   s¦   yNt j| ƒ}|jjtjd ƒ}tjtj|j	ƒ ƒƒ}t
|d ƒt|jdƒƒt|ƒfS  ttfk
r~ } ztj|| ƒ dS d }~X n$ tk
r    tjjd|  ƒ dS X d S )Nr>   r   z)Exception while trying to register URL %s)NNN)NNN)r   r   ÚheadersÚgetr   ZAUTH_TOKEN_HEADERr   r   r   r   ÚintrE   r   r   r   r   Ú	ExceptionÚkcarelogÚ	exception)r   r   r?   r!   r"   r#   r#   r$   r8   M   s    
 r8   c             C   s>  yt dƒ W n  tk
r,   tjjdƒ Y nX tjƒ }td|fd| fgƒ}djt	j
ƒ |ƒ}t|ƒ\}}}|dkr˜tj|ƒ t|ƒ t	jƒ  tjdƒ dS |dkr¬tjd	ƒ nv|d
krÀtjdƒ nb|dkrÔtjdƒ nN|dkrètjdƒ n:|dkrütjdƒ n&|dk�rtjdƒ ntjdj|ƒƒ |�r4t|ƒ dS |�p<dS )NTz9Exception while trying to unregister URL before register.ÚhostnameÚkeyz{0}/register_server.plain?{1}r   zServer Registeredr   zAccount Lockedr(   zInvalid Keyé   z}You have reached maximum registered servers for this key. Please go to your CLN account, remove unused servers and try again.é   z[IP is not allowed. Please change allowed IP ranges for the key in KernelCare Key tab in CLNé   zEThis IP was already used for trial, you cannot use it for trial againé   zfThis IP was banned. Please contact support for more information at https://www.kernelcare.com/support/zUnknown Error {0}éÿÿÿÿ)r%   rI   r   rJ   rK   r	   Zget_hostnamer   r   r   r   r8   r
   r9   r:   r   r   r   r@   )rM   ÚretryrL   Úqueryr   r>   r   r?   r#   r#   r$   Úregister[   s@    


rU   c               C   s   t jtjƒS )N)r   Útry_to_readr   ÚAUTH_TOKEN_DUMP_PATHr#   r#   r#   r$   Ú_get_auth_token‰   s    rX   c             C   s   | sd S t jtj| ƒ d S )N)r   Úatomic_writer   rW   )r?   r#   r#   r$   r:   Ž   s    r:   c             O   sv   |j dd ƒ}|j ddƒrt}ntj}tj| ƒr@tj| f|ž|ŽS tj| tƒ tƒ |d�}t	j
|dd�tjƒ|f|ž|ŽS )NÚmethodÚcheck_licenseT)rZ   é   )Úcount)ÚpopÚ_check_auth_retryr   Úcheck_urlopen_retryZis_local_urlÚurlopen_baseÚhttp_requestÚget_http_auth_stringrX   r   rS   )r   ÚargsÚkwargsrZ   ÚcheckÚrequestr#   r#   r$   Úurlopen_auth•   s    
rh   c              C   s.   t jƒ } | r*tjtjtjdj| dƒƒƒƒS d S )Nz{0}:{1}Z
kernelcare)r
   r   r   r   Úbase64Ú	b64encodeÚbstrr   )r   r#   r#   r$   rc   ¢   s    rc   c             C   s(   t | tƒr| jdkrt|ƒS tj| |ƒS )Né“  é‘  )rl   rm   )Ú
isinstancer   r>   Ú_handle_forbiddenr   r`   )r"   Ústater#   r#   r$   r_   ©   s    r_   c             C   sä   d| krdS t jràtjƒ }tjƒ d }|r8|dj|ƒ7 }y&tjt	j
|dd�jƒ ƒ}tj|ƒ}W n0 tk
rŽ } ztj||dd� dS d}~X nX | s¢|jd	ƒ r¸tjjd
j|ƒƒ dS |d	 dkrÚd| d< tjdƒ dS tƒ  dS )a  In case of 403 error we should check what's happen.
    Case #1. We are trying to register unlicensed machine and should try to register trial.
    Case #2. We have a valid license but access restrictions on server are not consistent yet
             and we had to try later.
    ÚlicenseTz/check.plainz?server_id={0}F)Zretry_on_500)r/   Nr>   zUnexpected CLN response: {0}Ú0Ú1z$Unable to access server. Retrying...)rr   rs   )r   ÚCHECK_CLN_LICENSE_STATUSr
   r   r   r   r   r   r   r   r   r   r   r   r   r   rG   rJ   Úerrorr   Ú_register_trial)rp   r   r   r    ÚinfoÚexr#   r#   r$   ro   ¯   s*    
ro   c              C   sæ   t jƒ } | rÜtjƒ dj| ƒ }yŽtj|ƒ}tj|j	ƒ ƒ}tj
|ƒ}| sT|jdƒ rhtjdj|ƒƒ dS t|d ƒ}|dkrŠtjdƒ dS tdd�}|dkr¦tjdƒ |S W qâ tk
rØ } ztj||ƒ dS d }~X qâX ntƒ S d S )	Nz/check.plain?server_id={0}r>   zUnexpected CLN response: {0}r   r   zKey-based valid license found)Úkey_checkedz No valid key-based license found)r
   r   r   r   r   r   r   r   r   r   r   rG   r)   rH   Ú_get_license_info_by_ipr   r   r   )r   r   r   r    r!   r>   Zlicense_typer"   r#   r#   r$   Úlicense_infoØ   s,    




r{   c             C   s²  t jƒ d }�y6tj|ƒ}tj|jƒ ƒ}tj|ƒ}|d jƒ dk�r&t	|d ƒ}|dkrptj
dj|d ƒƒ dS |dkrª|d }tj|d	 ƒjd
ƒ}tj
dj||ƒƒ dS |dkrè| dkrè|d }tj|d	 ƒjd
ƒ}tj
dj||ƒƒ |dkoö| dk�rBd|k�rtj
dj|d ƒƒ n
tj
dƒ n|jddƒ}tj
dj|ƒƒ W nh tk
�rt }	 ztj|	|ƒ W Y d d }	~	X n: tk
�r¬ }
 ztj
dj|
|jƒ ƒƒ W Y d d }
~
X nX dS )Nz/check.plainr   r   r>   r   zValid license found for IP {0}Úipr   Zexpire_datez%Y-%m-%dz?You have a trial license for the IP {0} that will expire on {1}r(   z0Your trial license for the IP {0} expired on {1}rN   zThe IP {0} hasn't been licensedz This server hasn't been licensedr   Ú z"Error retrieving license info: {0}z1Unexpected CLN response, cannot find {0} key:
{1})r   r   r   r   r   r   r   r   ÚlowerrH   r)   r   Zparse_response_dateÚstrftimerG   r   r   r   ÚKeyErrorÚstrip)ry   r   r   r    r!   r>   r|   Zexpires_strr   r"   rM   r#   r#   r$   rz   ó   s<    


(rz   c              C   sF  t jjtjdƒ} t jj| ƒr d S yðtjtj	ƒ d ƒ}t
jt
j|jƒ ƒƒ}y–|d jƒ dkrªt
j| ddd� tjƒ  |d dkr’tj|d	 |d
 ƒ‚tjdj|d	 ƒƒ d S |d dkrÒt
j| ddd� tjdƒ‚n
tjdƒ‚W n. tk
�r } ztj|ƒ‚W Y d d }~X nX W n0 tk
�r@ } ztj|jƒ‚W Y d d }~X nX d S )Nztrial-requestedz/trial.plainr   r   r}   T)Ú
ensure_dirZexpiredr|   Úcreatedz3Requesting trial license for IP {0}. Please wait...ZnazInvalid Licenser   rR   )r*   ÚpathÚjoinr   ÚPATCH_CACHEÚexistsr   r   r   r   r   r   r   r   r~   rY   r   r   ZAlreadyTrialedExceptionr   r   r   Ú
KcareErrorZUnableToGetLicenseExceptionr€   r   r>   )Z
trial_markr   r!   Zker"   r#   r#   r$   rv     s,     rv   )F)F)r   )!ri   r*   rA   r6   r}   r   r   r   r   r   r   r	   r
   r   Úpy23r   r   r   r%   r@   rE   r8   rU   ÚcachedrX   r:   rh   rc   r_   ro   r{   rz   rv   r#   r#   r#   r$   Ú<module>   s&   ,

.)
#