浏览代码

Moved helper methods to NTFileStoreHelper, Moved IOExceptionHelper

Tal Aloni 8 年之前
父节点
当前提交
36353c9d08

+ 1 - 1
SMBLibrary/Server/Helpers/IOExceptionHelper.cs

@@ -11,7 +11,7 @@ using System.Reflection;
 using System.Text;
 using System.Text;
 using Utilities;
 using Utilities;
 
 
-namespace SMBLibrary.Server
+namespace SMBLibrary
 {
 {
     public class IOExceptionHelper
     public class IOExceptionHelper
     {
     {

+ 102 - 0
SMBLibrary/NTFileStore/NTFileStoreHelper.cs

@@ -0,0 +1,102 @@
+/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. 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;
+        }
+    }
+}

+ 2 - 1
SMBLibrary/SMBLibrary.csproj

@@ -77,6 +77,7 @@
     <Compile Include="NetBios\SessionPackets\SessionPacket.cs" />
     <Compile Include="NetBios\SessionPackets\SessionPacket.cs" />
     <Compile Include="NetBios\SessionPackets\SessionRequestPacket.cs" />
     <Compile Include="NetBios\SessionPackets\SessionRequestPacket.cs" />
     <Compile Include="NetBios\SessionPackets\SessionRetargetResponsePacket.cs" />
     <Compile Include="NetBios\SessionPackets\SessionRetargetResponsePacket.cs" />
+    <Compile Include="NTFileStore\Adapter\IOExceptionHelper.cs" />
     <Compile Include="NTFileStore\Enums\FileInformation\CompressionFormat.cs" />
     <Compile Include="NTFileStore\Enums\FileInformation\CompressionFormat.cs" />
     <Compile Include="NTFileStore\Enums\FileInformation\FileAttributes.cs" />
     <Compile Include="NTFileStore\Enums\FileInformation\FileAttributes.cs" />
     <Compile Include="NTFileStore\Enums\FileInformation\FileInformationClass.cs" />
     <Compile Include="NTFileStore\Enums\FileInformation\FileInformationClass.cs" />
@@ -89,6 +90,7 @@
     <Compile Include="NTFileStore\Enums\NtCreateFile\CreateDisposition.cs" />
     <Compile Include="NTFileStore\Enums\NtCreateFile\CreateDisposition.cs" />
     <Compile Include="NTFileStore\Enums\NtCreateFile\CreateOptions.cs" />
     <Compile Include="NTFileStore\Enums\NtCreateFile\CreateOptions.cs" />
     <Compile Include="NTFileStore\Enums\NtCreateFile\ShareAccess.cs" />
     <Compile Include="NTFileStore\Enums\NtCreateFile\ShareAccess.cs" />
+    <Compile Include="NTFileStore\NTFileStoreHelper.cs" />
     <Compile Include="NTFileStore\Structures\ACE\AccessAllowedACE.cs" />
     <Compile Include="NTFileStore\Structures\ACE\AccessAllowedACE.cs" />
     <Compile Include="NTFileStore\Structures\ACE\ACE.cs" />
     <Compile Include="NTFileStore\Structures\ACE\ACE.cs" />
     <Compile Include="NTFileStore\Structures\ACE\AceHeader.cs" />
     <Compile Include="NTFileStore\Structures\ACE\AceHeader.cs" />
@@ -171,7 +173,6 @@
     <Compile Include="Server\Exceptions\EmptyPasswordNotAllowedException.cs" />
     <Compile Include="Server\Exceptions\EmptyPasswordNotAllowedException.cs" />
     <Compile Include="Server\Exceptions\InvalidRequestException.cs" />
     <Compile Include="Server\Exceptions\InvalidRequestException.cs" />
     <Compile Include="Server\Exceptions\UnsupportedInformationLevelException.cs" />
     <Compile Include="Server\Exceptions\UnsupportedInformationLevelException.cs" />
-    <Compile Include="Server\Helpers\IOExceptionHelper.cs" />
     <Compile Include="Server\Helpers\NTFileSystemHelper.cs" />
     <Compile Include="Server\Helpers\NTFileSystemHelper.cs" />
     <Compile Include="Server\Helpers\NTFileSystemHelper.Find.cs" />
     <Compile Include="Server\Helpers\NTFileSystemHelper.Find.cs" />
     <Compile Include="Server\Helpers\NTFileSystemHelper.Query.cs" />
     <Compile Include="Server\Helpers\NTFileSystemHelper.Query.cs" />

+ 2 - 88
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)
         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 requestedWriteAccess = (createAccess & FileAccess.Write) > 0;
 
 
             bool forceDirectory = (createOptions & CreateOptions.FILE_DIRECTORY_FILE) > 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)
         public static NTStatus OpenFile(out Stream stream, IFileSystem fileSystem, string path, FileAccess fileAccess, ShareAccess shareAccess, bool buffered, ConnectionState state)
         {
         {
             stream = null;
             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);
             state.LogToServer(Severity.Verbose, "OpenFile: Opening '{0}', Access={1}, Share={2}, Buffered={3}", path, fileAccess, fileShare, buffered);
             try
             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;
-        }
-
         /// <summary>
         /// <summary>
         /// Will return a virtual allocation size, assuming 4096 bytes per cluster
         /// Will return a virtual allocation size, assuming 4096 bytes per cluster
         /// </summary>
         /// </summary>

