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);
}