azure-devops/azext_devops/dev/common/_credentials.py (65 lines of code) (raw):
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
import os
from knack.log import get_logger
from knack.util import CLIError
from .uri import uri_parse
from .credential_store import CredentialStore
from .config import AZ_DEVOPS_GLOBAL_CONFIG_DIR
logger = get_logger(__name__)
def get_credential(organization, fall_back_to_default=True):
token = _get_credential(organization)
if token is None and organization is not None and fall_back_to_default:
token = _get_credential(organization=None)
return token
def _get_credential(organization):
key = _get_service_name(organization)
logger.debug('Getting credential: %s', key)
cred_store = CredentialStore()
return cred_store.get_password(key)
def set_credential(organization, token):
key = _get_service_name(organization)
cred_store = CredentialStore()
cred_store.set_password(key, token)
if os.path.isfile(ORGANIZATION_LIST_FILE):
# No need to add organization if it's already present.
with open(ORGANIZATION_LIST_FILE, 'r') as org_list:
for org in org_list:
if key == org.rstrip():
return
with open(ORGANIZATION_LIST_FILE, 'a+') as org_list:
org_list.write(key + "\n")
def clear_credential(organization):
key = _get_service_name(organization)
logger.debug('Clearing credential: %s', key)
cred_store = CredentialStore()
if key == _DEFAULT_CREDENTIAL_KEY:
# remove all organizations and delete the file
if os.path.isfile(ORGANIZATION_LIST_FILE):
with open(ORGANIZATION_LIST_FILE) as org_list_file:
for org in org_list_file:
cred_store.clear_password(org.rstrip())
os.remove(ORGANIZATION_LIST_FILE)
# this is to clear default credential before upgrade
elif cred_store.get_password(key) is not None:
cred_store.clear_password(key)
else:
raise CLIError('No credentials were found.')
else:
# delete particular organization from the list
if os.path.isfile(ORGANIZATION_LIST_FILE):
with open(ORGANIZATION_LIST_FILE, "r") as input_file:
orgs = input_file.readlines()
with open(ORGANIZATION_LIST_FILE, "w") as output_file:
for line in orgs:
if line.rstrip() != key:
output_file.write(line)
cred_store.clear_password(key)
def _get_service_name(organization):
if organization is not None:
return 'azdevops-cli:' + normalize_url_for_key(organization)
return _DEFAULT_CREDENTIAL_KEY
def normalize_url_for_key(url):
components = uri_parse(url)
normalized_url = components.scheme.lower() + '://' + components.netloc.lower()
organization_name = components.path.lower()
if (organization_name and ('visualstudio.com' not in url.lower())):
organization_name = organization_name.split('/')[1]
normalized_url = normalized_url + '/' + organization_name
return normalized_url
_DEFAULT_CREDENTIAL_KEY = 'azdevops-cli: default'
ORGANIZATION_LIST_FILE = os.path.join(AZ_DEVOPS_GLOBAL_CONFIG_DIR, 'organization_list')