mirror of
https://github.com/TalAloni/SMBLibrary.git
synced 2025-07-26 02:38:15 +02:00
Server: Pass SetFileSystemInformation requests to the underlying object store
This commit is contained in:
parent
c1210d57bc
commit
0f754ee55c
3 changed files with 90 additions and 1 deletions
|
@ -174,6 +174,56 @@ namespace SMBLibrary.Server.SMB1
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static Transaction2SetFSInformationResponse GetSubcommandResponse(SMB1Header header, Transaction2SetFSInformationRequest subcommand, ISMBShare share, SMB1ConnectionState state)
|
||||||
|
{
|
||||||
|
SMB1Session session = state.GetSession(header.UID);
|
||||||
|
if (share is FileSystemShare)
|
||||||
|
{
|
||||||
|
if (!((FileSystemShare)share).HasWriteAccess(session.SecurityContext, @"\"))
|
||||||
|
{
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. User '{1}' was denied access.", share.Name, session.UserName);
|
||||||
|
header.Status = NTStatus.STATUS_ACCESS_DENIED;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!subcommand.IsPassthroughInformationLevel)
|
||||||
|
{
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. Not a pass-through information level.", share.Name);
|
||||||
|
header.Status = NTStatus.STATUS_NOT_SUPPORTED;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
FileSystemInformation fileSystemInfo;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
fileSystemInfo = FileSystemInformation.GetFileSystemInformation(subcommand.InformationBytes, 0, subcommand.FileSystemInformationClass);
|
||||||
|
}
|
||||||
|
catch (UnsupportedInformationLevelException)
|
||||||
|
{
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. Information class: {1}, NTStatus: STATUS_OS2_INVALID_LEVEL.", share.Name, subcommand.FileSystemInformationClass);
|
||||||
|
header.Status = NTStatus.STATUS_OS2_INVALID_LEVEL;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. Information class: {1}, NTStatus: STATUS_INVALID_PARAMETER.", share.Name, subcommand.FileSystemInformationClass);
|
||||||
|
header.Status = NTStatus.STATUS_INVALID_PARAMETER;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTStatus status = share.FileStore.SetFileSystemInformation(fileSystemInfo);
|
||||||
|
if (status != NTStatus.STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. Information class: {1}, NTStatus: {2}.", share.Name, subcommand.FileSystemInformationClass, status);
|
||||||
|
header.Status = status;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' succeeded. Information class: {1}.", share.Name, subcommand.FileSystemInformationClass);
|
||||||
|
return new Transaction2SetFSInformationResponse();
|
||||||
|
}
|
||||||
|
|
||||||
internal static Transaction2QueryPathInformationResponse GetSubcommandResponse(SMB1Header header, Transaction2QueryPathInformationRequest subcommand, ISMBShare share, SMB1ConnectionState state)
|
internal static Transaction2QueryPathInformationResponse GetSubcommandResponse(SMB1Header header, Transaction2QueryPathInformationRequest subcommand, ISMBShare share, SMB1ConnectionState state)
|
||||||
{
|
{
|
||||||
SMB1Session session = state.GetSession(header.UID);
|
SMB1Session session = state.GetSession(header.UID);
|
||||||
|
|
|
@ -210,7 +210,7 @@ namespace SMBLibrary.Server.SMB1
|
||||||
}
|
}
|
||||||
else if (subcommand is Transaction2SetFSInformationRequest)
|
else if (subcommand is Transaction2SetFSInformationRequest)
|
||||||
{
|
{
|
||||||
header.Status = NTStatus.STATUS_NOT_IMPLEMENTED;
|
subcommandResponse = Transaction2SubcommandHelper.GetSubcommandResponse(header, (Transaction2SetFSInformationRequest)subcommand, share, state);
|
||||||
}
|
}
|
||||||
else if (subcommand is Transaction2QueryPathInformationRequest)
|
else if (subcommand is Transaction2QueryPathInformationRequest)
|
||||||
{
|
{
|
||||||
|
|
|
@ -36,6 +36,17 @@ namespace SMBLibrary.Server.SMB2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (request.InfoType == InfoType.FileSystem)
|
||||||
|
{
|
||||||
|
if (share is FileSystemShare)
|
||||||
|
{
|
||||||
|
if (!((FileSystemShare)share).HasWriteAccess(session.SecurityContext, @"\"))
|
||||||
|
{
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. User '{1}' was denied access.", share.Name, session.UserName);
|
||||||
|
return new ErrorResponse(request.CommandName, NTStatus.STATUS_ACCESS_DENIED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (request.InfoType == InfoType.File)
|
if (request.InfoType == InfoType.File)
|
||||||
{
|
{
|
||||||
|
@ -97,6 +108,34 @@ namespace SMBLibrary.Server.SMB2
|
||||||
}
|
}
|
||||||
return new SetInfoResponse();
|
return new SetInfoResponse();
|
||||||
}
|
}
|
||||||
|
else if (request.InfoType == InfoType.FileSystem)
|
||||||
|
{
|
||||||
|
FileSystemInformation fileSystemInformation;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
fileSystemInformation = FileSystemInformation.GetFileSystemInformation(request.Buffer, 0, request.FileSystemInformationClass);
|
||||||
|
}
|
||||||
|
catch (UnsupportedInformationLevelException)
|
||||||
|
{
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. Information class: {1}, NTStatus: STATUS_INVALID_INFO_CLASS.", share.Name, request.FileSystemInformationClass);
|
||||||
|
return new ErrorResponse(request.CommandName, NTStatus.STATUS_INVALID_INFO_CLASS);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. Information class: {1}, NTStatus: STATUS_INVALID_PARAMETER.", share.Name, request.FileSystemInformationClass);
|
||||||
|
return new ErrorResponse(request.CommandName, NTStatus.STATUS_INVALID_PARAMETER);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTStatus status = share.FileStore.SetFileSystemInformation(fileSystemInformation);
|
||||||
|
if (status != NTStatus.STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' failed. Information class: {1}, NTStatus: {2}.", share.Name, request.FileSystemInformationClass, status);
|
||||||
|
return new ErrorResponse(request.CommandName, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
state.LogToServer(Severity.Verbose, "SetFileSystemInformation on '{0}' succeeded. Information class: {1}.", share.Name, request.FileSystemInformationClass);
|
||||||
|
return new SetInfoResponse();
|
||||||
|
}
|
||||||
else if (request.InfoType == InfoType.Security)
|
else if (request.InfoType == InfoType.Security)
|
||||||
{
|
{
|
||||||
SecurityDescriptor securityDescriptor;
|
SecurityDescriptor securityDescriptor;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue