mirror of
https://github.com/TalAloni/SMBLibrary.git
synced 2025-07-26 02:38:15 +02:00
Moved helper methods to NTFileStoreHelper, Moved IOExceptionHelper
This commit is contained in:
parent
54c8a6fa1f
commit
36353c9d08
6 changed files with 111 additions and 94 deletions
|
@ -11,7 +11,7 @@ using System.Reflection;
|
|||
using System.Text;
|
||||
using Utilities;
|
||||
|
||||
namespace SMBLibrary.Server
|
||||
namespace SMBLibrary
|
||||
{
|
||||
public class IOExceptionHelper
|
||||
{
|
102
SMBLibrary/NTFileStore/NTFileStoreHelper.cs
Normal file
102
SMBLibrary/NTFileStore/NTFileStoreHelper.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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" />
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue