
    eg                        d dl mZ d dlZd dlZd dlZd dlZd dl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Zd dlZddlmZ ddlmZmZ dd	lmZ  ej        ej        j                    ej        d
          ZdZdZ G d d          ZdS )    )unicode_literalsN)basename)join)urlparse   )errors)InvalidNameNoDefaultUrl)UPLOAD_TYPE_MAPPINGrepo_cliauthoradminc                      e Zd ZdIdZed             Zd Zd Zed             Zed             Z	ed	             Z
dJd
Zd Zd Zdej        fdZd Zd Zd Zd Zd Zd ZdJdZd Zd Zd ZdKdZd Zd Zd Zd Zd  Z d! Z!d" Z"d# Z#d$ Z$	 dLd&Z%d' Z&d( Z'd) Z(dMd*Z)d+ Z*	 dJd,Z+dMd-Z,	 dNd.Z-dOd0Z.dOd1Z/dOd2Z0dOd3Z1dOd4Z2dOd5Z3dPd7Z4dQd9Z5dRd:Z6dKd;Z7d< Z8dKd=Z9d>e:fd?Z;d@ Z<dA Z=dB Z>	 dSdDZ?dE Z@dF ZAdG ZBdH ZCdS )TRepoApiNTc                 L    || _         || _        || _        d | _        d | _        d S N)base_url
verify_ssl_access_token_jwt_urls)selfr   
user_tokenr   s       2lib/python3.11/site-packages/repo_cli/utils/api.py__init__zRepoApi.__init__   s*     $'	


    c                    | j         | j        st                      i dt          | j        dd          dt          | j        d          dt          | j        dd          dt          | j        dd          dt          | j        d          dt          | j        d          d	t          | j        d	          d
t          | j        dd          dt          | j        dd          dt          | j        dd          dt          | j        dd          dt          | j        d          dt          | j        dd          dt          | j        d          dt          | j        d          dt          | j        d          dt          | j        d          t          | j        d          t          | j        d          d| _         | j         S )N	authorizeauthaccountaccount_tokenstokensloginlogoutchannels	artifactsuser_channels
token_infoz
token-infouser_tokensscopescvessystem_settingssystemsettingsmirrorsreporeportsusersdiagnose)r-   r3   )r   r   r
   r   r   s    r   urlszRepoApi.urls%   s   := %"nn$T$-EE4y99 !$t}i"J"J dmVW==	
 $t}h77 D
;; T$-==  dmY
!K!K d4=)\JJ tDM9hGG $t}iBB T]F33 "4x#L#L 4y99 T]F33  4y99!" dmW55#$ t}h77 
;;'  DJ* zr   c                 P    d                     t          j                              S )Nzrepo-cli-token-{hostname})hostname)formatsocketgethostnamer4   s    r   get_user_token_namezRepoApi.get_user_token_nameA   s"    *116;M;O;O1PPPr   c                 X   |                                  t          t          j                                                                        t          j        d          z             |                                 d}t          j        | j	        d         t          j        |          | j        | j                  }|j        dk    r@d|j        d|j        }t                               |           t%          j        |          |
                                d	         | _        | j        S )
