Esempio n. 1
0
        public async Task <IActionResult> RenameFile(Guid fileUniqId, [FromBody] RenameRequest request)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }

                var callerEmail = User.FindFirst(ClaimTypes.NameIdentifier).Value;
                await _fileService.RenameFileAsync(fileUniqId, request.NewName, callerEmail);

                if (!_fileService.State.IsValid)
                {
                    return(ServiceResponseDispatcher.ExecuteServiceResponse(this, _fileService.State.TypeOfError,
                                                                            _fileService.State.ErrorMessage));
                }

                return(StatusCode(204));
            }
            catch (Exception ex)
            {
                return(StatusCode(500, ex.Message));
            }
        }
        public async Task <IActionResult> Rename(
            [FromForm] RenameRequest renameRequest)
        {
            try
            {
                if (renameRequest.source == null)
                {
                    return(BadRequest("Rename source is not specified"));
                }

                if (renameRequest.target == null)
                {
                    return(BadRequest("Rename target is not specified"));
                }

                var result = await _fileSystemService
                             .RenameAsync(
                    new RenameState(
                        new NPath(renameRequest.target),
                        new NPath(renameRequest.source)));

                if (result == null)
                {
                    throw new SystemException("Unable to process rename");
                }

                return(Json(result));
            }
            catch (Exception e)
            {
                return(BadRequest(e));
            }
        }
Esempio n. 3
0
        private IEnumerable <ModifiedFileResponse> Rename(string renameTo, params Buffer[] buffers)
        {
            RenameRequest request         = null;
            var           solutionBuilder = new FakeSolutionBuilder();

            foreach (var buffer in buffers)
            {
                if (buffer.Text.Contains("$"))
                {
                    var location = TestHelpers.GetLineAndColumnFromDollar(buffer.Text);
                    buffer.Text = buffer.Text.Replace("$", "");
                    request     = new RenameRequest
                    {
                        Buffer   = buffer.Text,
                        Column   = location.Column - 1,
                        Line     = location.Line,
                        RenameTo = renameTo,
                        FileName = buffer.Filename
                    };
                }
                //solutionBuilder = solutionBuilder.AddProject();
                solutionBuilder = solutionBuilder.AddFile(buffer.Text, buffer.Filename);
            }
            var solution      = solutionBuilder.Build();
            var bufferParser  = new BufferParser(solution);
            var renameHandler = new RenameHandler(solution, bufferParser, new OmniSharpConfiguration(), new FindUsagesHandler(bufferParser, solution, new ProjectFinder(solution)));

            var response = renameHandler.Rename(request);

            return(response.Changes);
        }
