Applies the same naming restrictions to repositories as to snapshots except that leading underscores and uppercase characters are permitted. (#41585)
Fixes #40817.
This commit is contained in:
parent
fc4f401214
commit
b23709b178
|
@ -35,6 +35,7 @@ import org.elasticsearch.cluster.metadata.RepositoriesMetaData;
|
|||
import org.elasticsearch.cluster.metadata.RepositoryMetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.service.ClusterService;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.regex.Regex;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.util.concurrent.ConcurrentCollections;
|
||||
|
@ -94,6 +95,7 @@ public class RepositoriesService implements ClusterStateApplier {
|
|||
*/
|
||||
public void registerRepository(final PutRepositoryRequest request, final ActionListener<ClusterStateUpdateResponse> listener) {
|
||||
final RepositoryMetaData newRepositoryMetaData = new RepositoryMetaData(request.name(), request.type(), request.settings());
|
||||
validate(request.name());
|
||||
|
||||
final ActionListener<ClusterStateUpdateResponse> registrationListener;
|
||||
if (request.verify()) {
|
||||
|
@ -418,6 +420,20 @@ public class RepositoriesService implements ClusterStateApplier {
|
|||
}
|
||||
}
|
||||
|
||||
private static void validate(final String repositoryName) {
|
||||
if (Strings.hasLength(repositoryName) == false) {
|
||||
throw new RepositoryException(repositoryName, "cannot be empty");
|
||||
}
|
||||
if (repositoryName.contains("#")) {
|
||||
throw new RepositoryException(repositoryName, "must not contain '#'");
|
||||
}
|
||||
if (Strings.validFileName(repositoryName) == false) {
|
||||
throw new RepositoryException(repositoryName,
|
||||
"must not contain the following characters " + Strings.INVALID_FILENAME_CHARS);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void ensureRepositoryNotInUse(ClusterState clusterState, String repository) {
|
||||
if (SnapshotsService.isRepositoryInUse(clusterState, repository) || RestoreService.isRepositoryInUse(clusterState, repository)) {
|
||||
throw new IllegalStateException("trying to modify or unregister repository that is currently used ");
|
||||
|
|
|
@ -22,11 +22,13 @@ package org.elasticsearch.repositories;
|
|||
import org.apache.lucene.index.IndexCommit;
|
||||
import org.elasticsearch.Version;
|
||||
import org.elasticsearch.action.ActionListener;
|
||||
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
|
||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.metadata.MetaData;
|
||||
import org.elasticsearch.cluster.metadata.RepositoryMetaData;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||
import org.elasticsearch.cluster.service.ClusterService;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.UUIDs;
|
||||
import org.elasticsearch.common.component.Lifecycle;
|
||||
import org.elasticsearch.common.component.LifecycleListener;
|
||||
|
@ -100,6 +102,19 @@ public class RepositoriesServiceTests extends ESTestCase {
|
|||
assertSame(repository, repository2);
|
||||
}
|
||||
|
||||
public void testRegisterRejectsInvalidRepositoryNames() {
|
||||
assertThrowsOnRegister("");
|
||||
assertThrowsOnRegister("contains#InvalidCharacter");
|
||||
for (char c : Strings.INVALID_FILENAME_CHARS) {
|
||||
assertThrowsOnRegister("contains" + c + "InvalidCharacters");
|
||||
}
|
||||
}
|
||||
|
||||
private void assertThrowsOnRegister(String repoName) {
|
||||
PutRepositoryRequest request = new PutRepositoryRequest(repoName);
|
||||
expectThrows(RepositoryException.class, () -> repositoriesService.registerRepository(request, null));
|
||||
}
|
||||
|
||||
private static class TestRepository implements Repository {
|
||||
|
||||
private static final String TYPE = "internal";
|
||||
|
|
Loading…
Reference in New Issue