Fix updating replication credentials using te RepicationRemotesApi The implementation of the ReplicationRemotesApi for updating a remote introduced with I8003ec6c827 has wrongly saved the credentials (username) in the repication.config rather than in the SecureStore, causing the generation of non-functioning replication configs. The credentials are read from the secure.config (or other SecureStore) as documented in [1]. [1] https://gerrit.googlesource.com/plugins/replication/+/refs/heads/master/src/main/resources/Documentation/config.md#file-2 Change-Id: I644d73bc69589189a8762de98d1c58c263abcfd4
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationRemotesApiImpl.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationRemotesApiImpl.java index e4ef318..cc6bcad 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationRemotesApiImpl.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationRemotesApiImpl.java
@@ -59,19 +59,19 @@ "configuration update must have at least one 'remote' section"); } - SeparatedRemoteConfigs configs = onlyRemoteSectionsWithSeparatedPasswords(remoteConfig); - persistRemotesPasswords(configs); + SeparatedRemoteConfigs configs = onlyRemoteSectionsWithSeparatedCredentials(remoteConfig); + persistRemotesCredentials(configs); mergedConfigResource.update(configs.remotes); } - private SeparatedRemoteConfigs onlyRemoteSectionsWithSeparatedPasswords(Config configUpdates) { + private SeparatedRemoteConfigs onlyRemoteSectionsWithSeparatedCredentials(Config configUpdates) { SeparatedRemoteConfigs configs = new SeparatedRemoteConfigs(); for (String subSection : configUpdates.getSubsections("remote")) { for (String name : configUpdates.getNames("remote", subSection)) { List<String> values = List.of(configUpdates.getStringList("remote", subSection, name)); - if ("password".equals(name)) { - configs.passwords.setStringList("remote", subSection, "password", values); + if ("password".equals(name) || "username".equals(name)) { + configs.credentials.setStringList("remote", subSection, name, values); } else { configs.remotes.setStringList("remote", subSection, name, values); } @@ -81,16 +81,20 @@ return configs; } - private void persistRemotesPasswords(SeparatedRemoteConfigs configs) { - for (String subSection : configs.passwords.getSubsections("remote")) { - List<String> values = - List.of(configs.passwords.getStringList("remote", subSection, "password")); - secureStore.setList("remote", subSection, "password", values); + private void persistRemotesCredentials(SeparatedRemoteConfigs configs) { + for (String subSection : configs.credentials.getSubsections("remote")) { + copyRemoteStringList(configs.credentials, subSection, "username"); + copyRemoteStringList(configs.credentials, subSection, "password"); } } + private void copyRemoteStringList(Config config, String subSection, String key) { + secureStore.setList( + "remote", subSection, key, List.of(config.getStringList("remote", subSection, key))); + } + private static class SeparatedRemoteConfigs { private final Config remotes = new Config(); - private final Config passwords = new Config(); + private final Config credentials = new Config(); } }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationRemotesApiTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationRemotesApiTest.java index a806875..40d9846 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationRemotesApiTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationRemotesApiTest.java
@@ -148,9 +148,9 @@ } @Test - public void shouldEncryptPasswordButNotStoreInConfig() throws Exception { + public void shouldSetPasswordViaSecureStoreButNotStoreInConfig() throws Exception { Config update = new Config(); - String password = "my_secret_password"; + String password = "encrypted-password"; String remoteName = "site"; setRemoteSite(update, remoteName, "password", password); ReplicationRemotesApi objectUnderTest = getReplicationRemotesApi(); @@ -163,6 +163,22 @@ assertRemoteSite(objectUnderTest.get(remoteName), remoteName, "password").isNull(); } + @Test + public void shouldSetUsernameViaSecureStoreButNotStoreInConfig() throws Exception { + Config update = new Config(); + String username = "encrypted-username"; + String remoteName = "site"; + setRemoteSite(update, remoteName, "username", username); + ReplicationRemotesApi objectUnderTest = getReplicationRemotesApi(); + + objectUnderTest.update(update); + + verify(secureStoreMock).setList("remote", remoteName, "username", List.of(username)); + assertRemoteSite(baseConfig.getConfig(), remoteName, "username").isNull(); + assertRemoteSite(testOverrides.get().getConfig(), remoteName, "username").isNull(); + assertRemoteSite(objectUnderTest.get(remoteName), remoteName, "username").isNull(); + } + private void setRemoteSite(Config config, String remoteName, String name, String value) { config.setString("remote", remoteName, name, value); }