Commit 3f211bd4 authored by Adrian DC's avatar Adrian DC
Browse files

security(cli)!: acquire tokens only from environment variables

Signed-off-by: default avatarAdrian DC <radian.dc@gmail.com>
parent eced346b
Loading
Loading
Loading
Loading
Loading
+3 −6
Changes for README.md: 3 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -50,9 +50,9 @@ gitlab-projects-settings --reset-features 'https://gitlab.com/group/project'
<!-- readme-help-start -->

```yaml
usage: gitlab-projects-settings [-h] [--version] [--update-check] [--settings] [--set GROUP KEY VAL] [-t TOKEN]
                                [--confirm] [--dry-run] [--dump] [--exclude-group] [--exclude-subgroups]
                                [--exclude-projects] [--available-features] [--reset-features [KEEP_FEATURES]]
usage: gitlab-projects-settings [-h] [--version] [--update-check] [--settings] [--set GROUP KEY VAL] [--confirm]
                                [--dry-run] [--dump] [--exclude-group] [--exclude-subgroups] [--exclude-projects]
                                [--available-features] [--reset-features [KEEP_FEATURES]]
                                [--disable-features FEATURES] [--enable-features FEATURES] [--reset-members]
                                [--set-avatar FILE] [--set-description TEXT] [--update-description]
                                [--run-housekeeping] [--prune-unreachable-objects]
@@ -71,9 +71,6 @@ internal arguments:
  --set GROUP KEY VAL               # Set settings specific 'VAL' value to [GROUP] > KEY
                                    # or unset by using 'UNSET' as 'VAL'

credentials arguments:
  -t TOKEN                          # GitLab API token (default: GITLAB_TOKEN environment)

common settings arguments:
  --confirm                         # Automatically confirm all removal and contents warnings
  --dry-run                         # Enable dry run mode to check without saving
+3 −2
Changes for src/cli/entrypoint.py: 3 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ from ..features.gitlab import GitLabFeature
from ..prints.colors import Colors
from ..prints.themes import Themes
from ..system.platform import Platform
from ..types.environments import Environments
from ..types.gitlab import ProjectFeatures
from ..types.namespaces import Namespaces

@@ -31,7 +32,7 @@ class Entrypoint:

    # CLI, pylint: disable=too-many-branches,too-many-statements
    @staticmethod
    def cli(options: Namespace) -> Result:
    def cli(options: Namespace, environments: Environments) -> Result:

        # Variables
        group: Optional[GitLabGroup] = None
@@ -50,7 +51,7 @@ class Entrypoint:
        # GitLab client
        gitlab = GitLabFeature(
            gitlab_url,
            options.token,
            environments.value('gitlab_token'),
            options.dry_run,
        )
        print(f'{Colors.BOLD} - GitLab host: '
+3 −12
Changes for src/cli/main.py: 3 added lines, 12 removed lines.
Original line number Diff line number Diff line
@@ -3,7 +3,6 @@
# Standard libraries
from argparse import (_ArgumentGroup, _MutuallyExclusiveGroup, ArgumentParser, Namespace,
                      RawTextHelpFormatter)
from os import environ
from shutil import get_terminal_size
from sys import exit as sys_exit

@@ -34,6 +33,7 @@ def main() -> None:
    environments = Environments()
    environments.group = 'environment variables'
    environments.add(
        'gitlab_token',
        Bundle.ENV_GITLAB_TOKEN,
        'GitLab API token environment variable',
    )
@@ -91,15 +91,6 @@ def main() -> None:
             'or unset by using \'UNSET\' as \'VAL\'',
    )

    # Arguments credentials definitions
    group = parser.add_argument_group('credentials arguments')
    group.add_argument(
        '-t',
        dest='token',
        default=environ.get(Bundle.ENV_GITLAB_TOKEN, ''), #
        help=f'GitLab API token (default: {Bundle.ENV_GITLAB_TOKEN} environment)',
    )

    # Arguments common settings definitions
    group = parser.add_argument_group('common settings arguments')
    group.add_argument(
@@ -332,7 +323,7 @@ def main() -> None:
        sys_exit(0)

    # Arguments validation
    if not options.token or not options.url_path:
    if not options.url_path:
        result = Entrypoint.Result.CRITICAL

    # Header
@@ -341,7 +332,7 @@ def main() -> None:

    # CLI entrypoint
    if result != Entrypoint.Result.CRITICAL:
        result = Entrypoint.cli(options)
        result = Entrypoint.cli(options, environments)

    # CLI helper
    else:
+23 −9
Changes for src/types/environments.py: 23 added lines, 9 removed lines.
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@

# Standard libraries
from os import environ
from typing import List, NamedTuple
from typing import Dict, List, NamedTuple

# Environments class
class Environments:
@@ -27,12 +27,12 @@ class Environments:

    # Members
    __group: str
    __variables: List[Variable]
    __variables: Dict[str, Variable]

    # Constructor
    def __init__(self) -> None:
        self.__group = ''
        self.__variables = []
        self.__variables = {}

    # Group
    @property
@@ -45,16 +45,20 @@ class Environments:
        self.__group = value

    # Add
    def add(self, name: str, description: str, fallback: str = '') -> None:
    def add(
        self,
        key: str,
        name: str,
        description: str,
        fallback: str = '',
    ) -> None:

        # Append variable to list
        self.__variables += [
            Environments.Variable(
        self.__variables[key] = Environments.Variable(
            name=name,
            description=description,
            fallback=fallback,
            ),
        ]
        )

    # Help
    def help(self, help_position: int) -> str:
@@ -67,7 +71,7 @@ class Environments:
            lines += [self.__group]

        # Append variables
        for variable in self.__variables:
        for _, variable in self.__variables.items():
            line = f'  {variable.name: <{help_position - 2}}'
            line += f'{variable.description}'
            if variable.fallback:
@@ -76,3 +80,13 @@ class Environments:

        # Result
        return Environments.LINE_EOL.join(lines)

    # Value
    def value(self, key: str) -> str:

        # Get value of declared variable
        if key in self.__variables:
            return self.__variables[key].value

        # Fallback
        return ''