Fix settings serialization to not serialize secure settings or not take the total size into account (#25323)

This commit is contained in:
Simon Willnauer 2017-06-21 08:13:56 +02:00 committed by GitHub
parent 8d9a08e239
commit 406a15e7a9
2 changed files with 24 additions and 2 deletions

View File

@ -610,8 +610,10 @@ public final class Settings implements ToXContent {
}
public static void writeSettingsToStream(Settings settings, StreamOutput out) throws IOException {
out.writeVInt(settings.size());
for (Map.Entry<String, String> entry : settings.getAsMap().entrySet()) {
// pull getAsMap() to exclude secure settings in size()
Set<Map.Entry<String, String>> entries = settings.getAsMap().entrySet();
out.writeVInt(entries.size());
for (Map.Entry<String, String> entry : entries) {
out.writeString(entry.getKey());
out.writeOptionalString(entry.getValue());
}

View File

@ -21,6 +21,8 @@ package org.elasticsearch.common.settings;
import org.elasticsearch.Version;
import org.elasticsearch.common.Booleans;
import org.elasticsearch.common.io.stream.BytesStreamOutput;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.logging.DeprecationLogger;
import org.elasticsearch.common.logging.ESLoggerFactory;
import org.elasticsearch.common.settings.loader.YamlSettingsLoader;
@ -590,6 +592,24 @@ public class SettingsTests extends ESTestCase {
assertTrue(Settings.builder().setSecureSettings(secureSettings).build().isEmpty());
}
public void testWriteSettingsToStream() throws IOException {
BytesStreamOutput out = new BytesStreamOutput();
MockSecureSettings secureSettings = new MockSecureSettings();
secureSettings.setString("test.key1.foo", "somethingsecure");
secureSettings.setString("test.key1.bar", "somethingsecure");
secureSettings.setString("test.key2.foo", "somethingsecure");
secureSettings.setString("test.key2.bog", "somethingsecure");
Settings.Builder builder = Settings.builder();
builder.put("test.key1.baz", "blah1");
builder.setSecureSettings(secureSettings);
assertEquals(5, builder.build().size());
Settings.writeSettingsToStream(builder.build(), out);
StreamInput in = StreamInput.wrap(out.bytes().toBytesRef().bytes);
Settings settings = Settings.readSettingsFromStream(in);
assertEquals(1, settings.size());
assertEquals("blah1", settings.get("test.key1.baz"));
}
public void testSecureSettingConflict() {
Setting<SecureString> setting = SecureSetting.secureString("something.secure", null);
Settings settings = Settings.builder().put("something.secure", "notreallysecure").build();