Esempio n. 4
0
        public override async Task <WorkspaceEdit> Handle(RenameParams request, CancellationToken token)
        {
            var omnisharpRequest = new RenameRequest
            {
                FileName         = Helpers.FromUri(request.TextDocument.Uri),
                RenameTo         = request.NewName,
                Column           = Convert.ToInt32(request.Position.Character),
                Line             = Convert.ToInt32(request.Position.Line),
                Buffer           = request.NewName,
                WantsTextChanges = true,
                ApplyTextChanges = false
            };

            var omnisharpResponse = await _renameHandler.Handle(omnisharpRequest);

            if (omnisharpResponse.ErrorMessage != null)
            {
                return(new WorkspaceEdit());
            }

            var changes = omnisharpResponse.Changes.ToDictionary(change =>
                                                                 Helpers.ToUri(change.FileName),
                                                                 x => x.Changes.Select(edit => new TextEdit
            {
                NewText = edit.NewText,
                Range   = Helpers.ToRange((edit.StartColumn, edit.StartLine), (edit.EndColumn, edit.EndLine))
            }));
Esempio n. 5
0
        private string Rename(string buffer, string renameTo)
        {
            var location = TestHelpers.GetLineAndColumnFromDollar(buffer);

            buffer = buffer.Replace("$", "");

            var solution = new FakeSolutionBuilder()
                           .AddFile(buffer)
                           .Build();

            var bufferParser  = new BufferParser(solution);
            var renameHandler = new RenameHandler(solution, bufferParser);
            var request       = new RenameRequest
            {
                Buffer   = buffer,
                Column   = location.Column - 1,
                Line     = location.Line,
                RenameTo = renameTo,
                FileName = "myfile"
            };

            var response = renameHandler.Rename(request);

            if (response.Changes.Any())
            {
                return(response.Changes.First().Buffer);
            }
            return(buffer);
        }
Esempio n. 6
0
        internal static SMB1Command GetRenameResponse(SMB1Header header, RenameRequest request, ISMBShare share, SMB1ConnectionState state)
        {
            SMB1Session session = state.GetSession(header.UID);

            if (share is FileSystemShare)
            {
                if (!((FileSystemShare)share).HasWriteAccess(session.SecurityContext, request.OldFileName))
                {
                    state.LogToServer(Severity.Verbose, "Rename '{0}{1}' to '{0}{2}' failed. User '{3}' was denied access.", share.Name, request.OldFileName, request.NewFileName, session.UserName);
                    header.Status = NTStatus.STATUS_ACCESS_DENIED;
                    return(new ErrorResponse(request.CommandName));
                }
                if (!((FileSystemShare)share).HasWriteAccess(session.SecurityContext, request.NewFileName))
                {
                    state.LogToServer(Severity.Verbose, "Rename '{0}{1}' to '{0}{2}' failed. User '{3}' was denied access.", share.Name, request.OldFileName, request.NewFileName, session.UserName);
                    header.Status = NTStatus.STATUS_ACCESS_DENIED;
                    return(new ErrorResponse(request.CommandName));
                }
            }

            header.Status = SMB1FileStoreHelper.Rename(share.FileStore, request.OldFileName, request.NewFileName, request.SearchAttributes, session.SecurityContext);
            if (header.Status != NTStatus.STATUS_SUCCESS)
            {
                state.LogToServer(Severity.Verbose, "Rename '{0}{1}' to '{0}{2}' failed. NTStatus: {3}.", share.Name, request.OldFileName, request.NewFileName, header.Status);
                return(new ErrorResponse(request.CommandName));
            }
            state.LogToServer(Severity.Verbose, "Rename: User '{0}' renamed '{1}{2}' to '{1}{3}'.", session.UserName, share.Name, request.OldFileName, request.NewFileName);
            return(new RenameResponse());
        }
Esempio n. 7
0
        private async Task <RenameResponse> SendRequest(OmnisharpWorkspace workspace,
                                                        string renameTo,
                                                        string filename,
                                                        string fileContent,
                                                        bool wantsTextChanges = false,
                                                        bool applyTextChanges = true)
        {
            var lineColumn = TestHelpers.GetLineAndColumnFromDollar(fileContent);
            var controller = new OmnisharpController(workspace, new FakeOmniSharpOptions());
            var request    = new RenameRequest
            {
                Line             = lineColumn.Line,
                Column           = lineColumn.Column,
                RenameTo         = renameTo,
                FileName         = filename,
                Buffer           = fileContent.Replace("$", ""),
                WantsTextChanges = wantsTextChanges,
                ApplyTextChanges = applyTextChanges
            };

            var bufferFilter = new UpdateBufferFilter(workspace);

            bufferFilter.OnActionExecuting(TestHelpers.CreateActionExecutingContext(request, controller));

            return(await controller.Rename(request));
        }
Esempio n. 8
0
        private async Task <RenameResponse> PerformRename(
            OmniSharpTestHost host, TestFile[] testFiles, string renameTo,
            bool wantsTextChanges = false,
            bool applyTextChanges = true,
            bool updateBuffer     = false)
        {
            var activeFile = testFiles.Single(tf => tf.Content.HasPosition);
            var point      = activeFile.Content.GetPointFromPosition();

            var request = new RenameRequest
            {
                Line             = point.Line,
                Column           = point.Offset,
                RenameTo         = renameTo,
                FileName         = activeFile.FileName,
                Buffer           = activeFile.Content.Code,
                WantsTextChanges = wantsTextChanges,
                ApplyTextChanges = applyTextChanges
            };

            var requestHandler = GetRequestHandler(host);

            if (updateBuffer)
            {
                await host.Workspace.BufferManager.UpdateBufferAsync(request);
            }

            return(await requestHandler.Handle(request));
        }
Esempio n. 9
0
        internal async Task HandleRenameRequestAsync(RenameRequest req, IEmote emote, IUser approver, IUserMessage message)
        {
            if (emote.Name != _acceptEmote.Name && emote.Name != _denyEmote.Name) return;
            if (IsStaffMember(approver as IGuildUser) == false)
            {
                var m = await message.Channel.SendMessageAsync($"{approver.Mention} you cannot approve/deny this name change.");
                _deleteService.ScheduleDeletion(m, 5);
                return;
            }
            bool accepted = emote.Name == _acceptEmote.Name;

            if (req != null)
            {
                if (!accepted)
                {
                    await message.ModifyAsync(x => x.Embed = Embeds.RequestRename(req.GuildUser, req.Type, req.NewName, accepted, approver.Mention));
                    _renameRequests.Remove(req);
                    return;
                }

                if (req.Type == "discord" || req.Type == "both")
                {
                    string newDiscordName = "";
                    if (req.GuildUser.Nickname != null)
                    {
                        int indexOfBracket = req.GuildUser.Nickname.IndexOf("]");
                        if (indexOfBracket == -1)
                            newDiscordName = req.NewName;
                        else
                            newDiscordName = req.GuildUser.Nickname.Substring(0, indexOfBracket + 1) + " " + req.NewName;
                    }
                    else
                        newDiscordName = req.NewName;

                    await req.GuildUser.ModifyAsync(x =>
                    {
                        x.Nickname = newDiscordName;
                    }).ConfigureAwait(false);
                }


                if (req.Type == "spreadsheet" || req.Type == "both")
                {
                    int row = _dsn.GetRowNumber(req.GuildUser.Id);

                    if (row != -1)
                    {
                        string sectionToEdit = $"Player Data!C{row}";
                        _dsn.MakeRequest(sectionToEdit, new List<object>() { req.NewName });
                        return;
                    }
                }

                await message.ModifyAsync(x => x.Embed = Embeds.RequestRename(req.GuildUser, req.Type, req.NewName, accepted, approver.Mention));
                _renameRequests.Remove(req);
            }
        }
Esempio n. 10
0
 private async Task HandleExtraReactionMethodsAsync(ulong messageId, SocketReaction reaction, IUser approver, IUserMessage message)
 {
     RenameRequest req = _renameRequests.Find(x => x.MessageId == messageId);
     if (req != null)
     {
         await HandleRenameRequestAsync(req, reaction.Emote, approver, message).ConfigureAwait(false);
         return;
     }
 }
Esempio n. 11
0
        void RenameView()
        {
            if (rt == null)
            {
                UnityEditor.EditorUtility.DisplayDialog("No GameObject", "GameObject for the node is not found!", "OK");
                return;
            }

            RenameRequest?.Invoke(this);
        }
Esempio n. 12
0
        private async Task DoRename()
        {
            var name = await RenameRequest.Handle(Unit.Default);

            if (string.IsNullOrWhiteSpace(name))
            {
                return;
            }
            Title = _category.Title = name;
            await _categoryManager.Update(_category);
        }
Esempio n. 13
0
        /// <summary>
        /// Renames the specified request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <param name="db">The database.</param>
        public ProcessResponse Rename(RenameRequest request, string db)
        {
            this.SetDatabase(db);
            var processId = Guid.NewGuid();

            progressStatus.TryAdd(processId, new ConcurrentQueue <string>());
            request.Items.ForEach(t => progressStatus[processId].Enqueue(t));

            Action action = () =>
            {
                string itemId;
                while (progressStatus[processId].TryDequeue(out itemId))
                {
                    try
                    {
                        var item = this.database.GetItem(new ID(itemId));

                        using (new EditContext(item))
                        {
                            item.Name = this.GetName(item.Name, request.NameOrPattern, request.Items.IndexOf(itemId));
                        }
                    }
                    catch (Exception ex)
                    {
                        List <string> errorMessages = new List <string>();
                        if (errors == null)
                        {
                            errors = new ConcurrentDictionary <Guid, List <string> >();
                        }

                        if (errors.TryGetValue(processId, out errorMessages))
                        {
                            var newErrors = new List <string>();
                            newErrors.AddRange(errorMessages);
                            newErrors.Add(ex.Message + " Item Id: " + itemId);
                            errors.TryUpdate(processId, newErrors, errorMessages);
                        }
                        else
                        {
                            errors.TryAdd(processId, new List <string> {
                                ex.Message + " Item Id: " + itemId
                            });
                        }
                    }
                }
            };

            Task.Run(() => Parallel.Invoke(new Action[] { action }));

            return(new ProcessResponse {
                StatusId = processId
            });
        }
        public async Task <IActionResult> Rename([FromBody] RenameRequest request)
        {
            _workspace.EnsureBufferUpdated(request);

            var response = new RenameResponse();

            var documentId = _workspace.GetDocumentId(request.FileName);

            if (documentId != null)
            {
                var document   = _workspace.CurrentSolution.GetDocument(documentId);
                var sourceText = await document.GetTextAsync();

                var position = sourceText.Lines.GetPosition(new LinePosition(request.Line - 1, request.Column));

                var symbol = await SymbolFinder.FindSymbolAtPositionAsync(document, position);

                Solution solution = _workspace.CurrentSolution;

                if (symbol != null)
                {
                    solution = await Renamer.RenameSymbolAsync(solution, symbol, request.RenameTo, _workspace.Options);
                }

                var changes = new List <ModifiedFileResponse>();

                var solutionChanges = solution.GetChanges(_workspace.CurrentSolution);

                foreach (var projectChange in solutionChanges.GetProjectChanges())
                {
                    foreach (var changedDocumentId in projectChange.GetChangedDocuments())
                    {
                        var changedDocument = solution.GetDocument(changedDocumentId);
                        var changedText     = await changedDocument.GetTextAsync();

                        var modifiedFileResponse = new ModifiedFileResponse(changedDocument.FilePath, changedText.ToString());

                        changes.Add(modifiedFileResponse);
                    }
                }

                // Attempt to update the workspace
                if (_workspace.TryApplyChanges(solution))
                {
                    response.Changes = changes;
                }
            }

            return(new ObjectResult(response));
        }
Esempio n. 15
0
        public async Task ShouldSupportLoadedFiles()
        {
            using (var testProject = await TestAssets.Instance.GetTestProjectAsync("CakeProject", shadowCopy: false))
                using (var host = CreateOmniSharpHost(testProject.Directory))
                {
                    var fileName = Path.Combine(testProject.Directory, "build.cake");

                    var request = new RenameRequest
                    {
                        FileName         = fileName,
                        Line             = 8,
                        Column           = 10,
                        WantsTextChanges = true,
                        RenameTo         = "Build"
                    };

                    var requestHandler = GetRequestHandler(host);
                    var response       = await requestHandler.Handle(request);

                    Assert.Equal(2, response.Changes.Count());

                    var loadedFile = response.Changes.FirstOrDefault(x => x.FileName.Equals(Path.Combine(testProject.Directory, "foo.cake")));
                    Assert.NotNull(loadedFile);
                    Assert.Contains(new LinePositionSpanTextChange
                    {
                        NewText     = "Build",
                        StartLine   = 4,
                        EndLine     = 4,
                        StartColumn = 22,
                        EndColumn   = 28
                    },
                                    loadedFile.Changes);

                    var sameFile = response.Changes.FirstOrDefault(x => x.FileName.Equals(Path.Combine(testProject.Directory, "build.cake")));
                    Assert.NotNull(sameFile);
                    Assert.Contains(new LinePositionSpanTextChange
                    {
                        NewText     = "Build",
                        StartLine   = 8,
                        EndLine     = 8,
                        StartColumn = 5,
                        EndColumn   = 11
                    },
                                    sameFile.Changes);
                }
        }
Esempio n. 16
0
        internal static SMBCommand GetRenameResponse(SMBHeader header, RenameRequest request, FileSystemShare share, StateObject state)
        {
            string userName = state.GetConnectedUserName(header.UID);

            if (!share.HasWriteAccess(userName))
            {
                header.Status = NTStatus.STATUS_ACCESS_DENIED;
                return(new ErrorResponse(CommandName.SMB_COM_RENAME));
            }
            IFileSystem fileSystem = share.FileSystem;

            FileSystemEntry sourceEntry = fileSystem.GetEntry(request.OldFileName);

            if (sourceEntry == null)
            {
                header.Status = NTStatus.STATUS_NO_SUCH_FILE;
                return(new ErrorResponse(CommandName.SMB_COM_RENAME));
            }

            // The file must not already exist unless we just want to upcase / downcase a filename letter
            FileSystemEntry destinationEntry = fileSystem.GetEntry(request.NewFileName);

            if (destinationEntry != null &&
                !String.Equals(request.OldFileName, request.NewFileName, StringComparison.InvariantCultureIgnoreCase))
            {
                // The new file already exists.
                header.Status = NTStatus.STATUS_OBJECT_NAME_COLLISION;
                return(new ErrorResponse(CommandName.SMB_COM_RENAME));
            }

            try
            {
                fileSystem.Move(request.OldFileName, request.NewFileName);
                return(new RenameResponse());
            }
            catch (IOException)
            {
                header.Status = NTStatus.STATUS_SHARING_VIOLATION;
                return(new ErrorResponse(CommandName.SMB_COM_RENAME));
            }
            catch (UnauthorizedAccessException)
            {
                header.Status = NTStatus.STATUS_ACCESS_DENIED;
                return(new ErrorResponse(CommandName.SMB_COM_RENAME));
            }
        }
Esempio n. 17
0
        private async Task <RenameResponse> SendRequest(OmnisharpWorkspace workspace,
                                                        string renameTo,
                                                        string filename,
                                                        string fileContent,
                                                        bool wantsTextChanges = false,
                                                        bool applyTextChanges = true)
        {
            var lineColumn = TestHelpers.GetLineAndColumnFromDollar(fileContent);
            var controller = new RenameService(workspace);
            var request    = new RenameRequest
            {
                Line             = lineColumn.Line,
                Column           = lineColumn.Column,
                RenameTo         = renameTo,
                FileName         = filename,
                Buffer           = fileContent.Replace("$", ""),
                WantsTextChanges = wantsTextChanges,
                ApplyTextChanges = applyTextChanges
            };

            await workspace.BufferManager.UpdateBuffer(request);

            return(await controller.Handle(request));
        }
Esempio n. 18
0
 public static void InvokeRenameRequest(RenameRequestEventArgs e)
 {
     RenameRequest?.Invoke(e);
 }
Esempio n. 19
0
        public async Task <RenameResponse> Rename(RenameRequest request)
        {
            var response = new RenameResponse();

            var document = _workspace.GetDocument(request.FileName);

            if (document != null)
            {
                var sourceText = await document.GetTextAsync();

                var position = sourceText.Lines.GetPosition(new LinePosition(request.Line - 1, request.Column - 1));

                var symbol = await SymbolFinder.FindSymbolAtPositionAsync(document, position);

                Solution solution = _workspace.CurrentSolution;

                if (symbol != null)
                {
                    try
                    {
                        solution = await Renamer.RenameSymbolAsync(solution, symbol, request.RenameTo, _workspace.Options);
                    }
                    catch (ArgumentException e)
                    {
                        response.ErrorMessage = e.Message;
                    }
                }

                var changes         = new Dictionary <string, ModifiedFileResponse>();
                var solutionChanges = solution.GetChanges(_workspace.CurrentSolution);

                foreach (var projectChange in solutionChanges.GetProjectChanges())
                {
                    foreach (var changedDocumentId in projectChange.GetChangedDocuments())
                    {
                        var changedDocument = solution.GetDocument(changedDocumentId);

                        ModifiedFileResponse modifiedFileResponse;
                        if (!changes.TryGetValue(changedDocument.FilePath, out modifiedFileResponse))
                        {
                            modifiedFileResponse = new ModifiedFileResponse(changedDocument.FilePath);
                            changes[changedDocument.FilePath] = modifiedFileResponse;
                        }

                        if (!request.WantsTextChanges)
                        {
                            var changedText = await changedDocument.GetTextAsync();

                            modifiedFileResponse.Buffer = changedText.ToString();
                        }
                        else
                        {
                            var originalDocument = _workspace.CurrentSolution.GetDocument(changedDocumentId);
                            var textChanges      = await changedDocument.GetTextChangesAsync(originalDocument);

                            var linePositionSpanTextChanges = await LinePositionSpanTextChange.Convert(originalDocument, textChanges);

                            modifiedFileResponse.Changes = modifiedFileResponse.Changes != null
                                ? modifiedFileResponse.Changes.Union(linePositionSpanTextChanges)
                                : linePositionSpanTextChanges;
                        }
                    }
                }

                if (request.ApplyTextChanges)
                {
                    // Attempt to update the workspace
                    if (_workspace.TryApplyChanges(solution))
                    {
                        response.Changes = changes.Values;
                    }
                }
                else
                {
                    response.Changes = changes.Values;
                }
            }

            return(response);
        }
Esempio n. 20
0
 public static void InvokeRenameRequest(Mobile from, Mobile target, string name) =>
 RenameRequest?.Invoke(from, target, name);
 public ProcessResponse Rename([FromBody] RenameRequest renameRequest)
 {
     return(this._customRepositoryActions.Rename(renameRequest, renameRequest.Database));
 }
        public static async Task <RenameResponse> TranslateAsync(this RenameResponse response, OmniSharpWorkspace workspace, RenameRequest request)
        {
            var changes = new Dictionary <string, List <LinePositionSpanTextChange> >();

            foreach (var change in response.Changes)
            {
                await PopulateModificationsAsync(change, workspace, changes);
            }

            response.Changes = changes.Select(x => new ModifiedFileResponse(x.Key)
            {
                Changes = x.Value
            });

            return(response);
        }
Esempio n. 23
0
        private List <SMB1Command> ProcessSMB1Command(SMB1Header header, SMB1Command command, SMB1ConnectionState state)
        {
            if (command is SessionSetupAndXRequest)
            {
                SessionSetupAndXRequest request = (SessionSetupAndXRequest)command;
                state.MaxBufferSize = request.MaxBufferSize;
                return(SessionSetupHelper.GetSessionSetupResponse(header, request, m_securityProvider, state));
            }
            else if (command is SessionSetupAndXRequestExtended)
            {
                SessionSetupAndXRequestExtended request = (SessionSetupAndXRequestExtended)command;
                state.MaxBufferSize = request.MaxBufferSize;
                return(SessionSetupHelper.GetSessionSetupResponseExtended(header, request, m_securityProvider, state));
            }
            else if (command is EchoRequest)
            {
                return(ServerResponseHelper.GetEchoResponse((EchoRequest)command));
            }
            else
            {
                SMB1Session session = state.GetSession(header.UID);
                if (session == null)
                {
                    header.Status = NTStatus.STATUS_USER_SESSION_DELETED;
                    return(new ErrorResponse(command.CommandName));
                }

                if (command is TreeConnectAndXRequest)
                {
                    TreeConnectAndXRequest request = (TreeConnectAndXRequest)command;
                    return(TreeConnectHelper.GetTreeConnectResponse(header, request, state, m_services, m_shares));
                }
                else if (command is LogoffAndXRequest)
                {
                    state.LogToServer(Severity.Information, "Logoff: User '{0}' logged off.", session.UserName);
                    m_securityProvider.DeleteSecurityContext(ref session.SecurityContext.AuthenticationContext);
                    state.RemoveSession(header.UID);
                    return(new LogoffAndXResponse());
                }
                else
                {
                    ISMBShare share = session.GetConnectedTree(header.TID);
                    if (share == null)
                    {
                        header.Status = NTStatus.STATUS_SMB_BAD_TID;
                        return(new ErrorResponse(command.CommandName));
                    }

                    if (command is CreateDirectoryRequest)
                    {
                        CreateDirectoryRequest request = (CreateDirectoryRequest)command;
                        return(FileStoreResponseHelper.GetCreateDirectoryResponse(header, request, share, state));
                    }
                    else if (command is DeleteDirectoryRequest)
                    {
                        DeleteDirectoryRequest request = (DeleteDirectoryRequest)command;
                        return(FileStoreResponseHelper.GetDeleteDirectoryResponse(header, request, share, state));
                    }
                    else if (command is CloseRequest)
                    {
                        CloseRequest request = (CloseRequest)command;
                        return(ServerResponseHelper.GetCloseResponse(header, request, share, state));
                    }
                    else if (command is FlushRequest)
                    {
                        return(new FlushResponse());
                    }
                    else if (command is DeleteRequest)
                    {
                        DeleteRequest request = (DeleteRequest)command;
                        return(FileStoreResponseHelper.GetDeleteResponse(header, request, share, state));
                    }
                    else if (command is RenameRequest)
                    {
                        RenameRequest request = (RenameRequest)command;
                        return(FileStoreResponseHelper.GetRenameResponse(header, request, share, state));
                    }
                    else if (command is QueryInformationRequest)
                    {
                        QueryInformationRequest request = (QueryInformationRequest)command;
                        return(FileStoreResponseHelper.GetQueryInformationResponse(header, request, share, state));
                    }
                    else if (command is SetInformationRequest)
                    {
                        SetInformationRequest request = (SetInformationRequest)command;
                        return(FileStoreResponseHelper.GetSetInformationResponse(header, request, share, state));
                    }
                    else if (command is ReadRequest)
                    {
                        ReadRequest request = (ReadRequest)command;
                        return(ReadWriteResponseHelper.GetReadResponse(header, request, share, state));
                    }
                    else if (command is WriteRequest)
                    {
                        WriteRequest request = (WriteRequest)command;
                        return(ReadWriteResponseHelper.GetWriteResponse(header, request, share, state));
                    }
                    else if (command is CheckDirectoryRequest)
                    {
                        CheckDirectoryRequest request = (CheckDirectoryRequest)command;
                        return(FileStoreResponseHelper.GetCheckDirectoryResponse(header, request, share, state));
                    }
                    else if (command is WriteRawRequest)
                    {
                        // [MS-CIFS] 3.3.5.26 - Receiving an SMB_COM_WRITE_RAW Request:
                        // the server MUST verify that the Server.Capabilities include CAP_RAW_MODE,
                        // If an error is detected [..] the Write Raw operation MUST fail and
                        // the server MUST return a Final Server Response [..] with the Count field set to zero.
                        return(new WriteRawFinalResponse());
                    }
                    else if (command is SetInformation2Request)
                    {
                        SetInformation2Request request = (SetInformation2Request)command;
                        return(FileStoreResponseHelper.GetSetInformation2Response(header, request, share, state));
                    }
                    else if (command is LockingAndXRequest)
                    {
                        header.Status = NTStatus.STATUS_ACCESS_DENIED;
                        return(new ErrorResponse(command.CommandName));
                    }
                    else if (command is OpenAndXRequest)
                    {
                        OpenAndXRequest request = (OpenAndXRequest)command;
                        return(OpenAndXHelper.GetOpenAndXResponse(header, request, share, state));
                    }
                    else if (command is ReadAndXRequest)
                    {
                        ReadAndXRequest request = (ReadAndXRequest)command;
                        return(ReadWriteResponseHelper.GetReadResponse(header, request, share, state));
                    }
                    else if (command is WriteAndXRequest)
                    {
                        WriteAndXRequest request = (WriteAndXRequest)command;
                        return(ReadWriteResponseHelper.GetWriteResponse(header, request, share, state));
                    }
                    else if (command is FindClose2Request)
                    {
                        return(ServerResponseHelper.GetFindClose2Request(header, (FindClose2Request)command, state));
                    }
                    else if (command is TreeDisconnectRequest)
                    {
                        TreeDisconnectRequest request = (TreeDisconnectRequest)command;
                        return(TreeConnectHelper.GetTreeDisconnectResponse(header, request, share, state));
                    }
                    else if (command is TransactionRequest) // Both TransactionRequest and Transaction2Request
                    {
                        TransactionRequest request = (TransactionRequest)command;
                        return(TransactionHelper.GetTransactionResponse(header, request, share, state));
                    }
                    else if (command is TransactionSecondaryRequest) // Both TransactionSecondaryRequest and Transaction2SecondaryRequest
                    {
                        TransactionSecondaryRequest request = (TransactionSecondaryRequest)command;
                        return(TransactionHelper.GetTransactionResponse(header, request, share, state));
                    }
                    else if (command is NTTransactRequest)
                    {
                        NTTransactRequest request = (NTTransactRequest)command;
                        return(NTTransactHelper.GetNTTransactResponse(header, request, share, state));
                    }
                    else if (command is NTTransactSecondaryRequest)
                    {
                        NTTransactSecondaryRequest request = (NTTransactSecondaryRequest)command;
                        return(NTTransactHelper.GetNTTransactResponse(header, request, share, state));
                    }
                    else if (command is NTCreateAndXRequest)
                    {
                        NTCreateAndXRequest request = (NTCreateAndXRequest)command;
                        return(NTCreateHelper.GetNTCreateResponse(header, request, share, state));
                    }
                }
            }

            header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
            return(new ErrorResponse(command.CommandName));
        }
Esempio n. 24
0
        /// <summary>
        /// May return null
        /// </summary>
        public SMBCommand ProcessCommand(SMBHeader header, SMBCommand command, StateObject state, List <SMBCommand> sendQueue)
        {
            if (command is NegotiateRequest)
            {
                NegotiateRequest request = (NegotiateRequest)command;
                if (request.Dialects.Contains(SMBServer.NTLanManagerDialect))
                {
                    if (EnableExtendedSecurity && header.ExtendedSecurityFlag)
                    {
                        return(NegotiateHelper.GetNegotiateResponseExtended(request, m_serverGuid));
                    }
                    else
                    {
                        return(new NegotiateResponseNotSupported());
                    }
                }
                else
                {
                    return(new NegotiateResponseNotSupported());
                }
            }
            else if (command is SessionSetupAndXRequest)
            {
                SessionSetupAndXRequest request = (SessionSetupAndXRequest)command;
                state.MaxBufferSize = request.MaxBufferSize;
                //this probably won't work
                return(NegotiateHelper.GetSessionSetupResponse(header, request, state));
            }
            else if (command is SessionSetupAndXRequestExtended)
            {
                SessionSetupAndXRequestExtended request = (SessionSetupAndXRequestExtended)command;
                state.MaxBufferSize = request.MaxBufferSize;
                return(NegotiateHelper.GetSessionSetupResponseExtended(header, request, state));
            }
            else if (command is EchoRequest)
            {
                return(ServerResponseHelper.GetEchoResponse((EchoRequest)command, sendQueue));
            }
            else if (state.IsAuthenticated(header.UID))
            {
                if (command is TreeConnectAndXRequest)
                {
                    TreeConnectAndXRequest request = (TreeConnectAndXRequest)command;
                    return(TreeConnectHelper.GetTreeConnectResponse(header, request, state, m_shares));
                }
                else if (command is LogoffAndXRequest)
                {
                    return(new LogoffAndXResponse());
                }
                else if (state.IsTreeConnected(header.TID))
                {
                    string rootPath = state.GetConnectedTreePath(header.TID);
                    object share;
                    if (state.IsIPC(header.TID))
                    {
                        share = m_services;
                    }
                    else
                    {
                        share = m_shares.GetShareFromRelativePath(rootPath);
                    }

                    if (command is CreateDirectoryRequest)
                    {
                        if (!(share is FileSystemShare))
                        {
                            header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
                            return(new ErrorResponse(command.CommandName));
                        }
                        CreateDirectoryRequest request = (CreateDirectoryRequest)command;
                        return(FileSystemResponseHelper.GetCreateDirectoryResponse(header, request, (FileSystemShare)share, state));
                    }
                    else if (command is DeleteDirectoryRequest)
                    {
                        if (!(share is FileSystemShare))
                        {
                            header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
                            return(new ErrorResponse(command.CommandName));
                        }
                        DeleteDirectoryRequest request = (DeleteDirectoryRequest)command;
                        return(FileSystemResponseHelper.GetDeleteDirectoryResponse(header, request, (FileSystemShare)share, state));
                    }
                    else if (command is CloseRequest)
                    {
                        CloseRequest request = (CloseRequest)command;
                        return(ServerResponseHelper.GetCloseResponse(header, request, state));
                    }
                    else if (command is FlushRequest)
                    {
                        return(new FlushResponse());
                    }
                    else if (command is DeleteRequest)
                    {
                        if (!(share is FileSystemShare))
                        {
                            header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
                            return(new ErrorResponse(command.CommandName));
                        }
                        DeleteRequest request = (DeleteRequest)command;
                        return(FileSystemResponseHelper.GetDeleteResponse(header, request, (FileSystemShare)share, state));
                    }
                    else if (command is RenameRequest)
                    {
                        if (!(share is FileSystemShare))
                        {
                            header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
                            return(new ErrorResponse(command.CommandName));
                        }
                        RenameRequest request = (RenameRequest)command;
                        return(FileSystemResponseHelper.GetRenameResponse(header, request, (FileSystemShare)share, state));
                    }
                    else if (command is QueryInformationRequest)
                    {
                        if (!(share is FileSystemShare))
                        {
                            header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
                            return(new ErrorResponse(command.CommandName));
                        }
                        QueryInformationRequest request = (QueryInformationRequest)command;
                        return(FileSystemResponseHelper.GetQueryInformationResponse(header, request, (FileSystemShare)share));
                    }
                    else if (command is SetInformationRequest)
                    {
                        if (!(share is FileSystemShare))
                        {
                            header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
                            return(new ErrorResponse(command.CommandName));
                        }
                        SetInformationRequest request = (SetInformationRequest)command;
                        return(FileSystemResponseHelper.GetSetInformationResponse(header, request, (FileSystemShare)share, state));
                    }
                    else if (command is ReadRequest)
                    {
                        ReadRequest request = (ReadRequest)command;
                        return(ReadWriteResponseHelper.GetReadResponse(header, request, share, state));
                    }
                    else if (command is WriteRequest)
                    {
                        string userName = state.GetConnectedUserName(header.UID);
                        if (share is FileSystemShare && !((FileSystemShare)share).HasWriteAccess(userName))
                        {
                            header.Status = NTStatus.STATUS_ACCESS_DENIED;
                            return(new ErrorResponse(command.CommandName));
                        }
                        WriteRequest request = (WriteRequest)command;
                        return(ReadWriteResponseHelper.GetWriteResponse(header, request, share, state));
                    }
                    else if (command is CheckDirectoryRequest)
                    {
                        if (!(share is FileSystemShare))
                        {
                            header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
                            return(new ErrorResponse(command.CommandName));
                        }
                        CheckDirectoryRequest request = (CheckDirectoryRequest)command;
                        return(FileSystemResponseHelper.GetCheckDirectoryResponse(header, request, (FileSystemShare)share));
                    }
                    else if (command is WriteRawRequest)
                    {
                        // [MS-CIFS] 3.3.5.26 - Receiving an SMB_COM_WRITE_RAW Request:
                        // the server MUST verify that the Server.Capabilities include CAP_RAW_MODE,
                        // If an error is detected [..] the Write Raw operation MUST fail and
                        // the server MUST return a Final Server Response [..] with the Count field set to zero.
                        return(new WriteRawFinalResponse());
                    }
                    else if (command is SetInformation2Request)
                    {
                        if (!(share is FileSystemShare))
                        {
                            header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
                            return(new ErrorResponse(command.CommandName));
                        }
                        SetInformation2Request request = (SetInformation2Request)command;
                        return(FileSystemResponseHelper.GetSetInformation2Response(header, request, (FileSystemShare)share, state));
                    }
                    else if (command is LockingAndXRequest)
                    {
                        header.Status = NTStatus.STATUS_ACCESS_DENIED;
                        return(new ErrorResponse(CommandName.SMB_COM_LOCKING_ANDX));
                    }
                    else if (command is OpenAndXRequest)
                    {
                        OpenAndXRequest request = (OpenAndXRequest)command;
                        return(OpenAndXHelper.GetOpenAndXResponse(header, request, share, state));
                    }
                    else if (command is ReadAndXRequest)
                    {
                        ReadAndXRequest request = (ReadAndXRequest)command;
                        return(ReadWriteResponseHelper.GetReadResponse(header, request, share, state));
                    }
                    else if (command is WriteAndXRequest)
                    {
                        string userName = state.GetConnectedUserName(header.UID);
                        if (share is FileSystemShare && !((FileSystemShare)share).HasWriteAccess(userName))
                        {
                            header.Status = NTStatus.STATUS_ACCESS_DENIED;
                            return(new ErrorResponse(command.CommandName));
                        }
                        WriteAndXRequest request = (WriteAndXRequest)command;
                        return(ReadWriteResponseHelper.GetWriteResponse(header, request, share, state));
                    }
                    else if (command is FindClose2Request)
                    {
                        return(ServerResponseHelper.GetFindClose2Request(header, (FindClose2Request)command, state));
                    }
                    else if (command is TreeDisconnectRequest)
                    {
                        TreeDisconnectRequest request = (TreeDisconnectRequest)command;
                        return(TreeConnectHelper.GetTreeDisconnectResponse(header, request, state));
                    }
                    else if (command is TransactionRequest) // Both TransactionRequest and Transaction2Request
                    {
                        TransactionRequest request = (TransactionRequest)command;
                        try
                        {
                            return(TransactionHelper.GetTransactionResponse(header, request, share, state, sendQueue));
                        }
                        catch (UnsupportedInformationLevelException)
                        {
                            header.Status = NTStatus.STATUS_INVALID_PARAMETER;
                            return(new ErrorResponse(command.CommandName));
                        }
                    }
                    else if (command is TransactionSecondaryRequest) // Both TransactionSecondaryRequest and Transaction2SecondaryRequest
                    {
                        TransactionSecondaryRequest request = (TransactionSecondaryRequest)command;
                        try
                        {
                            return(TransactionHelper.GetTransactionResponse(header, request, share, state, sendQueue));
                        }
                        catch (UnsupportedInformationLevelException)
                        {
                            header.Status = NTStatus.STATUS_INVALID_PARAMETER;
                            return(new ErrorResponse(command.CommandName));
                        }
                    }
                    else if (command is NTTransactRequest)
                    {
                        NTTransactRequest request = (NTTransactRequest)command;
                        return(NTTransactHelper.GetNTTransactResponse(header, request, share, state, sendQueue));
                    }
                    else if (command is NTTransactSecondaryRequest)
                    {
                        NTTransactSecondaryRequest request = (NTTransactSecondaryRequest)command;
                        return(NTTransactHelper.GetNTTransactResponse(header, request, share, state, sendQueue));
                    }
                    else if (command is NTCreateAndXRequest)
                    {
                        NTCreateAndXRequest request = (NTCreateAndXRequest)command;
                        return(NTCreateHelper.GetNTCreateResponse(header, request, share, state));
                    }
                }
                else
                {
                    header.Status = NTStatus.STATUS_SMB_BAD_TID;
                    return(new ErrorResponse(command.CommandName));
                }
            }

            header.Status = NTStatus.STATUS_SMB_BAD_COMMAND;
            return(new ErrorResponse(command.CommandName));
        }
Esempio n. 25
0
 internal void AddRenameRequest(RenameRequest req)
 {
     _renameRequests.Add(req);
 }