+ 2 - 2
SMBLibrary/Server/SMB1/NTCreateHelper.cs

@@ -48,7 +48,7 @@ namespace SMBLibrary.Server.SMB1
             else // FileSystemShare
             else // FileSystemShare
             {
             {
                 FileSystemShare fileSystemShare = (FileSystemShare)share;
                 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))
                 if (!fileSystemShare.HasAccess(session.UserName, path, createAccess, state.ClientEndPoint))
                 {
                 {
                     header.Status = NTStatus.STATUS_ACCESS_DENIED;
                     header.Status = NTStatus.STATUS_ACCESS_DENIED;
@@ -63,7 +63,7 @@ namespace SMBLibrary.Server.SMB1
                     return new ErrorResponse(request.CommandName);
                     return new ErrorResponse(request.CommandName);
                 }
                 }
 
 
-                FileAccess fileAccess = NTFileSystemHelper.ToFileAccess(request.DesiredAccess);
+                FileAccess fileAccess = NTFileStoreHelper.ToFileAccess(request.DesiredAccess);
 
 
                 Stream stream;
                 Stream stream;
                 bool deleteOnClose = false;
                 bool deleteOnClose = false;

+ 2 - 2
SMBLibrary/Server/SMB2/CreateHelper.cs

@@ -42,7 +42,7 @@ namespace SMBLibrary.Server.SMB2
             else
             else
             {
             {
                 FileSystemShare fileSystemShare = (FileSystemShare)share;
                 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))
                 if (!fileSystemShare.HasAccess(session.UserName, path, createAccess, state.ClientEndPoint))
                 {
                 {
                     return new ErrorResponse(request.CommandName, NTStatus.STATUS_ACCESS_DENIED);
                     return new ErrorResponse(request.CommandName, NTStatus.STATUS_ACCESS_DENIED);
@@ -55,7 +55,7 @@ namespace SMBLibrary.Server.SMB2
                     return new ErrorResponse(request.CommandName, createStatus);
                     return new ErrorResponse(request.CommandName, createStatus);
                 }
                 }
 
 
-                FileAccess fileAccess = NTFileSystemHelper.ToFileAccess(request.DesiredAccess.File);
+                FileAccess fileAccess = NTFileStoreHelper.ToFileAccess(request.DesiredAccess.File);
 
 
                 Stream stream;
                 Stream stream;
                 bool deleteOnClose = false;
                 bool deleteOnClose = false;