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