N   )days)name
expires_atr*   r!   dataheadersverify   z9Error requesting a new user token! Server responded with : token)r;   strdatetimenowdate	timedelta
get_scopesrequestspostr5   jsondumpsbearer_headersr   status_codecontentloggererrorr   RepoCLIErrorr   )r   rB   respmsgs       r   create_access_tokenzRepoApi.create_access_tokenD   s    ,,..!%%'',,..1C1L1L1LL  oo''
 
 }I&'D!!'?	
 
 
 s"""   C LL%c***!YY[[1!!r   c                      d| j          dd}|S )NzBearer application/json)AuthorizationContent-Type)r   )r   rC   s     r   rR   zRepoApi.bearer_headers_   s'     3ty22.
 
 r   c           	          | j         sdS | j                             d          d         }t          j        t	          j        |dt          |          dz  z  z                       }|d         d         }t          |v S )NF.   =   realm_accessroles)r   splitrP   loadsbase64	b64decodelen
ROLE_ADMIN)r   payloadrB   re   s       r   is_admin_jwtzRepoApi.is_admin_jwtg   sr    y 	5)//#&&q)z&*7SCLL1<L5M+MNNOO^$W-U""r   c                 *    |                                  S r   )get_xauth_headersr4   s    r   xauth_headerszRepoApi.xauth_headersr   s    %%'''r   c                 F    d| j         i}|r|                    |           |S )NzX-Auth)r   update)r   extra_headersrC   s      r   ro   zRepoApi.get_xauth_headersv   s.    T/0 	*NN=)))r   c                    t                               d           t          j        | j        d         | j        | j                  }|j        dk    r@d|j        d|j        }t           	                    |           t          j        |          |                                                    dg           }t                               dt          |                      |r"|                                 fd	|D             }|sd S |d
         d         }t          | j        d         |          }|rt                               d|            t          j        || j        | j                  }|j        dk    rt                               d           d S |j        dk    rt                               d           d S d|j        d|j        }t           	                    |           t          j        |          t                               d|            t          j        |d| j        | j                  }|j        dk    r@d|j        d|j        }t           	                    |           t          j        |          |                                d         x| _        }t                               d           |S )Nz[API] Getting access token.. r!   rC   rD   rE   z3Error retrieving user token! Server responded with rF   itemsz![LOGIN] Access token retrieved.. c                 ,    g | ]}|d          k    |S )r?    ).0r   user_token_names     r   
<listcomp>z+RepoApi.get_xauth_token.<locals>.<listcomp>   s3       f%88 888r   r   idz:[XAUTH_TOKEN] Deleteing token because force_scopes option    z[XAUTH_TOKEN] Token Deleted  z1[XAUTH_TOKEN] Token not deleted because not foundz1Error deleting user token! Server responded with z![XAUTH_TOKEN] Refreshing token.. z{}rA   z3Error refreshing user token! Server responded with rG   z[XAUTH_TOKEN] Token Refreshed)rU   debugrN   getr5   rR   r   rS   rT   rV   r   rW   rP   rj   r;   r   deleteputr   )	r   force_scopes
token_resprY   r)   token_id	token_url	new_tokenrz   s	           @r   get_xauth_tokenzRepoApi.get_xauth_token|   s   4555\I&''?
 
 


 !S(((&&&""C LL%c*** oo''++GR88K[9I9IKKLLL 	"6688O   "-  K
  	Fq>$'#34h??	 %	LLWXWW   "4#6t  J %,,:;;;;;'3..PQQQQQ / ***&& S!!!)#... LLGXGGHHH!+	  J %,,,***&& S!!!)#...-7__->->w-GGDLL8999r   c                    t          j                    }t                              d           |                    | j        d         | j        d          }|j        dk    rOt                              d           t                              d|j                    t          j
                    t          |j        d                   }|                    d	
          }|S )Nz"[LOGIN] Getting authorize endpointr   F)rD   allow_redirectsi.  z([LOGIN] Error getting auth configurationServer responded with response Location )query)rN   SessionrU   r   r   r5   r   rS   infor   WrongRepoAuthSetupr   rC   _replace)r   srX   urls       r   get_authorize_urlzRepoApi.get_authorize_url   s    9:::uuIk"4?E  
 
 s""KKBCCCLLM4;KMMNNN+---t|J/00lll$$
r   returnc                 &   ||d}t          j                    }t                              d| d           |                    | j        d         t          j        |          ddi| j                  }t                              d           |j	        d	k    rWt          
                    d
           t                              d|j	         d|j                    t          j                    |                                d         x| _        }|S )z3Login using direct grant and returns the jwt token.)usernamepasswordz[LOGIN] Authenticating user ...r#   r^   r\   rA   z[LOGIN] DonerE   z[LOGIN] Error logging in...r   
Data: rG   )rN   r   rU   r   rO   r5   rP   rQ   r   rS   r   rT   r   Unauthorizedr   )r   r   r   rB   r   rX   	jwt_tokens          r   r#   zRepoApi.login   s   $(;;AHAAABBBvvIgD!!#%78?	  
 
 	^$$$s""KK5666LLZ$2BZZDLZZ   %''' $		G 44	Ir   c                     |                      |          }|sHt                              d           |                                 }t                              d           |S )z-Returns user token, used with X-Auth headers.z/[LOGIN] Access token not found. Creating one...z[LOGIN] Done.)r   rU   r   rZ   )r   r   r   s      r   get_user_tokenzRepoApi.get_user_token   s[    )),77
 	*LLJKKK1133JLL))) r   c                     | j         d         }t                              d|            t          j        || j        | j                  }|                     |d          d         S )Nr    z+[UPLOAD] Getting user default channel from ru   getting account detailsdefault_channel_namer5   rU   r   rN   r   rp   r   _manage_responser   r   responses      r   get_default_channelzRepoApi.get_default_channel   se    i	"H3HHIII<T-?XXX$$X/HII"
 	
r   c                     | j         d         }t                              d|            t          j        || j        | j                  }|                     |d          S )Nr    z#[UPLOAD] Getting current user from ru   r   r   r   s      r   get_current_userzRepoApi.get_current_user   s[    i	"@3@@AAA<T-?XXX$$X/HIIIr   c                    |t           vrt          j        d|z            t           |         }t          | j        d|d          }t          j        |          }t          |          }t          	                    d| j
         d| j                    |t          |d          fd |fd |j        fd}t                              d| d	| d
           t          j        ||| j        | j                  }	|	S )Nz%s upload is not supportedr%   r&   z[UPLOAD] Using token  on rb)rT   filetypesizez
Uploading z artifact to r   )filesrC   rD   )r   r   rW   r   r   osstatr   rU   r   r   openst_sizer   rN   rO   rp   r   )
r   filepathchannelpackage_typeartifact_typer   statinfofilenamemultipart_form_datar   s
             r   upload_filezRepoApi.upload_file  s   222%&B\&QRRR+L94=*g{CC78$$H%%TT-?TTT]TTUUU $x"6"67}-8+,
 

 	DDDCDDDEEE=%&?	
 
 
 r   c                 
   |}t                               d| d| j                    d|v rP|                    d          \  }}t	          | j        d         |d          }d|i}|                     ddi          }n5t	          | j        d                   }d|i}|                     ddi          }|                     |d                    t          j	        |||| j
        	          }|                     |d
| dg          S )a  Create a new channel with name `channel` on the repo server at `base_url` using `token`
        to authenticate.

        Args:
              channel(str): name of the channel to be created

        Returns:
              response (http response object)
        zCreating channel r   /r%   subchannelsr?   r^   r\   rP   rC   rD   zcreating channel    success_codes)rU   r   r   rf   r   r5   ro   _validate_channel_namerN   rO   r   r   )r   r   _channel
subchannelr   rB   rC   r   s           r   create_channelzRepoApi.create_channel  s+    FFFt}FFGGG'>>")--"4"4GZty,g}EECJ'D,,n>P-QRRGGty,--CG$D,,n>P-QRRG##DL111=dGDO
 
 
 $$4(44SE % 
 
 	
r   c                 Z   |                      |          }t                              d| d| j                    t                              d| j                    t          j        ||                     ddi          | j                  }|j	        dv rIt          
                    d| d	           t                              d
|j	         d|j                    nKd| d|j	         d|j         }t                              |           |j	        dv rt          j                    |S )NzRemoving channel r   Using token r^   r\   ru   )   Channel z successfully removedServer responded with r   zError removing z#.Server responded with status code .
Error details:     )_get_channel_urlrU   r   r   r   rN   r   ro   r   rS   r   rT   rV   r   r   )r   r   r   r   rY   s        r   remove_channelzRepoApi.remove_channel8  s[   ##G,,EEEdmEEFFF8D$688999?**N<N+OPP?
 
 

 5((KKA7AAABBBLLY)=YYxGWYY   
5' 5 55=5I5 5"*"25 5 
 LL#z11)+++r   c                    d|vr|                      |           |                     |          }t                              d| d| j                    t                              d| j                    t          j        |||                     ddi          | j	                  }|sd| d	}|j
        d
v rEt                              |           t                              d|j
         d|j                    nKd| d|j
         d|j         }t                              |           |j
        dv rt          j                    |S )NprivacyzUpdating channel r   r   r^   r\   r   r   z successfully updated.rE   r}   r   r   zError updating z% - Server responded with status code z
Error details: r   )r   r   rU   r   r   r   rN   r   ro   r   rS   r   rT   rV   r   r   )r   r   success_messagerB   r   r   rY   s          r   update_channelzRepoApi.update_channelQ  s   D  ''000##G,,EEEdmEEFFF8D$688999<**N<N+OPP?	
 
 
  	IHHHHO:--KK(((LLY)=YYxGWYY   
5' 5 55=5I5 5"*"25 5 
 LL#z11)+++r   c                 
    d|v S )a  Return True if channel is a path to a subchannel, False otherwise. For example:

        >> is_subchannel("main")
            False
        >> is_subchannel("main/stage")
            True

        Args:
            channel (str): name of the channel

        Returns:
            (bool)r   rx   )r   r   s     r   is_subchannelzRepoApi.is_subchannelr  s     g~r   c                     |                      |          r6|                    d          \  }}t          | j        d         |d|          }nt          | j        d         |          }|S )zReturn a channel url based on the fact that it's a normal channel or
         a subchannel

        Args:
            channel (str): name of the channel

        Returns:
            (str) url
        r   r%   r   )r   rf   r   r5   )r   r   r   r   s       r   r   zRepoApi._get_channel_url  sg     g&& 	7")--"4"4GZty,g}jQQCCty,g66C
r   c                 
   t                               d| d| j                    |                     |          }t	          j        ||                     ddi          | j                  }|                     |d|           S )NGetting channel r   r^   r\   ru   getting channel )	rU   r   r   r   rN   r   ro   r   r   r   r   r   r   s       r   get_channelzRepoApi.get_channel  s    DDDT]DDEEE##G,,<**N<N+OPP?
 
 

 $$X/K'/K/KLLLr   r   2   c                 4   t                               d| d| j                    t          |                     |          d|d|          }t          j        ||                     ddi          | j                  }| 	                    |d| d	          S )
Nr   z	 history zhistory?offset=&limit=r^   r\   ru   r   z history)
rU   r   r   r   r   rN   r   ro   r   r   )r   r   offsetlimitr   r   s         r   get_channel_historyzRepoApi.get_channel_history  s    III$-IIJJJ!!'***,2FFEE:
 
 <**N<N+OPP?
 
 

 $$X/S'/S/S/STTTr   c                     t                               d| j                    t          j        | j        d         |                     ddi          | j                  }|                     |d          S )NzGetting user channels from r'   r^   r\   ru   zgetting user channels	rU   r   r   rN   r   r5   ro   r   r   r   r   s     r   list_user_channelszRepoApi.list_user_channels  st    B4=BBCCC<Io&**N<N+OPP?
 
 

 $$X/FGGGr   c                     t                               d| j                    t          j        | j        d         |                     ddi          | j                  }|                     |d          S )NzGetting channels from r%   r^   r\   ru   zgetting channelsr   r   s     r   list_channelszRepoApi.list_channels  st    =dm==>>><Ij!**N<N+OPP?
 
 

 $$X/ABBBr   c                    t                               d| d| j                    t          | j        d         |d          }t          j        ||                     ddi          | j                  }| 	                    |d| d	          S )
Nr   z subchannels on r%   r   r^   r\   ru   r   z subchannel)
rU   r   r   r   r5   rN   r   ro   r   r   r   s       r   get_channel_subchannelszRepoApi.get_channel_subchannels  s    PPPPPQQQ49Z('=AA<**N<N+OPP?
 
 

 $$X/V'/V/V/VWWWr   c
                 4   t          |                     |          d          }
|||||||d}|	r|	|d<   t          j        |
t	          j        |          |                     ddi          | j                  }|                     |d| d| d	gd
g          S )Nr/   mirror_namesource_rootmirror_modecronmirror_typefiltersrun_nowproxyr^   r\   rA   zCreating mirror  on channel r   r   r   auth_fail_codes)	r   r   rN   rO   rP   rQ   ro   r   r   )r   r   r   r?   moder   type_r   r   r   r   mirror_detailsrX   s                r   create_mirrorzRepoApi.create_mirror  s     4((119==& 
 
  	,&+N7#}N++**N<N+OPP?	
 
 
 $$:t::::% E	 % 
 
 	
r   c                 6   t          |                     |          d|          }|||||||	d}|
r|
|d<   t          j        |t	          j        |          |                     ddi          | j                  }|                     |d| d| d	gd
g          S )Nr/   r   r   r^   r\   rA   zUpdating mirror r   r   r   r   )	r   r   rN   r   rP   rQ   ro   r   r   )r   	mirror_idr   r   r?   r   r   r   r   r   r   r   r   rX   s                 r   update_mirrorzRepoApi.update_mirror  s     4((119iHH& 
 
  	,&+N7#|N++**N<N+OPP?	
 
 
 $$:t::::% E	 % 
 
 	
r   c                     t          |                     |          d          }t          j        || j        | j                  }|                     |d|           S )Nr/   ru   zGetting mirrors on channel r   r   rN   r   rp   r   r   )r   r   r   rX   s       r   get_mirrorszRepoApi.get_mirrors
  sY    4((119==|C);DOTTT$$T+R+R+RSSSr   c                     t          |                     |          d|          }t          j        || j        | j                  }|                     |d| d|           S )Nr/   ru   zGetting mirror r   r  )r   r   r   r   rX   s        r   
get_mirrorzRepoApi.get_mirror  sj    4((119kJJ|C);DOTTT$$FKFFWFF
 
 	
r   c                    | j         d         }dddd}t          j        || j        | j        t          j        |                    }|j        r|                                d         dk    rh|                                d         ddd}t          j        || j        | j        t          j        |                    }|                     |d          S |                     |d	          S )
Nr/   d   r   r   )r   r   sortrC   rD   rB   total_countzGetting all mirrorszGetting global mirrors)	r5   rN   r   rp   r   rP   rQ   okr   )r   r   paramsrX   refetch_resps        r   get_all_mirrorszRepoApi.get_all_mirrors  s    i	"!]CC|&?F##	
 
 
 7 	Ryy{{=)C//!YY[[7) 
  (| .?F++	      ,,\;PQQQ$$T+CDDDr   c                     t          |                     |          d|          }t          j        || j        | j                  }|                     |d| d| dg          S )Nr/   ru   zMirror z was deleted on channel r}   r   )r   r   rN   r   rp   r   r   )r   r   r   r   r   rX   s         r   delete_mirrorzRepoApi.delete_mirror1  st    4((119iHHsD,>tWWW$$DkDD7DD% % 
 
 	
r   r   c                 f   |sdg}|sddg}|j         |v r!|j         dk    rd S |                                S d| d|j          d|j        pd  d}|j         d	k    r|d
z  }|j         dk    rt                              |           |j         |v rt          j                    t          j        |          )NrE   r   r   r}   zError z$. Server responded with status code r   
i  z
Please verify that the Anaconda Server server is online and that your configuration is pointing to the active ATE server.
If Anaconda Server is still responding with 500 errors, please contact your system administrator.
)rS   rP   rT   rU   r   r   r   rW   )r   r   actionr   r   rY   s         r   r   zRepoApi._manage_response;  s     	" EM 	)"CjO=00#s**==??"? ? ?5=5I? ?"*"2":d? ? ? 
 #s**B #s**S!!!#66)+++%c***r   c                 (   t          j        | j        d         | j        | j                  }|j        dv r|                                S d|j         d|j         }t          	                    |           |j        dv rt          j                    i S )Nr(   ru   r   z;Error getting token info.Server responded with status code r   r   )rN   r   r5   rp   r   rS   rP   rT   rU   rV   r   r   r   r   rY   s      r   get_token_infozRepoApi.get_token_infoZ  s    <Il#T-?
 
 
 :--==??"55=5I5 5"*"25 5 
 LL#z11)+++	r   c                 (   t          j        | j        d         | j        | j                  }|j        dv r|                                S d|j         d|j         }t          	                    |           |j        dv rt          j                    g S )Nr!   ru   r   z<Error getting user tokens.Server responded with status code r   r   )rN   r   r5   rR   r   rS   rP   rT   rU   rV   r   r   r  s      r   get_user_tokenszRepoApi.get_user_tokensl  s    <I&''?
 
 
 :--==??"55=5I5 5"*"25 5 
 LL#z11)+++	r   c                     t          | j        d         |          }t          j        || j        | j                  }|                     |ddg          S )Nr!   ru   zremoving user tokenr}   r   )r   r5   rN   r   rR   r   r   )r   rG   r   r   s       r   remove_user_tokenzRepoApi.remove_user_token  sd    49-.66?,T_
 
 
 $$+C5 % 
 
 	
r   c                     ||d}|r||d<   |r||d<   t          j        | j        d         t          j        |          | j        | j                  }|                     |ddg          S )	N)r?   r@   r*   	resourcesr!   rA   zcreating user tokenrE   r   )rN   rO   r5   rP   rQ   rR   r   r   )r   r?   
expirationr*   r  rB   r   s          r   create_user_tokenzRepoApi.create_user_token  s    $
 
  	$#DN 	* )D=I&'D!!'?	
 
 
 $$+C5 % 
 
 	
r   c                     t          j        | j        d         | j        | j                  }|                     |d          d         S )Nr*   ru   zgetting scopes)rN   r   r5   rR   r   r   r   s     r   rM   zRepoApi.get_scopes  sI    <Ih)<T_
 
 
 $$X/?@@JJr   c                    t          |                     |          dd          }||d}|r(d|v r|                    d          \  |d<   |d<   n||d<   t          j        |||                     ddi          | j        	          }|j        d
k    rt          j	        |          |j        dk    r:t          j        |j                  }t          j        |d         |d                   |                     |d|z  dgg d          S )Nr&   bulk)r  rv   r   target_channeltarget_subchannelr^   r\   r   i  i  codemessagez%s articfactsr   )r   r   r~   r   )r   r   rf   rN   r   ro   r   rS   r   ChannelFrozenrP   rg   rT   BulkActionErrorr   )	r   r   r  r&   r"  r   rB   rX   rT   s	            r   channel_artifacts_bulk_actionsz&RepoApi.channel_artifacts_bulk_actions  sE    4((11;GG 955 	8n$$
 #((--)*,-- *8%&|**N<N+OPP?	
 
 
 s""&w///s""j..G('):LMMM$$f$%+OO	 % 
 
 	
r   c                    g }||                     d|z             ||                     d|z             |rJt          |                     |          d                    d                    |                              }n#t          |                     |          d          }t	          j        || j        | j                  }|                     |d          S )Nz	offset=%szlimit=%szartifacts?{}&r&   ru   zgetting artifacts)	appendr   r   r8   rN   r   rp   r   r   )r   r   r   r   r   r   rX   s          r   get_channel_artifactszRepoApi.get_channel_artifacts  s    LLv-...LLe+,,, 	D%%g..0E0Echhuoo0V0V CC t,,W55{CCC|C);DOTTT$$T+>???r   c                    | j         | j        | j        | j        | j        | j        d}g }d}|r|g}	nF|                     |                              dg           }
rfd|
D             }	nd |
D             }	|	D ]}r-t          | 	                    |          d|d         d          }n2t          | 	                    |          d|d	         |d         d          }t          j        || j        | j        
          }|                     |d          }|d         }|d         D ]\}r |         |||          }n ||d	                  |||          }|r)dD ]}||v r||         ||<   |                    |           ]
||fS )N)condacranpythonanaconda_projectanaconda_envnotebookr   rv   c                 b    g | ]+}|d          dk    |d         k    |d         |d         d,S )
file_countr   familyr?   r?   r6  rx   )ry   pkgr6  s     r   r{   z7RepoApi.get_channel_artifacts_files.<locals>.<listcomp>  sQ       <(1,,X&1H1H ![CMBB1H1H1Hr   c                 H    g | ]}|d          dk    |d         |d         d S )r5  r   r?   r6  r7  rx   )ry   r8  s     r   r{   z7RepoApi.get_channel_artifacts_files.<locals>.<listcomp>  sB       <(1,, ![CMBB,,,r   r&   r?   r   r6  ru   zgetting articfactsr
  )
cve_status	cve_score)_parse_conda_file_parse_cran_file_parse_python_file_parse_project_file_parse_environment_file_parse_notebook_filer,  r   r   r   rN   rp   r   r   r+  )r   r   r6  packageversionr   file_family_parsersartifact_filesr
  packagesrB   r   rX   r   	file_datarec	cve_fields     `              r   get_channel_artifacts_filesz#RepoApi.get_channel_artifacts_files  sH    +)- $ 8 81
 
  	yHH
 --g66::7BGGD    #   #     &	/ &	/G ))'22FO  ))'22H%FO  <T-?XXXD))$0DEEE.K"7^ / /	 5-f5!  CC C-i.AB!  C
  /%@ B B	$	11-6y-AC	N"))#...#/& {**r   Fc                 :   |d                              d          p|d         d         |rd         |k    rd S |rd         |k    rd S |r|}nK|d         |d         d}|                    fd	d
D                                             dd          |d<   |S )Nmetadatazrepodata_record.jsonz
index.jsonrC  fnr?   ckeyr?   rN  c                 >    i | ]}|                     |d           S r   )r   )ry   keymetas     r   
<dictcomp>z-RepoApi._parse_conda_file.<locals>.<dictcomp>2  s)    LLL3TXXc2..LLLr   )rC  rM  subdirr   platform)r   rr   )r   rG  rC  r   
return_rawrH  rS  s         @r   r<  zRepoApi._parse_conda_file$  s    j!%%&<== 3$\2 	
  	tI'11F 	T
h..F 	5CC$V,i6GHHCJJLLLL:KLLLMMM"hhx44C
O
r   c                 &   |d         }|d                              d          d         }|r|d         |k    rd S |r||k    rd S |r|}nH|d         |d         d}|                    |           |                    d          |d<   ||d	<   d
|d<   |S )NrL  rN  r   Versionr?   rO  rC  rM  n/arV  rf   rr   pop)r   rG  rC  r   rW  rS  rM  rH  s           r   r=  zRepoApi._parse_cran_file7  s    $v$$S))"-  	tI'11F 	hF 	$CC$V,i6GHHCJJt WWY//C	NCI#C
O
r   c                    |d                              dd          d         }|d                             d          }t          |t                    rd                    |          }|d	         |d         ||r|nd
d d}|S )NrN  r   ra   maxsplitrY  rL  	platforms,r?   r[  r?   rN  rM  rV  rC  )rf   r   
isinstancelistr   )r   rG  rC  r   rW  rM  ra  rH  s           r   r?  zRepoApi._parse_project_fileK  s    v$$S1$55b9j)--k::	i&& 	,++If%f%%.9		E
 
 
r   c                 t    |d                              dd          d         }|d         |d         |dd d}|S 	NrN  r   ra   r_  rY  r?   r[  rc  rf   r   rG  rC  r   rW  rM  rH  s          r   r@  zRepoApi._parse_environment_fileY  P    v$$S1$55b9f%f%
 
 
r   c                 t    |d                              dd          d         }|d         |d         |dd d}|S rg  rh  ri  s          r   rA  zRepoApi._parse_notebook_filed  rj  r   c                 &   |d         }|d                              d          d         }|r|d         |k    rd S |r||k    rd S |r|}nH|d         |d         d}|                    |           |                    d          |d<   ||d<   d	|d
<   |S )NrL  rN  r   rY  rC  r?   rO  artifact_filenamer[  rV  r\  )r   rG  rC  r   rW  rS  rm  rH  s           r   r>  zRepoApi._parse_python_fileo  s    $%f-33C88< 	tI'11F 	)X55F 	$CC$V,i6GHHCJJt WWY//C	N'8C#$#C
O
r   -download_countc           	          | j         d         d|d|d|d|	}t          j        || j        | j                  }|                     |d          S )Nr&   z?q=r   z&offset=z&sort=ru   zsearching artifactsr5   rN   r   rp   r   r   )r   r   r   r   r  r   r   s          r   get_artifactszRepoApi.get_artifacts  sg    Ik"""EEEEFFD
 <T-?XXX$$X/DEEEr   r  c           	          | j         d         d|d|d|d|z   }t          j        || j        | j                  }|                     |d          S )Nr%   r   z/artifacts/z/files?limit=ru   zgetting artifact filesrp  )r   r   rB  r6  r   r   r   s          r   get_artifact_fileszRepoApi.get_artifact_files  si    i
