Moved helper methods to NTFileStoreHelper, Moved IOExceptionHelper

This commit is contained in:
Tal Aloni 2017-02-10 19:53:54 +02:00
parent 54c8a6fa1f
commit 36353c9d08
6 changed files with 111 additions and 94 deletions

View file

@ -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
{ {

View file

@ -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;
}
}
}

View file

@ -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" />

View file

@ -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>

View file

@ -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;

View file

@ -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;