
    #&a                         d dl Z d dlZd dlZd dlZ G d d      Z G d de      Z G d de      Z G d d	e      Z G d
 de      Z G d de      Z	 G d d      Z
 G d de      Zy)    Nc                       e Zd Zd Zd Zy)
BasePluginc                     || _         y N)source)selfsrcs     :/usr/lib/python3/dist-packages/websockify/token_plugins.py__init__zBasePlugin.__init__   s	        c                      y r    r   tokens     r
   lookupzBasePlugin.lookup
   s    r   N)__name__
__module____qualname__r   r   r   r   r
   r   r      s    r   r   c                   *     e Zd Z fdZd Zd Z xZS )ReadOnlyTokenFilec                 2    t        |   |i | d | _        y r   )superr   _targetsr   argskwargs	__class__s      r
   r   zReadOnlyTokenFile.__init__   s    $)&)r   c                    t         j                  j                  | j                        rUt        j                  | j                        D cg c],  }t         j                  j                  | j                  |      . }}n| j                  g}i | _        d}|D ]  }t        |      j                         D cg c]  }|j                          c}D ]a  }|rX|j                  d      sG	 t        j                  d|      \  }}|j                         j                  dd      | j                  |<   |dz  }c  y c c}w c c}w # t        $ r- t        d| j                  |fz  t         j"                         Y Iw xY w)N   #z:\s:zSyntax error in %s on line %dfile)ospathisdirr   listdirjoinr   open	readlinesstrip
startswithresplitrsplit
ValueErrorprintsysstderr)r   f	cfg_filesindexllinetoktargets           r
   _load_targetszReadOnlyTokenFile._load_targets   s:   77==% jj57 dkk15 7I 7 I 	A,0G,=,=,?@q@  4g&(hhud&;V-3\\^-B-B3-Jc* 
	7 A
 & g=e@TT[^[e[efgs   1D65D;&AE  3E65E6c                 v    | j                   | j                          || j                   v r| j                   |   S y r   )r   r;   r   s     r
   r   zReadOnlyTokenFile.lookup)   s6    ==  DMM!==''r   )r   r   r   r   r;   r   __classcell__r   s   @r
   r   r      s    &r   r   c                        e Zd Z fdZ xZS )	TokenFilec                 B    | j                          t        | 	  |      S r   )r;   r   r   )r   r   r   s     r
   r   zTokenFile.lookup:   s    w~e$$r   )r   r   r   r   r=   r>   s   @r
   r@   r@   6   s    % %r   r@   c                       e Zd Zd Zd Zy)BaseTokenAPIc                 j    |j                   j                  d      \  }}|j                  dd      }||gS )Nr!   asciiignore)textr.   encode)r   resphostports       r
   process_resultzBaseTokenAPI.process_resultG   s2    YY__S)
d{{78,t~r   c                     dd l }|j                  | j                  |z        }|j                  r| j	                  |      S y )Nr   )requestsgetr   okrL   )r   r   rN   rI   s       r
   r   zBaseTokenAPI.lookupL   s7    ||DKK%/077&&t,,r   N)r   r   r   rL   r   r   r   r
   rC   rC   @   s    
r   rC   c                       e Zd Zd Zy)JSONTokenApic                 6    |j                         }|d   |d   fS )NrJ   rK   )json)r   rI   	resp_jsons      r
   rL   zJSONTokenApi.process_result[   s"    IIK	&!9V#455r   N)r   r   r   rL   r   r   r
   rR   rR   W   s    6r   rR   c                       e Zd Zd Zy)JWTTokenApic                    	 ddl m} dd l}|j                         }	 t	        | j
                  d      5 }|j                         }d d d        	 |j                         	 |j                  ||
      }|j!                  |j"                        }d|v r|j                  ||j$                  
      }|j!                  |j$                        }	d|	v r6t'        j&                         |	d   k  rt        dt        j                         y d|	v r6t'        j&                         |	d   kD  rt        dt        j                         y |	d   |	d   fS # 1 sw Y   xY w# t        $ r1}t        dt        |      z  t        j                         Y d }~y d }~ww xY w#  	 |j                  j                  d      d       n##  t        d	t        j                         Y Y y xY wY xY w# t        $ r1}t        dt        |      z  t        j                         Y d }~y d }~ww xY w# t(        $ r%}t        dt        j                         Y d }~y d }~ww xY w)Nr   )jwtrbzError loading key file: %sr"   utf-8oct)kktyz#Failed to correctly parse key data!)keyrY   encnbfzToken can not be used yet!expzToken has expired!rJ   rK   zFailed to parse token: %szGpackage jwcrypto not found, are you sure you've installed it correctly?)jwcryptorY   rT   JWKr)   r   read	Exceptionr1   strr2   r3   import_from_pem
