public void FollowSymlink_DeadLoop_1() { #if DNXCORE50 if (!CrossPlatformHelpers.IsLinux) { return; } DMLibDataInfo sourceDataInfo = new DMLibDataInfo("rootfolder"); DirNode targetFolder = new DirNode($"{UnicodeFileName}{FolderSuffix}"); targetFolder.AddFileNode(new FileNode($"{UnicodeFileName}{FileSuffix}") { SizeInByte = 1024 }); targetFolder.AddDirNode(DirNode.SymlinkedDir($"{UnicodeFileName}{SymlinkSuffix}", Path.Combine("..", $"{UnicodeFileName}{FolderSuffix}"), targetFolder)); sourceDataInfo.RootNode.AddDirNode(targetFolder); var options = new TestExecutionOptions <DMLibDataInfo>() { IsDirectoryTransfer = true, TransferItemModifier = (notUsed, item) => { dynamic transferOptions = DefaultTransferDirectoryOptions; transferOptions.Recursive = true; (transferOptions as UploadDirectoryOptions).FollowSymlink = true; item.Options = transferOptions; } }; var result = this.ExecuteTestCase(sourceDataInfo, options); Test.Assert(result.Exceptions.Count == 1 && result.Exceptions[0] is TransferException && result.Exceptions[0].Message.Contains("Potential dead loop in directory structure due to symbolic link"), "Verify expected exception is thrown."); #endif }
private void BuildDirNode(CloudBlobDirectory cloudDir, DirNode dirNode) { foreach (IListBlobItem item in cloudDir.ListBlobs(false, BlobListingDetails.Metadata, HelperConst.DefaultBlobOptions)) { CloudBlob cloudBlob = item as CloudBlob; CloudBlobDirectory subCloudDir = item as CloudBlobDirectory; if (cloudBlob != null) { if (CloudBlobHelper.MapStorageBlobTypeToBlobType(cloudBlob.BlobType) == this.BlobType) { FileNode fileNode = new FileNode(cloudBlob.GetShortName()); this.BuildFileNode(cloudBlob, fileNode); dirNode.AddFileNode(fileNode); } } else if (subCloudDir != null) { var subDirName = subCloudDir.GetShortName(); DirNode subDirNode = dirNode.GetDirNode(subDirName); // A blob directory could be listed more than once if it's across table servers. if (subDirNode == null) { subDirNode = new DirNode(subDirName); this.BuildDirNode(subCloudDir, subDirNode); dirNode.AddDirNode(subDirNode); } } } }
public static void AddTree(DirNode dirNode, string dirPrefix, string filePrefix, int width, int depth, int fileSizeInKB, FileAttributes?fa = null, DateTime?lmt = null) { for (int i = 0; i < width; ++i) { string fileName = i == 0 ? filePrefix : filePrefix + "_" + i; FileNode fileNode = new FileNode(fileName) { SizeInByte = 1024L * fileSizeInKB, FileAttr = fa, LastModifiedTime = lmt, }; dirNode.AddFileNode(fileNode); } if (depth > 0) { for (int i = 0; i < width; ++i) { string dirName = i == 0 ? dirPrefix : dirPrefix + "_" + i; DirNode subDirNode = dirNode.GetDirNode(dirName); if (subDirNode == null) { subDirNode = new DirNode(dirName); dirNode.AddDirNode(subDirNode); } DMLibDataHelper.AddTree(subDirNode, dirPrefix, filePrefix, width, depth - 1, fileSizeInKB, fa, lmt: lmt); } } }
private void BuildDirNode(CloudFileDirectory cloudDir, DirNode dirNode) { cloudDir.FetchAttributes(options: HelperConst.DefaultFileOptions); dirNode.LastWriteTime = cloudDir.Properties.LastWriteTime; dirNode.CreationTime = cloudDir.Properties.CreationTime; dirNode.SMBAttributes = cloudDir.Properties.NtfsAttributes; if (cloudDir.Metadata.Count > 0) { dirNode.Metadata = new Dictionary <string, string>(cloudDir.Metadata); } foreach (IListFileItem item in cloudDir.ListFilesAndDirectories(HelperConst.DefaultFileOptions)) { CloudFile cloudFile = item as CloudFile; CloudFileDirectory subCloudDir = item as CloudFileDirectory; if (cloudFile != null) { // Cannot fetch attributes while listing, so do it for each cloud file. cloudFile.FetchAttributes(options: HelperConst.DefaultFileOptions); FileNode fileNode = new FileNode(cloudFile.Name); this.BuildFileNode(cloudFile, fileNode); dirNode.AddFileNode(fileNode); } else if (subCloudDir != null) { DirNode subDirNode = new DirNode(subCloudDir.Name); this.BuildDirNode(subCloudDir, subDirNode); dirNode.AddDirNode(subDirNode); } } }
private void BuildDirNode(string dirPath, DirNode parent, bool handleSMBAttributes) { dirPath = AppendDirectorySeparator(dirPath); DateTimeOffset?creationTime = null; DateTimeOffset?lastWriteTime = null; FileAttributes?fileAttributes = null; #if DOTNET5_4 LongPathFileExtension.GetFileProperties(dirPath, out creationTime, out lastWriteTime, out fileAttributes, true); #else LongPathFileExtension.GetFileProperties(dirPath, out creationTime, out lastWriteTime, out fileAttributes); #endif parent.CreationTime = creationTime; parent.LastWriteTime = lastWriteTime; foreach (var fileInfo in LongPathDirectoryExtension.GetFiles(dirPath)) { FileNode fileNode = new FileNode(fileInfo.Remove(0, dirPath.Length)); this.BuildFileNode(fileInfo, fileNode, handleSMBAttributes); parent.AddFileNode(fileNode); } foreach (var subDirInfo in LongPathDirectoryExtension.GetDirectories(dirPath)) { DirNode subDirNode = new DirNode(subDirInfo.Remove(0, dirPath.Length)); this.BuildDirNode(subDirInfo, subDirNode, handleSMBAttributes); parent.AddDirNode(subDirNode); } }
private void BuildDirNode(DirectoryInfo dirInfo, DirNode parent, bool handleSMBAttributes = false) { if (handleSMBAttributes) { DateTimeOffset?creationTime = null; DateTimeOffset?lastWriteTime = null; FileAttributes?fileAttributes = null; #if DOTNET5_4 LongPathFileExtension.GetFileProperties(dirInfo.FullName, out creationTime, out lastWriteTime, out fileAttributes, true); #else LongPathFileExtension.GetFileProperties(dirInfo.FullName, out creationTime, out lastWriteTime, out fileAttributes); #endif parent.CreationTime = creationTime; parent.LastWriteTime = lastWriteTime; } foreach (FileInfo fileInfo in dirInfo.GetFiles()) { FileNode fileNode = new FileNode(fileInfo.Name); this.BuildFileNode(fileInfo, fileNode, handleSMBAttributes); parent.AddFileNode(fileNode); } foreach (DirectoryInfo subDirInfo in dirInfo.GetDirectories()) { DirNode subDirNode = new DirNode(subDirInfo.Name); this.BuildDirNode(subDirInfo, subDirNode, handleSMBAttributes); parent.AddDirNode(subDirNode); } }
public static void AddTree( DirNode dirNode, string dirPrefix, string filePrefix, int width, int depth, int fileSizeInKB, FileAttributes?fa = null, DateTime?lmt = null, string cacheControl = null, string contentDisposition = null, string contentEncoding = null, string contentLanguage = null, string contentType = null, string md5 = null, IDictionary <string, string> metadata = null) { for (int i = 0; i < width; ++i) { string fileName = i == 0 ? filePrefix : filePrefix + "_" + i; FileNode fileNode = new FileNode(fileName) { SizeInByte = 1024L * fileSizeInKB, FileAttr = fa, LastModifiedTime = lmt, CacheControl = cacheControl, ContentDisposition = contentDisposition, ContentEncoding = contentEncoding, ContentLanguage = contentLanguage, ContentType = contentType, MD5 = md5, Metadata = metadata }; dirNode.AddFileNode(fileNode); } if (depth > 0) { for (int i = 0; i < width; ++i) { string dirName = i == 0 ? dirPrefix : dirPrefix + "_" + i; DirNode subDirNode = dirNode.GetDirNode(dirName); if (subDirNode == null) { subDirNode = new DirNode(dirName); dirNode.AddDirNode(subDirNode); } DMLibDataHelper.AddTree(subDirNode, dirPrefix, filePrefix, width, depth - 1, fileSizeInKB, fa, lmt: lmt); } } }
public void FollowSymlink_DeadLoop_2() { #if DNXCORE50 if (!CrossPlatformHelpers.IsLinux) { return; } DMLibDataInfo sourceDataInfo = new DMLibDataInfo("rootfolder"); DMLibDataInfo targetDataInfo = new DMLibDataInfo("targetC"); DirNode dirNodeC = new DirNode("folder_C"); DirNode dirNodeB = new DirNode("folder_B"); dirNodeB.AddFileNode(new FileNode("File_B") { SizeInByte = 1024 }); dirNodeC.AddDirNode(dirNodeB); dirNodeB.AddDirNode(DirNode.SymlinkedDir("symlinkToC", "../../folder_C", dirNodeC)); targetDataInfo.RootNode.AddDirNode(dirNodeC); SourceAdaptor.CreateIfNotExists(); SourceAdaptor.GenerateData(targetDataInfo); sourceDataInfo.RootNode.AddDirNode(DirNode.SymlinkedDir("symlinkToB", "../targetC/folder_C/folder_B", dirNodeB)); var options = new TestExecutionOptions <DMLibDataInfo>() { IsDirectoryTransfer = true, TransferItemModifier = (notUsed, item) => { dynamic transferOptions = DefaultTransferDirectoryOptions; transferOptions.Recursive = true; (transferOptions as UploadDirectoryOptions).FollowSymlink = true; item.Options = transferOptions; }, DisableSourceCleaner = true, }; // This case may takes very long time. options.TimeoutInMs = 60 * 60 * 1000; var result = this.ExecuteTestCase(sourceDataInfo, options); foreach (var exception in result.Exceptions) { Test.Info(exception.Message); } Test.Assert(result.Exceptions.Count == 1 && result.Exceptions[0] is TransferException && result.Exceptions[0].InnerException.Message.Contains("Too many levels of symbolic links"), "Verify expected exception is thrown."); #endif }
private void BuildDeepSymlinkDir(DirNode rootDir, DirNode parent, int level) { DirNode subDir = new DirNode($"{UnicodeFileName}{FolderSuffix}_{level}"); if (--level > 0) { BuildDeepSymlinkDir(rootDir, subDir, level); } subDir.AddFileNode(new FileNode($"{UnicodeFileName}{FileSuffix}") { SizeInByte = 1024 }); rootDir.AddDirNode(subDir); parent.AddDirNode(DirNode.SymlinkedDir($"{UnicodeFileName}{SymlinkSuffix}_{level}", Path.Combine(Object.ReferenceEquals(rootDir, parent) ? "" : "..", subDir.Name), subDir)); }
private void BuildDirNode(DirectoryInfo dirInfo, DirNode parent) { foreach (FileInfo fileInfo in dirInfo.GetFiles()) { FileNode fileNode = new FileNode(fileInfo.Name); this.BuildFileNode(fileInfo, fileNode); parent.AddFileNode(fileNode); } foreach (DirectoryInfo subDirInfo in dirInfo.GetDirectories()) { DirNode subDirNode = new DirNode(subDirInfo.Name); this.BuildDirNode(subDirInfo, subDirNode); parent.AddDirNode(subDirNode); } }
private void BuildDirNode(string dirPath, DirNode parent) { dirPath = AppendDirectorySeparator(dirPath); foreach (var fileInfo in LongPathDirectoryExtension.GetFiles(dirPath)) { FileNode fileNode = new FileNode(fileInfo.Remove(0, dirPath.Length)); this.BuildFileNode(fileInfo, fileNode); parent.AddFileNode(fileNode); } foreach (var subDirInfo in LongPathDirectoryExtension.GetDirectories(dirPath)) { DirNode subDirNode = new DirNode(subDirInfo.Remove(0, dirPath.Length)); this.BuildDirNode(subDirInfo, subDirNode); parent.AddDirNode(subDirNode); } }
private void BuildDirNode(CloudFileDirectory cloudDir, DirNode dirNode) { foreach (IListFileItem item in cloudDir.ListFilesAndDirectories(HelperConst.DefaultFileOptions)) { CloudFile cloudFile = item as CloudFile; CloudFileDirectory subCloudDir = item as CloudFileDirectory; if (cloudFile != null) { // Cannot fetch attributes while listing, so do it for each cloud file. cloudFile.FetchAttributes(options: HelperConst.DefaultFileOptions); FileNode fileNode = new FileNode(cloudFile.Name); this.BuildFileNode(cloudFile, fileNode); dirNode.AddFileNode(fileNode); } else if (subCloudDir != null) { DirNode subDirNode = new DirNode(subCloudDir.Name); this.BuildDirNode(subCloudDir, subDirNode); dirNode.AddDirNode(subDirNode); } } }
private static void PrepareSourceData() { DMLibDataInfo sourceFileTree = new DMLibDataInfo(string.Empty); DirNode dirNode1 = new DirNode("folder1"); DirNode subDir1 = new DirNode("subfolder1"); subDir1.AddDirNode(new DirNode("subfolder3")); subDir1.AddFileNode(GenerateFileNode("testfile2")); subDir1.AddFileNode(GenerateFileNode("4testfile")); dirNode1.AddDirNode(subDir1); DirNode subDir2 = new DirNode("subfolder2"); DirNode subDir4 = new DirNode("subfolder4"); subDir4.AddFileNode(GenerateFileNode("test5")); subDir2.AddDirNode(subDir4); subDir2.AddFileNode(GenerateFileNode("TESTFILE345")); subDir2.AddFileNode(GenerateFileNode("testfile234")); subDir2.AddFileNode(GenerateFileNode("testYfile")); subDir2.AddFileNode(GenerateFileNode("f_arbitrary.exe")); subDir2.AddFileNode(GenerateFileNode("测试x文件")); dirNode1.AddDirNode(subDir2); dirNode1.AddFileNode(GenerateFileNode("testfile1")); dirNode1.AddFileNode(GenerateFileNode("TestFile2")); dirNode1.AddFileNode(GenerateFileNode("测试文件2")); sourceFileTree.RootNode.AddDirNode(dirNode1); DirNode dirNode2 = new DirNode("folder2"); dirNode2.AddFileNode(GenerateFileNode("folder_file")); dirNode2.AddDirNode(new DirNode("testfile1")); dirNode2.AddFileNode(GenerateFileNode("测试文件三")); dirNode2.AddFileNode(GenerateFileNode("测试四文件")); sourceFileTree.RootNode.AddDirNode(dirNode2); DirNode dirNode3 = new DirNode("folder3"); sourceFileTree.RootNode.AddDirNode(dirNode3); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("testfile")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("testfile1")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("testfile2")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("testXfile")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("testXXfile")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("测试文件")); sourceFileTree.RootNode.AddFileNode(GenerateFileNode("..a123")); DMLibDataInfo blobSourceFileTree = sourceFileTree.Clone(); blobSourceFileTree.RootNode.AddFileNode(GenerateFileNode("TeSTfIle")); Test.Info("Start to generate test data, will take a while..."); foreach (DMLibDataType dataType in sourceDataTypes) { if (IsCloudBlob(dataType)) { PrepareSourceData(dataType, blobSourceFileTree.Clone()); } else { PrepareSourceData(dataType, sourceFileTree.Clone()); } } Test.Info("Done"); }