Skip to content

Commit ac5d400

Browse files
committed
[ELY-2547] Add Elytron Tool option to overwrite CLI script
1 parent 7e9967d commit ac5d400

File tree

7 files changed

+215
-20
lines changed

7 files changed

+215
-20
lines changed

tool/src/main/java/org/wildfly/security/tool/Command.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,7 @@ class Params {
498498
static final String SILENT_PARAM = "silent";
499499
static final String STORE_LOCATION_PARAM = "location";
500500
static final String SUMMARY_PARAM = "summary";
501+
static final String OVERWRITE_SCRIPT_FILE = "overwrite-script-file";
501502

502503
// Other constants
503504
static final Pattern BOOLEAN_ARG_REGEX = Pattern.compile("(true|false)", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);

tool/src/main/java/org/wildfly/security/tool/ElytronToolMessages.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,9 @@ public interface ElytronToolMessages extends BasicLogger {
589589
@Message(id = NONE, value = "Provides a detailed summary of all operations performed, once the command finishes.")
590590
String cmdFileSystemRealmSummaryDesc();
591591

592+
@Message(id = NONE, value = "Whether the cli script file will be overwritten, if attempting to write to an existing file.")
593+
String cmdFileSystemRealmOverwriteCliScriptFileDesc();
594+
592595
@Message(id = NONE, value = "No users file specified. Please use either --bulk-convert <file> or specify a users file using --users-file <file>")
593596
MissingOptionException missingUsersFile();
594597

tool/src/main/java/org/wildfly/security/tool/FileSystemEncryptRealmCommand.java

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package org.wildfly.security.tool;
1919

20+
import static org.wildfly.security.tool.Params.BOOLEAN_PARAM;
2021
import static org.wildfly.security.tool.Params.BULK_CONVERT_PARAM;
2122
import static org.wildfly.security.tool.Params.CREATE_CREDENTIAL_STORE_PARAM;
2223
import static org.wildfly.security.tool.Params.CREDENTIAL_STORE_LOCATION_PARAM;
@@ -38,6 +39,7 @@
3839
import static org.wildfly.security.tool.Params.LINE_SEPARATOR;
3940
import static org.wildfly.security.tool.Params.NAME_PARAM;
4041
import static org.wildfly.security.tool.Params.OUTPUT_LOCATION_PARAM;
42+
import static org.wildfly.security.tool.Params.OVERWRITE_SCRIPT_FILE;
4143
import static org.wildfly.security.tool.Params.PASSWORD_ENV_PARAM;
4244
import static org.wildfly.security.tool.Params.PASSWORD_PARAM;
4345
import static org.wildfly.security.tool.Params.REALM_NAME_PARAM;
@@ -176,6 +178,10 @@ class FileSystemEncryptRealmCommand extends Command {
176178
option.setArgName(FILE_PARAM);
177179
options.addOption(option);
178180

181+
option = new Option("w", OVERWRITE_SCRIPT_FILE, true, ElytronToolMessages.msg.cmdFileSystemRealmOverwriteCliScriptFileDesc());
182+
option.setArgName(BOOLEAN_PARAM);
183+
options.addOption(option);
184+
179185
option = Option.builder().longOpt(HELP_PARAM).desc(ElytronToolMessages.msg.cmdLineHelp()).build();
180186
options.addOption(option);
181187

@@ -208,6 +214,7 @@ private static final class Descriptor {
208214
private Boolean encoded;
209215
private Boolean createCredentialStore;
210216
private Boolean populate;
217+
private Boolean overwriteScriptFile;
211218
Descriptor() {
212219
}
213220

@@ -230,6 +237,7 @@ private static final class Descriptor {
230237
this.createCredentialStore = descriptor.createCredentialStore;
231238
this.secretKeyAlias = descriptor.secretKeyAlias;
232239
this.populate = descriptor.populate;
240+
this.overwriteScriptFile = descriptor.overwriteScriptFile;
233241
}
234242

235243
public Encoding getHashEncoding() {
@@ -362,6 +370,14 @@ void setKeyPairAlias(String keyPairAlias) {
362370
this.keyPairAlias = keyPairAlias;
363371
}
364372

373+
public Boolean getOverwriteScriptFile() {
374+
return overwriteScriptFile;
375+
}
376+
377+
public void setOverwriteScriptFile(Boolean overwriteScriptFile) {
378+
this.overwriteScriptFile = overwriteScriptFile;
379+
}
380+
365381
void reset() {
366382
this.inputRealmLocation = null;
367383
this.outputRealmLocation = null;
@@ -379,6 +395,7 @@ void reset() {
379395
this.encoded = null;
380396
this.levels = null;
381397
this.populate = null;
398+
this.overwriteScriptFile = null;
382399
}
383400
}
384401

@@ -424,6 +441,7 @@ public void execute(String[] args) throws Exception {
424441
String encodedOption = cmdLine.getOptionValue("f");
425442
String bulkConvert = cmdLine.getOptionValue("b");
426443
String populateOption = cmdLine.getOptionValue("p");
444+
String overwriteScriptFileOption = cmdLine.getOptionValue("w");
427445

428446
if (bulkConvert == null) {
429447
if (realmNameOption == null) {
@@ -473,6 +491,9 @@ public void execute(String[] args) throws Exception {
473491
} else {
474492
descriptor.setPopulate(Boolean.valueOf(populateOption));
475493
}
494+
if (overwriteScriptFileOption != null) {
495+
descriptor.setOverwriteScriptFile(Boolean.valueOf(overwriteScriptFileOption));
496+
}
476497

477498
if (levelsOption == null) {
478499
descriptor.setLevels(DEFAULT_LEVELS);
@@ -928,6 +949,7 @@ private void createWildFlyScript() throws Exception {
928949
String keyStoreType = descriptor.getKeyStoreType();
929950
char[] password = descriptor.getPassword();
930951
String keyPairAlias = descriptor.getKeyPairAlias();
952+
Boolean overwriteScript = descriptor.getOverwriteScriptFile();
931953

932954
if (hashCharset == null) {
933955
hashCharset = StandardCharsets.UTF_8;
@@ -942,17 +964,20 @@ private void createWildFlyScript() throws Exception {
942964

943965
Path scriptPath = Paths.get(String.format("%s/%s.cli", outputRealmLocation, fileSystemRealmName));
944966

945-
if (scriptPath.toFile().exists()) {
946-
createScriptCheck = prompt(
947-
true,
948-
ElytronToolMessages.msg.shouldFileBeOverwritten(scriptPath.toString()),
949-
false,
950-
null
951-
);
952-
if (createScriptCheck.trim().isEmpty()) createScriptCheck = "n";
967+
if (overwriteScript == null) {
968+
if (scriptPath.toFile().exists()) {
969+
createScriptCheck = prompt(
970+
true,
971+
ElytronToolMessages.msg.shouldFileBeOverwritten(scriptPath.toString()),
972+
false,
973+
null
974+
);
975+
if (createScriptCheck.trim().isEmpty()) createScriptCheck = "n";
976+
}
977+
978+
overwriteScript = createScriptCheck.isEmpty() || createScriptCheck.toLowerCase().startsWith("y");
953979
}
954980

955-
boolean overwriteScript = createScriptCheck.isEmpty() || createScriptCheck.toLowerCase().startsWith("y");
956981
if (!overwriteScript) { // Generate a random file for the CLI script
957982
do {
958983
scriptPath = Paths.get(String.format("%s/%s.cli",
@@ -1006,7 +1031,7 @@ private void createWildFlyScript() throws Exception {
10061031
if (overwriteScript) { // Create a new script file, or overwrite the existing one
10071032
Files.write(scriptPath, scriptLines, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
10081033
} else {
1009-
Files.write(scriptPath, scriptLines, StandardOpenOption.APPEND);
1034+
Files.write(scriptPath, scriptLines, StandardOpenOption.CREATE);
10101035
}
10111036
counter++;
10121037
}

tool/src/main/java/org/wildfly/security/tool/FileSystemRealmIntegrityCommand.java

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import static org.wildfly.security.tool.Params.NAME_PARAM;
4040
import static org.wildfly.security.tool.Params.NUMBER_PARAM;
4141
import static org.wildfly.security.tool.Params.OUTPUT_LOCATION_PARAM;
42+
import static org.wildfly.security.tool.Params.OVERWRITE_SCRIPT_FILE;
4243
import static org.wildfly.security.tool.Params.PASSWORD_ENV_PARAM;
4344
import static org.wildfly.security.tool.Params.PASSWORD_PARAM;
4445
import static org.wildfly.security.tool.Params.REALM_NAME_PARAM;
@@ -160,6 +161,9 @@ public class FileSystemRealmIntegrityCommand extends Command {
160161
options.addOption(Option.builder("b").longOpt(BULK_CONVERT_PARAM).desc(ElytronToolMessages.msg.cmdFileSystemRealmIntegrityBulkConvertDesc())
161162
.hasArg().argName(FILE_PARAM)
162163
.build());
164+
options.addOption(Option.builder("w").longOpt(OVERWRITE_SCRIPT_FILE).desc(ElytronToolMessages.msg.cmdFileSystemRealmOverwriteCliScriptFileDesc())
165+
.hasArg().argName(BOOLEAN_PARAM)
166+
.build());
163167

164168
// General options
165169
options.addOption(Option.builder("h").longOpt(HELP_PARAM).desc(ElytronToolMessages.msg.cmdLineHelp())
@@ -188,6 +192,7 @@ private static final class Descriptor {
188192
private Encoding hashEncoding;
189193
private Charset hashCharset;
190194
private Boolean encoded;
195+
private Boolean overwriteScriptFile;
191196

192197
private Boolean upgradeInPlace;
193198
private Boolean missingRequiredValue;
@@ -215,6 +220,7 @@ private static final class Descriptor {
215220
this.hashEncoding = descriptor.hashEncoding;
216221
this.hashCharset = descriptor.hashCharset;
217222
this.encoded = descriptor.encoded;
223+
this.overwriteScriptFile = descriptor.overwriteScriptFile;
218224

219225
this.upgradeInPlace = descriptor.upgradeInPlace;
220226
this.missingRequiredValue = descriptor.missingRequiredValue;
@@ -325,6 +331,9 @@ public Boolean getMissingRequiredValue() {
325331
public Boolean getRealmUpgraded() {
326332
return realmUpgraded;
327333
}
334+
public Boolean getOverwriteScriptFile() {
335+
return overwriteScriptFile;
336+
}
328337

329338
public void setInputRealmPath(String inputRealmPath) {
330339
setInputRealmPath(Paths.get(inputRealmPath).normalize().toAbsolutePath());
@@ -413,6 +422,9 @@ public void setMissingRequiredValue() {
413422
public void setRealmUpgraded() {
414423
this.realmUpgraded = true;
415424
}
425+
public void setOverwriteScriptFile(Boolean overwriteScriptFile) {
426+
this.overwriteScriptFile = overwriteScriptFile;
427+
}
416428

417429
void reset(boolean resetMissingValues) {
418430
// Required values are set to null if contents are null, or equal "MISSING"
@@ -431,6 +443,7 @@ void reset(boolean resetMissingValues) {
431443
hashEncoding = null;
432444
hashCharset = null;
433445
encoded = null;
446+
overwriteScriptFile = null;
434447

435448
upgradeInPlace = false;
436449
realmUpgraded = false;
@@ -479,6 +492,7 @@ public void execute(String[] args) throws Exception {
479492
String hashCharsetOption = cmdLine.getOptionValue("u");
480493
String encodedOption = cmdLine.getOptionValue("f");
481494
String bulkConvertOption = cmdLine.getOptionValue("b");
495+
String overwriteScriptFileOption = cmdLine.getOptionValue("w");
482496

483497
if (bulkConvertOption == null) {
484498
if (summaryMode) {
@@ -577,6 +591,10 @@ public void execute(String[] args) throws Exception {
577591
descriptor.setEncoded(Boolean.parseBoolean(encodedOption));
578592
}
579593

594+
if (overwriteScriptFileOption != null) {
595+
descriptor.setOverwriteScriptFile(Boolean.valueOf(overwriteScriptFileOption));
596+
}
597+
580598
descriptors.add(descriptor);
581599
findMissingRequiredValuesAndSetValues(0, descriptor);
582600
} else if (nonBulkConvertOptionSet(inputRealmPathOption, outputRealmPathOption, realmNameOption, keyStorePathOption,
@@ -955,22 +973,26 @@ private void createWildFlyScript() throws Exception {
955973
String fileSystemRealmName = descriptor.getFileSystemRealmName();
956974
Path outputRealmPath = descriptor.getOutputRealmPath();
957975
boolean upgradeInPlace = descriptor.getUpgradeInPlace();
976+
Boolean overwriteScript = descriptor.getOverwriteScriptFile();
958977

959978
String createScriptCheck = "";
960979
Path scriptPath = Paths.get(String.format("%s/%s.cli", outputRealmPath, fileSystemRealmName));
961980

962-
// Ask to overwrite CLI script, if already exists
963-
if(scriptPath.toFile().exists()) {
964-
createScriptCheck = prompt(
965-
true,
966-
ElytronToolMessages.msg.shouldFileBeOverwritten(scriptPath.toString()),
967-
false,
968-
null
969-
);
970-
if (createScriptCheck.trim().isEmpty()) createScriptCheck = "n";
981+
if (overwriteScript == null) {
982+
// Ask to overwrite CLI script, if already exists
983+
if(scriptPath.toFile().exists()) {
984+
createScriptCheck = prompt(
985+
true,
986+
ElytronToolMessages.msg.shouldFileBeOverwritten(scriptPath.toString()),
987+
false,
988+
null
989+
);
990+
if (createScriptCheck.trim().isEmpty()) createScriptCheck = "n";
991+
}
992+
993+
overwriteScript = createScriptCheck.isEmpty() || createScriptCheck.toLowerCase().startsWith("y");
971994
}
972995

973-
boolean overwriteScript = createScriptCheck.isEmpty() || createScriptCheck.toLowerCase().startsWith("y");
974996
if (!overwriteScript) {
975997
do {
976998
scriptPath = Paths.get(String.format("%s/%s.cli",

tool/src/test/java/org/wildfly/security/tool/FileSystemEncryptRealmCommandTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package org.wildfly.security.tool;
1919

20+
import static org.junit.Assert.assertFalse;
2021
import static org.junit.Assert.assertThrows;
2122
import static org.junit.Assert.assertTrue;
2223
import static org.wildfly.security.tool.Command.ELYTRON_KS_PASS_PROVIDERS;
@@ -26,6 +27,7 @@
2627
import java.nio.file.Files;
2728
import java.nio.file.Path;
2829
import java.nio.file.Paths;
30+
import java.util.Arrays;
2931
import java.util.Comparator;
3032
import java.util.HashMap;
3133
import java.util.Map;
@@ -66,6 +68,12 @@ private void runCommand(String inputLocation, String outputLocation, String file
6668
executeCommandAndCheckStatus(requiredArgs, expectedStatus);
6769
}
6870

71+
private void runCommand(String inputLocation, String outputLocation, String fileSystemRealmName, String encoded, boolean create, int expectedStatus, boolean overwriteScriptFile) {
72+
String[] requiredArgs;
73+
requiredArgs = new String[]{"--input-location", inputLocation, "--output-location", outputLocation, "--realm-name", fileSystemRealmName, "--encoded", encoded, "--create", String.valueOf(create), "--credential-store", CREDENTIAL_STORE_PATH, "--overwrite-script-file", String.valueOf(overwriteScriptFile)};
74+
executeCommandAndCheckStatus(requiredArgs, expectedStatus);
75+
}
76+
6977
private void runCommand(String inputLocation, String outputLocation, String fileSystemRealmName, int levels, String encoded, boolean create, int expectedStatus) {
7078
String[] requiredArgs;
7179
requiredArgs = new String[]{"--input-location", inputLocation, "--output-location", outputLocation, "--realm-name", fileSystemRealmName, "--levels", String.valueOf(levels), "--encoded", encoded, "--create", String.valueOf(create), "--credential-store", CREDENTIAL_STORE_PATH};
@@ -159,6 +167,48 @@ public void testSingleUser() throws Exception {
159167
}
160168
}
161169

170+
@Test
171+
public void testOverwritingScriptFileTrue() throws Exception {
172+
String outputLocation = RELATIVE_BASE_DIR + "fs-encrypted-realms";
173+
String fileSystemRealmName = "overwrite-script-true";
174+
String file = "target/test-classes/filesystem-encrypt/fs-encrypted-realms/overwrite-script-true.cli";
175+
176+
String inputLocation = RELATIVE_BASE_DIR + "fs-unencrypted-realms/single-user-with-role/";
177+
runCommand(inputLocation, outputLocation, fileSystemRealmName, 3, "false", true, 0);
178+
179+
assertTrue(fileExists(file));
180+
Path scriptPath = Paths.get(file);
181+
byte[] fileContentBefore = Files.readAllBytes(scriptPath);
182+
183+
inputLocation = RELATIVE_BASE_DIR + "fs-unencrypted-realms/single-user/";
184+
runCommand(inputLocation, outputLocation, fileSystemRealmName, "false", true, 0, true);
185+
186+
byte[] fileContentAfter = Files.readAllBytes(scriptPath);
187+
188+
assertFalse(Arrays.equals(fileContentBefore, fileContentAfter));
189+
}
190+
191+
@Test
192+
public void testOverwritingScriptFileFalse() throws Exception {
193+
String outputLocation = RELATIVE_BASE_DIR + "fs-encrypted-realms";
194+
String fileSystemRealmName = "overwrite-script-false";
195+
String file = "target/test-classes/filesystem-encrypt/fs-encrypted-realms/overwrite-script-false.cli";
196+
197+
String inputLocation = RELATIVE_BASE_DIR + "fs-unencrypted-realms/single-user-with-role/";
198+
runCommand(inputLocation, outputLocation, fileSystemRealmName, 3, "false", true, 0);
199+
200+
assertTrue(fileExists(file));
201+
Path scriptPath = Paths.get(file);
202+
byte[] fileContentBefore = Files.readAllBytes(scriptPath);
203+
204+
inputLocation = RELATIVE_BASE_DIR + "fs-unencrypted-realms/single-user/";
205+
runCommand(inputLocation, outputLocation, fileSystemRealmName, "false", true, 0, false);
206+
207+
byte[] fileContentAfter = Files.readAllBytes(scriptPath);
208+
209+
assertTrue(Arrays.equals(fileContentBefore, fileContentAfter));
210+
}
211+
162212
@Test
163213
public void testSingleUserMissingParam() throws Exception {
164214
String outputLocation = RELATIVE_BASE_DIR + "fs-encrypted-realms";

0 commit comments

Comments
 (0)