Kaynağa Gözat

Moved helper methods to NTFileStoreHelper, Moved IOExceptionHelper

Tal Aloni 8 yıl önce
ebeveyn
işleme
36353c9d08

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

@@ -11,7 +11,7 @@ using System.Reflection;
 using System.Text;
 using Utilities;
 
-namespace SMBLibrary.Server
+namespace SMBLibrary
 {
     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\SessionRequestPacket.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\FileAttributes.cs" />
     <Compile Include="NTFileStore\Enums\FileInformation\FileInformationClass.cs" />
@@ -89,6 +90,7 @@
     <Compile Include="NTFileStore\Enums\NtCreateFile\CreateDisposition.cs" />
     <Compile Include="NTFileStore\Enums\NtCreateFile\CreateOptions.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\ACE.cs" />
     <Compile Include="NTFileStore\Structures\ACE\AceHeader.cs" />
@@ -171,7 +173,6 @@
     <Compile Include="Server\Exceptions\EmptyPasswordNotAllowedException.cs" />
     <Compile Include="Server\Exceptions\InvalidRequestException.cs" />
     <Compile Include="Server\Exceptions\UnsupportedInformationLevelException.cs" />
-    <Compile Include="Server\Helpers\IOExceptionHelper.cs" />
     <Compile Include="Server\Helpers\NTFileSystemHelper.cs" />
     <Compile Include="Server\Helpers\NTFileSystemHelper.Find.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)
         {
-            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;
-        }
-
         /// <summary>
         /// Will return a virtual allocation size, assuming 4096 bytes per cluster
         /// </summary>

+ 2 - 2
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;

+ 2 - 2
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;