Skip to content

Commit b47bd3a

Browse files
authored
Use terminal reader in keystore add command (#126729)
When reading a string value from stdin the keystore add command currently looks directly at stdin. However, stdin may also be consumed while reading the keystore password. This commit changes the add command to use the reader from the termainl instead of looking at stdin directly. closes #98115
1 parent 85713f7 commit b47bd3a

File tree

3 files changed

+17
-31
lines changed

3 files changed

+17
-31
lines changed

distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/AddStringKeyStoreCommand.java

+2-10
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,10 @@
1919
import org.elasticsearch.core.CheckedFunction;
2020
import org.elasticsearch.env.Environment;
2121

22-
import java.io.BufferedReader;
2322
import java.io.CharArrayWriter;
2423
import java.io.Closeable;
2524
import java.io.IOException;
26-
import java.io.InputStream;
27-
import java.io.InputStreamReader;
28-
import java.nio.charset.StandardCharsets;
25+
import java.io.Reader;
2926
import java.util.Arrays;
3027
import java.util.List;
3128

@@ -47,11 +44,6 @@ class AddStringKeyStoreCommand extends BaseKeyStoreCommand {
4744
this.arguments = parser.nonOptions("setting names");
4845
}
4946

50-
// pkg private so tests can manipulate
51-
InputStream getStdin() {
52-
return System.in;
53-
}
54-
5547
@Override
5648
protected void executeCommand(Terminal terminal, OptionSet options, Environment env) throws Exception {
5749
final List<String> settings = arguments.values(options);
@@ -64,7 +56,7 @@ protected void executeCommand(Terminal terminal, OptionSet options, Environment
6456
final Closeable closeable;
6557
final CheckedFunction<String, char[], IOException> valueSupplier;
6658
if (options.has(stdinOption)) {
67-
final BufferedReader stdinReader = new BufferedReader(new InputStreamReader(getStdin(), StandardCharsets.UTF_8));
59+
final Reader stdinReader = terminal.getReader();
6860
valueSupplier = s -> {
6961
try (CharArrayWriter writer = new CharArrayWriter()) {
7062
int c;

distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/AddStringKeyStoreCommandTests.java

+9-21
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,20 @@
1818
import org.elasticsearch.common.settings.KeyStoreWrapper;
1919
import org.elasticsearch.env.Environment;
2020

21-
import java.io.ByteArrayInputStream;
2221
import java.io.CharArrayWriter;
23-
import java.io.InputStream;
24-
import java.nio.charset.StandardCharsets;
2522

2623
import static org.hamcrest.Matchers.anyOf;
2724
import static org.hamcrest.Matchers.containsString;
2825
import static org.hamcrest.Matchers.hasToString;
2926

3027
public class AddStringKeyStoreCommandTests extends KeyStoreCommandTestCase {
31-
InputStream input;
32-
3328
@Override
3429
protected Command newCommand() {
3530
return new AddStringKeyStoreCommand() {
3631
@Override
3732
protected Environment createEnv(OptionSet options, ProcessInfo processInfo) throws UserException {
3833
return env;
3934
}
40-
41-
@Override
42-
InputStream getStdin() {
43-
return input;
44-
}
4535
};
4636
}
4737

@@ -167,7 +157,7 @@ public void testStdinShort() throws Exception {
167157
String password = "keystorepassword";
168158
KeyStoreWrapper.create().save(env.configDir(), password.toCharArray());
169159
terminal.addSecretInput(password);
170-
setInput("secret value 1");
160+
terminal.addSecretInput("secret value 1");
171161
execute("-x", "foo");
172162
assertSecureString("foo", "secret value 1", password);
173163
}
@@ -176,7 +166,7 @@ public void testStdinLong() throws Exception {
176166
String password = "keystorepassword";
177167
KeyStoreWrapper.create().save(env.configDir(), password.toCharArray());
178168
terminal.addSecretInput(password);
179-
setInput("secret value 2");
169+
terminal.addSecretInput("secret value 2");
180170
execute("--stdin", "foo");
181171
assertSecureString("foo", "secret value 2", password);
182172
}
@@ -185,7 +175,7 @@ public void testStdinNoInput() throws Exception {
185175
String password = "keystorepassword";
186176
KeyStoreWrapper.create().save(env.configDir(), password.toCharArray());
187177
terminal.addSecretInput(password);
188-
setInput("");
178+
terminal.addSecretInput("");
189179
execute("-x", "foo");
190180
assertSecureString("foo", "", password);
191181
}
@@ -194,7 +184,7 @@ public void testStdinInputWithLineBreaks() throws Exception {
194184
String password = "keystorepassword";
195185
KeyStoreWrapper.create().save(env.configDir(), password.toCharArray());
196186
terminal.addSecretInput(password);
197-
setInput("Typedthisandhitenter\n");
187+
terminal.addSecretInput("Typedthisandhitenter\n");
198188
execute("-x", "foo");
199189
assertSecureString("foo", "Typedthisandhitenter", password);
200190
}
@@ -203,7 +193,7 @@ public void testStdinInputWithCarriageReturn() throws Exception {
203193
String password = "keystorepassword";
204194
KeyStoreWrapper.create().save(env.configDir(), password.toCharArray());
205195
terminal.addSecretInput(password);
206-
setInput("Typedthisandhitenter\r");
196+
terminal.addSecretInput("Typedthisandhitenter\r");
207197
execute("-x", "foo");
208198
assertSecureString("foo", "Typedthisandhitenter", password);
209199
}
@@ -212,7 +202,9 @@ public void testStdinWithMultipleValues() throws Exception {
212202
final String password = "keystorepassword";
213203
KeyStoreWrapper.create().save(env.configDir(), password.toCharArray());
214204
terminal.addSecretInput(password);
215-
setInput("bar1\nbar2\nbar3");
205+
terminal.addSecretInput("bar1");
206+
terminal.addSecretInput("bar2");
207+
terminal.addSecretInput("bar3");
216208
execute(randomFrom("-x", "--stdin"), "foo1", "foo2", "foo3");
217209
assertSecureString("foo1", "bar1", password);
218210
assertSecureString("foo2", "bar2", password);
@@ -228,7 +220,7 @@ public void testAddUtf8String() throws Exception {
228220
for (int i = 0; i < stringSize; i++) {
229221
secretChars.write((char) randomIntBetween(129, 2048));
230222
}
231-
setInput(secretChars.toString());
223+
terminal.addSecretInput(secretChars.toString());
232224
execute("-x", "foo");
233225
assertSecureString("foo", secretChars.toString(), password);
234226
}
@@ -265,8 +257,4 @@ public void testAddToUnprotectedKeystore() throws Exception {
265257
execute("foo");
266258
assertSecureString("foo", "bar", password);
267259
}
268-
269-
void setInput(String inputStr) {
270-
input = new ByteArrayInputStream(inputStr.getBytes(StandardCharsets.UTF_8));
271-
}
272260
}

docs/changelog/126729.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 126729
2+
summary: Use terminal reader in keystore add command
3+
area: Infra/CLI
4+
type: bug
5+
issues:
6+
- 98115

0 commit comments

Comments
 (0)