| 215 | } |
| 216 | |
| 217 | func secretValue(inv *serpent.Invocation, value string) (string, bool, error) { |
| 218 | valueProvided := userSetOption(inv, "value") |
| 219 | stdinValue, stdinProvided, err := readInvocationStdin(inv) |
| 220 | if err != nil { |
| 221 | return "", false, err |
| 222 | } |
| 223 | |
| 224 | sourceNames := make([]string, 0, 2) |
| 225 | if valueProvided { |
| 226 | sourceNames = append(sourceNames, "--value") |
| 227 | } |
| 228 | if stdinProvided { |
| 229 | sourceNames = append(sourceNames, "stdin") |
| 230 | } |
| 231 | if len(sourceNames) > 1 { |
| 232 | return "", false, xerrors.Errorf("secret value may be provided by only one source, got %s", strings.Join(sourceNames, ", ")) |
| 233 | } |
| 234 | |
| 235 | if valueProvided { |
| 236 | return value, true, nil |
| 237 | } |
| 238 | |
| 239 | if stdinProvided { |
| 240 | warnSuspiciousTrailingNewline(inv.Stderr, stdinValue) |
| 241 | return stdinValue, true, nil |
| 242 | } |
| 243 | |
| 244 | return "", false, nil |
| 245 | } |
| 246 | |
| 247 | func readInvocationStdin(inv *serpent.Invocation) (string, bool, error) { |
| 248 | if isTTYIn(inv) { |