maskSecretArguments static method

String maskSecretArguments(
  1. List<String> arguments
)

Renders arguments with the value of every credential option masked.

Handles --token=value, --token value, -J value, -Jvalue and -J=value.

Implementation

static String maskSecretArguments(List<String> arguments) {
  // The header is written before anything is parsed, so the sub-command is
  // recovered from the raw list.
  final abbreviations = <String>{};
  for (final argument in arguments) {
    final forCommand = secretAbbreviations[argument];
    if (forCommand != null) abbreviations.addAll(forCommand);
  }

  final masked = <String>[];
  var maskNext = false;

  for (final argument in arguments) {
    if (maskNext) {
      masked.add('***');
      maskNext = false;
      continue;
    }

    if (!argument.startsWith('-')) {
      masked.add(argument);
      continue;
    }

    if (!argument.startsWith('--') && abbreviations.isNotEmpty) {
      // A short option, possibly bundled (`-vp secret`) or with the value
      // attached (`-psecret`). Everything after the credential letter is the
      // value, so mask from there on.
      final letters = argument.substring(1);
      final at = letters.split('').indexWhere(abbreviations.contains);
      if (at != -1) {
        final head = '-${letters.substring(0, at + 1)}';
        final tail = letters.substring(at + 1);
        if (tail.isEmpty) {
          masked.add(head);
          maskNext = true;
        } else {
          masked.add('$head***');
        }
        continue;
      }
    }

    final separator = argument.indexOf('=');
    final name =
        separator == -1 ? argument : argument.substring(0, separator);

    if (!_secretOptionPattern.hasMatch(name)) {
      masked.add(argument);
      continue;
    }

    if (separator == -1) {
      masked.add(argument);
      maskNext = true;
    } else {
      masked.add('$name=***');
    }
  }

  return masked.join(' ');
}