Skip to content

Commit 6ddcf0b

Browse files
committed
Use terminal reader in keystore add command
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 elastic#98115
1 parent c1ecafa commit 6ddcf0b

File tree

2 files changed

+11
-28
lines changed

2 files changed

+11
-28
lines changed

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

+2-7
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@
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;
2625
import java.io.InputStream;
2726
import java.io.InputStreamReader;
27+
import java.io.Reader;
2828
import java.nio.charset.StandardCharsets;
2929
import java.util.Arrays;
3030
import java.util.List;
@@ -47,11 +47,6 @@ class AddStringKeyStoreCommand extends BaseKeyStoreCommand {
4747
this.arguments = parser.nonOptions("setting names");
4848
}
4949

50-
// pkg private so tests can manipulate
51-
InputStream getStdin() {
52-
return System.in;
53-
}
54-
5550
@Override
5651
protected void executeCommand(Terminal terminal, OptionSet options, Environment env) throws Exception {
5752
final List<String> settings = arguments.values(options);
@@ -64,7 +59,7 @@ protected void executeCommand(Terminal terminal, OptionSet options, Environment
6459
final Closeable closeable;
6560
final CheckedFunction<String, char[], IOException> valueSupplier;
6661
if (options.has(stdinOption)) {
67-
final BufferedReader stdinReader = new BufferedReader(new InputStreamReader(getStdin(), StandardCharsets.UTF_8));
62+
final Reader stdinReader = terminal.getReader();
6863
valueSupplier = s -> {
6964
try (CharArrayWriter writer = new CharArrayWriter()) {
7065
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
}

0 commit comments

Comments
 (0)