Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Archiver enabled/disabled option in config.xml #27

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Gradle
.gradle
build/

#VS Code
.vscode/
# IntelliJ
out/
*.iml
Expand Down
10 changes: 9 additions & 1 deletion README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,14 @@ The credentials configuration includes the following settings.

<!-- Reload interval for credentials in seconds -->
<credentials-reload-interval>60</credentials-reload-interval>


<!-- Avoid save previous credentials.xml to archive folder
Use this option to enable or disable save archive credentials.xml in case of replace
true (default) -> archiver enabled
false -> archiver disabled
-->
<archiver-enabled>true</archiver-enabled>

<!-- Optional list of names of listeners this extension is used for
<listener-names>
<listener-name>my-listener</listener-name>
Expand All @@ -238,6 +245,7 @@ The credentials configuration includes the following settings.
|===
|Configuration |Default |Description
|`credentials-reload-interval` |`60` |Regular interval in seconds, in which the `credentials.xml` configuration file is checked for changes and reloaded.
|`archiver-enabled` |`true` |Use this option to enable or disable save archive credentials.xml in case of replace.
|`listener-names` |`null` |List of names of listeners, this extension will be used for. See {hivemq-listener}[HiveMQ config details^].
|`password-type` |`HASHED` |How passwords are stored in the `credentials.xml` configuration file. Can either bei `PLAIN` for plain text passwords, or `HASHED` for a salted password hash.
|`next-extension-instead-of-fail` |`false` |The outcome in case the RBAC could not authenticate the client successfully.
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
version=4.6.0
version=4.6.1
3 changes: 3 additions & 0 deletions src/hivemq-extension/conf/config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
<!-- Reload interval for credentials in seconds -->
<credentials-reload-interval>60</credentials-reload-interval>

<!-- Avoid save old config to archive folder -->
<archiver-enabled>true</archiver-enabled>

