From 36353c9d0858e41a8fbc3d89266abb4067677c52 Mon Sep 17 00:00:00 2001 From: Tal Aloni Date: Fri, 10 Feb 2017 19:53:54 +0200 Subject: [PATCH] Moved helper methods to NTFileStoreHelper, Moved IOExceptionHelper --- .../Adapter}/IOExceptionHelper.cs | 2 +- SMBLibrary/NTFileStore/NTFileStoreHelper.cs | 102 ++++++++++++++++++ SMBLibrary/SMBLibrary.csproj | 3 +- .../Server/Helpers/NTFileSystemHelper.cs | 90 +--------------- SMBLibrary/Server/SMB1/NTCreateHelper.cs | 4 +- SMBLibrary/Server/SMB2/CreateHelper.cs | 4 +- 6 files changed, 111 insertions(+), 94 deletions(-) rename SMBLibrary/{Server/Helpers => NTFileStore/Adapter}/IOExceptionHelper.cs (94%) create mode 100644 SMBLibrary/NTFileStore/NTFileStoreHelper.cs diff --git a/SMBLibrary/Server/Helpers/IOExceptionHelper.cs b/SMBLibrary/NTFileStore/Adapter/IOExceptionHelper.cs similarity index 94% rename from SMBLibrary/Server/Helpers/IOExceptionHelper.cs rename to SMBLibrary/NTFileStore/Adapter/IOExceptionHelper.cs index a925144..f4bd588 100644 --- a/SMBLibrary/Server/Helpers/IOExceptionHelper.cs +++ b/SMBLibrary/NTFileStore/Adapter/IOExceptionHelper.cs @@ -11,7 +11,7 @@ using System.Reflection; using System.Text; using Utilities; -namespace SMBLibrary.Server +namespace SMBLibrary { public class IOExceptionHelper { diff --git a/SMBLibrary/NTFileStore/NTFileStoreHelper.cs b/SMBLibrary/NTFileStore/NTFileStoreHelper.cs new file mode 100644 index 0000000..d9e67e8 --- /dev/null +++ b/SMBLibrary/NTFileStore/NTFileStoreHelper.cs @@ -0,0 +1,102 @@ +/* Copyright (C) 2014-2017 Tal Aloni . All rights reserved. + * + * You can redistribute this program and/or modify it under the terms of + * the GNU Lesser Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + */ +using System; +using System.Collections.Generic; +using System.IO; +using Utilities; + +namespace SMBLibrary +{ + public partial class NTFileStoreHelper + { + public static FileAccess ToCreateFileAccess(AccessMask desiredAccess, CreateDisposition createDisposition) + { + FileAccess result = 0; + + if ((desiredAccess.File & FileAccessMask.FILE_READ_DATA) > 0 || + (desiredAccess.File & FileAccessMask.FILE_READ_EA) > 0 || + (desiredAccess.File & FileAccessMask.FILE_READ_ATTRIBUTES) > 0 || + (desiredAccess.File & FileAccessMask.MAXIMUM_ALLOWED) > 0 || + (desiredAccess.File & FileAccessMask.GENERIC_ALL) > 0 || + (desiredAccess.File & FileAccessMask.GENERIC_READ) > 0) + { + result |= FileAccess.Read; + } + + if ((desiredAccess.File & FileAccessMask.FILE_WRITE_DATA) > 0 || + (desiredAccess.File & FileAccessMask.FILE_APPEND_DATA) > 0 || + (desiredAccess.File & FileAccessMask.FILE_WRITE_EA) > 0 || + (desiredAccess.File & FileAccessMask.FILE_WRITE_ATTRIBUTES) > 0 || + (desiredAccess.File & FileAccessMask.DELETE) > 0 || + (desiredAccess.File & FileAccessMask.WRITE_DAC) > 0 || + (desiredAccess.File & FileAccessMask.WRITE_OWNER) > 0 || + (desiredAccess.File & FileAccessMask.MAXIMUM_ALLOWED) > 0 || + (desiredAccess.File & FileAccessMask.GENERIC_ALL) > 0 || + (desiredAccess.File & FileAccessMask.GENERIC_WRITE) > 0) + { + result |= FileAccess.Write; + } + + if ((desiredAccess.Directory & DirectoryAccessMask.FILE_DELETE_CHILD) > 0) + { + result |= FileAccess.Write; + } + + if (createDisposition == CreateDisposition.FILE_CREATE || + createDisposition == CreateDisposition.FILE_SUPERSEDE) + { + result |= FileAccess.Write; + } + + return result; + } + + public static FileAccess ToFileAccess(FileAccessMask desiredAccess) + { + FileAccess result = 0; + if ((desiredAccess & FileAccessMask.FILE_READ_DATA) > 0 || + (desiredAccess & FileAccessMask.MAXIMUM_ALLOWED) > 0 || + (desiredAccess & FileAccessMask.GENERIC_ALL) > 0 || + (desiredAccess & FileAccessMask.GENERIC_READ) > 0) + { + result |= FileAccess.Read; + } + + if ((desiredAccess & FileAccessMask.FILE_WRITE_DATA) > 0 || + (desiredAccess & FileAccessMask.FILE_APPEND_DATA) > 0 || + (desiredAccess & FileAccessMask.MAXIMUM_ALLOWED) > 0 || + (desiredAccess & FileAccessMask.GENERIC_ALL) > 0 || + (desiredAccess & FileAccessMask.GENERIC_WRITE) > 0) + { + result |= FileAccess.Write; + } + + return result; + } + + public static FileShare ToFileShare(ShareAccess shareAccess) + { + FileShare result = FileShare.None; + if ((shareAccess & ShareAccess.FILE_SHARE_READ) > 0) + { + result |= FileShare.Read; + } + + if ((shareAccess & ShareAccess.FILE_SHARE_WRITE) > 0) + { + result |= FileShare.Write; + } + + if ((shareAccess & ShareAccess.FILE_SHARE_DELETE) > 0) + { + result |= FileShare.Delete; + } + + return result; + } + } +} diff --git a/SMBLibrary/SMBLibrary.csproj b/SMBLibrary/SMBLibrary.csproj index 7289e53..95fc7f3 100644 --- a/SMBLibrary/SMBLibrary.csproj +++ b/SMBLibrary/SMBLibrary.csproj @@ -77,6 +77,7 @@ + @@ -89,6 +90,7 @@ + @@ -171,7 +173,6 @@ - diff --git a/SMBLibrary/Server/Helpers/NTFileSystemHelper.cs b/SMBLibrary/Server/Helpers/NTFileSystemHelper.cs index 615c0c3..7995d75 100644 --- a/SMBLibrary/Server/Helpers/NTFileSystemHelper.cs +++ b/SMBLibrary/Server/Helpers/NTFileSystemHelper.cs @@ -22,7 +22,7 @@ namespace SMBLibrary.Server public static NTStatus CreateFile(out FileSystemEntry entry, IFileSystem fileSystem, string path, AccessMask desiredAccess, CreateDisposition createDisposition, CreateOptions createOptions, ConnectionState state) { - FileAccess createAccess = ToCreateFileAccess(desiredAccess, createDisposition); + FileAccess createAccess = NTFileStoreHelper.ToCreateFileAccess(desiredAccess, createDisposition); bool requestedWriteAccess = (createAccess & FileAccess.Write) > 0; bool forceDirectory = (createOptions & CreateOptions.FILE_DIRECTORY_FILE) > 0; @@ -216,7 +216,7 @@ namespace SMBLibrary.Server public static NTStatus OpenFile(out Stream stream, IFileSystem fileSystem, string path, FileAccess fileAccess, ShareAccess shareAccess, bool buffered, ConnectionState state) { stream = null; - FileShare fileShare = NTFileSystemHelper.ToFileShare(shareAccess); + FileShare fileShare = NTFileStoreHelper.ToFileShare(shareAccess); state.LogToServer(Severity.Verbose, "OpenFile: Opening '{0}', Access={1}, Share={2}, Buffered={3}", path, fileAccess, fileShare, buffered); try { @@ -364,92 +364,6 @@ namespace SMBLibrary.Server } } - public static FileAccess ToCreateFileAccess(AccessMask desiredAccess, CreateDisposition createDisposition) - { - FileAccess result = 0; - - if ((desiredAccess.File & FileAccessMask.FILE_READ_DATA) > 0 || - (desiredAccess.File & FileAccessMask.FILE_READ_EA) > 0 || - (desiredAccess.File & FileAccessMask.FILE_READ_ATTRIBUTES) > 0 || - (desiredAccess.File & FileAccessMask.MAXIMUM_ALLOWED) > 0 || - (desiredAccess.File & FileAccessMask.GENERIC_ALL) > 0 || - (desiredAccess.File & FileAccessMask.GENERIC_READ) > 0) - { - result |= FileAccess.Read; - } - - if ((desiredAccess.File & FileAccessMask.FILE_WRITE_DATA) > 0 || - (desiredAccess.File & FileAccessMask.FILE_APPEND_DATA) > 0 || - (desiredAccess.File & FileAccessMask.FILE_WRITE_EA) > 0 || - (desiredAccess.File & FileAccessMask.FILE_WRITE_ATTRIBUTES) > 0 || - (desiredAccess.File & FileAccessMask.DELETE) > 0 || - (desiredAccess.File & FileAccessMask.WRITE_DAC) > 0 || - (desiredAccess.File & FileAccessMask.WRITE_OWNER) > 0 || - (desiredAccess.File & FileAccessMask.MAXIMUM_ALLOWED) > 0 || - (desiredAccess.File & FileAccessMask.GENERIC_ALL) > 0 || - (desiredAccess.File & FileAccessMask.GENERIC_WRITE) > 0) - { - result |= FileAccess.Write; - } - - if ((desiredAccess.Directory & DirectoryAccessMask.FILE_DELETE_CHILD) > 0) - { - result |= FileAccess.Write; - } - - if (createDisposition == CreateDisposition.FILE_CREATE || - createDisposition == CreateDisposition.FILE_SUPERSEDE) - { - result |= FileAccess.Write; - } - - return result; - } - - public static FileAccess ToFileAccess(FileAccessMask desiredAccess) - { - FileAccess result = 0; - if ((desiredAccess & FileAccessMask.FILE_READ_DATA) > 0 || - (desiredAccess & FileAccessMask.MAXIMUM_ALLOWED) > 0 || - (desiredAccess & FileAccessMask.GENERIC_ALL) > 0 || - (desiredAccess & FileAccessMask.GENERIC_READ) > 0) - { - result |= FileAccess.Read; - } - - if ((desiredAccess & FileAccessMask.FILE_WRITE_DATA) > 0 || - (desiredAccess & FileAccessMask.FILE_APPEND_DATA) > 0 || - (desiredAccess & FileAccessMask.MAXIMUM_ALLOWED) > 0 || - (desiredAccess & FileAccessMask.GENERIC_ALL) > 0 || - (desiredAccess & FileAccessMask.GENERIC_WRITE) > 0) - { - result |= FileAccess.Write; - } - - return result; - } - - public static FileShare ToFileShare(ShareAccess shareAccess) - { - FileShare result = FileShare.None; - if ((shareAccess & ShareAccess.FILE_SHARE_READ) > 0) - { - result |= FileShare.Read; - } - - if ((shareAccess & ShareAccess.FILE_SHARE_WRITE) > 0) - { - result |= FileShare.Write; - } - - if ((shareAccess & ShareAccess.FILE_SHARE_DELETE) > 0) - { - result |= FileShare.Delete; - } - - return result; - } - /// /// Will return a virtual allocation size, assuming 4096 bytes per cluster /// diff --git a/SMBLibrary/Server/SMB1/NTCreateHelper.cs b/SMBLibrary/Server/SMB1/NTCreateHelper.cs index ab0a94d..c9d272a 100644 --- a/SMBLibrary/Server/SMB1/NTCreateHelper.cs +++ b/SMBLibrary/Server/SMB1/NTCreateHelper.cs @@ -48,7 +48,7 @@ namespace SMBLibrary.Server.SMB1 else // FileSystemShare { FileSystemShare fileSystemShare = (FileSystemShare)share; - FileAccess createAccess = NTFileSystemHelper.ToCreateFileAccess(request.DesiredAccess, request.CreateDisposition); + FileAccess createAccess = NTFileStoreHelper.ToCreateFileAccess(request.DesiredAccess, request.CreateDisposition); if (!fileSystemShare.HasAccess(session.UserName, path, createAccess, state.ClientEndPoint)) { header.Status = NTStatus.STATUS_ACCESS_DENIED; @@ -63,7 +63,7 @@ namespace SMBLibrary.Server.SMB1 return new ErrorResponse(request.CommandName); } - FileAccess fileAccess = NTFileSystemHelper.ToFileAccess(request.DesiredAccess); + FileAccess fileAccess = NTFileStoreHelper.ToFileAccess(request.DesiredAccess); Stream stream; bool deleteOnClose = false; diff --git a/SMBLibrary/Server/SMB2/CreateHelper.cs b/SMBLibrary/Server/SMB2/CreateHelper.cs index 1d63ecc..870f9f1 100644 --- a/SMBLibrary/Server/SMB2/CreateHelper.cs +++ b/SMBLibrary/Server/SMB2/CreateHelper.cs @@ -42,7 +42,7 @@ namespace SMBLibrary.Server.SMB2 else { FileSystemShare fileSystemShare = (FileSystemShare)share; - FileAccess createAccess = NTFileSystemHelper.ToCreateFileAccess(request.DesiredAccess, request.CreateDisposition); + FileAccess createAccess = NTFileStoreHelper.ToCreateFileAccess(request.DesiredAccess, request.CreateDisposition); if (!fileSystemShare.HasAccess(session.UserName, path, createAccess, state.ClientEndPoint)) { return new ErrorResponse(request.CommandName, NTStatus.STATUS_ACCESS_DENIED); @@ -55,7 +55,7 @@ namespace SMBLibrary.Server.SMB2 return new ErrorResponse(request.CommandName, createStatus); } - FileAccess fileAccess = NTFileSystemHelper.ToFileAccess(request.DesiredAccess.File); + FileAccess fileAccess = NTFileStoreHelper.ToFileAccess(request.DesiredAccess.File); Stream stream; bool deleteOnClose = false;