def getLoginInfo(region):
    '''
    Getting the username and password
    '''
    try:
        loginList = [
            inquirer.Text(
                'username',
                message="{}Type in your username (email address){}".format(
                    config.BOLD, config.END),
                validate=lambda _, x: re.match('[^@]+@[^@]+\.[^@]+', x)),
            inquirer.Password('password',
                              message="{}Type in your password{}".format(
                                  config.BOLD, config.END)),
            inquirer.Password(
                '2fa',
                message=
                "{}Type in your 2FA token (Leave blank if you do not use 2FA){}"
                .format(config.BOLD, config.END)),
            inquirer.Confirm(
                'store',
                message=
                '{}Do you want to store the authentication token on the local drive?{}'
                .format(config.BOLD, config.END),
                default=True)
        ]
        loginInfo = inquirer.prompt(loginList)
        loginInfo['region'] = region
        return loginInfo
    except TypeError:
        exitProgram()
def executeLogin(loginInfo, maxTries, count=1):
    '''
    Executes the login versus Contentstack with the login information fetches in the initiateLogin function
    '''
    try:
        loginInfo['region'] = cma.regionMap[loginInfo['region']]
        while count < maxTries:  # Maximum Attempts
            statusCode, loginAttempt = cma.login(loginInfo['username'],
                                                 loginInfo['password'],
                                                 loginInfo['region'])
            if statusCode == 200:
                return loginAttempt, loginInfo['region']
            # elif statusCode == 294:
            #     print('STATUS CODE 294')
            #     exitProgram()
            elif 'error_message' in loginAttempt:
                config.logging.error(
                    str(config.RED) + str(loginAttempt['error_message']) +
                    str(config.END))
            else:
                config.logging.error(
                    str(config.RED) + str(loginAttempt) + str(config.END))
            count += 1
        config.logging.error('{}Login failed{}'.format(config.RED, config.END))
        return None, None
    except TypeError:
        exitProgram()
def shouldDeleteFile():
    try:
        deleteFile = [
            inquirer.Confirm(
                'deleteFile',
                message="{}Want to delete authtoken file?{}".format(
                    config.BOLD, config.END),
                default=True)
        ]
        if inquirer.prompt(deleteFile)['deleteFile']:
            os.remove(config.authTokenFile)
    except TypeError:
        exitProgram()
def chooseRegion():
    '''
    Choosing between available Contentstack regions
    '''
    try:

        regionMap = {'North America': 'US', 'Europe': 'EU'}
        chooseRegion = [
            inquirer.List(
                'chosenRegion',
                message="{}Choose Region{}".format(config.BOLD, config.END),
                choices=['North America', 'Europe'],
            ),
        ]
        region = inquirer.prompt(chooseRegion)['chosenRegion']
        return regionMap[region]
    except TypeError:
        exitProgram()
Ejemplo n.º 5
0
def startup(count=1):
    '''
    Starting up the application - authenticating the user
    '''
    region = chooseRegion()
    if not region:
        return None
    userInfo = initiateLogin(region)
    if not userInfo:
        config.logging.critical('Not able to login. Try again')
        exitProgram()
    liveUserInfo = cma.getUserInfo(userInfo['authtoken'],
                                   cma.regionMap[region])
    if not liveUserInfo:
        userInfo = initiateLogin(region, count)
    while not liveUserInfo and count < 3:
        liveUserInfo = cma.getUserInfo(userInfo['authtoken'],
                                       cma.regionMap[region])
        count += 1
    return cma.regionMap[region], userInfo, liveUserInfo, userInfo['authtoken']
def initiateLogin(region, retrying=False):
    '''
    Initiating a Login sequence
    '''
    try:
        loginToNewRegion = False
        if retrying:
            shouldDeleteFile()
        loginInfo = None
        if os.path.isfile(config.authTokenFile):
            authTokenDict = config.readFromJsonFile(config.authTokenFile)
            if authTokenDict:
                if region in authTokenDict:
                    config.logging.info(
                        'Authtoken found for user {}{}{} in {} region.'.format(
                            config.UNDERLINE,
                            authTokenDict[region]['username'], config.END,
                            region))
                    use = [
                        inquirer.Confirm(
                            'useFile',
                            message=
                            "{}AuthToken found on local storage. Try to use that?{}"
                            .format(config.BOLD, config.END),
                            default=True)
                    ]
                    if inquirer.prompt(use)['useFile']:
                        return {
                            'region': region,
                            'username': authTokenDict[region]['username'],
                            'authtoken': authTokenDict[region]['authtoken']
                        }
                    else:
                        shouldDeleteFile()
                    loginInfo = getLoginInfo(region)
                else:
                    loginToNewRegion = True
                    loginInfo = getLoginInfo(region)
        else:
            loginInfo = getLoginInfo(region)
        if loginInfo or loginToNewRegion:
            statusCode, userSession = cma.login(
                loginInfo['username'], loginInfo['password'], loginInfo['2fa'],
                cma.regionMap[loginInfo['region']])
            if statusCode == 200:
                config.logging.info(
                    '{}Login Successful - Username: {} - Region: {}{}'.format(
                        config.GREEN, loginInfo['username'],
                        loginInfo['region'], config.END))
            else:
                config.logging.critical(
                    '{}Login ERROR! - Username: {} - Region: {} Status Code: {}{}'
                    .format(config.GREEN, loginInfo['username'],
                            loginInfo['region'], statusCode, config.END))
                return None
            sessionToFile = {
                loginInfo['region']: {
                    'username': loginInfo['username'],
                    'authtoken': userSession['user']['authtoken']
                }
            }
            session = {
                'username': loginInfo['username'],
                'authtoken': userSession['user']['authtoken'],
                'region': loginInfo['region']
            }
            if statusCode == 200 and loginInfo['store']:
                config.addToJsonFile(sessionToFile, config.authTokenFile)
            return session
    except TypeError:
        exitProgram()