コード例 #1
0
        /// <summary>
        /// True if the user can access a given file
        /// </summary>
        /// <param name="entityName"></param>
        /// <param name="entityId"></param>
        /// <param name="documentType"></param>
        /// <param name="serverRelativeUrl"></param>
        /// <returns></returns>
        private async Task <bool> CanAccessEntityFile(string entityName, string entityId, string documentType, string serverRelativeUrl, bool isDelete = false)
        {
            var logUrl = WordSanitizer.Sanitize(serverRelativeUrl);

            var result = await CanAccessEntity(entityName, entityId, isDelete).ConfigureAwait(true);

            //get list of files for entity
            var hasFile = false;

            var fileExistsRequest = new FileExistsRequest
            {
                DocumentType      = documentType,
                EntityId          = entityId,
                EntityName        = entityName,
                FolderName        = await _dynamicsClient.GetFolderName(entityName, entityId).ConfigureAwait(true),
                ServerRelativeUrl = serverRelativeUrl
            };

            var hasFileResult = _fileManagerClient.FileExists(fileExistsRequest);

            if (hasFileResult.ResultStatus == FileExistStatus.Exist)
            {
                // Update modifiedon to current time
                hasFile = true;
            }
            else
            {
                _logger.LogError($"Unexpected error - Unable to validate file - {logUrl}");
            }

            return(result && hasFile);
        }
コード例 #2
0
        private async Task CreateSharePointWorkerDocumentLocation(FileManagerClient _fileManagerClient, MicrosoftDynamicsCRMadoxioWorker worker)
        {
            string folderName    = "";
            string logFolderName = "";

            try
            {
                folderName    = worker.GetDocumentFolderName();
                logFolderName = WordSanitizer.Sanitize(folderName);

                var createFolderRequest = new CreateFolderRequest
                {
                    EntityName = "worker",
                    FolderName = folderName
                };

                var createFolderResult = _fileManagerClient.CreateFolder(createFolderRequest);

                if (createFolderResult.ResultStatus == ResultStatus.Fail)
                {
                    _logger.Error($"Error creating folder for contact {logFolderName}. Error is {createFolderResult.ErrorDetail}");
                }
            }
            catch (Exception e)
            {
                _logger.Error(e, $"Error creating folder for contact {logFolderName}");
            }
        }
        private async Task CreateContactDocumentLocation(IDynamicsClient _dynamicsClient, FileManagerClient _fileManagerClient, MicrosoftDynamicsCRMcontact contact)
        {
            string folderName;
            string logFolderName = "";

            try
            {
                folderName    = contact.GetDocumentFolderName();
                logFolderName = WordSanitizer.Sanitize(folderName);

                var createFolderRequest = new CreateFolderRequest()
                {
                    EntityName = "contact",
                    FolderName = folderName
                };

                var createFolderResult = _fileManagerClient.CreateFolder(createFolderRequest);

                if (createFolderResult.ResultStatus == ResultStatus.Fail)
                {
                    _logger.Error($"Error creating folder for contact {logFolderName}. Error is {createFolderResult.ErrorDetail}");
                }
            }
            catch (Exception e)
            {
                _logger.Error(e, $"Error creating folder for contact {logFolderName}");
            }
        }
コード例 #4
0
        public void TestSanitize()
        {
            string input    = "Joe_personal123123";
            string expected = "J**_p*******123123";

            string resultingData = WordSanitizer.Sanitize(input);

            Assert.Equal(expected, resultingData);
        }
コード例 #5
0
        /// <summary>
        /// Internal implementation of download attachment
        /// </summary>
        /// <param name="entityId"></param>
        /// <param name="entityName"></param>
        /// <param name="serverRelativeUrl"></param>
        /// <param name="documentType"></param>
        /// <param name="checkUser"></param>
        /// <returns></returns>
        private async Task <IActionResult> DownloadAttachmentInternal(string entityId, string entityName, [FromQuery] string serverRelativeUrl, [FromQuery] string documentType, bool checkUser)
        {
            // get the file.
            if (string.IsNullOrEmpty(serverRelativeUrl) || string.IsNullOrEmpty(documentType) || string.IsNullOrEmpty(entityId) || string.IsNullOrEmpty(entityName))
            {
                return(BadRequest());
            }

            var hasAccess = true;

            if (checkUser)
            {
                ValidateSession();
                hasAccess = await CanAccessEntityFile(entityName, entityId, documentType, serverRelativeUrl).ConfigureAwait(true);
            }

            if (!hasAccess)
            {
                return(BadRequest());
            }

            var logUrl = WordSanitizer.Sanitize(serverRelativeUrl);

            // call the web service
            var downloadRequest = new DownloadFileRequest
            {
                ServerRelativeUrl = serverRelativeUrl
            };

            var downloadResult = _fileManagerClient.DownloadFile(downloadRequest);

            if (downloadResult.ResultStatus == ResultStatus.Success)
            {
                // Update modifiedon to current time
                UpdateEntityModifiedOnDate(entityName, entityId, true);
                _logger.LogInformation($"SUCCESS in getting file {logUrl}");
                var fileContents = downloadResult.Data.ToByteArray();
                return(new FileContentResult(fileContents, "application/octet-stream"));
            }

            _logger.LogError($"ERROR in getting file {logUrl} - {downloadResult.ErrorDetail}");
            throw new Exception($"ERROR in getting file {logUrl} - {downloadResult.ErrorDetail}");
        }
