From fd485e06e4829ed941d64c4bd9528a8cea90825c Mon Sep 17 00:00:00 2001 From: SuhorukovAnton Date: Mon, 7 Jun 2021 13:54:17 +0300 Subject: [PATCH 1/8] remove_binary_formatter --- .../CommonChunkedUploadSession.cs | 43 ++++++++++++++++--- .../CommonChunkedUploadSessionHolder.cs | 11 +++-- .../Core/Core/Entries/ChunkedUploadSession.cs | 22 +++++++++- products/ASC.Files/Core/Core/Entries/File.cs | 13 ++++-- .../ASC.Files/Core/Core/Entries/FileEntry.cs | 14 ++++-- .../HttpHandlers/ChunkedUploaderHandler.cs | 25 ++++++----- .../Core/Utils/ChunkedUploadSessionHolder.cs | 38 +++++++++++----- 7 files changed, 124 insertions(+), 42 deletions(-) diff --git a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs index bbcab626645..c4b7c3305dc 100644 --- a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs +++ b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs @@ -27,7 +27,9 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Runtime.Serialization.Formatters.Binary; +using System.Text.Json; namespace ASC.Core.ChunkedUploader { @@ -54,7 +56,7 @@ public class CommonChunkedUploadSession : ICloneable public string CultureName { get; set; } - public Dictionary Items = new Dictionary(); + public Dictionary Items { get; set; } = new Dictionary(); private const string TempPathKey = "TempPath"; public string TempPath @@ -91,16 +93,45 @@ public T GetItemOrDefault(string key) return Items.ContainsKey(key) && Items[key] is T t ? t : default; } - public Stream Serialize() + public virtual Stream Serialize() { - var stream = new MemoryStream(); - new BinaryFormatter().Serialize(stream, this); - return stream; + return null; } public static CommonChunkedUploadSession Deserialize(Stream stream) { - return (CommonChunkedUploadSession)new BinaryFormatter().Deserialize(stream); + var sr = new StreamReader(stream); + string str = sr.ReadToEnd(); + var CommonChunkedUploadSession = JsonSerializer.Deserialize(str); + CommonChunkedUploadSession.TransformItems(); + return CommonChunkedUploadSession; + } + + public void TransformItems() + { + var newItems = new Dictionary(); + foreach(var item in Items) + { + if (item.Value != null) + { + if (item.Value.GetType() == typeof(JsonElement)) + { + var value = (JsonElement)item.Value; + if (value.ValueKind == JsonValueKind.String) + { + newItems.Add(item.Key, item.Value.ToString()); + } + if (value.ValueKind == JsonValueKind.Array) + { + newItems.Add(item.Key, value.EnumerateArray().Select(o => o.ToString()).ToList()); + } + } + else + { + newItems.Add(item.Key, item.Value); + } + } + } } public virtual object Clone() diff --git a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs index 0b51e46baaf..54fb0544aa6 100644 --- a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs +++ b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSessionHolder.cs @@ -86,12 +86,11 @@ public void Remove(CommonChunkedUploadSession s) { DataStore.Delete(Domain, GetPathWithId(s.Id)); } - - public CommonChunkedUploadSession Get(string sessionId) - { - using var stream = DataStore.GetReadStream(Domain, GetPathWithId(sessionId)); - return CommonChunkedUploadSession.Deserialize(stream); - } + + public Stream GetStream(string sessionId) + { + return DataStore.GetReadStream(Domain, GetPathWithId(sessionId)); + } public void Init(CommonChunkedUploadSession chunkedUploadSession) { diff --git a/products/ASC.Files/Core/Core/Entries/ChunkedUploadSession.cs b/products/ASC.Files/Core/Core/Entries/ChunkedUploadSession.cs index 56306f31326..6d5c758d27f 100644 --- a/products/ASC.Files/Core/Core/Entries/ChunkedUploadSession.cs +++ b/products/ASC.Files/Core/Core/Entries/ChunkedUploadSession.cs @@ -27,8 +27,11 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Linq; - +using System.Text; +using System.Text.Json; + using ASC.Common; using ASC.Common.Logging; using ASC.Core.ChunkedUploader; @@ -62,6 +65,23 @@ public override object Clone() var clone = (ChunkedUploadSession)MemberwiseClone(); clone.File = (File)File.Clone(); return clone; + } + + public override Stream Serialize() + { + var str = JsonSerializer.Serialize(this); + var stream = new MemoryStream(Encoding.UTF8.GetBytes(str)); + return stream; + } + + public static ChunkedUploadSession Deserialize(Stream stream) + { + var sr = new StreamReader(stream); + string str = sr.ReadToEnd(); + var chunkedUploadSession = JsonSerializer.Deserialize>(str); + chunkedUploadSession.TransformItems(); + return chunkedUploadSession; + } } diff --git a/products/ASC.Files/Core/Core/Entries/File.cs b/products/ASC.Files/Core/Core/Entries/File.cs index 5a22a537ccd..a204ba71bb4 100644 --- a/products/ASC.Files/Core/Core/Entries/File.cs +++ b/products/ASC.Files/Core/Core/Entries/File.cs @@ -77,6 +77,11 @@ public File(Global global, FileUtility = fileUtility; FileConverter = fileConverter; FileTracker = fileTracker; + } + + public File() + { + } public int Version { get; set; } @@ -238,15 +243,15 @@ public string ConvertedExtension public object NativeAccessor { get; set; } [NonSerialized] - private FileTrackerHelper FileTracker; + public FileTrackerHelper FileTracker; [NonSerialized] - private readonly FilesLinkUtility FilesLinkUtility; + public FilesLinkUtility FilesLinkUtility; [NonSerialized] - private readonly FileUtility FileUtility; + public FileUtility FileUtility; [NonSerialized] - private readonly FileConverter FileConverter; + public FileConverter FileConverter; } } \ No newline at end of file diff --git a/products/ASC.Files/Core/Core/Entries/FileEntry.cs b/products/ASC.Files/Core/Core/Entries/FileEntry.cs index 920af3968bf..20edb91e7ff 100644 --- a/products/ASC.Files/Core/Core/Entries/FileEntry.cs +++ b/products/ASC.Files/Core/Core/Entries/FileEntry.cs @@ -38,6 +38,11 @@ public abstract class FileEntry : ICloneable public FileEntry(Global global) { Global = global; + } + + public FileEntry() + { + } public virtual string Title { get; set; } @@ -56,14 +61,12 @@ public string CreateByString public string CreateOnString { get { return CreateOn.Equals(default) ? null : CreateOn.ToString("g"); } - set { throw new NotImplementedException(); } } [JsonPropertyName("modified_on")] public string ModifiedOnString { get { return ModifiedOn.Equals(default) ? null : ModifiedOn.ToString("g"); } - set { throw new NotImplementedException(); } } [JsonPropertyName("modified_by_id")] @@ -105,7 +108,7 @@ public bool ProviderEntry public FileEntryType FileEntryType; [NonSerialized] - protected Global Global; + public Global Global; private string _modifiedByString; private string _createByString; @@ -127,6 +130,11 @@ public abstract class FileEntry : FileEntry, ICloneable { public FileEntry(Global global) : base(global) { + } + + public FileEntry() + { + } public T ID { get; set; } diff --git a/products/ASC.Files/Core/HttpHandlers/ChunkedUploaderHandler.cs b/products/ASC.Files/Core/HttpHandlers/ChunkedUploaderHandler.cs index ea4001d5488..e8ffba13a68 100644 --- a/products/ASC.Files/Core/HttpHandlers/ChunkedUploaderHandler.cs +++ b/products/ASC.Files/Core/HttpHandlers/ChunkedUploaderHandler.cs @@ -112,17 +112,20 @@ public ChunkedUploaderHandlerService( Logger = optionsMonitor.CurrentValue; } - public async Task Invoke(HttpContext context) - { - var uploadSession = ChunkedUploadSessionHolder.GetSession(context.Request.Query["uid"]); - - if (uploadSession as ChunkedUploadSession != null) - { - await Invoke(context); - return; - } - - await Invoke(context); + public async Task Invoke(HttpContext context) + { + try + { + var uploadSession = ChunkedUploadSessionHolder.GetSession(context.Request.Query["uid"]); + if (uploadSession != null) + { + await Invoke(context); + } + } + catch (Exception e) + { + await Invoke(context); + } } public async Task Invoke(HttpContext context) diff --git a/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs b/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs index cabf4d5c99f..8d706c178f4 100644 --- a/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs +++ b/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs @@ -31,8 +31,11 @@ using ASC.Common.Logging; using ASC.Core.ChunkedUploader; using ASC.Files.Core; +using ASC.Web.Core.Files; using ASC.Web.Files.Classes; using ASC.Web.Studio.Core; + +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -43,18 +46,21 @@ public class ChunkedUploadSessionHolder { public static readonly TimeSpan SlidingExpiration = TimeSpan.FromHours(12); - private IOptionsMonitor Options { get; } + private IOptionsMonitor Options { get; } + private IServiceProvider ServiceProvider { get; } private GlobalStore GlobalStore { get; } private SetupInfo SetupInfo { get; } private TempPath TempPath { get; } public ChunkedUploadSessionHolder( IOptionsMonitor options, + IServiceProvider serviceProvider, GlobalStore globalStore, SetupInfo setupInfo, TempPath tempPath) { - Options = options; + Options = options; + ServiceProvider = serviceProvider; GlobalStore = globalStore; SetupInfo = setupInfo; TempPath = tempPath; @@ -78,16 +84,26 @@ public void StoreSession(ChunkedUploadSession s) public void RemoveSession(ChunkedUploadSession s) { CommonSessionHolder(false).Remove(s); - } + } + + public ChunkedUploadSession GetSession(string sessionId) + { + using var stream = CommonSessionHolder(false).GetStream(sessionId); + var chunkedUploadSession = ChunkedUploadSession.Deserialize(stream); + chunkedUploadSession.File.Global = ServiceProvider.GetService(); + chunkedUploadSession.File.FilesLinkUtility = ServiceProvider.GetService(); + chunkedUploadSession.File.FileUtility = ServiceProvider.GetService(); + chunkedUploadSession.File.FileConverter = ServiceProvider.GetService(); + chunkedUploadSession.File.FileTracker = ServiceProvider.GetService(); + return chunkedUploadSession; + } + + public CommonChunkedUploadSession GetSession(string sessionId) + { + using var stream = CommonSessionHolder(false).GetStream(sessionId); + return CommonChunkedUploadSession.Deserialize(stream); + } - public ChunkedUploadSession GetSession(string sessionId) - { - return (ChunkedUploadSession)GetSession(sessionId); - } - public CommonChunkedUploadSession GetSession(string sessionId) - { - return CommonSessionHolder(false).Get(sessionId); - } public ChunkedUploadSession CreateUploadSession(File file, long contentLength) { From 50f0bef484502fa08f1026eee3ee9d2fd6d7b56f Mon Sep 17 00:00:00 2001 From: SuhorukovAnton Date: Mon, 7 Jun 2021 13:56:24 +0300 Subject: [PATCH 2/8] remove unnecessary using --- .../ChunkedUploader/CommonChunkedUploadSession.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs index c4b7c3305dc..cec1aed3703 100644 --- a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs +++ b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs @@ -28,7 +28,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.Serialization.Formatters.Binary; using System.Text.Json; namespace ASC.Core.ChunkedUploader From a82efce2a181c65c0553567e843037295f1c2c33 Mon Sep 17 00:00:00 2001 From: SuhorukovAnton Date: Thu, 10 Jun 2021 17:53:06 +0300 Subject: [PATCH 3/8] add fileHelper --- .../CommonChunkedUploadSession.cs | 12 ++ .../Storage/DocumentsBackupStorage.cs | 2 +- .../Core/Core/Dao/TeamlabDao/DaoFactory.cs | 9 +- .../Core/Core/Dao/TeamlabDao/FileDao.cs | 14 ++- .../Core/Core/Dao/TeamlabDao/FolderDao.cs | 9 +- products/ASC.Files/Core/Core/Entries/File.cs | 102 +++------------- .../ASC.Files/Core/Core/Entries/FileEntry.cs | 64 +++------- .../ASC.Files/Core/Core/Entries/FileHelper.cs | 110 ++++++++++++++++++ .../ASC.Files/Core/Core/Entries/Folder.cs | 4 +- .../ASC.Files/Core/Core/FileStorageService.cs | 14 ++- .../Core/Core/Thirdparty/CrossDao.cs | 2 +- .../Core/Thirdparty/IThirdPartyProviderDao.cs | 6 +- .../ProviderDao/ProviderSecutiryDao.cs | 4 +- .../SharePoint/SharePointProviderInfo.cs | 10 +- .../ASC.Files/Core/Helpers/DocuSignHelper.cs | 5 +- products/ASC.Files/Core/Helpers/Global.cs | 5 +- .../Core/HttpHandlers/FileHandler.ashx.cs | 4 +- .../Core/HttpHandlers/SearchHandler.cs | 71 ++++++----- products/ASC.Files/Core/Model/FileWrapper.cs | 18 ++- .../Services/DocumentService/Configuration.cs | 11 +- .../ASC.Files/Core/ThirdPartyApp/BoxApp.cs | 7 +- .../Core/ThirdPartyApp/GoogleDriveApp.cs | 7 +- .../Core/Utils/ChunkedUploadSessionHolder.cs | 15 +-- products/ASC.Files/Core/Utils/EntryManager.cs | 17 ++- .../ASC.Files/Core/Utils/FileConverter.cs | 2 +- .../ASC.Files/Core/Utils/FileShareLink.cs | 22 ++-- products/ASC.Files/Core/Utils/FileUploader.cs | 8 +- 27 files changed, 295 insertions(+), 259 deletions(-) create mode 100644 products/ASC.Files/Core/Core/Entries/FileHelper.cs diff --git a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs index cec1aed3703..1c52f4b5291 100644 --- a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs +++ b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs @@ -29,6 +29,7 @@ using System.IO; using System.Linq; using System.Text.Json; +using System.Text.Json.Serialization; namespace ASC.Core.ChunkedUploader { @@ -58,6 +59,8 @@ public class CommonChunkedUploadSession : ICloneable public Dictionary Items { get; set; } = new Dictionary(); private const string TempPathKey = "TempPath"; + + [JsonIgnore] public string TempPath { get { return GetItemOrDefault(TempPathKey); } @@ -65,6 +68,8 @@ public string TempPath } private const string UploadIdKey = "UploadId"; + + [JsonIgnore] public string UploadId { get { return GetItemOrDefault(UploadIdKey); } @@ -72,6 +77,8 @@ public string UploadId } private const string ChunksBufferKey = "ChunksBuffer"; + + [JsonIgnore] public string ChunksBuffer { get { return GetItemOrDefault(ChunksBufferKey); } @@ -120,6 +127,10 @@ public void TransformItems() { newItems.Add(item.Key, item.Value.ToString()); } + if (value.ValueKind == JsonValueKind.Number) + { + newItems.Add(item.Key, Int32.Parse(item.Value.ToString())); + } if (value.ValueKind == JsonValueKind.Array) { newItems.Add(item.Key, value.EnumerateArray().Select(o => o.ToString()).ToList()); @@ -131,6 +142,7 @@ public void TransformItems() } } } + Items = newItems; } public virtual object Clone() diff --git a/common/services/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs b/common/services/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs index d07ddef30a5..2613506fa2b 100644 --- a/common/services/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs +++ b/common/services/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs @@ -145,7 +145,7 @@ private T Upload(T folderId, string localPath) } using var source = File.OpenRead(localPath); - var newFile = ServiceProvider.GetService>(); + var newFile = new File(); newFile.Title = Path.GetFileName(localPath); newFile.FolderID = folder.ID; newFile.ContentLength = source.Length; diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/DaoFactory.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/DaoFactory.cs index d239835e94d..b05c71c0067 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/DaoFactory.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/DaoFactory.cs @@ -71,16 +71,13 @@ public class DaoFactoryExtension { public static void Register(DIHelper services) { - services.TryAdd>(); - services.TryAdd, FileDao>(); + services.TryAdd>(); + services.TryAdd>(); - services.TryAdd>(); + services.TryAdd, FileDao>(); services.TryAdd, ProviderFileDao>(); - services.TryAdd>(); services.TryAdd, FolderDao>(); - - services.TryAdd>(); services.TryAdd, ProviderFolderDao>(); services.TryAdd>(); diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs index 30a9edb2854..735977e1d68 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs @@ -823,8 +823,10 @@ public File CopyFile(int fileId, int toFolderId) var file = GetFile(fileId); if (file != null) { - var copy = ServiceProvider.GetService>(); - copy.FileStatus = file.FileStatus; + var copy = new File(); + var fileHelper = ServiceProvider.GetService>(); + fileHelper.FileEntry = file; + copy._status = fileHelper.FileStatus; copy.FolderID = toFolderId; copy.Title = file.Title; copy.ConvertedType = file.ConvertedType; @@ -1039,7 +1041,7 @@ private File GetFileForCommit(ChunkedUploadSession uploadSession) return file; } - var result = ServiceProvider.GetService>(); + var result = new File(); result.FolderID = uploadSession.File.FolderID; result.Title = uploadSession.File.Title; result.ContentLength = uploadSession.BytesTotal; @@ -1429,7 +1431,7 @@ select f public File ToFile(DbFileQuery r) { - var file = ServiceProvider.GetService>(); + var file = new File(); if (r == null) return null; file.ID = r.File.Id; file.Title = r.File.Title; @@ -1479,7 +1481,7 @@ internal protected DbFile InitDocument(DbFile dbFile) return dbFile; } - var file = ServiceProvider.GetService>(); + var file = new File(); file.ID = dbFile.Id; file.Title = dbFile.Title; file.Version = dbFile.Version; @@ -1513,7 +1515,7 @@ internal protected async Task InitDocumentAsync(DbFile dbFile) return dbFile; } - var file = ServiceProvider.GetService>(); + var file = new File(); file.ID = dbFile.Id; file.Title = dbFile.Title; file.Version = dbFile.Version; diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs index 3809b38ad01..74380e440b9 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs @@ -50,7 +50,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.Extensions.DependencyInjection; namespace ASC.Files.Core.Data { @@ -576,7 +575,7 @@ public Folder CopyFolder(int folderId, int toFolderId, CancellationToken? c if (folder.FolderType == FolderType.BUNCH) folder.FolderType = FolderType.DEFAULT; - var copy = ServiceProvider.GetService>(); + var copy = new Folder(); copy.FolderID = toFolderId; copy.RootFolderId = toFolder.RootFolderId; copy.RootFolderCreator = toFolder.RootFolderCreator; @@ -834,7 +833,7 @@ public IEnumerable GetFolderIDs(string module, string bunch, IEnumerable>(); + var folder = new Folder(); switch (bunch) { case my: @@ -918,7 +917,7 @@ public int GetFolderID(string module, string bunch, string data, bool createIfNo var newFolderId = 0; if (createIfNotExists) { - var folder = ServiceProvider.GetService>(); + var folder = new Folder(); folder.FolderID = 0; switch (bunch) { @@ -1090,7 +1089,7 @@ select f public Folder ToFolder(DbFolderQuery r) { if (r == null) return null; - var result = ServiceProvider.GetService>(); + var result = new Folder(); result.ID = r.Folder.Id; result.FolderID = r.Folder.ParentId; result.Title = r.Folder.Title; diff --git a/products/ASC.Files/Core/Core/Entries/File.cs b/products/ASC.Files/Core/Core/Entries/File.cs index a204ba71bb4..f363228fc2a 100644 --- a/products/ASC.Files/Core/Core/Entries/File.cs +++ b/products/ASC.Files/Core/Core/Entries/File.cs @@ -30,8 +30,6 @@ using ASC.Common; using ASC.Web.Core.Files; -using ASC.Web.Files.Classes; -using ASC.Web.Files.Utils; using ASC.Web.Studio.Core; namespace ASC.Files.Core @@ -61,63 +59,38 @@ public enum FileStatus [DebuggerDisplay("{Title} ({ID} v{Version})")] public class File : FileEntry { - private FileStatus _status; - - public File(Global global, - FilesLinkUtility filesLinkUtility, - FileUtility fileUtility, - FileConverter fileConverter, - FileTrackerHelper fileTracker) - : base(global) - { - Version = 1; - VersionGroup = 1; - FileEntryType = FileEntryType.File; - FilesLinkUtility = filesLinkUtility; - FileUtility = fileUtility; - FileConverter = fileConverter; - FileTracker = fileTracker; - } + public FileStatus _status; + public File() { - + Version = 1; + VersionGroup = 1; + FileEntryType = FileEntryType.File; } public int Version { get; set; } - [JsonPropertyName("version_group")] public int VersionGroup { get; set; } public string Comment { get; set; } - + + [JsonIgnore] public string PureTitle { - get { return base.Title; } - set { base.Title = value; } + get { return Title; } + set { Title = value; } } - public override string Title - { - get - { - return string.IsNullOrEmpty(ConvertedType) - ? base.Title - : FileUtility.ReplaceFileExtension(base.Title, FileUtility.GetInternalExtension(base.Title)); - } - set { base.Title = value; } - } - - [JsonPropertyName("content_length")] public long ContentLength { get; set; } - - [JsonPropertyName("content_length_string")] + + [JsonIgnore] public string ContentLengthString { get { return FileSizeComment.FilesSizeToString(ContentLength); } - set { } } - + + [JsonIgnore] public FilterType FilterType { get @@ -143,36 +116,11 @@ public FilterType FilterType } } - [JsonPropertyName("file_status")] - public FileStatus FileStatus - { - get - { - if (FileTracker.IsEditing(ID)) - { - _status |= FileStatus.IsEditing; - } - - if (FileTracker.IsEditingAlone(ID)) - { - _status |= FileStatus.IsEditingAlone; - } - - if (FileConverter.IsConverting(this)) - { - _status |= FileStatus.IsConverting; - } - - return _status; - } - set { _status = value; } - } - public bool Locked { get; set; } - [JsonPropertyName("locked_by")] public string LockedBy { get; set; } - + + [JsonIgnore] public override bool IsNew { get { return (_status & FileStatus.IsNew) == FileStatus.IsNew; } @@ -211,18 +159,13 @@ public bool IsTemplate public bool Encrypted { get; set; } - [JsonPropertyName("thumbnail_status")] public Thumbnail ThumbnailStatus { get; set; } public ForcesaveType Forcesave { get; set; } - public string DownloadUrl - { - get { return FilesLinkUtility.GetFileDownloadUrl(ID); } - } - public string ConvertedType { get; set; } - + + [JsonIgnore] public string ConvertedExtension { get @@ -241,17 +184,6 @@ public string ConvertedExtension } public object NativeAccessor { get; set; } - - [NonSerialized] - public FileTrackerHelper FileTracker; - - [NonSerialized] - public FilesLinkUtility FilesLinkUtility; - - [NonSerialized] - public FileUtility FileUtility; - [NonSerialized] - public FileConverter FileConverter; } } \ No newline at end of file diff --git a/products/ASC.Files/Core/Core/Entries/FileEntry.cs b/products/ASC.Files/Core/Core/Entries/FileEntry.cs index 20edb91e7ff..f4639ef3451 100644 --- a/products/ASC.Files/Core/Core/Entries/FileEntry.cs +++ b/products/ASC.Files/Core/Core/Entries/FileEntry.cs @@ -28,68 +28,41 @@ using System.Text.Json.Serialization; using ASC.Files.Core.Security; -using ASC.Web.Files.Classes; namespace ASC.Files.Core { [Serializable] public abstract class FileEntry : ICloneable { - public FileEntry(Global global) - { - Global = global; - } - - public FileEntry() - { - - } - - public virtual string Title { get; set; } + public string Title { get; set; } - [JsonPropertyName("create_by_id")] public Guid CreateBy { get; set; } - - [JsonPropertyName("create_by")] - public string CreateByString - { - get { return !CreateBy.Equals(Guid.Empty) ? Global.GetUserName(CreateBy) : _createByString; } - set { _createByString = value; } - } - - [JsonPropertyName("create_on")] + + [JsonIgnore] public string CreateOnString { get { return CreateOn.Equals(default) ? null : CreateOn.ToString("g"); } } - - [JsonPropertyName("modified_on")] + + [JsonIgnore] public string ModifiedOnString { get { return ModifiedOn.Equals(default) ? null : ModifiedOn.ToString("g"); } } - [JsonPropertyName("modified_by_id")] public Guid ModifiedBy { get; set; } - [JsonPropertyName("modified_by")] - public string ModifiedByString - { - get { return !ModifiedBy.Equals(Guid.Empty) ? Global.GetUserName(ModifiedBy) : _modifiedByString; } - set { _modifiedByString = value; } - } - public string Error { get; set; } public FileShare Access { get; set; } public bool Shared { get; set; } - [JsonPropertyName("provider_id")] public int ProviderId { get; set; } - [JsonPropertyName("provider_key")] - public string ProviderKey { get; set; } + public string ProviderKey { get; set; } + + [JsonIgnore] public bool ProviderEntry { get { return !string.IsNullOrEmpty(ProviderKey); } @@ -107,12 +80,8 @@ public bool ProviderEntry public FileEntryType FileEntryType; - [NonSerialized] - public Global Global; - - private string _modifiedByString; - private string _createByString; - + public string _modifiedByString; + public string _createByString; public override string ToString() { @@ -128,14 +97,6 @@ public object Clone() [Serializable] public abstract class FileEntry : FileEntry, ICloneable { - public FileEntry(Global global) : base(global) - { - } - - public FileEntry() - { - - } public T ID { get; set; } @@ -143,7 +104,6 @@ public FileEntry() private T _folderIdDisplay; - [JsonPropertyName("folder_id")] public T FolderIdDisplay { get @@ -155,7 +115,9 @@ public T FolderIdDisplay set { _folderIdDisplay = value; } } - public T RootFolderId { get; set; } + public T RootFolderId { get; set; } + + [JsonIgnore] public string UniqID { get { return string.Format("{0}_{1}", GetType().Name.ToLower(), ID); } diff --git a/products/ASC.Files/Core/Core/Entries/FileHelper.cs b/products/ASC.Files/Core/Core/Entries/FileHelper.cs new file mode 100644 index 00000000000..e6b012dd1e5 --- /dev/null +++ b/products/ASC.Files/Core/Core/Entries/FileHelper.cs @@ -0,0 +1,110 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2021 + * + * This program is freeware. You can redistribute it and/or modify it under the terms of the GNU + * General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html). + * In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that + * Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights. + * + * THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html + * + * You can contact Ascensio System SIA by email at sales@onlyoffice.com + * + * The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display + * Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3. + * + * Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains + * relevant author attributions when distributing the software. If the display of the logo in its graphic + * form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE" + * in every copy of the program you distribute. + * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. + * +*/ + +using System; + +using ASC.Common; +using ASC.Web.Core.Files; +using ASC.Web.Files.Classes; +using ASC.Web.Files.Utils; + +namespace ASC.Files.Core +{ + [Transient] + public class FileHelper + { + private FileTrackerHelper FileTracker { get; set; } + + private FilesLinkUtility FilesLinkUtility { get; set; } + + private FileUtility FileUtility { get; set; } + + private FileConverter FileConverter { get; set; } + + private Global Global { get; set; } + + public FileEntry FileEntry { get; set; } + + public FileHelper(FileTrackerHelper fileTracker, FilesLinkUtility filesLinkUtility, FileUtility fileUtility, FileConverter fileConverter, Global global) + { + FileTracker = fileTracker; + FilesLinkUtility = filesLinkUtility; + FileUtility = fileUtility; + FileConverter = fileConverter; + Global = global; + } + + public string CreateByString + { + get { return !FileEntry.CreateBy.Equals(Guid.Empty) ? Global.GetUserName(FileEntry.CreateBy) : FileEntry._createByString; } + } + + public string ModifiedByString + { + get { return !FileEntry.ModifiedBy.Equals(Guid.Empty) ? Global.GetUserName(FileEntry.ModifiedBy) : FileEntry._modifiedByString; } + } + + public string Title + { + get + { + var File = (File)FileEntry; + return string.IsNullOrEmpty(File.ConvertedType) + ? File.Title + : FileUtility.ReplaceFileExtension(File.Title, FileUtility.GetInternalExtension(File.Title)); + } + } + + public FileStatus FileStatus + { + get + { + + var File = (File)FileEntry; + if (FileTracker.IsEditing(File.ID)) + { + File._status |= FileStatus.IsEditing; + } + + if (FileTracker.IsEditingAlone(File.ID)) + { + File._status |= FileStatus.IsEditingAlone; + } + + if (FileConverter.IsConverting(File)) + { + File._status |= FileStatus.IsConverting; + } + + return File._status; + } + } + + public string DownloadUrl + { + get { return FilesLinkUtility.GetFileDownloadUrl(((FileEntry)FileEntry).ID); } + } + } +} diff --git a/products/ASC.Files/Core/Core/Entries/Folder.cs b/products/ASC.Files/Core/Core/Entries/Folder.cs index 5927a8a0d97..dcdd2bed22b 100644 --- a/products/ASC.Files/Core/Core/Entries/Folder.cs +++ b/products/ASC.Files/Core/Core/Entries/Folder.cs @@ -28,7 +28,6 @@ using System.Diagnostics; using ASC.Common; -using ASC.Web.Files.Classes; namespace ASC.Files.Core { @@ -84,8 +83,7 @@ public override bool IsNew set { NewForMe = Convert.ToInt32(value); } } - public Folder(Global global) - : base(global) + public Folder() { Title = string.Empty; FileEntryType = FileEntryType.Folder; diff --git a/products/ASC.Files/Core/Core/FileStorageService.cs b/products/ASC.Files/Core/Core/FileStorageService.cs index 0901526ea55..3396ffdea05 100644 --- a/products/ASC.Files/Core/Core/FileStorageService.cs +++ b/products/ASC.Files/Core/Core/FileStorageService.cs @@ -405,7 +405,7 @@ public Folder CreateNewFolder(T parentId, string title) try { - var newFolder = ServiceProvider.GetService>(); + var newFolder = new Folder(); newFolder.Title = title; newFolder.FolderID = parent.ID; @@ -578,7 +578,7 @@ public File CreateNewFile(FileModel fileWrapper, bool enableExternalExt = } - var file = ServiceProvider.GetService>(); + var file = new File(); file.FolderID = folder.ID; file.Comment = FilesCommonResource.CommentCreate; @@ -1532,7 +1532,7 @@ public ItemList CheckConversion(ItemList> if (file == null) { - var newFile = ServiceProvider.GetService>(); + var newFile = new File(); newFile.ID = fileId; newFile.Version = version; @@ -1602,7 +1602,7 @@ public void ReassignStorage(Guid userFromId, Guid userToId) { //create folder with name userFrom in folder userTo var folderIdToMy = folderDao.GetFolderIDUser(true, userTo.ID); - var newFolder = ServiceProvider.GetService>(); + var newFolder = new Folder(); newFolder.Title = string.Format(CustomNamingPeople.Substitute("TitleDeletedUserFolder"), userFrom.DisplayUserName(false, DisplayUserSettingsHelper)); newFolder.FolderID = folderIdToMy; @@ -2138,12 +2138,14 @@ public IEnumerable ChangeOwner(IEnumerable foldersId, IEnumerable< var newFile = file; if (file.CreateBy != userInfo.ID) { - newFile = ServiceProvider.GetService>(); + newFile = new File(); + var fileHelper = ServiceProvider.GetService>(); + fileHelper.FileEntry = file; newFile.ID = file.ID; newFile.Version = file.Version + 1; newFile.VersionGroup = file.VersionGroup + 1; newFile.Title = file.Title; - newFile.FileStatus = file.FileStatus; + newFile._status = fileHelper.FileStatus; newFile.FolderID = file.FolderID; newFile.CreateBy = userInfo.ID; newFile.CreateOn = file.CreateOn; diff --git a/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs b/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs index f6a4a4cd89d..fccf878d2c2 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs @@ -118,7 +118,7 @@ public Folder PerformCrossDaoFolderCopy { var fromFolder = fromFolderDao.GetFolder(fromConverter(fromFolderId)); - var toFolder1 = ServiceProvider.GetService>(); + var toFolder1 = new Folder(); toFolder1.Title = fromFolder.Title; toFolder1.FolderID = toConverter(toRootFolderId); diff --git a/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs b/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs index d654156afc2..4b09eb39cda 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs @@ -20,7 +20,6 @@ using ASC.Web.Studio.Core; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using FileShare = ASC.Files.Core.Security.FileShare; @@ -290,7 +289,7 @@ protected string MappingID(string id, bool saveIfNotExist = false) protected Folder GetFolder() { - var folder = ServiceProvider.GetService>(); + var folder = new Folder(); InitFileEntry(folder); @@ -315,12 +314,11 @@ protected Folder GetErrorFolder(ErrorEntry entry) protected File GetFile() { - var file = ServiceProvider.GetService>(); + var file = new File(); InitFileEntry(file); file.Access = FileShare.None; - file.FileStatus = FileStatus.None; file.Shared = false; file.Version = 1; diff --git a/products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderSecutiryDao.cs b/products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderSecutiryDao.cs index e0ab9148713..c8182e8b92c 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderSecutiryDao.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderSecutiryDao.cs @@ -35,8 +35,6 @@ using ASC.Files.Core.Security; using ASC.Files.Core.Thirdparty; -using Microsoft.Extensions.DependencyInjection; - namespace ASC.Files.Thirdparty.ProviderDao { [Scope] @@ -155,7 +153,7 @@ private List GetShareForFolders(IReadOnlyCollection>(); + var f = new Folder(); f.ID = pureShareRecord.EntryId.ToString(); pureShareRecord.Level = parentFolders.IndexOf(f); diff --git a/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointProviderInfo.cs b/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointProviderInfo.cs index 0b3d6cadbce..c14afc90e57 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointProviderInfo.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointProviderInfo.cs @@ -37,9 +37,8 @@ using ASC.Common.Logging; using ASC.Core.Tenants; using ASC.Files.Core; -using ASC.Web.Files.Classes; - -using Microsoft.Extensions.DependencyInjection; +using ASC.Web.Files.Classes; + using Microsoft.Extensions.Options; using Microsoft.SharePoint.Client; @@ -281,7 +280,7 @@ public File ToFile(File file) if (file == null) return null; - var result = ServiceProvider.GetService>(); + var result = new File(); if (file is SharePointFileErrorEntry errorFile) { @@ -307,7 +306,6 @@ public File ToFile(File file) //ContentLength = file.Length, result.CreateBy = Owner; result.CreateOn = file.TimeCreated.Kind == DateTimeKind.Utc ? TenantUtil.DateTimeFromUtc(file.TimeCreated) : file.TimeCreated; - result.FileStatus = FileStatus.None; result.FolderID = MakeId(GetParentFolderId(file.ServerRelativeUrl)); result.ModifiedBy = Owner; result.ModifiedOn = file.TimeLastModified.Kind == DateTimeKind.Utc ? TenantUtil.DateTimeFromUtc(file.TimeLastModified) : file.TimeLastModified; @@ -498,7 +496,7 @@ public Folder ToFolder(Folder folder) { if (folder == null) return null; - var result = ServiceProvider.GetService>(); + var result = new Folder(); if (folder is SharePointFolderErrorEntry errorFolder) { diff --git a/products/ASC.Files/Core/Helpers/DocuSignHelper.cs b/products/ASC.Files/Core/Helpers/DocuSignHelper.cs index e62a185ef88..de4d4aa2367 100644 --- a/products/ASC.Files/Core/Helpers/DocuSignHelper.cs +++ b/products/ASC.Files/Core/Helpers/DocuSignHelper.cs @@ -55,9 +55,8 @@ using DocuSign.eSign.Api; using DocuSign.eSign.Client; -using DocuSign.eSign.Model; +using DocuSign.eSign.Model; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.Extensions.Primitives; @@ -408,7 +407,7 @@ public File SaveDocument(string envelopeId, string documentId, string docu } } - var file = ServiceProvider.GetService>(); + var file = new File(); file.FolderID = folderId; file.Comment = FilesCommonResource.CommentCreateByDocuSign; file.Title = FileUtility.ReplaceFileExtension(documentName, ".pdf"); diff --git a/products/ASC.Files/Core/Helpers/Global.cs b/products/ASC.Files/Core/Helpers/Global.cs index 088f6a3d88b..f9bc4ac2eea 100644 --- a/products/ASC.Files/Core/Helpers/Global.cs +++ b/products/ASC.Files/Core/Helpers/Global.cs @@ -47,7 +47,6 @@ using ASC.Web.Files.Utils; using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Constants = ASC.Core.Configuration.Constants; @@ -572,7 +571,7 @@ private void SaveStartDocument(FileMarker fileMarker, IFolderDao folderDao foreach (var folderName in storeTemplate.ListDirectoriesRelative(path, false)) { - var folder = ServiceProvider.GetService>(); + var folder = new Folder(); folder.Title = folderName; folder.FolderID = folderId; @@ -591,7 +590,7 @@ private void SaveFile(FileMarker fileMarker, IFileDao fileDao, T folder, s return; var fileName = Path.GetFileName(filePath); - var file = ServiceProvider.GetService>(); + var file = new File(); file.Title = fileName; file.FolderID = folder; diff --git a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs index ee484f3f7a2..e1e44756b7e 100644 --- a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs +++ b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs @@ -1144,7 +1144,7 @@ private File CreateFileFromTemplate(Folder folder, string fileTitle, st fileTitle += fileExt; } - var file = ServiceProvider.GetService>(); + var file = new File(); file.Title = fileTitle; file.FolderID = folder.ID; file.Comment = FilesCommonResource.CommentCreate; @@ -1160,7 +1160,7 @@ private File CreateFileFromUri(Folder folder, string fileUri, string fi if (string.IsNullOrEmpty(fileTitle)) fileTitle = Path.GetFileName(HttpUtility.UrlDecode(fileUri)); - var file = ServiceProvider.GetService>(); + var file = new File(); file.Title = fileTitle; file.FolderID = folder.ID; file.Comment = FilesCommonResource.CommentCreate; diff --git a/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs b/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs index c5a59022bc5..81d95c72bc8 100644 --- a/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs +++ b/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs @@ -39,6 +39,8 @@ using ASC.Web.Files.Utils; using ASC.Web.Studio.Core; +using Microsoft.Extensions.DependencyInjection; + namespace ASC.Web.Files.Configuration { public class SearchHandler @@ -72,6 +74,7 @@ public string SearchName private FileUtility FileUtility { get; } private PathProvider PathProvider { get; } private ThirdpartyConfiguration ThirdpartyConfiguration { get; } + private IServiceProvider ServiceProvider { get; } public SearchHandler( FileSecurity fileSecurity, @@ -82,7 +85,8 @@ public SearchHandler( FilesLinkUtility filesLinkUtility, FileUtility fileUtility, PathProvider pathProvider, - ThirdpartyConfiguration thirdpartyConfiguration) + ThirdpartyConfiguration thirdpartyConfiguration, + IServiceProvider serviceProvider) { FileSecurity = fileSecurity; DaoFactory = daoFactory; @@ -93,6 +97,7 @@ public SearchHandler( FileUtility = fileUtility; PathProvider = pathProvider; ThirdpartyConfiguration = thirdpartyConfiguration; + ServiceProvider = serviceProvider; } public IEnumerable> SearchFiles(string text) @@ -130,39 +135,49 @@ public IEnumerable> SearchFolders(string text) public SearchResultItem[] Search(string text) { var folderDao = DaoFactory.GetFolderDao(); - var result = SearchFiles(text) - .Select(r => new SearchResultItem - { - Name = r.Title ?? string.Empty, - Description = string.Empty, - URL = FilesLinkUtility.GetFileWebPreviewUrl(FileUtility, r.Title, r.ID), - Date = r.ModifiedOn, - Additional = new Dictionary + var files = SearchFiles(text); + var helper = ServiceProvider.GetService>(); + List list = new List(); + foreach (var file in files) + { + helper.FileEntry = file; + var searchResultItem = new SearchResultItem + { + Name = file.Title ?? string.Empty, + Description = string.Empty, + URL = FilesLinkUtility.GetFileWebPreviewUrl(FileUtility, file.Title, file.ID), + Date = file.ModifiedOn, + Additional = new Dictionary { - { "Author", r.CreateByString.HtmlEncode() }, - { "Path", FolderPathBuilder(EntryManager.GetBreadCrumbs(r.FolderID, folderDao)) }, - { "Size", FileSizeComment.FilesSizeToString(r.ContentLength) } + { "Author", helper.CreateByString.HtmlEncode() }, + { "Path", FolderPathBuilder(EntryManager.GetBreadCrumbs(file.FolderID, folderDao)) }, + { "Size", FileSizeComment.FilesSizeToString(file.ContentLength) } } - } - ); - - var resultFolder = SearchFolders(text) - .Select(f => - new SearchResultItem - { - Name = f.Title ?? string.Empty, - Description = string.Empty, - URL = PathProvider.GetFolderUrl(f), - Date = f.ModifiedOn, - Additional = new Dictionary + }; + list.Add(searchResultItem); + } + + var folders = SearchFolders(text); + foreach (var folder in folders) + { + helper.FileEntry = folder; + var searchResultItem = new SearchResultItem + { + Name = folder.Title ?? string.Empty, + Description = string.Empty, + URL = PathProvider.GetFolderUrl(folder), + Date = folder.ModifiedOn, + Additional = new Dictionary { - { "Author", f.CreateByString.HtmlEncode() }, - { "Path", FolderPathBuilder(EntryManager.GetBreadCrumbs(f.ID, folderDao)) }, + { "Author", helper.CreateByString.HtmlEncode() }, + { "Path", FolderPathBuilder(EntryManager.GetBreadCrumbs(folder.ID, folderDao)) }, { "IsFolder", true } } - }); + }; + list.Add(searchResultItem); + } - return result.Concat(resultFolder).ToArray(); + return list.ToArray(); } private static string FolderPathBuilder(IEnumerable folders) diff --git a/products/ASC.Files/Core/Model/FileWrapper.cs b/products/ASC.Files/Core/Model/FileWrapper.cs index 795aae879f6..eb945b099ba 100644 --- a/products/ASC.Files/Core/Model/FileWrapper.cs +++ b/products/ASC.Files/Core/Model/FileWrapper.cs @@ -40,6 +40,8 @@ using ASC.Web.Files.Classes; using ASC.Web.Studio.Utility; +using Microsoft.Extensions.DependencyInjection; + using FileShare = ASC.Files.Core.Security.FileShare; namespace ASC.Api.Documents { @@ -153,7 +155,8 @@ public class FileWrapperHelper : FileEntryWrapperHelper private GlobalFolderHelper GlobalFolderHelper { get; } private CommonLinkUtility CommonLinkUtility { get; } private FilesLinkUtility FilesLinkUtility { get; } - private FileUtility FileUtility { get; } + private FileUtility FileUtility { get; } + private IServiceProvider ServiceProvider { get; } public FileWrapperHelper( ApiDateTimeHelper apiDateTimeHelper, @@ -164,7 +167,8 @@ public FileWrapperHelper( GlobalFolderHelper globalFolderHelper, CommonLinkUtility commonLinkUtility, FilesLinkUtility filesLinkUtility, - FileUtility fileUtility) + FileUtility fileUtility, + IServiceProvider serviceProvider) : base(apiDateTimeHelper, employeeWrapperHelper) { AuthContext = authContext; @@ -173,7 +177,8 @@ public FileWrapperHelper( GlobalFolderHelper = globalFolderHelper; CommonLinkUtility = commonLinkUtility; FilesLinkUtility = filesLinkUtility; - FileUtility = fileUtility; + FileUtility = fileUtility; + ServiceProvider = serviceProvider; } public FileWrapper Get(File file, List, bool>> folders = null) @@ -212,6 +217,9 @@ public FileWrapper Get(File file, List, bool>> folde private FileWrapper GetFileWrapper(File file) { + var fileHelper = ServiceProvider.GetService>(); + fileHelper.FileEntry = file; + var result = Get, T>(file); result.FileExst = FileUtility.GetFileExtension(file.Title); @@ -219,7 +227,7 @@ private FileWrapper GetFileWrapper(File file) result.Version = file.Version; result.VersionGroup = file.VersionGroup; result.ContentLength = file.ContentLengthString; - result.FileStatus = file.FileStatus; + result.FileStatus = fileHelper.FileStatus; result.PureContentLength = file.ContentLength.NullIfDefault(); result.Comment = file.Comment; result.Encrypted = file.Encrypted.NullIfDefault(); @@ -228,7 +236,7 @@ private FileWrapper GetFileWrapper(File file) try { - result.ViewUrl = CommonLinkUtility.GetFullAbsolutePath(file.DownloadUrl); + result.ViewUrl = CommonLinkUtility.GetFullAbsolutePath(fileHelper.DownloadUrl); result.WebUrl = CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.GetFileWebPreviewUrl(FileUtility, file.Title, file.ID, file.Version)); diff --git a/products/ASC.Files/Core/Services/DocumentService/Configuration.cs b/products/ASC.Files/Core/Services/DocumentService/Configuration.cs index 023a4c4b68c..ed46395456e 100644 --- a/products/ASC.Files/Core/Services/DocumentService/Configuration.cs +++ b/products/ASC.Files/Core/Services/DocumentService/Configuration.cs @@ -200,17 +200,19 @@ public string Url [Transient] public class InfoConfig { - public File File; + public File File; + private FileHelper FileHelper; public EditorType Type = EditorType.Desktop; private string _breadCrumbs; - public InfoConfig(BreadCrumbsManager breadCrumbsManager, FileSharing fileSharing, SecurityContext securityContext, UserManager userManager) + public InfoConfig(BreadCrumbsManager breadCrumbsManager, FileSharing fileSharing, SecurityContext securityContext, UserManager userManager, FileHelper fileHelper) { BreadCrumbsManager = breadCrumbsManager; FileSharing = fileSharing; SecurityContext = securityContext; UserManager = userManager; + FileHelper = fileHelper; } public bool? Favorite @@ -245,7 +247,10 @@ public string Folder public string Owner { set { } - get { return File.CreateByString; } + get { + FileHelper.FileEntry = File; + return FileHelper.CreateByString; + } } public string Uploaded diff --git a/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs b/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs index 843c0eff200..f13aa390f24 100644 --- a/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs +++ b/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs @@ -62,7 +62,6 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Newtonsoft.Json.Linq; @@ -207,7 +206,7 @@ public File GetFile(string fileId, out bool editable) var jsonFile = JObject.Parse(boxFile); - var file = ServiceProvider.GetService>(); + var file = new File(); file.ID = ThirdPartySelector.BuildAppFileId(AppAttr, jsonFile.Value("id")); file.Title = Global.ReplaceInvalidCharsAndTruncate(jsonFile.Value("name")); file.CreateOn = TenantUtil.DateTimeFromUtc(jsonFile.Value("created_at")); @@ -218,13 +217,13 @@ public File GetFile(string fileId, out bool editable) var modifiedBy = jsonFile.Value("modified_by"); if (modifiedBy != null) { - file.ModifiedByString = modifiedBy.Value("name"); + file._modifiedByString = modifiedBy.Value("name"); } var createdBy = jsonFile.Value("created_by"); if (createdBy != null) { - file.CreateByString = createdBy.Value("name"); + file._createByString = createdBy.Value("name"); } diff --git a/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs b/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs index 99b5f2fb0d5..90169ed96bb 100644 --- a/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs +++ b/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs @@ -63,7 +63,6 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Newtonsoft.Json.Linq; @@ -227,19 +226,19 @@ public File GetFile(string fileId, out bool editable) var jsonFile = JObject.Parse(driveFile); - var file = ServiceProvider.GetService>(); + var file = new File(); file.ID = ThirdPartySelector.BuildAppFileId(AppAttr, jsonFile.Value("id")); file.Title = Global.ReplaceInvalidCharsAndTruncate(GetCorrectTitle(jsonFile)); file.CreateOn = TenantUtil.DateTimeFromUtc(jsonFile.Value("createdTime")); file.ModifiedOn = TenantUtil.DateTimeFromUtc(jsonFile.Value("modifiedTime")); file.ContentLength = Convert.ToInt64(jsonFile.Value("size")); - file.ModifiedByString = jsonFile["lastModifyingUser"]["displayName"].Value(); + file._modifiedByString = jsonFile["lastModifyingUser"]["displayName"].Value(); file.ProviderKey = "Google"; var owners = jsonFile["owners"]; if (owners != null) { - file.CreateByString = owners[0]["displayName"].Value(); + file._createByString = owners[0]["displayName"].Value(); } editable = jsonFile["capabilities"]["canEdit"].Value(); diff --git a/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs b/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs index 8d706c178f4..caf3e967dcd 100644 --- a/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs +++ b/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs @@ -31,11 +31,8 @@ using ASC.Common.Logging; using ASC.Core.ChunkedUploader; using ASC.Files.Core; -using ASC.Web.Core.Files; using ASC.Web.Files.Classes; using ASC.Web.Studio.Core; - -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -46,21 +43,18 @@ public class ChunkedUploadSessionHolder { public static readonly TimeSpan SlidingExpiration = TimeSpan.FromHours(12); - private IOptionsMonitor Options { get; } - private IServiceProvider ServiceProvider { get; } + private IOptionsMonitor Options { get; } private GlobalStore GlobalStore { get; } private SetupInfo SetupInfo { get; } private TempPath TempPath { get; } public ChunkedUploadSessionHolder( IOptionsMonitor options, - IServiceProvider serviceProvider, GlobalStore globalStore, SetupInfo setupInfo, TempPath tempPath) { - Options = options; - ServiceProvider = serviceProvider; + Options = options; GlobalStore = globalStore; SetupInfo = setupInfo; TempPath = tempPath; @@ -90,11 +84,6 @@ public ChunkedUploadSession GetSession(string sessionId) { using var stream = CommonSessionHolder(false).GetStream(sessionId); var chunkedUploadSession = ChunkedUploadSession.Deserialize(stream); - chunkedUploadSession.File.Global = ServiceProvider.GetService(); - chunkedUploadSession.File.FilesLinkUtility = ServiceProvider.GetService(); - chunkedUploadSession.File.FileUtility = ServiceProvider.GetService(); - chunkedUploadSession.File.FileConverter = ServiceProvider.GetService(); - chunkedUploadSession.File.FileTracker = ServiceProvider.GetService(); return chunkedUploadSession; } diff --git a/products/ASC.Files/Core/Utils/EntryManager.cs b/products/ASC.Files/Core/Utils/EntryManager.cs index 7ee714a8155..f892537c8f2 100644 --- a/products/ASC.Files/Core/Utils/EntryManager.cs +++ b/products/ASC.Files/Core/Utils/EntryManager.cs @@ -777,7 +777,14 @@ public IEnumerable SortEntries(IEnumerable entries, Ord , SortedByType.Author => (x, y) => { - var cmp = c * string.Compare(x.CreateByString, y.CreateByString); + var fileHelper = ServiceProvider.GetService>(); + fileHelper.FileEntry = x; + var xCreateByString = fileHelper.CreateByString; + + fileHelper.FileEntry = y; + var yCreateByString = fileHelper.CreateByString; + + var cmp = c * string.Compare(xCreateByString, yCreateByString); return cmp == 0 ? x.Title.EnumerableComparer(y.Title) : cmp; } , @@ -831,7 +838,7 @@ public IEnumerable SortEntries(IEnumerable entries, Ord public Folder GetFakeThirdpartyFolder(IProviderInfo providerInfo, string parentFolderId = null) { //Fake folder. Don't send request to third party - var folder = ServiceProvider.GetService>(); + var folder = new Folder(); folder.FolderID = parentFolderId; @@ -1105,13 +1112,15 @@ public File UpdateToVersionFile(T fileId, int version, string doc = null, try { var currFile = fileDao.GetFile(fileId); - var newFile = ServiceProvider.GetService>(); + var newFile = new File(); + var fileHelper = ServiceProvider.GetService>(); + fileHelper.FileEntry = currFile; newFile.ID = fromFile.ID; newFile.Version = currFile.Version + 1; newFile.VersionGroup = currFile.VersionGroup; newFile.Title = FileUtility.ReplaceFileExtension(currFile.Title, FileUtility.GetFileExtension(fromFile.Title)); - newFile.FileStatus = currFile.FileStatus; + newFile._status = fileHelper.FileStatus; newFile.FolderID = currFile.FolderID; newFile.CreateBy = currFile.CreateBy; newFile.CreateOn = currFile.CreateOn; diff --git a/products/ASC.Files/Core/Utils/FileConverter.cs b/products/ASC.Files/Core/Utils/FileConverter.cs index c5e601920b4..d50dc283332 100644 --- a/products/ASC.Files/Core/Utils/FileConverter.cs +++ b/products/ASC.Files/Core/Utils/FileConverter.cs @@ -769,7 +769,7 @@ public File SaveConvertedFile(File file, string convertedFileUrl) if (newFile == null) { - newFile = ServiceProvider.GetService>(); + newFile = new File(); newFile.FolderID = folderId; } } diff --git a/products/ASC.Files/Core/Utils/FileShareLink.cs b/products/ASC.Files/Core/Utils/FileShareLink.cs index 3ac10c008d3..7bad9089e11 100644 --- a/products/ASC.Files/Core/Utils/FileShareLink.cs +++ b/products/ASC.Files/Core/Utils/FileShareLink.cs @@ -24,15 +24,18 @@ */ +using System; using System.Web; using ASC.Common; using ASC.Common.Utils; using ASC.Core.Common; -using ASC.Files.Core; +using ASC.Files.Core; using ASC.Files.Core.Security; using ASC.Web.Core.Files; -using ASC.Web.Files.Classes; +using ASC.Web.Files.Classes; + +using Microsoft.Extensions.DependencyInjection; using FileShare = ASC.Files.Core.Security.FileShare; @@ -45,25 +48,30 @@ public class FileShareLink private FilesLinkUtility FilesLinkUtility { get; } private BaseCommonLinkUtility BaseCommonLinkUtility { get; } private Global Global { get; } - private FileSecurity FileSecurity { get; } + private FileSecurity FileSecurity { get; } + private IServiceProvider ServiceProvider { get; } public FileShareLink( FileUtility fileUtility, FilesLinkUtility filesLinkUtility, BaseCommonLinkUtility baseCommonLinkUtility, Global global, - FileSecurity fileSecurity) + FileSecurity fileSecurity, + IServiceProvider serviceProvider) { FileUtility = fileUtility; FilesLinkUtility = filesLinkUtility; BaseCommonLinkUtility = baseCommonLinkUtility; Global = global; - FileSecurity = fileSecurity; + FileSecurity = fileSecurity; + ServiceProvider = serviceProvider; } public string GetLink(File file, bool withHash = true) - { - var url = file.DownloadUrl; + { + var fileHelper = ServiceProvider.GetService>(); + fileHelper.FileEntry = file; + var url = fileHelper.DownloadUrl; if (FileUtility.CanWebView(file.Title)) url = FilesLinkUtility.GetFileWebPreviewUrl(FileUtility, file.Title, file.ID); diff --git a/products/ASC.Files/Core/Utils/FileUploader.cs b/products/ASC.Files/Core/Utils/FileUploader.cs index bc650d7e13e..f2954386405 100644 --- a/products/ASC.Files/Core/Utils/FileUploader.cs +++ b/products/ASC.Files/Core/Utils/FileUploader.cs @@ -44,8 +44,6 @@ using ASC.Web.Studio.Core; using ASC.Web.Studio.UserControls.Statistics; using ASC.Web.Studio.Utility; - -using Microsoft.Extensions.DependencyInjection; namespace ASC.Web.Files.Utils { @@ -162,7 +160,7 @@ public File VerifyFileUpload(T folderId, string fileName, bool updateIfExi return file; } - var newFile = ServiceProvider.GetService>(); + var newFile = new File(); newFile.FolderID = folderId; newFile.Title = fileName; return newFile; @@ -215,7 +213,7 @@ private T GetFolderId(T folderId, IList relativePath) if (folder == null) { - var newFolder = ServiceProvider.GetService>(); + var newFolder = new Folder(); newFolder.Title = subFolderTitle; newFolder.FolderID = folderId; @@ -252,7 +250,7 @@ public File VerifyChunkedUpload(T folderId, string fileName, long fileSize public ChunkedUploadSession InitiateUpload(T folderId, T fileId, string fileName, long contentLength, bool encrypted) { - var file = ServiceProvider.GetService>(); + var file = new File(); file.ID = fileId; file.FolderID = folderId; file.Title = fileName; From c9012e3ba89b2a3b2bd278d6369c8f866bcafbe7 Mon Sep 17 00:00:00 2001 From: SuhorukovAnton Date: Fri, 11 Jun 2021 12:53:41 +0300 Subject: [PATCH 4/8] refactoring --- products/ASC.Files/Core/Core/Entries/FileEntry.cs | 1 - products/ASC.Files/Core/Core/Entries/Folder.cs | 7 ++----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/products/ASC.Files/Core/Core/Entries/FileEntry.cs b/products/ASC.Files/Core/Core/Entries/FileEntry.cs index f4639ef3451..823aa06b3a9 100644 --- a/products/ASC.Files/Core/Core/Entries/FileEntry.cs +++ b/products/ASC.Files/Core/Core/Entries/FileEntry.cs @@ -97,7 +97,6 @@ public object Clone() [Serializable] public abstract class FileEntry : FileEntry, ICloneable { - public T ID { get; set; } public T FolderID { get; set; } diff --git a/products/ASC.Files/Core/Core/Entries/Folder.cs b/products/ASC.Files/Core/Core/Entries/Folder.cs index dcdd2bed22b..5c6684db893 100644 --- a/products/ASC.Files/Core/Core/Entries/Folder.cs +++ b/products/ASC.Files/Core/Core/Entries/Folder.cs @@ -25,9 +25,7 @@ using System; -using System.Diagnostics; - -using ASC.Common; +using System.Diagnostics; namespace ASC.Files.Core { @@ -60,8 +58,7 @@ public interface IFolder public string FolderUrl { get; set; } } - - [Transient] + [DebuggerDisplay("{Title} ({ID})")] public class Folder : FileEntry, IFolder { From 4a4cab53527fc0b1435af163f68cbc98bd8d9c6f Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Fri, 18 Jun 2021 23:31:46 +0300 Subject: [PATCH 5/8] Files: FileHelper decorator --- .../CommonChunkedUploadSession.cs | 9 --- .../Storage/DocumentsBackupStorage.cs | 2 +- .../Core/Core/Dao/TeamlabDao/DaoFactory.cs | 9 ++- .../Core/Core/Dao/TeamlabDao/FileDao.cs | 16 ++--- .../Core/Core/Dao/TeamlabDao/FolderDao.cs | 10 +-- .../Core/Core/Entries/ChunkedUploadSession.cs | 7 +-- products/ASC.Files/Core/Core/Entries/File.cs | 50 ++++++++++----- .../ASC.Files/Core/Core/Entries/FileEntry.cs | 42 ++++++++++--- .../ASC.Files/Core/Core/Entries/FileHelper.cs | 63 ++++++++----------- .../ASC.Files/Core/Core/Entries/Folder.cs | 14 ++++- .../ASC.Files/Core/Core/FileStorageService.cs | 14 ++--- .../Core/Core/Thirdparty/CrossDao.cs | 2 +- .../Core/Thirdparty/IThirdPartyProviderDao.cs | 7 ++- .../ProviderDao/ProviderSecutiryDao.cs | 4 +- .../SharePoint/SharePointProviderInfo.cs | 9 +-- .../ASC.Files/Core/Helpers/DocuSignHelper.cs | 3 +- products/ASC.Files/Core/Helpers/Global.cs | 5 +- .../HttpHandlers/ChunkedUploaderHandler.cs | 4 +- .../Core/HttpHandlers/FileHandler.ashx.cs | 4 +- .../Core/HttpHandlers/SearchHandler.cs | 9 +-- products/ASC.Files/Core/Model/FileWrapper.cs | 9 +-- .../Services/DocumentService/Configuration.cs | 9 +-- .../ASC.Files/Core/ThirdPartyApp/BoxApp.cs | 11 ++-- .../Core/ThirdPartyApp/GoogleDriveApp.cs | 5 +- .../Core/Utils/ChunkedUploadSessionHolder.cs | 13 ++-- products/ASC.Files/Core/Utils/EntryManager.cs | 19 ++---- .../ASC.Files/Core/Utils/FileConverter.cs | 2 +- .../ASC.Files/Core/Utils/FileShareLink.cs | 8 +-- products/ASC.Files/Core/Utils/FileUploader.cs | 8 ++- 29 files changed, 192 insertions(+), 175 deletions(-) diff --git a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs index 1c52f4b5291..fd00bd4e162 100644 --- a/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs +++ b/common/ASC.Data.Storage/ChunkedUploader/CommonChunkedUploadSession.cs @@ -104,15 +104,6 @@ public virtual Stream Serialize() return null; } - public static CommonChunkedUploadSession Deserialize(Stream stream) - { - var sr = new StreamReader(stream); - string str = sr.ReadToEnd(); - var CommonChunkedUploadSession = JsonSerializer.Deserialize(str); - CommonChunkedUploadSession.TransformItems(); - return CommonChunkedUploadSession; - } - public void TransformItems() { var newItems = new Dictionary(); diff --git a/common/services/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs b/common/services/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs index 2613506fa2b..d07ddef30a5 100644 --- a/common/services/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs +++ b/common/services/ASC.Data.Backup/Storage/DocumentsBackupStorage.cs @@ -145,7 +145,7 @@ private T Upload(T folderId, string localPath) } using var source = File.OpenRead(localPath); - var newFile = new File(); + var newFile = ServiceProvider.GetService>(); newFile.Title = Path.GetFileName(localPath); newFile.FolderID = folder.ID; newFile.ContentLength = source.Length; diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/DaoFactory.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/DaoFactory.cs index b05c71c0067..d239835e94d 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/DaoFactory.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/DaoFactory.cs @@ -71,13 +71,16 @@ public class DaoFactoryExtension { public static void Register(DIHelper services) { - services.TryAdd>(); - services.TryAdd>(); - + services.TryAdd>(); services.TryAdd, FileDao>(); + + services.TryAdd>(); services.TryAdd, ProviderFileDao>(); + services.TryAdd>(); services.TryAdd, FolderDao>(); + + services.TryAdd>(); services.TryAdd, ProviderFolderDao>(); services.TryAdd>(); diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs index 735977e1d68..3bfb962dc0f 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs @@ -823,10 +823,9 @@ public File CopyFile(int fileId, int toFolderId) var file = GetFile(fileId); if (file != null) { - var copy = new File(); - var fileHelper = ServiceProvider.GetService>(); - fileHelper.FileEntry = file; - copy._status = fileHelper.FileStatus; + var copy = ServiceProvider.GetService>(); + + copy.FileStatus = file.FileStatus; copy.FolderID = toFolderId; copy.Title = file.Title; copy.ConvertedType = file.ConvertedType; @@ -1041,7 +1040,8 @@ private File GetFileForCommit(ChunkedUploadSession uploadSession) return file; } - var result = new File(); + + var result = ServiceProvider.GetService>(); result.FolderID = uploadSession.File.FolderID; result.Title = uploadSession.File.Title; result.ContentLength = uploadSession.BytesTotal; @@ -1431,7 +1431,7 @@ select f public File ToFile(DbFileQuery r) { - var file = new File(); + var file = ServiceProvider.GetService>(); if (r == null) return null; file.ID = r.File.Id; file.Title = r.File.Title; @@ -1481,7 +1481,7 @@ internal protected DbFile InitDocument(DbFile dbFile) return dbFile; } - var file = new File(); + var file = ServiceProvider.GetService>(); file.ID = dbFile.Id; file.Title = dbFile.Title; file.Version = dbFile.Version; @@ -1515,7 +1515,7 @@ internal protected async Task InitDocumentAsync(DbFile dbFile) return dbFile; } - var file = new File(); + var file = ServiceProvider.GetService>(); file.ID = dbFile.Id; file.Title = dbFile.Title; file.Version = dbFile.Version; diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs index 74380e440b9..74a8962593b 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs @@ -51,6 +51,8 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.Extensions.DependencyInjection; + namespace ASC.Files.Core.Data { [Scope] @@ -575,7 +577,7 @@ public Folder CopyFolder(int folderId, int toFolderId, CancellationToken? c if (folder.FolderType == FolderType.BUNCH) folder.FolderType = FolderType.DEFAULT; - var copy = new Folder(); + var copy = ServiceProvider.GetService>(); copy.FolderID = toFolderId; copy.RootFolderId = toFolder.RootFolderId; copy.RootFolderCreator = toFolder.RootFolderCreator; @@ -833,7 +835,7 @@ public IEnumerable GetFolderIDs(string module, string bunch, IEnumerable(); + var folder = ServiceProvider.GetService>(); switch (bunch) { case my: @@ -917,7 +919,7 @@ public int GetFolderID(string module, string bunch, string data, bool createIfNo var newFolderId = 0; if (createIfNotExists) { - var folder = new Folder(); + var folder = ServiceProvider.GetService>(); folder.FolderID = 0; switch (bunch) { @@ -1089,7 +1091,7 @@ select f public Folder ToFolder(DbFolderQuery r) { if (r == null) return null; - var result = new Folder(); + var result = ServiceProvider.GetService>(); result.ID = r.Folder.Id; result.FolderID = r.Folder.ParentId; result.Title = r.Folder.Title; diff --git a/products/ASC.Files/Core/Core/Entries/ChunkedUploadSession.cs b/products/ASC.Files/Core/Core/Entries/ChunkedUploadSession.cs index 6d5c758d27f..12d60adc64f 100644 --- a/products/ASC.Files/Core/Core/Entries/ChunkedUploadSession.cs +++ b/products/ASC.Files/Core/Core/Entries/ChunkedUploadSession.cs @@ -74,11 +74,10 @@ public override Stream Serialize() return stream; } - public static ChunkedUploadSession Deserialize(Stream stream) + public static ChunkedUploadSession Deserialize(Stream stream, FileHelper fileHelper) { - var sr = new StreamReader(stream); - string str = sr.ReadToEnd(); - var chunkedUploadSession = JsonSerializer.Deserialize>(str); + var chunkedUploadSession = JsonSerializer.DeserializeAsync>(stream).Result; + chunkedUploadSession.File.FileHelper = fileHelper; chunkedUploadSession.TransformItems(); return chunkedUploadSession; diff --git a/products/ASC.Files/Core/Core/Entries/File.cs b/products/ASC.Files/Core/Core/Entries/File.cs index f363228fc2a..ebbd07f7146 100644 --- a/products/ASC.Files/Core/Core/Entries/File.cs +++ b/products/ASC.Files/Core/Core/Entries/File.cs @@ -58,15 +58,19 @@ public enum FileStatus [Serializable] [DebuggerDisplay("{Title} ({ID} v{Version})")] public class File : FileEntry - { - public FileStatus _status; - + { + private FileStatus _status; public File() { Version = 1; VersionGroup = 1; FileEntryType = FileEntryType.File; + } + + public File(FileHelper fileHelper): this() + { + FileHelper = fileHelper; } public int Version { get; set; } @@ -74,12 +78,11 @@ public File() public int VersionGroup { get; set; } public string Comment { get; set; } - - [JsonIgnore] + public string PureTitle { - get { return Title; } - set { Title = value; } + get { return base.Title; } + set { base.Title = value; } } public long ContentLength { get; set; } @@ -114,7 +117,20 @@ public FilterType FilterType return FilterType.None; } + } + + public FileStatus FileStatus + { + get => FileHelper.GetFileStatus(this, _status); + set => _status = value; } + + [JsonIgnore] + public override string Title { get => FileHelper.GetTitle(this); } + + + [JsonIgnore] + public string DownloadUrl { get => FileHelper.GetDownloadUrl(this); } public bool Locked { get; set; } @@ -123,37 +139,39 @@ public FilterType FilterType [JsonIgnore] public override bool IsNew { - get { return (_status & FileStatus.IsNew) == FileStatus.IsNew; } + get { return (FileStatus & FileStatus.IsNew) == FileStatus.IsNew; } set { if (value) - _status |= FileStatus.IsNew; + FileStatus |= FileStatus.IsNew; else - _status &= ~FileStatus.IsNew; + FileStatus &= ~FileStatus.IsNew; } } + [JsonIgnore] public bool IsFavorite { - get { return (_status & FileStatus.IsFavorite) == FileStatus.IsFavorite; } + get { return (FileStatus & FileStatus.IsFavorite) == FileStatus.IsFavorite; } set { if (value) - _status |= FileStatus.IsFavorite; + FileStatus |= FileStatus.IsFavorite; else - _status &= ~FileStatus.IsFavorite; + FileStatus &= ~FileStatus.IsFavorite; } } + [JsonIgnore] public bool IsTemplate { - get { return (_status & FileStatus.IsTemplate) == FileStatus.IsTemplate; } + get { return (FileStatus & FileStatus.IsTemplate) == FileStatus.IsTemplate; } set { if (value) - _status |= FileStatus.IsTemplate; + FileStatus |= FileStatus.IsTemplate; else - _status &= ~FileStatus.IsTemplate; + FileStatus &= ~FileStatus.IsTemplate; } } diff --git a/products/ASC.Files/Core/Core/Entries/FileEntry.cs b/products/ASC.Files/Core/Core/Entries/FileEntry.cs index 823aa06b3a9..0606c40fc1b 100644 --- a/products/ASC.Files/Core/Core/Entries/FileEntry.cs +++ b/products/ASC.Files/Core/Core/Entries/FileEntry.cs @@ -33,10 +33,31 @@ namespace ASC.Files.Core { [Serializable] public abstract class FileEntry : ICloneable - { - public string Title { get; set; } + { + [JsonIgnore] + public FileHelper FileHelper { get; set; } + + protected FileEntry() + { + + } + + public FileEntry(FileHelper fileHelper) + { + FileHelper = fileHelper; + } - public Guid CreateBy { get; set; } + public virtual string Title { get; set; } + + public Guid CreateBy { get; set; } + + [JsonIgnore] + public string CreateByString { get => FileHelper.GetCreateByString(this); } + + public Guid ModifiedBy { get; set; } + + [JsonIgnore] + public string ModifiedByString { get => FileHelper.GetModifiedByString(this); } [JsonIgnore] public string CreateOnString @@ -50,8 +71,6 @@ public string ModifiedOnString get { return ModifiedOn.Equals(default) ? null : ModifiedOn.ToString("g"); } } - public Guid ModifiedBy { get; set; } - public string Error { get; set; } public FileShare Access { get; set; } @@ -101,8 +120,17 @@ public abstract class FileEntry : FileEntry, ICloneable public T FolderID { get; set; } - private T _folderIdDisplay; - + private T _folderIdDisplay; + + protected FileEntry() + { + + } + + protected FileEntry(FileHelper fileHelper) : base(fileHelper) + { + } + public T FolderIdDisplay { get diff --git a/products/ASC.Files/Core/Core/Entries/FileHelper.cs b/products/ASC.Files/Core/Core/Entries/FileHelper.cs index e6b012dd1e5..4c815430f06 100644 --- a/products/ASC.Files/Core/Core/Entries/FileHelper.cs +++ b/products/ASC.Files/Core/Core/Entries/FileHelper.cs @@ -32,8 +32,8 @@ namespace ASC.Files.Core { - [Transient] - public class FileHelper + [Scope] + public class FileHelper { private FileTrackerHelper FileTracker { get; set; } @@ -45,8 +45,6 @@ public class FileHelper private Global Global { get; set; } - public FileEntry FileEntry { get; set; } - public FileHelper(FileTrackerHelper fileTracker, FilesLinkUtility filesLinkUtility, FileUtility fileUtility, FileConverter fileConverter, Global global) { FileTracker = fileTracker; @@ -56,55 +54,46 @@ public FileHelper(FileTrackerHelper fileTracker, FilesLinkUtility filesLinkUtili Global = global; } - public string CreateByString + internal string GetCreateByString(FileEntry fileEntry) { - get { return !FileEntry.CreateBy.Equals(Guid.Empty) ? Global.GetUserName(FileEntry.CreateBy) : FileEntry._createByString; } + return !fileEntry.CreateBy.Equals(Guid.Empty) ? Global.GetUserName(fileEntry.CreateBy) : fileEntry._createByString; } - public string ModifiedByString + internal string GetModifiedByString(FileEntry fileEntry) { - get { return !FileEntry.ModifiedBy.Equals(Guid.Empty) ? Global.GetUserName(FileEntry.ModifiedBy) : FileEntry._modifiedByString; } + return !fileEntry.ModifiedBy.Equals(Guid.Empty) ? Global.GetUserName(fileEntry.ModifiedBy) : fileEntry._modifiedByString; } - public string Title + internal string GetTitle(File file) { - get - { - var File = (File)FileEntry; - return string.IsNullOrEmpty(File.ConvertedType) - ? File.Title - : FileUtility.ReplaceFileExtension(File.Title, FileUtility.GetInternalExtension(File.Title)); - } + return string.IsNullOrEmpty(file.ConvertedType) + ? file.PureTitle + : FileUtility.ReplaceFileExtension(file.PureTitle, FileUtility.GetInternalExtension(file.PureTitle)); } - - public FileStatus FileStatus + + internal FileStatus GetFileStatus(File file, FileStatus currentStatus) { - get + if (FileTracker.IsEditing(file.ID)) { + currentStatus |= FileStatus.IsEditing; + } - var File = (File)FileEntry; - if (FileTracker.IsEditing(File.ID)) - { - File._status |= FileStatus.IsEditing; - } - - if (FileTracker.IsEditingAlone(File.ID)) - { - File._status |= FileStatus.IsEditingAlone; - } - - if (FileConverter.IsConverting(File)) - { - File._status |= FileStatus.IsConverting; - } + if (FileTracker.IsEditingAlone(file.ID)) + { + currentStatus |= FileStatus.IsEditingAlone; + } - return File._status; + if (FileConverter.IsConverting(file)) + { + currentStatus |= FileStatus.IsConverting; } + + return currentStatus; } - public string DownloadUrl + public string GetDownloadUrl(FileEntry fileEntry) { - get { return FilesLinkUtility.GetFileDownloadUrl(((FileEntry)FileEntry).ID); } + return FilesLinkUtility.GetFileDownloadUrl(fileEntry.ID); } } } diff --git a/products/ASC.Files/Core/Core/Entries/Folder.cs b/products/ASC.Files/Core/Core/Entries/Folder.cs index 5c6684db893..32c933c2a24 100644 --- a/products/ASC.Files/Core/Core/Entries/Folder.cs +++ b/products/ASC.Files/Core/Core/Entries/Folder.cs @@ -25,8 +25,10 @@ using System; -using System.Diagnostics; - +using System.Diagnostics; + +using ASC.Common; + namespace ASC.Files.Core { public enum FolderType @@ -59,7 +61,8 @@ public interface IFolder public string FolderUrl { get; set; } } - [DebuggerDisplay("{Title} ({ID})")] + [DebuggerDisplay("{Title} ({ID})")] + [Transient] public class Folder : FileEntry, IFolder { public FolderType FolderType { get; set; } @@ -84,6 +87,11 @@ public Folder() { Title = string.Empty; FileEntryType = FileEntryType.Folder; + } + + public Folder(FileHelper fileHelper) : this() + { + FileHelper = fileHelper; } } } \ No newline at end of file diff --git a/products/ASC.Files/Core/Core/FileStorageService.cs b/products/ASC.Files/Core/Core/FileStorageService.cs index 165d1dd83d4..6419c2410bb 100644 --- a/products/ASC.Files/Core/Core/FileStorageService.cs +++ b/products/ASC.Files/Core/Core/FileStorageService.cs @@ -405,7 +405,7 @@ public Folder CreateNewFolder(T parentId, string title) try { - var newFolder = new Folder(); + var newFolder = ServiceProvider.GetService>(); newFolder.Title = title; newFolder.FolderID = parent.ID; @@ -578,7 +578,7 @@ public File CreateNewFile(FileModel fileWrapper, bool enableExternalExt = } - var file = new File(); + var file = ServiceProvider.GetService>(); file.FolderID = folder.ID; file.Comment = FilesCommonResource.CommentCreate; @@ -1532,7 +1532,7 @@ public ItemList CheckConversion(ItemList> if (file == null) { - var newFile = new File(); + var newFile = ServiceProvider.GetService>(); newFile.ID = fileId; newFile.Version = version; @@ -1602,7 +1602,7 @@ public void ReassignStorage(Guid userFromId, Guid userToId) { //create folder with name userFrom in folder userTo var folderIdToMy = folderDao.GetFolderIDUser(true, userTo.ID); - var newFolder = new Folder(); + var newFolder = ServiceProvider.GetService>(); newFolder.Title = string.Format(CustomNamingPeople.Substitute("TitleDeletedUserFolder"), userFrom.DisplayUserName(false, DisplayUserSettingsHelper)); newFolder.FolderID = folderIdToMy; @@ -2138,14 +2138,12 @@ public IEnumerable ChangeOwner(IEnumerable foldersId, IEnumerable< var newFile = file; if (file.CreateBy != userInfo.ID) { - newFile = new File(); - var fileHelper = ServiceProvider.GetService>(); - fileHelper.FileEntry = file; + newFile = ServiceProvider.GetService>(); newFile.ID = file.ID; newFile.Version = file.Version + 1; newFile.VersionGroup = file.VersionGroup + 1; newFile.Title = file.Title; - newFile._status = fileHelper.FileStatus; + newFile.FileStatus = file.FileStatus; newFile.FolderID = file.FolderID; newFile.CreateBy = userInfo.ID; newFile.CreateOn = file.CreateOn; diff --git a/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs b/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs index fccf878d2c2..f6a4a4cd89d 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/CrossDao.cs @@ -118,7 +118,7 @@ public Folder PerformCrossDaoFolderCopy { var fromFolder = fromFolderDao.GetFolder(fromConverter(fromFolderId)); - var toFolder1 = new Folder(); + var toFolder1 = ServiceProvider.GetService>(); toFolder1.Title = fromFolder.Title; toFolder1.FolderID = toConverter(toRootFolderId); diff --git a/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs b/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs index 4b09eb39cda..28aeefd2664 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs @@ -18,8 +18,9 @@ using ASC.Web.Core.Files; using ASC.Web.Files.Services.DocumentService; using ASC.Web.Studio.Core; - + using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using FileShare = ASC.Files.Core.Security.FileShare; @@ -289,7 +290,7 @@ protected string MappingID(string id, bool saveIfNotExist = false) protected Folder GetFolder() { - var folder = new Folder(); + var folder = ServiceProvider.GetService>(); InitFileEntry(folder); @@ -314,7 +315,7 @@ protected Folder GetErrorFolder(ErrorEntry entry) protected File GetFile() { - var file = new File(); + var file = ServiceProvider.GetService>(); InitFileEntry(file); diff --git a/products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderSecutiryDao.cs b/products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderSecutiryDao.cs index c8182e8b92c..4ba1a889dd2 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderSecutiryDao.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/ProviderDao/ProviderSecutiryDao.cs @@ -34,6 +34,8 @@ using ASC.Files.Core.Data; using ASC.Files.Core.Security; using ASC.Files.Core.Thirdparty; + +using Microsoft.Extensions.DependencyInjection; namespace ASC.Files.Thirdparty.ProviderDao { @@ -153,7 +155,7 @@ private List GetShareForFolders(IReadOnlyCollection(); + var f = ServiceProvider.GetService>(); f.ID = pureShareRecord.EntryId.ToString(); pureShareRecord.Level = parentFolders.IndexOf(f); diff --git a/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointProviderInfo.cs b/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointProviderInfo.cs index c14afc90e57..9c57234b6c8 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointProviderInfo.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointProviderInfo.cs @@ -39,6 +39,7 @@ using ASC.Files.Core; using ASC.Web.Files.Classes; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.SharePoint.Client; @@ -278,9 +279,9 @@ public File CopyFile(string id, string toFolderId) public File ToFile(File file) { if (file == null) - return null; - - var result = new File(); + return null; + + var result = ServiceProvider.GetService>(); if (file is SharePointFileErrorEntry errorFile) { @@ -496,7 +497,7 @@ public Folder ToFolder(Folder folder) { if (folder == null) return null; - var result = new Folder(); + var result = ServiceProvider.GetService>(); if (folder is SharePointFolderErrorEntry errorFolder) { diff --git a/products/ASC.Files/Core/Helpers/DocuSignHelper.cs b/products/ASC.Files/Core/Helpers/DocuSignHelper.cs index de4d4aa2367..2d61d04ff92 100644 --- a/products/ASC.Files/Core/Helpers/DocuSignHelper.cs +++ b/products/ASC.Files/Core/Helpers/DocuSignHelper.cs @@ -57,6 +57,7 @@ using DocuSign.eSign.Client; using DocuSign.eSign.Model; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.Extensions.Primitives; @@ -407,7 +408,7 @@ public File SaveDocument(string envelopeId, string documentId, string docu } } - var file = new File(); + var file = ServiceProvider.GetService>(); file.FolderID = folderId; file.Comment = FilesCommonResource.CommentCreateByDocuSign; file.Title = FileUtility.ReplaceFileExtension(documentName, ".pdf"); diff --git a/products/ASC.Files/Core/Helpers/Global.cs b/products/ASC.Files/Core/Helpers/Global.cs index f9bc4ac2eea..c475f4b9057 100644 --- a/products/ASC.Files/Core/Helpers/Global.cs +++ b/products/ASC.Files/Core/Helpers/Global.cs @@ -47,6 +47,7 @@ using ASC.Web.Files.Utils; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Constants = ASC.Core.Configuration.Constants; @@ -571,7 +572,7 @@ private void SaveStartDocument(FileMarker fileMarker, IFolderDao folderDao foreach (var folderName in storeTemplate.ListDirectoriesRelative(path, false)) { - var folder = new Folder(); + var folder = ServiceProvider.GetService>(); folder.Title = folderName; folder.FolderID = folderId; @@ -590,7 +591,7 @@ private void SaveFile(FileMarker fileMarker, IFileDao fileDao, T folder, s return; var fileName = Path.GetFileName(filePath); - var file = new File(); + var file = ServiceProvider.GetService>(); file.Title = fileName; file.FolderID = folder; diff --git a/products/ASC.Files/Core/HttpHandlers/ChunkedUploaderHandler.cs b/products/ASC.Files/Core/HttpHandlers/ChunkedUploaderHandler.cs index e8ffba13a68..7c9a616d6d6 100644 --- a/products/ASC.Files/Core/HttpHandlers/ChunkedUploaderHandler.cs +++ b/products/ASC.Files/Core/HttpHandlers/ChunkedUploaderHandler.cs @@ -122,7 +122,7 @@ public async Task Invoke(HttpContext context) await Invoke(context); } } - catch (Exception e) + catch (Exception) { await Invoke(context); } @@ -209,7 +209,7 @@ private bool TryAuthorize(ChunkedRequestHelper request) if (!string.IsNullOrEmpty(request.UploadId)) { - var uploadSession = ChunkedUploadSessionHolder.GetSession(request.UploadId); + var uploadSession = ChunkedUploadSessionHolder.GetSession(request.UploadId); if (uploadSession != null) { TenantManager.SetCurrentTenant(uploadSession.TenantId); diff --git a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs index 2ff5fbda76c..c4c9a97edca 100644 --- a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs +++ b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs @@ -1144,7 +1144,7 @@ private File CreateFileFromTemplate(Folder folder, string fileTitle, st fileTitle += fileExt; } - var file = new File(); + var file = ServiceProvider.GetService>(); file.Title = fileTitle; file.FolderID = folder.ID; file.Comment = FilesCommonResource.CommentCreate; @@ -1160,7 +1160,7 @@ private File CreateFileFromUri(Folder folder, string fileUri, string fi if (string.IsNullOrEmpty(fileTitle)) fileTitle = Path.GetFileName(HttpUtility.UrlDecode(fileUri)); - var file = new File(); + var file = ServiceProvider.GetService>(); file.Title = fileTitle; file.FolderID = folder.ID; file.Comment = FilesCommonResource.CommentCreate; diff --git a/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs b/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs index 81d95c72bc8..2f69017a93e 100644 --- a/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs +++ b/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs @@ -39,8 +39,6 @@ using ASC.Web.Files.Utils; using ASC.Web.Studio.Core; -using Microsoft.Extensions.DependencyInjection; - namespace ASC.Web.Files.Configuration { public class SearchHandler @@ -136,11 +134,9 @@ public SearchResultItem[] Search(string text) { var folderDao = DaoFactory.GetFolderDao(); var files = SearchFiles(text); - var helper = ServiceProvider.GetService>(); List list = new List(); foreach (var file in files) { - helper.FileEntry = file; var searchResultItem = new SearchResultItem { Name = file.Title ?? string.Empty, @@ -149,7 +145,7 @@ public SearchResultItem[] Search(string text) Date = file.ModifiedOn, Additional = new Dictionary { - { "Author", helper.CreateByString.HtmlEncode() }, + { "Author", file.CreateByString.HtmlEncode() }, { "Path", FolderPathBuilder(EntryManager.GetBreadCrumbs(file.FolderID, folderDao)) }, { "Size", FileSizeComment.FilesSizeToString(file.ContentLength) } } @@ -160,7 +156,6 @@ public SearchResultItem[] Search(string text) var folders = SearchFolders(text); foreach (var folder in folders) { - helper.FileEntry = folder; var searchResultItem = new SearchResultItem { Name = folder.Title ?? string.Empty, @@ -169,7 +164,7 @@ public SearchResultItem[] Search(string text) Date = folder.ModifiedOn, Additional = new Dictionary { - { "Author", helper.CreateByString.HtmlEncode() }, + { "Author", folder.CreateByString.HtmlEncode() }, { "Path", FolderPathBuilder(EntryManager.GetBreadCrumbs(folder.ID, folderDao)) }, { "IsFolder", true } } diff --git a/products/ASC.Files/Core/Model/FileWrapper.cs b/products/ASC.Files/Core/Model/FileWrapper.cs index eb945b099ba..e3515498d25 100644 --- a/products/ASC.Files/Core/Model/FileWrapper.cs +++ b/products/ASC.Files/Core/Model/FileWrapper.cs @@ -40,8 +40,6 @@ using ASC.Web.Files.Classes; using ASC.Web.Studio.Utility; -using Microsoft.Extensions.DependencyInjection; - using FileShare = ASC.Files.Core.Security.FileShare; namespace ASC.Api.Documents { @@ -217,9 +215,6 @@ public FileWrapper Get(File file, List, bool>> folde private FileWrapper GetFileWrapper(File file) { - var fileHelper = ServiceProvider.GetService>(); - fileHelper.FileEntry = file; - var result = Get, T>(file); result.FileExst = FileUtility.GetFileExtension(file.Title); @@ -227,7 +222,7 @@ private FileWrapper GetFileWrapper(File file) result.Version = file.Version; result.VersionGroup = file.VersionGroup; result.ContentLength = file.ContentLengthString; - result.FileStatus = fileHelper.FileStatus; + result.FileStatus = file.FileStatus; result.PureContentLength = file.ContentLength.NullIfDefault(); result.Comment = file.Comment; result.Encrypted = file.Encrypted.NullIfDefault(); @@ -236,7 +231,7 @@ private FileWrapper GetFileWrapper(File file) try { - result.ViewUrl = CommonLinkUtility.GetFullAbsolutePath(fileHelper.DownloadUrl); + result.ViewUrl = CommonLinkUtility.GetFullAbsolutePath(file.DownloadUrl); result.WebUrl = CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.GetFileWebPreviewUrl(FileUtility, file.Title, file.ID, file.Version)); diff --git a/products/ASC.Files/Core/Services/DocumentService/Configuration.cs b/products/ASC.Files/Core/Services/DocumentService/Configuration.cs index ed46395456e..f5689265a29 100644 --- a/products/ASC.Files/Core/Services/DocumentService/Configuration.cs +++ b/products/ASC.Files/Core/Services/DocumentService/Configuration.cs @@ -200,19 +200,17 @@ public string Url [Transient] public class InfoConfig { - public File File; - private FileHelper FileHelper; + public File File; public EditorType Type = EditorType.Desktop; private string _breadCrumbs; - public InfoConfig(BreadCrumbsManager breadCrumbsManager, FileSharing fileSharing, SecurityContext securityContext, UserManager userManager, FileHelper fileHelper) + public InfoConfig(BreadCrumbsManager breadCrumbsManager, FileSharing fileSharing, SecurityContext securityContext, UserManager userManager) { BreadCrumbsManager = breadCrumbsManager; FileSharing = fileSharing; SecurityContext = securityContext; UserManager = userManager; - FileHelper = fileHelper; } public bool? Favorite @@ -248,8 +246,7 @@ public string Owner { set { } get { - FileHelper.FileEntry = File; - return FileHelper.CreateByString; + return File.CreateByString; } } diff --git a/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs b/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs index f13aa390f24..5fd9a291f2f 100644 --- a/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs +++ b/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs @@ -33,7 +33,7 @@ using System.Text; using System.Threading; using System.Web; - + using ASC.Common.Caching; using ASC.Common.Logging; using ASC.Common.Web; @@ -59,13 +59,14 @@ using ASC.Web.Files.Services.DocumentService; using ASC.Web.Studio.Core; using ASC.Web.Studio.Utility; - + using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; - + using Newtonsoft.Json.Linq; - + using SecurityContext = ASC.Core.SecurityContext; namespace ASC.Web.Files.ThirdPartyApp @@ -206,7 +207,7 @@ public File GetFile(string fileId, out bool editable) var jsonFile = JObject.Parse(boxFile); - var file = new File(); + var file = ServiceProvider.GetService>(); file.ID = ThirdPartySelector.BuildAppFileId(AppAttr, jsonFile.Value("id")); file.Title = Global.ReplaceInvalidCharsAndTruncate(jsonFile.Value("name")); file.CreateOn = TenantUtil.DateTimeFromUtc(jsonFile.Value("created_at")); diff --git a/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs b/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs index 90169ed96bb..40bbbc57256 100644 --- a/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs +++ b/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs @@ -62,7 +62,8 @@ using ASC.Web.Studio.Utility; using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Newtonsoft.Json.Linq; @@ -226,7 +227,7 @@ public File GetFile(string fileId, out bool editable) var jsonFile = JObject.Parse(driveFile); - var file = new File(); + var file = ServiceProvider.GetService>(); file.ID = ThirdPartySelector.BuildAppFileId(AppAttr, jsonFile.Value("id")); file.Title = Global.ReplaceInvalidCharsAndTruncate(GetCorrectTitle(jsonFile)); file.CreateOn = TenantUtil.DateTimeFromUtc(jsonFile.Value("createdTime")); diff --git a/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs b/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs index caf3e967dcd..26be85d80bb 100644 --- a/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs +++ b/products/ASC.Files/Core/Utils/ChunkedUploadSessionHolder.cs @@ -47,17 +47,20 @@ public class ChunkedUploadSessionHolder private GlobalStore GlobalStore { get; } private SetupInfo SetupInfo { get; } private TempPath TempPath { get; } + private FileHelper FileHelper { get; } public ChunkedUploadSessionHolder( IOptionsMonitor options, GlobalStore globalStore, SetupInfo setupInfo, - TempPath tempPath) + TempPath tempPath, + FileHelper fileHelper) { Options = options; GlobalStore = globalStore; SetupInfo = setupInfo; TempPath = tempPath; + FileHelper = fileHelper; // clear old sessions try @@ -83,15 +86,9 @@ public void RemoveSession(ChunkedUploadSession s) public ChunkedUploadSession GetSession(string sessionId) { using var stream = CommonSessionHolder(false).GetStream(sessionId); - var chunkedUploadSession = ChunkedUploadSession.Deserialize(stream); + var chunkedUploadSession = ChunkedUploadSession.Deserialize(stream, FileHelper); return chunkedUploadSession; } - - public CommonChunkedUploadSession GetSession(string sessionId) - { - using var stream = CommonSessionHolder(false).GetStream(sessionId); - return CommonChunkedUploadSession.Deserialize(stream); - } public ChunkedUploadSession CreateUploadSession(File file, long contentLength) diff --git a/products/ASC.Files/Core/Utils/EntryManager.cs b/products/ASC.Files/Core/Utils/EntryManager.cs index f892537c8f2..1bb59280755 100644 --- a/products/ASC.Files/Core/Utils/EntryManager.cs +++ b/products/ASC.Files/Core/Utils/EntryManager.cs @@ -777,14 +777,7 @@ public IEnumerable SortEntries(IEnumerable entries, Ord , SortedByType.Author => (x, y) => { - var fileHelper = ServiceProvider.GetService>(); - fileHelper.FileEntry = x; - var xCreateByString = fileHelper.CreateByString; - - fileHelper.FileEntry = y; - var yCreateByString = fileHelper.CreateByString; - - var cmp = c * string.Compare(xCreateByString, yCreateByString); + var cmp = c * string.Compare(x.CreateByString, y.CreateByString); return cmp == 0 ? x.Title.EnumerableComparer(y.Title) : cmp; } , @@ -838,7 +831,7 @@ public IEnumerable SortEntries(IEnumerable entries, Ord public Folder GetFakeThirdpartyFolder(IProviderInfo providerInfo, string parentFolderId = null) { //Fake folder. Don't send request to third party - var folder = new Folder(); + var folder = ServiceProvider.GetService>(); folder.FolderID = parentFolderId; @@ -1111,16 +1104,14 @@ public File UpdateToVersionFile(T fileId, int version, string doc = null, try { - var currFile = fileDao.GetFile(fileId); - var newFile = new File(); - var fileHelper = ServiceProvider.GetService>(); - fileHelper.FileEntry = currFile; + var currFile = fileDao.GetFile(fileId); + var newFile = ServiceProvider.GetService>(); newFile.ID = fromFile.ID; newFile.Version = currFile.Version + 1; newFile.VersionGroup = currFile.VersionGroup; newFile.Title = FileUtility.ReplaceFileExtension(currFile.Title, FileUtility.GetFileExtension(fromFile.Title)); - newFile._status = fileHelper.FileStatus; + newFile.FileStatus = currFile.FileStatus; newFile.FolderID = currFile.FolderID; newFile.CreateBy = currFile.CreateBy; newFile.CreateOn = currFile.CreateOn; diff --git a/products/ASC.Files/Core/Utils/FileConverter.cs b/products/ASC.Files/Core/Utils/FileConverter.cs index 3a892cb9ec7..e74dc64d75c 100644 --- a/products/ASC.Files/Core/Utils/FileConverter.cs +++ b/products/ASC.Files/Core/Utils/FileConverter.cs @@ -794,7 +794,7 @@ public File SaveConvertedFile(File file, string convertedFileUrl) if (newFile == null) { - newFile = new File(); + newFile = ServiceProvider.GetService>(); newFile.FolderID = folderId; } } diff --git a/products/ASC.Files/Core/Utils/FileShareLink.cs b/products/ASC.Files/Core/Utils/FileShareLink.cs index 7bad9089e11..842ee0e743b 100644 --- a/products/ASC.Files/Core/Utils/FileShareLink.cs +++ b/products/ASC.Files/Core/Utils/FileShareLink.cs @@ -34,8 +34,6 @@ using ASC.Files.Core.Security; using ASC.Web.Core.Files; using ASC.Web.Files.Classes; - -using Microsoft.Extensions.DependencyInjection; using FileShare = ASC.Files.Core.Security.FileShare; @@ -68,10 +66,8 @@ public FileShareLink( } public string GetLink(File file, bool withHash = true) - { - var fileHelper = ServiceProvider.GetService>(); - fileHelper.FileEntry = file; - var url = fileHelper.DownloadUrl; + { + var url = file.DownloadUrl; if (FileUtility.CanWebView(file.Title)) url = FilesLinkUtility.GetFileWebPreviewUrl(FileUtility, file.Title, file.ID); diff --git a/products/ASC.Files/Core/Utils/FileUploader.cs b/products/ASC.Files/Core/Utils/FileUploader.cs index f2954386405..dc8ed2e5c5f 100644 --- a/products/ASC.Files/Core/Utils/FileUploader.cs +++ b/products/ASC.Files/Core/Utils/FileUploader.cs @@ -44,6 +44,8 @@ using ASC.Web.Studio.Core; using ASC.Web.Studio.UserControls.Statistics; using ASC.Web.Studio.Utility; + +using Microsoft.Extensions.DependencyInjection; namespace ASC.Web.Files.Utils { @@ -160,7 +162,7 @@ public File VerifyFileUpload(T folderId, string fileName, bool updateIfExi return file; } - var newFile = new File(); + var newFile = ServiceProvider.GetService>(); newFile.FolderID = folderId; newFile.Title = fileName; return newFile; @@ -213,7 +215,7 @@ private T GetFolderId(T folderId, IList relativePath) if (folder == null) { - var newFolder = new Folder(); + var newFolder = ServiceProvider.GetService>(); newFolder.Title = subFolderTitle; newFolder.FolderID = folderId; @@ -250,7 +252,7 @@ public File VerifyChunkedUpload(T folderId, string fileName, long fileSize public ChunkedUploadSession InitiateUpload(T folderId, T fileId, string fileName, long contentLength, bool encrypted) { - var file = new File(); + var file = ServiceProvider.GetService>(); file.ID = fileId; file.FolderID = folderId; file.Title = fileName; From b5076ed81c1c5db89a98628c642b1fc26157da93 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Fri, 18 Jun 2021 23:35:33 +0300 Subject: [PATCH 6/8] File: fix status --- products/ASC.Files/Core/Core/Entries/File.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/products/ASC.Files/Core/Core/Entries/File.cs b/products/ASC.Files/Core/Core/Entries/File.cs index ebbd07f7146..d1b80705d70 100644 --- a/products/ASC.Files/Core/Core/Entries/File.cs +++ b/products/ASC.Files/Core/Core/Entries/File.cs @@ -139,39 +139,39 @@ public FileStatus FileStatus [JsonIgnore] public override bool IsNew { - get { return (FileStatus & FileStatus.IsNew) == FileStatus.IsNew; } + get { return (_status & FileStatus.IsNew) == FileStatus.IsNew; } set { if (value) - FileStatus |= FileStatus.IsNew; + _status |= FileStatus.IsNew; else - FileStatus &= ~FileStatus.IsNew; + _status &= ~FileStatus.IsNew; } } [JsonIgnore] public bool IsFavorite { - get { return (FileStatus & FileStatus.IsFavorite) == FileStatus.IsFavorite; } + get { return (_status & FileStatus.IsFavorite) == FileStatus.IsFavorite; } set { if (value) - FileStatus |= FileStatus.IsFavorite; + _status |= FileStatus.IsFavorite; else - FileStatus &= ~FileStatus.IsFavorite; + _status &= ~FileStatus.IsFavorite; } } [JsonIgnore] public bool IsTemplate { - get { return (FileStatus & FileStatus.IsTemplate) == FileStatus.IsTemplate; } + get { return (_status & FileStatus.IsTemplate) == FileStatus.IsTemplate; } set { if (value) - FileStatus |= FileStatus.IsTemplate; + _status |= FileStatus.IsTemplate; else - FileStatus &= ~FileStatus.IsTemplate; + _status &= ~FileStatus.IsTemplate; } } From 6d21bb2209ba5fa73c382fd582988d3e7e779d38 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Tue, 22 Jun 2021 11:42:29 +0300 Subject: [PATCH 7/8] File: status fix --- products/ASC.Files/Core/Core/Entries/File.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/products/ASC.Files/Core/Core/Entries/File.cs b/products/ASC.Files/Core/Core/Entries/File.cs index d1b80705d70..43320b19cc6 100644 --- a/products/ASC.Files/Core/Core/Entries/File.cs +++ b/products/ASC.Files/Core/Core/Entries/File.cs @@ -121,7 +121,7 @@ public FilterType FilterType public FileStatus FileStatus { - get => FileHelper.GetFileStatus(this, _status); + get => FileHelper.GetFileStatus(this, ref _status); set => _status = value; } From 8998a72d8c4fa4e6fde36529ca86be2e87e0ae96 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Wed, 23 Jun 2021 20:56:55 +0300 Subject: [PATCH 8/8] Files: fixed build --- products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs | 2 -- .../ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs | 1 - products/ASC.Files/Core/Core/Entries/FileHelper.cs | 2 +- products/ASC.Files/Core/HttpHandlers/SearchHandler.cs | 5 +---- products/ASC.Files/Core/Model/FileWrapper.cs | 9 +++------ .../Core/Services/DocumentService/Configuration.cs | 4 +--- products/ASC.Files/Core/Utils/FileShareLink.cs | 10 +++------- 7 files changed, 9 insertions(+), 24 deletions(-) diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs index 3bfb962dc0f..30a9edb2854 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs @@ -824,7 +824,6 @@ public File CopyFile(int fileId, int toFolderId) if (file != null) { var copy = ServiceProvider.GetService>(); - copy.FileStatus = file.FileStatus; copy.FolderID = toFolderId; copy.Title = file.Title; @@ -1040,7 +1039,6 @@ private File GetFileForCommit(ChunkedUploadSession uploadSession) return file; } - var result = ServiceProvider.GetService>(); result.FolderID = uploadSession.File.FolderID; result.Title = uploadSession.File.Title; diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs index 74a8962593b..3809b38ad01 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FolderDao.cs @@ -50,7 +50,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; - using Microsoft.Extensions.DependencyInjection; namespace ASC.Files.Core.Data diff --git a/products/ASC.Files/Core/Core/Entries/FileHelper.cs b/products/ASC.Files/Core/Core/Entries/FileHelper.cs index 4c815430f06..07700232a1e 100644 --- a/products/ASC.Files/Core/Core/Entries/FileHelper.cs +++ b/products/ASC.Files/Core/Core/Entries/FileHelper.cs @@ -71,7 +71,7 @@ internal string GetTitle(File file) : FileUtility.ReplaceFileExtension(file.PureTitle, FileUtility.GetInternalExtension(file.PureTitle)); } - internal FileStatus GetFileStatus(File file, FileStatus currentStatus) + internal FileStatus GetFileStatus(File file, ref FileStatus currentStatus) { if (FileTracker.IsEditing(file.ID)) { diff --git a/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs b/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs index 2f69017a93e..072cb6a981a 100644 --- a/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs +++ b/products/ASC.Files/Core/HttpHandlers/SearchHandler.cs @@ -72,7 +72,6 @@ public string SearchName private FileUtility FileUtility { get; } private PathProvider PathProvider { get; } private ThirdpartyConfiguration ThirdpartyConfiguration { get; } - private IServiceProvider ServiceProvider { get; } public SearchHandler( FileSecurity fileSecurity, @@ -83,8 +82,7 @@ public SearchHandler( FilesLinkUtility filesLinkUtility, FileUtility fileUtility, PathProvider pathProvider, - ThirdpartyConfiguration thirdpartyConfiguration, - IServiceProvider serviceProvider) + ThirdpartyConfiguration thirdpartyConfiguration) { FileSecurity = fileSecurity; DaoFactory = daoFactory; @@ -95,7 +93,6 @@ public SearchHandler( FileUtility = fileUtility; PathProvider = pathProvider; ThirdpartyConfiguration = thirdpartyConfiguration; - ServiceProvider = serviceProvider; } public IEnumerable> SearchFiles(string text) diff --git a/products/ASC.Files/Core/Model/FileWrapper.cs b/products/ASC.Files/Core/Model/FileWrapper.cs index ff624d55307..4319979c127 100644 --- a/products/ASC.Files/Core/Model/FileWrapper.cs +++ b/products/ASC.Files/Core/Model/FileWrapper.cs @@ -156,8 +156,7 @@ public class FileWrapperHelper : FileEntryWrapperHelper private GlobalFolderHelper GlobalFolderHelper { get; } private CommonLinkUtility CommonLinkUtility { get; } private FilesLinkUtility FilesLinkUtility { get; } - private FileUtility FileUtility { get; } - private IServiceProvider ServiceProvider { get; } + private FileUtility FileUtility { get; } public FileWrapperHelper( ApiDateTimeHelper apiDateTimeHelper, @@ -168,8 +167,7 @@ public FileWrapperHelper( GlobalFolderHelper globalFolderHelper, CommonLinkUtility commonLinkUtility, FilesLinkUtility filesLinkUtility, - FileUtility fileUtility, - IServiceProvider serviceProvider) + FileUtility fileUtility) : base(apiDateTimeHelper, employeeWrapperHelper) { AuthContext = authContext; @@ -178,8 +176,7 @@ public FileWrapperHelper( GlobalFolderHelper = globalFolderHelper; CommonLinkUtility = commonLinkUtility; FilesLinkUtility = filesLinkUtility; - FileUtility = fileUtility; - ServiceProvider = serviceProvider; + FileUtility = fileUtility; } public FileWrapper Get(File file, List, bool>> folders = null) diff --git a/products/ASC.Files/Core/Services/DocumentService/Configuration.cs b/products/ASC.Files/Core/Services/DocumentService/Configuration.cs index f5689265a29..023a4c4b68c 100644 --- a/products/ASC.Files/Core/Services/DocumentService/Configuration.cs +++ b/products/ASC.Files/Core/Services/DocumentService/Configuration.cs @@ -245,9 +245,7 @@ public string Folder public string Owner { set { } - get { - return File.CreateByString; - } + get { return File.CreateByString; } } public string Uploaded diff --git a/products/ASC.Files/Core/Utils/FileShareLink.cs b/products/ASC.Files/Core/Utils/FileShareLink.cs index 842ee0e743b..f47bf21d3d5 100644 --- a/products/ASC.Files/Core/Utils/FileShareLink.cs +++ b/products/ASC.Files/Core/Utils/FileShareLink.cs @@ -24,7 +24,6 @@ */ -using System; using System.Web; using ASC.Common; @@ -46,23 +45,20 @@ public class FileShareLink private FilesLinkUtility FilesLinkUtility { get; } private BaseCommonLinkUtility BaseCommonLinkUtility { get; } private Global Global { get; } - private FileSecurity FileSecurity { get; } - private IServiceProvider ServiceProvider { get; } + private FileSecurity FileSecurity { get; } public FileShareLink( FileUtility fileUtility, FilesLinkUtility filesLinkUtility, BaseCommonLinkUtility baseCommonLinkUtility, Global global, - FileSecurity fileSecurity, - IServiceProvider serviceProvider) + FileSecurity fileSecurity) { FileUtility = fileUtility; FilesLinkUtility = filesLinkUtility; BaseCommonLinkUtility = baseCommonLinkUtility; Global = global; - FileSecurity = fileSecurity; - ServiceProvider = serviceProvider; + FileSecurity = fileSecurity; } public string GetLink(File file, bool withHash = true)