##GGFFGGE	'
 
 <T-?XXX$$X/GHHHr   c                 p    | j         d         d|d|d}t          j        || j        | j                  S )Nr0   r   z?sbom=download)r   rC   rD   )r5   rN   r   rp   r   )r   r   rN  r   s       r   get_sbom_downloadzRepoApi.get_sbom_download  s?    *.)F*;*;*;WWWdddK|T-?XXXXr   c                     | j         d         d|d|}t          j        || j        | j                  }|                     |d          S )Nr+   z?offset=r   ru   zgetting cvesrp  )r   r   r   r   r   s        r   get_cveszRepoApi.get_cves  sR    )-6):):):FFFEEJ<T-?XXX$$X~>>>r   c                     | j         d         d|}t          j        || j        | j                  }|                     |d          S )Nr+   r   ru   zgetting cve idrp  )r   cve_idr   r   s       r   get_cvezRepoApi.get_cve  sM    6***FF3<T-?XXX$$X/?@@@r   c                     | j         d         d|d|d|}t          j        || j        | j                  }|                     |d          S )Nr+   r   z/files?offset=r   ru   zgetting cve filesrp  )r   ry  r   r   r   r   s         r   get_cve_fileszRepoApi.get_cve_files  s`    IfFFFFE	
 <T-?XXX$$X/BCCCr   r?   c                 ^   |                      |          r	 |                    d          \  }}|                     |           |                     |           n=# t          $ r0 d| d}t                              |           t          |          w xY wd S t          j        d|          st          d          }t          |                    t          |                              }dd                    |           }t                              |           t          |          d S )Nr   zChannel name z, is not valid. It contains more than one '/'z^[a-z][a-z0-9_-]*$z!"#$%&'()*+,./:;<=>?@[\]^`{|}~z'Channel name contains invalid sequence z, )r   rf   r   
