maskSecretArguments static method
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(' ');
}