Skip to content

Commit

Permalink
fix: Core fails to list file metadata of the root folder #662 (#663)
Browse files Browse the repository at this point in the history
Co-authored-by: Sergey Zinchenko <sergey.zinchenko.rnd@gmail.com>
  • Loading branch information
astsiapanay and sergey-zinchenko authored Jan 31, 2025
1 parent 0b32f62 commit 8ac797d
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ public static Map<ResourceDescriptor, Set<ResourceAccessType>> getAppResourceAcc
public static Map<ResourceDescriptor, Set<ResourceAccessType>> getAppResourceAccess(
Set<ResourceDescriptor> resources, ProxyContext context, String deployment) {

String appPath = BucketBuilder.APPDATA_PATTERN.formatted(UrlUtil.encodePath(deployment));
Map<ResourceDescriptor, Set<ResourceAccessType>> result = new HashMap<>();
String location = BucketBuilder.buildAppDataBucket(context);
for (ResourceDescriptor resource : resources) {
Expand All @@ -216,11 +217,16 @@ public static Map<ResourceDescriptor, Set<ResourceAccessType>> getAppResourceAcc
}

String parentPath = resource.getParentPath();
String filePath = (parentPath == null)
? resource.getName()
: parentPath + ResourceDescriptor.PATH_SEPARATOR + resource.getName();
String filePath;
if (resource.isFolder()) {
filePath = parentPath;
} else {
filePath = parentPath == null
? resource.getName()
: parentPath + ResourceDescriptor.PATH_SEPARATOR + resource.getName();
}

if (filePath.startsWith(BucketBuilder.APPDATA_PATTERN.formatted(UrlUtil.encodePath(deployment)))) {
if (filePath != null && filePath.startsWith(appPath)) {
result.put(resource, ResourceAccessType.ALL);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,10 @@ static String buildTargetFolderForCustomAppFiles(String targetUrl, EncryptionSer
throw new IllegalArgumentException("target url must be an application type");
}
String appName = descriptor.getName();
List<String> folders = descriptor.getParentFolders();
if (folders.isEmpty()) {
String appPath = descriptor.getParentPath();
if (appPath == null) {
return "." + appName + ResourceDescriptor.PATH_SEPARATOR;
} else {
String appPath = String.join(ResourceDescriptor.PATH_SEPARATOR, folders);
return appPath + ResourceDescriptor.PATH_SEPARATOR + "." + appName + ResourceDescriptor.PATH_SEPARATOR;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.epam.aidial.core.server.service;

import com.epam.aidial.core.server.ProxyContext;
import com.epam.aidial.core.server.data.ApiKeyData;
import com.epam.aidial.core.server.data.ResourceTypes;
import com.epam.aidial.core.server.security.AccessService;
import com.epam.aidial.core.storage.data.ResourceAccessType;
import com.epam.aidial.core.storage.resource.ResourceDescriptor;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Map;
import java.util.Set;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class AccessServiceTest {

@Test
public void testGetAppResourceAccess_RootFolder() {
ProxyContext context = mock(ProxyContext.class);
ApiKeyData apiKeyData = new ApiKeyData();
apiKeyData.setPerRequestKey("key");
when(context.getApiKeyData()).thenReturn(apiKeyData);
when(context.getUserSub()).thenReturn("user");
when(context.getSourceDeployment()).thenReturn("source");
ResourceDescriptor descriptor = new ResourceDescriptor(ResourceTypes.FILE, null, List.of(), "bucket", "Users/user/", true);

Map<ResourceDescriptor, Set<ResourceAccessType>> result = AccessService.getAppResourceAccess(Set.of(descriptor), context);

assertTrue(result.isEmpty());
}

@Test
public void testGetAppResourceAccess_Folder() {
ProxyContext context = mock(ProxyContext.class);
ApiKeyData apiKeyData = new ApiKeyData();
apiKeyData.setPerRequestKey("key");
when(context.getApiKeyData()).thenReturn(apiKeyData);
when(context.getUserSub()).thenReturn("user");
when(context.getSourceDeployment()).thenReturn("source");
ResourceDescriptor descriptor = new ResourceDescriptor(ResourceTypes.FILE, null, List.of("folder"), "bucket", "Users/user/", true);

Map<ResourceDescriptor, Set<ResourceAccessType>> result = AccessService.getAppResourceAccess(Set.of(descriptor), context);

assertTrue(result.isEmpty());
}

@Test
public void testGetAppResourceAccess_File() {
ProxyContext context = mock(ProxyContext.class);
ApiKeyData apiKeyData = new ApiKeyData();
apiKeyData.setPerRequestKey("key");
when(context.getApiKeyData()).thenReturn(apiKeyData);
when(context.getUserSub()).thenReturn("user");
when(context.getSourceDeployment()).thenReturn("source");
ResourceDescriptor descriptor = new ResourceDescriptor(ResourceTypes.FILE, "file.json", List.of(), "bucket", "Users/user/", false);

Map<ResourceDescriptor, Set<ResourceAccessType>> result = AccessService.getAppResourceAccess(Set.of(descriptor), context);

assertTrue(result.isEmpty());
}

@Test
public void testGetAppResourceAccess_AppDataFile() {
ProxyContext context = mock(ProxyContext.class);
ApiKeyData apiKeyData = new ApiKeyData();
apiKeyData.setPerRequestKey("key");
when(context.getApiKeyData()).thenReturn(apiKeyData);
when(context.getUserSub()).thenReturn("user");
when(context.getSourceDeployment()).thenReturn("app");
ResourceDescriptor descriptor = new ResourceDescriptor(ResourceTypes.FILE, "file.json", List.of("appdata", "app"), "bucket", "Users/user/", false);

Map<ResourceDescriptor, Set<ResourceAccessType>> result = AccessService.getAppResourceAccess(Set.of(descriptor), context);

assertTrue(result.containsKey(descriptor));
assertEquals(ResourceAccessType.ALL, result.get(descriptor));
}
}

0 comments on commit 8ac797d

Please sign in to comment.