ValueErrorrU   rV   r	   rematchsetre  intersectionr   )r   r?   r   r   error_messageinvalid_charsinvalid_letterss          r   r   zRepoApi._validate_channel_name  sC   d## 	
8&*jjoo# ++G444++J7777  1 1 1VDVVV  ]+++!-0001 Fx-t44 	- EFFM"=#=#=c$ii#H#HIIOV$))O:T:TVV  LL'''m,,,	- 	-s   A :Bc                 z    t          j        | j        d         | j                  }|                     |d          S )Nr,   )rC   zgetting system settings)rN   r   r5   rp   r   r   s     r   get_system_settingszRepoApi.get_system_settings  sA    <I'($2D
 
 
 $$X/HIIIr   c                     t          j        | j        d         t          j        |          |                     ddi          | j                  }|                     |d          S )Nr,   r^   r\   rA   zupdating system settings)rN   r   r5   rP   rQ   ro   r   r   )r   r.   r   s      r   update_system_settingszRepoApi.update_system_settings  se    <I'(H%%**N<N+OPP?	
 
 
 $$X/IJJJr   c                     |                      |          d|z  z   }t          j        || j        | j                  }|                     |d          S )Nz/mirrors/%s/stop_mirror_syncru   zstopping mirror)r   rN   rO   rp   r   r   )r   r   r   r   r   s        r   stop_mirrorzRepoApi.stop_mirror  sb    !!'**-Ki-WW 	 =&?
 
 

 $$X/@AAAr   rP   c                    | j         d         dz   }|||d}|r||d<   |r||d<   t          j        ||                     ddd          | j        t          j        |                    }|j        d	k    rt          j	        |j        d