import_keydecodeJWTloadsheaderclaimstimeImportError)
r   r   rY   rT   r_   key_filekey_dataeparsed_headerparseds
             r
   r   zJWTTokenApi.lookupd   s   2	$'')C$++t, /'}}H/ ##H-CU3 $

5<< 8M)GGG>EELL1F?yy{VE]2:L#F?yy{VE]22D#vv77K/ / 2SV;#**M  NNX__W%=%NH ?cjjQ I8  1CF:L  	[beblblm	s   H E EE F B#G  9G  =	G  EE 	F'F	H 	FH G"F76G7GGH GH  	H)'HH HH 	I&IIN)r   r   r   r   r   r   r
   rW   rW   `   s    3r   rW   c                       e Zd ZdZd Zd Zy)
TokenRedisa  
    The TokenRedis plugin expects the format of the data in a form of json.
    
    Prepare data with:
        redis-cli set hello '{"host":"127.0.0.1:5000"}'
    
    Verify with:
        redis-cli --raw get hello
    
    Spawn a test "server" using netcat
        nc -l 5000 -v
    
    Note: you have to install also the 'redis' and 'simplejson' modules
          pip install redis simplejson
    c                    	 dd l }dd l}|j                  d      \  | _        | _        t        d| j                  d| j                  dt        j                         y # t        $ r5 t        d|z  t        j                         t        j                          Y y t        $ r2 t        dt        j                         t        j                          Y y w xY w)Nr   r!   zTokenRedis backend initilized ()r"   zKThe provided --token-source='%s' is not in an expected format <host>:<port>Tpackage redis or simplejson not found, are you sure you've installed them correctly?)redis
simplejsonr.   _server_portr1   r2   r3   r0   exitrp   )r   r	   r{   r|   s       r
   r   zTokenRedis.__init__   s    	'*yy~$DL$*<<-36::? 	_JJ(HHJ 	horoyoyzHHJ	s   AA ;C7CCc                 <   	 dd l }dd l}t        d|z  t        j
                         j                  | j                  | j                        }|j                  |      }|y |j                  d      }t        d|z  t        j
                         j                  |      }|d   j                  d	      \  }}	t        d
|d|	t        j
                         ||	gS # t        $ r3 t        dt        j
                         t	        j                          Y w xY w)Nr   rz   r"   zresolving token '%s')rJ   rK   r[   zresponse from redis : %srJ   r!   zhost: z, port: )r{   r|   rp   r1   r2   r3   r   Redisr}   r~   rO   rj   rl   r.   )
r   r   r{   r|   clientstuffresponseStrcomborJ   rK   s
             r
   r   zTokenRedis.lookup   s    	
 	$u,3::>$,,TZZ@

5!=,,w/K,{:L$$[1E =..s3LT4$t43::F$<  	horoyoyzHHJ	s   C 8DDN)r   r   r   __doc__r   r   r   r   r
   rw   rw      s      r   rw   c                   $     e Zd Z fdZd Z xZS )UnixDomainSocketDirectoryc                     t        |   |i | t        j                  j	                  | j
                        | _        y r   )r   r   r$   r%   abspathr   	_dir_pathr   s      r
   r   z"UnixDomainSocketDirectory.__init__   s-    $)&)5r   c                 F   	 dd l }t        j                  j                  | j                        sy t        j                  j                  t        j                  j                  | j                  |            }|j                  | j                        sy t        j                  j                  |      sy |j                  t        j                   |      j                        sy d|gS # t        $ r1}t        dt        |      z  t        j                         Y d }~y d }~ww xY w)Nr   unix_socketz$Error finding unix domain socket: %sr"   )statr$   r%   r&   r   r   r(   r,   existsS_ISSOCKst_moderf   r1   rg   r2   r3   )r   r   r   uds_pathrs   s        r
   r   z UnixDomainSocketDirectory.lookup   s    	77==0wwrww||DNNE'JKH&&t~~677>>(+==!2!:!:;"H.. 	<s1vECJJW	s/   -C& A"C& C& 3.C& "C& &	D /'DD )r   r   r   r   r   r=   r>   s   @r
   r   r      s    6r   r   )r$   r2   ro   r-   r   r   r@   rC   rR   rW   rw   r   r   r   r
   <module>r      sq    	 
  	 "
 "P%! %: .6< 67* 7r3  3 l
 r   