Branch name validation
This commit is contained in:
parent
84e39af7c7
commit
36743eb5af
@ -53,6 +53,7 @@ import org.thingsboard.server.common.data.sms.config.TestSmsRequest;
|
|||||||
import org.thingsboard.server.common.data.sync.vc.AutoCommitSettings;
|
import org.thingsboard.server.common.data.sync.vc.AutoCommitSettings;
|
||||||
import org.thingsboard.server.common.data.sync.vc.RepositorySettings;
|
import org.thingsboard.server.common.data.sync.vc.RepositorySettings;
|
||||||
import org.thingsboard.server.common.data.sync.vc.RepositorySettingsInfo;
|
import org.thingsboard.server.common.data.sync.vc.RepositorySettingsInfo;
|
||||||
|
import org.thingsboard.server.common.data.sync.vc.VcUtils;
|
||||||
import org.thingsboard.server.dao.settings.AdminSettingsService;
|
import org.thingsboard.server.dao.settings.AdminSettingsService;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
import org.thingsboard.server.service.security.auth.jwt.settings.JwtSettingsService;
|
import org.thingsboard.server.service.security.auth.jwt.settings.JwtSettingsService;
|
||||||
@ -307,6 +308,7 @@ public class AdminController extends BaseController {
|
|||||||
@PreAuthorize("hasAuthority('TENANT_ADMIN')")
|
@PreAuthorize("hasAuthority('TENANT_ADMIN')")
|
||||||
@PostMapping("/autoCommitSettings")
|
@PostMapping("/autoCommitSettings")
|
||||||
public AutoCommitSettings saveAutoCommitSettings(@RequestBody AutoCommitSettings settings) throws ThingsboardException {
|
public AutoCommitSettings saveAutoCommitSettings(@RequestBody AutoCommitSettings settings) throws ThingsboardException {
|
||||||
|
settings.values().forEach(config -> VcUtils.checkBranchName(config.getBranch()));
|
||||||
accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.WRITE);
|
accessControlService.checkPermission(getCurrentUser(), Resource.VERSION_CONTROL, Operation.WRITE);
|
||||||
return autoCommitSettingsService.save(getTenantId(), settings);
|
return autoCommitSettingsService.save(getTenantId(), settings);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,6 +22,7 @@ import com.google.common.util.concurrent.MoreExecutors;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.support.TransactionTemplate;
|
import org.springframework.transaction.support.TransactionTemplate;
|
||||||
@ -32,7 +33,6 @@ import org.thingsboard.common.util.ThingsBoardExecutors;
|
|||||||
import org.thingsboard.server.cache.TbTransactionalCache;
|
import org.thingsboard.server.cache.TbTransactionalCache;
|
||||||
import org.thingsboard.server.common.data.EntityType;
|
import org.thingsboard.server.common.data.EntityType;
|
||||||
import org.thingsboard.server.common.data.ExportableEntity;
|
import org.thingsboard.server.common.data.ExportableEntity;
|
||||||
import org.thingsboard.server.common.data.StringUtils;
|
|
||||||
import org.thingsboard.server.common.data.User;
|
import org.thingsboard.server.common.data.User;
|
||||||
import org.thingsboard.server.common.data.audit.ActionType;
|
import org.thingsboard.server.common.data.audit.ActionType;
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
|
import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
|
||||||
@ -101,6 +101,7 @@ import java.util.function.Function;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static com.google.common.util.concurrent.Futures.transform;
|
import static com.google.common.util.concurrent.Futures.transform;
|
||||||
|
import static org.thingsboard.server.common.data.sync.vc.VcUtils.checkBranchName;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
@ -138,6 +139,7 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
|
|||||||
@SuppressWarnings("UnstableApiUsage")
|
@SuppressWarnings("UnstableApiUsage")
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<UUID> saveEntitiesVersion(User user, VersionCreateRequest request) throws Exception {
|
public ListenableFuture<UUID> saveEntitiesVersion(User user, VersionCreateRequest request) throws Exception {
|
||||||
|
checkBranchName(request.getBranch());
|
||||||
var pendingCommit = gitServiceQueue.prepareCommit(user, request);
|
var pendingCommit = gitServiceQueue.prepareCommit(user, request);
|
||||||
DonAsynchron.withCallback(pendingCommit, commit -> {
|
DonAsynchron.withCallback(pendingCommit, commit -> {
|
||||||
cachePut(commit.getTxId(), new VersionCreationResult());
|
cachePut(commit.getTxId(), new VersionCreationResult());
|
||||||
@ -504,6 +506,7 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<RepositorySettings> saveVersionControlSettings(TenantId tenantId, RepositorySettings versionControlSettings) {
|
public ListenableFuture<RepositorySettings> saveVersionControlSettings(TenantId tenantId, RepositorySettings versionControlSettings) {
|
||||||
|
checkBranchName(versionControlSettings.getDefaultBranch());
|
||||||
var restoredSettings = this.repositorySettingsService.restore(tenantId, versionControlSettings);
|
var restoredSettings = this.repositorySettingsService.restore(tenantId, versionControlSettings);
|
||||||
try {
|
try {
|
||||||
var future = gitServiceQueue.initRepository(tenantId, restoredSettings);
|
var future = gitServiceQueue.initRepository(tenantId, restoredSettings);
|
||||||
@ -525,6 +528,7 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<Void> checkVersionControlAccess(TenantId tenantId, RepositorySettings settings) throws ThingsboardException {
|
public ListenableFuture<Void> checkVersionControlAccess(TenantId tenantId, RepositorySettings settings) throws ThingsboardException {
|
||||||
|
checkBranchName(settings.getDefaultBranch());
|
||||||
settings = this.repositorySettingsService.restore(tenantId, settings);
|
settings = this.repositorySettingsService.restore(tenantId, settings);
|
||||||
try {
|
try {
|
||||||
return gitServiceQueue.testRepository(tenantId, settings);
|
return gitServiceQueue.testRepository(tenantId, settings);
|
||||||
|
|||||||
@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2023 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.thingsboard.server.common.data.sync.vc;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
public class VcUtils {
|
||||||
|
|
||||||
|
private VcUtils() {}
|
||||||
|
|
||||||
|
public static void checkBranchName(String branch) {
|
||||||
|
if (StringUtils.isEmpty(branch)) return;
|
||||||
|
|
||||||
|
boolean invalid = StringUtils.containsWhitespace(branch) ||
|
||||||
|
StringUtils.containsAny(branch, "..", "~", "^", ":", "\\") ||
|
||||||
|
StringUtils.endsWithAny(branch, "/", ".lock");
|
||||||
|
if (invalid) {
|
||||||
|
throw new IllegalArgumentException("Branch name is invalid");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user