11from __future__ import annotations
22
33import logging
4- from typing import Dict , Optional
54
65from pyartifactory .exception import InvalidTokenDataError
76from pyartifactory .models .auth import AccessTokenModel , ApiKeyModel , PasswordModel
@@ -14,6 +13,7 @@ class ArtifactorySecurity(ArtifactoryObject):
1413 """Models artifactory security."""
1514
1615 _uri = "security"
16+ _tokens_uri = "tokens"
1717
1818 def get_encrypted_password (self ) -> PasswordModel :
1919 """
@@ -29,7 +29,7 @@ def create_access_token(
2929 user_name : str ,
3030 expires_in : int = 3600 ,
3131 refreshable : bool = False ,
32- groups : Optional [ str ] = None ,
32+ scope : str = "applied-permissions/user" ,
3333 ) -> AccessTokenModel :
3434 """
3535 Creates an access token.
@@ -38,39 +38,28 @@ def create_access_token(
3838 is created if user doesn't exist in artifactory.
3939 :param expires_in: Expiry time for the token in seconds. For eternal tokens specify 0.
4040 :param refreshable: If set to true token can be refreshed using the refresh token returned.
41- :param groups: A list of groups the token has membership of.
42- If an existing user in artifactory is used with existing memberships
43- groups are automatically implied without specification.
41+ :param scope: The scope of access that the token provides.
4442 :return: AccessToken
4543 """
46- payload = {
47- "username" : user_name ,
48- "expires_in" : expires_in ,
49- "refreshable" : refreshable ,
50- }
51- if groups :
52- if not isinstance (groups , list ):
53- raise ValueError (groups )
54- scope = f'member-of-groups:"{ "," .join (groups )} "'
55- payload .update ({"scope" : scope })
56- response = self ._post (f"api/{ self ._uri } /token" , data = payload , raise_for_status = False )
44+ payload = {"username" : user_name , "expires_in" : expires_in , "refreshable" : refreshable , "scope" : scope }
45+ response = self ._post (f"access/api/v1/{ self ._tokens_uri } " , data = payload , raise_for_status = False )
5746 if response .ok :
5847 return AccessTokenModel (** response .json ())
5948 raise InvalidTokenDataError (response .json ().get ("error_description" , "Unknown error" ))
6049
61- def revoke_access_token (self , token : Optional [ str ] = None , token_id : Optional [ str ] = None ) -> bool :
50+ def revoke_access_token (self , token : str ) -> bool :
6251 """
6352 Revokes an access token.
6453
6554 :param token: The token to revoke
66- :param token_id: The id of a token to revoke
6755 :return: bool True or False indicating success or failure of token revocation attempt.
6856 """
69- if not any ([token , token_id ]):
70- logger .error ("Neither a token or a token id was specified" )
71- raise InvalidTokenDataError
72- payload : Dict [str , Optional [str ]] = {"token" : token } if token else {"token_id" : token_id }
73- response = self ._post (f"api/{ self ._uri } /token/revoke" , data = payload , raise_for_status = False )
57+
58+ response = self ._delete (
59+ f"access/api/v1/{ self ._tokens_uri } /revoke" ,
60+ data = {"token" : token },
61+ raise_for_status = False ,
62+ )
7463 if response .ok :
7564 logger .debug ("Token revoked successfully, or token did not exist" )
7665 return True
0 commit comments