
    >Tf                         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l
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ dZ G d de	j                  ZdS )    N)settings)
ArrayField)MinLengthValidator)models)reverse)timezone)gettext_lazy)	IPNetwork)IPNetworkField)RestrictedQuerySet)Tokenc            	           e Zd ZdZ ej        dej        d          Z ej         e	d          d          Z
 ej         e	d          dd	          Z ej         e	d
          dd	          Z ej         e	d          dd ed          g          Z ej         e	d          d e	d                    Z ej         e	d          dd          Z e e            dd e	d           e	d                    Z ej                    Z G d d          Zd Zd Zed             Z fdZed             Z ed             Z!d Z" xZ#S ) r   z
    An API token used for user authentication. This extends the stock model to allow each user to have multiple tokens.
    It also supports setting an expiration time and toggling write ability.
    z
users.Usertokens)to	on_deleterelated_namecreatedT)verbose_nameauto_now_addexpires)r   blanknullz	last usedkey(   )r   
max_lengthunique
validatorszwrite enabledz5Permit create/update/delete operations using this key)r   default	help_textdescription   )r   r   r   zallowed IPszAllowed IPv4/IPv6 networks from where the token can be used. Leave blank for no restrictions. Ex: "10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64")
base_fieldr   r   r   r   c                   :    e Zd Z ed          Z ed          ZdS )
Token.Metatokenr   N)__name__
__module____qualname___r   verbose_name_plural     8/var/www/html/netbox-4.1.3/netbox/users/models/tokens.pyMetar$   J   s+        qzzakkr,   r.   c                 6    t           j        r| j        n| j        S N)r   ALLOW_TOKEN_RETRIEVALr   partialselfs    r-   __str__zToken.__str__N   s    #9Ktxxt|Kr,   c                 0    t          d| j        g          S )Nzusers:token)args)r   pkr3   s    r-   get_absolute_urlzToken.get_absolute_urlQ   s    }DG95555r,   c                 8    | j         rd| j         dd           ndS )Nz"**********************************i )r   r3   s    r-   r2   zToken.partialT   s(    GKxWCDHRSSMCCCUWWr,   c                 v    | j         s|                                 | _          t                      j        |i |S r0   )r   generate_keysupersave)r4   r7   kwargs	__class__s      r-   r?   z
Token.saveX   s;    x 	+((**DHuww|T,V,,,r,   c                  r    t          j        t          j        d                                                    S )N   )binasciihexlifyosurandomdecoder+   r,   r-   r=   zToken.generate_key]   s)     
2//66888r,   c                 P    | j         t          j                    | j         k     rdS dS )NFT)r   r   nowr3   s    r-   
is_expiredzToken.is_expiredb   s&    <8<>>DL#@#@5tr,   c                 T    | j         sdS | j         D ]}|t          |          v r dS dS )zr
        Validate the API client IP address against the source IP restrictions (if any) set on the token.
        TF)allowed_ipsr
   )r4   	client_ip
ip_networks      r-   validate_client_ipzToken.validate_client_iph   sL      	4* 	 	JIj1111tt 2 ur,   )$r&   r'   r(   __doc__r   
ForeignKeyCASCADEuserDateTimeFieldr)   r   r   	last_used	CharFieldr   r   BooleanFieldwrite_enabledr    r   r   rM   r   
as_managerobjectsr.   r5   r9   propertyr2   r?   staticmethodr=   rK   rP   __classcell__)rA   s   @r-   r   r      s         6.  D
 #f"Qy\\  G #f"Qy\\  G
 %$Q{^^  I
 &
QuXX&&r**+	  C (F'Q''!KLL  M
 #&"Q}%%  K
 *!>##Q}%%!C
 
	 	 	K , +--G* * * * * * * *L L L6 6 6 X X XX- - - - -
 9 9 \9   X
      r,   r   )rD   rF   django.confr   django.contrib.postgres.fieldsr   django.core.validatorsr   	django.dbr   django.urlsr   django.utilsr   django.utils.translationr	   r)   netaddrr
   ipam.fieldsr   utilities.querysetsr   __all__Modelr   r+   r,   r-   <module>rk      s    				             5 5 5 5 5 5 5 5 5 5 5 5             ! ! ! ! ! ! 6 6 6 6 6 6       & & & & & & 2 2 2 2 2 2
^ ^ ^ ^ ^FL ^ ^ ^ ^ ^r,   