k    rdS |dk    r'|                                
                    d          S |dk    r|j        S d S )Nr1   z/artifact_downloads)	from_dateto_datedownload_as
user_nameschannel_namesr\   r^   Acceptr	  r   rE   FrP   downloaded_itemscsv)r5   rN   rO   ro   r   rP   rQ   rS   r   r   r   text)	r   	data_fromdata_tor  r  	file_typer   rB   r   s	            r   
get_reportzRepoApi.get_report  s    i	"%:: #$
 
  	,!+D 	2$1D!=**!3?QRR  ?D!!
 
 
 3&&%%3&&5==??&&'9:::=  r   c                 0    | j         d         d|d|dz   S )Nr0   r   z	/jupyter/z.ipynb)r5   )r   r   notebook_names      r   get_notebook_download_urlz!RepoApi.get_notebook_download_url  s$    y  WWWmmm#TTTr   c                    | j         d         dz   }t          j        ||                     ddd          | j        t          j        |                    }|j        dk    rt          j	                    | 
                    |d          S )Nr-   /blob_cleanupr\   r  r	  i  zblob cleanup)r5   rN   rO   ro   r   rP   rQ   rS   r   SystemDiagonseErrorr   )r   	array_shar   r   s       r   post_blob_cleanupzRepoApi.post_blob_cleanup  s    i!O3=**!3?QRR  ?I&&
 
 
 3&&,...$$X~>>>r   c                     | j         d         dz   }t          j        || j        | j                  }|                     |d          S )Nr-   r  ru   zdeleting blobs)r5   rN   r   rp   r   r   r   s      r   delete_blobszRepoApi.delete_blobs!  sP    i!O3?&?
 
 
 $$X/?@@@r   c                     | j         d         dz   }d|d}t          j        || j        | j        t          j        |                    }|S )Nr3   z/blobsrP   )r  r  r	  )r5   rN   rO   rp   r   rP   rQ   )r   r  r   rB   r   s        r   diagnose_blobszRepoApi.diagnose_blobs,  sX    i