<!-- Optional list of names of listeners this extension is used for
<listener-names>
<listener-name>my-listener</listener-name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.hivemq.extension.sdk.api.annotations.NotNull;
import com.hivemq.extension.sdk.api.annotations.Nullable;
import com.hivemq.extension.sdk.api.annotations.ThreadSafe;
import com.hivemq.extensions.rbac.file.configuration.entities.ExtensionConfig;
import com.hivemq.extensions.rbac.file.configuration.entities.FileAuthConfig;
import org.apache.commons.lang3.time.FastDateFormat;
import org.slf4j.Logger;
Expand All @@ -35,11 +36,13 @@ class ConfigArchiver {

private final @NotNull File archiveFolder;
private final @NotNull XmlParser xmlParser;
private final @NotNull ExtensionConfig extensionConfig;

ConfigArchiver(
final @NotNull File extensionHomeFolder, final @NotNull XmlParser xmlParser) {
final @NotNull File extensionHomeFolder, final @NotNull XmlParser xmlParser, final @NotNull ExtensionConfig extensionConfig) {
this.xmlParser = xmlParser;
archiveFolder = new File(extensionHomeFolder, "credentials-archive");
this.extensionConfig = extensionConfig;
}

/**
Expand All @@ -57,6 +60,11 @@ synchronized void archive(final @Nullable FileAuthConfig config) throws IOExcept
LOG.debug("Configuration is invalid, archiving is not possible");
return;
}
//If someone don't want to create archive every time when he changed credentials.xml file.
if (!this.extensionConfig.isArchiverEnabled()){
LOG.debug("Config Archiver is disabled , archiving is not enabled.");
return;
}

//If someone's nasty and creates a file that looks like a folder
if (archiveFolder.isFile()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public CredentialsConfiguration(
final ReloadConfigFileTask reloadableTask = new ReloadConfigFileTask(//
unmodifiableList(callbacks) /* We don't want the task to modify the callbacks!*/,
configParser,
new ConfigArchiver(extensionHomeFolder, new XmlParser()),
new ConfigArchiver(extensionHomeFolder, new XmlParser(),extensionConfig),
this,
credentialsResolver);
extensionExecutorService.scheduleWithFixedDelay(reloadableTask,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ public class ExtensionConfig {
@XmlElement(name = "credentials-reload-interval", defaultValue = "60")
private int reloadInterval = 60;

@XmlElement(name = "archiver-enabled", defaultValue = "true")
private boolean archiverEnabled = true;

@XmlElementWrapper(name = "listener-names")
@XmlElement(name = "listener-name")
private @Nullable Set<String> listenerNames;
Expand All @@ -50,10 +53,12 @@ public ExtensionConfig() {

public ExtensionConfig(
final int reloadInterval,
final boolean archiverEnabled,
final @Nullable Set<String> listenerNames,
final @Nullable PasswordType passwordType,
final boolean nextExtensionInsteadOfFail) {
this.reloadInterval = reloadInterval;
this.archiverEnabled = archiverEnabled;
this.listenerNames = listenerNames;
this.passwordType = passwordType;
this.nextExtensionInsteadOfFail = nextExtensionInsteadOfFail;
Expand All @@ -67,6 +72,14 @@ public void setReloadInterval(final int reloadInterval) {
this.reloadInterval = reloadInterval;
}

public boolean isArchiverEnabled() {
return archiverEnabled;
}

public void setArchiverEnabled(final boolean archiverEnabled) {
this.archiverEnabled = archiverEnabled;
}

public @Nullable Set<String> getListenerNames() {
return listenerNames;
}
Expand All @@ -88,6 +101,8 @@ public boolean isNextExtensionInsteadOfFail() {
return "ExtensionConfig{" +
"reloadInterval=" +
reloadInterval +
"archiverEnabled=" +
archiverEnabled +
", listenerNames=" +
listenerNames +
", passwordType=" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.hivemq.extensions.rbac.file.configuration;

import com.hivemq.extension.sdk.api.annotations.NotNull;
import com.hivemq.extensions.rbac.file.configuration.entities.ExtensionConfig;
import com.hivemq.extensions.rbac.file.configuration.entities.FileAuthConfig;
import com.hivemq.extensions.rbac.file.configuration.entities.Permission;
import com.hivemq.extensions.rbac.file.configuration.entities.Role;
Expand All @@ -39,7 +40,7 @@ class ConfigArchiverTest {
@BeforeEach
void setUp(@TempDir final @NotNull File extensionFolder) {
this.extensionFolder = extensionFolder;
configArchiver = new ConfigArchiver(extensionFolder, new XmlParser());
configArchiver = new ConfigArchiver(extensionFolder, new XmlParser(),new ExtensionConfig());
}

@Test
Expand All @@ -63,4 +64,19 @@ void test_archive() throws Exception {
assertTrue(archivedFiles[0].getName().startsWith("20"));
assertTrue(archivedFiles[0].getName().endsWith("credentials.xml"));
}
@Test
void test_archiver_disabled() throws Exception {
final FileAuthConfig config = new FileAuthConfig();
config.setRoles(List.of(new Role("id1", List.of(new Permission("topic1")))));

ExtensionConfig extensionConfig= new ExtensionConfig();
extensionConfig.setArchiverEnabled(false);
configArchiver = new ConfigArchiver(extensionFolder, new XmlParser(),extensionConfig);
configArchiver.archive(config);

final File[] files = extensionFolder.listFiles();
assertNotNull(files);

assertEquals(0, files.length);
}
}
3 changes: 2 additions & 1 deletion src/test/resources/test-extension-config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@

<!-- Reload interval for credentials -->
<credentials-reload-interval>120</credentials-reload-interval>

<!-- Avoid save old config to archive folder -->
<archiver-enabled>false</archiver-enabled>
<!-- If the credentials file is using HASHED or PLAIN passwords -->
<password-type>HASHED</password-type>

Expand Down