
­­­­­­­­­­­­­­­­­­
<!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 }yt j }|d kr(| s$tjd d S tj dj| }tj|}t	j
|j }t	j|}|d dkrt j  tj  | stjd n | stj| tjd|d   W n2 tk
r } z| st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|rtj| t| tj  |jd qW 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rtj| t| t	j  tjd dS |dkrtjd	 nv|d
krtjd nb|dkrtjd nN|dkrtjd n:|dkrt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rt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	 rtjjd
j| dS |d	 dkrd| 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 } | rtj dj|  }ytj|}tj|j	 }tj
|}| sT|jd rhtjdj| dS t|d }|dkrtjd dS tdd}|dkrtjd |S W q tk
r } ztj|| dS d }~X qX 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 ytjtj	 d }t
jt
j|j }y|d j dkrt
j| ddd tj  |d dkrtj|d	 |d
 tjdj|d	  d S |d dkrt
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&   ,

.)
#