#h.%FF=&?D!!	
 
 
 r   )NTr   )r   r   )r   NN)NN)NNNN)F)r   r   rn  )r  rQ  )rP   )D__name__
__module____qualname__r   propertyr5   r;   rZ   rR   rm   rp   ro   r   r   rN   Responser#   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r  r  r  r  rM   r(  r,  rJ  r<  r=  r?  r@  rA  r>  rq  rs  ru  rw  rz  r|  rH   r   r  r  r  r  r  r  r  r  rx   r   r   r   r      s             X6Q Q Q" " "6   X # # X# ( ( X(   B B BH  8+<    .  
 
 
J J J  0
 
 
>  2   B    $M M MU U U UH H HC C CX X X
 
 
:%
 %
 %
NT T T

 
 
E E E6
 
 
 HL+ + + +>  $  (
 
 

 
 
 
*K K K :>"
 "
 "
 "
H@ @ @ @  JNJ+ J+ J+ J+X   &   (   	 	 	 		 	 	 	   *	F 	F 	F 	FI I I IY Y Y Y
? ? ? ?
A A A
D D D D-3 - - - -4J J JK K K
B 
B 
B HN#! #! #! #!JU U U? ? ?"	A 	A 	A    r   r   )
__future__r   rh   rI   rP   loggingr   r  r9   os.pathr   	posixpathr   urllib.parser   rN   urllib3r   r   r	   r
   utils.configr   disable_warnings
exceptionsInsecureRequestWarning	getLoggerrU   ROLE_AUTHORrk   r   rx   r   r   <module>r     sK   ' ' ' ' ' '     				 				              ! ! ! ! ! !         . . . . . . . . . . . . . .  +B C C C		:	&	&
[ [ [ [ [ [ [ [ [ [r   