コード例 #6
0
        /// <summary>
        /// Internal implementation of delete file
        /// </summary>
        /// <param name="serverRelativeUrl"></param>
        /// <param name="documentType"></param>
        /// <param name="entityId"></param>
        /// <param name="entityName"></param>
        /// <param name="checkUser">If true, check that the current user has access</param>
        /// <returns></returns>
        private async Task <IActionResult> DeleteFileInternal(string serverRelativeUrl, string documentType, string entityId, string entityName, bool checkUser)
        {
            // get the file.
            if (string.IsNullOrEmpty(entityId) || string.IsNullOrEmpty(entityName) || string.IsNullOrEmpty(serverRelativeUrl) || string.IsNullOrEmpty(documentType))
            {
                return(BadRequest());
            }

            var hasAccess = true;

            if (checkUser)
            {
                ValidateSession();
                hasAccess = await CanAccessEntityFile(entityName, entityId, documentType, serverRelativeUrl, true);
            }

            if (!hasAccess)
            {
                return(new NotFoundResult());
            }

            var logUrl = WordSanitizer.Sanitize(serverRelativeUrl);

            // call the web service
            var deleteRequest = new DeleteFileRequest
            {
                ServerRelativeUrl = serverRelativeUrl
            };

            var deleteResult = _fileManagerClient.DeleteFile(deleteRequest);

            if (deleteResult.ResultStatus == ResultStatus.Success)
            {
                // Update modifiedon to current time
                UpdateEntityModifiedOnDate(entityName, entityId, true);
                _logger.LogInformation($"SUCCESS in deleting file {serverRelativeUrl}");
                return(new OkResult());
            }

            _logger.LogError($"ERROR in deleting file {logUrl} - {deleteResult.ErrorDetail}");
            throw new Exception($"ERROR in deleting file {logUrl} - {deleteResult.ErrorDetail}");
        }
コード例 #7
0
        /// <summary>
        /// Internal implementation of upload attachment
        /// </summary>
        /// <param name="entityId"></param>
        /// <param name="entityName"></param>
        /// <param name="file"></param>
        /// <param name="documentType"></param>
        /// <param name="checkUser"></param>
        /// <returns></returns>
        private async Task <IActionResult> UploadAttachmentInternal(string entityId, string entityName,
                                                                    IFormFile file, string documentType, bool checkUser)
        {
            FileSystemItem result = null;

            if (string.IsNullOrEmpty(entityId) || string.IsNullOrEmpty(entityName) || string.IsNullOrEmpty(documentType))
            {
                return(BadRequest());
            }

            var hasAccess = true;

            if (checkUser)
            {
                ValidateSession();
                hasAccess = await CanAccessEntity(entityName, entityId).ConfigureAwait(true);
            }

            if (!hasAccess)
            {
                return(new NotFoundResult());
            }

            // Sanitize file name
            var illegalInFileName = new Regex(@"[#%*<>?{}~¿""]");
            var fileName          = illegalInFileName.Replace(file.FileName, "");

            illegalInFileName = new Regex(@"[&:/\\|]");
            fileName          = illegalInFileName.Replace(fileName, "-");

            fileName = FileSystemItemExtensions.CombineNameDocumentType(fileName, documentType);

            var folderName = await _dynamicsClient.GetFolderName(entityName, entityId).ConfigureAwait(true);

            _dynamicsClient.CreateEntitySharePointDocumentLocation(entityName, entityId, folderName, folderName);

            var ms = new MemoryStream();

            file.OpenReadStream().CopyTo(ms);
            var data = ms.ToArray();

            // call the web service
            var uploadRequest = new UploadFileRequest
            {
                ContentType = file.ContentType,
                Data        = ByteString.CopyFrom(data),
                EntityName  = entityName,
                FileName    = fileName,
                FolderName  = folderName
            };

            var uploadResult = _fileManagerClient.UploadFile(uploadRequest);

            var logFolderName = WordSanitizer.Sanitize(folderName);
            var logFileName   = WordSanitizer.Sanitize(fileName);

            if (uploadResult.ResultStatus == ResultStatus.Success)
            {
                // Update modifiedon to current time
                UpdateEntityModifiedOnDate(entityName, entityId, true);
                _logger.LogInformation($"SUCCESS in uploading file {logFileName} to folder {logFolderName}");
            }
            else
            {
                _logger.LogError($"ERROR in uploading file {logFileName} to folder {logFolderName}");
                throw new Exception($"ERROR in uploading file {logFileName} to folder {logFolderName}");
            }

            return(new JsonResult(result));
        }