Merge branch 'develop' into feature/third-party-settings

This commit is contained in:
Vladislav Makhov 2020-11-09 16:44:18 +03:00
commit 982fbdd593
13 changed files with 128 additions and 126 deletions

View File

@ -91,33 +91,7 @@ namespace ASC.Core
public class TenantManager
{
private class TenantHolder
{
public Tenant Tenant;
}
private static readonly AsyncLocal<TenantHolder> currentTenant = new AsyncLocal<TenantHolder>();
public Tenant CurrentTenant
{
get
{
return currentTenant.Value?.Tenant;
}
set
{
var holder = currentTenant.Value;
if (holder != null)
{
holder.Tenant = null;
}
if (value != null)
{
currentTenant.Value = new TenantHolder { Tenant = value };
}
}
}
private Tenant CurrentTenant { get; set; }
public const string CURRENT_TENANT = "CURRENT_TENANT";
internal ITenantService TenantService { get; set; }
@ -250,12 +224,13 @@ namespace ASC.Core
}
public Tenant GetCurrentTenant(bool throwIfNotFound, HttpContext context)
{
Tenant tenant = null;
{
if (CurrentTenant != null)
{
return CurrentTenant;
}
Tenant tenant = null;
if (context != null)
{
@ -266,10 +241,7 @@ namespace ASC.Core
context.Items[CURRENT_TENANT] = tenant;
}
}
if (tenant == null)
{
tenant = CallContext.GetData(CURRENT_TENANT) as Tenant;
}
if (tenant == null && throwIfNotFound)
{
throw new Exception("Could not resolve current tenant :-(.");

View File

@ -83,8 +83,10 @@ namespace ASC.Files.Core
{
Logger.ErrorFormat("GetBreadCrumbs {0} with null", session.FolderId);
return default;
}
return f.ID;
}
if (f is Folder<string> f1) return (T)Convert.ChangeType(f1.ID, typeof(T));
if (f is Folder<int> f2) return (T)Convert.ChangeType(f2.ID, typeof(T));
return (T)Convert.ChangeType(0, typeof(T));
})
: new List<T> { session.FolderId };

View File

@ -227,7 +227,7 @@ namespace ASC.Web.Files.Services.WCFService
}
}
public ItemList<T> GetPath(T folderId)
public ItemList<object> GetPath(T folderId)
{
var folderDao = GetFolderDao();
var folder = folderDao.GetFolder(folderId);
@ -235,7 +235,12 @@ namespace ASC.Web.Files.Services.WCFService
ErrorIf(folder == null, FilesCommonResource.ErrorMassage_FolderNotFound);
ErrorIf(!FileSecurity.CanRead(folder), FilesCommonResource.ErrorMassage_SecurityException_ViewFolder);
return new ItemList<T>(EntryManager.GetBreadCrumbs(folderId, folderDao).Select(f => f.ID));
return new ItemList<object>(EntryManager.GetBreadCrumbs(folderId, folderDao).Select(f =>
{
if (f is Folder<string> f1) return (object)f1.ID;
if (f is Folder<int> f2) return f2.ID;
return 0;
}));
}
public DataWrapper<T> GetFolderItems(T parentId, int from, int count, FilterType filter, bool subjectGroup, string ssubject, string searchText, bool searchInContent, bool withSubfolders, OrderBy orderBy)
@ -296,7 +301,8 @@ namespace ASC.Web.Files.Services.WCFService
var prevVisible = breadCrumbs.ElementAtOrDefault(breadCrumbs.Count() - 2);
if (prevVisible != null)
{
parent.ParentFolderID = prevVisible.ID;
if (prevVisible is Folder<string> f1) parent.ParentFolderID = (T)Convert.ChangeType(f1.ID, typeof(T));
if (prevVisible is Folder<int> f2) parent.ParentFolderID = (T)Convert.ChangeType(f2.ID, typeof(T));
}
parent.Shareable = FileSharing.CanSetAccess(parent)
@ -309,7 +315,12 @@ namespace ASC.Web.Files.Services.WCFService
{
Total = total,
Entries = new ItemList<FileEntry>(entries.ToList()),
FolderPathParts = new ItemList<T>(breadCrumbs.Select(f => f.ID)),
FolderPathParts = new ItemList<object>(breadCrumbs.Select(f =>
{
if (f is Folder<string> f1) return (object)f1.ID;
if (f is Folder<int> f2) return f2.ID;
return 0;
})),
FolderInfo = parent,
New = FileMarker.GetRootFoldersIdMarkedAsNew(parentId)
};
@ -579,27 +590,27 @@ namespace ASC.Web.Files.Services.WCFService
if (fileWrapper.TemplateId.Equals(default(T)))
{
var culture = UserManager.GetUsers(AuthContext.CurrentAccount.ID).GetCulture();
var storeTemplate = GetStoreTemplate();
var culture = UserManager.GetUsers(AuthContext.CurrentAccount.ID).GetCulture();
var storeTemplate = GetStoreTemplate();
var path = FileConstant.NewDocPath + culture + "/";
if (!storeTemplate.IsDirectory(path))
{
path = FileConstant.NewDocPath + "default/";
}
var path = FileConstant.NewDocPath + culture + "/";
if (!storeTemplate.IsDirectory(path))
{
path = FileConstant.NewDocPath + "default/";
}
path += "new" + fileExt;
path += "new" + fileExt;
try
{
using var stream = storeTemplate.GetReadStream("", path);
file.ContentLength = stream.CanSeek ? stream.Length : storeTemplate.GetFileSize(path);
file = fileDao.SaveFile(file, stream);
}
catch (Exception e)
{
throw GenerateException(e);
}
try
{
using var stream = storeTemplate.GetReadStream("", path);
file.ContentLength = stream.CanSeek ? stream.Length : storeTemplate.GetFileSize(path);
file = fileDao.SaveFile(file, stream);
}
catch (Exception e)
{
throw GenerateException(e);
}
}
else
{
@ -1316,7 +1327,7 @@ namespace ASC.Web.Files.Services.WCFService
{
ErrorIf(!folders.Any() && !files.Any(), FilesCommonResource.ErrorMassage_BadRequest);
return FileOperationsManager.Download(AuthContext.CurrentAccount.ID, TenantManager.CurrentTenant, folders, files, GetHttpHeaders());
return FileOperationsManager.Download(AuthContext.CurrentAccount.ID, TenantManager.GetCurrentTenant(), folders, files, GetHttpHeaders());
}
@ -1420,7 +1431,7 @@ namespace ASC.Web.Files.Services.WCFService
ItemList<FileOperationResult> result;
if (foldersId.Any() || filesId.Any())
{
result = FileOperationsManager.MoveOrCopy(AuthContext.CurrentAccount.ID, TenantManager.CurrentTenant, foldersId, filesId, destFolderId, ic, resolve, !deleteAfter, GetHttpHeaders());
result = FileOperationsManager.MoveOrCopy(AuthContext.CurrentAccount.ID, TenantManager.GetCurrentTenant(), foldersId, filesId, destFolderId, ic, resolve, !deleteAfter, GetHttpHeaders());
}
else
{
@ -1432,16 +1443,16 @@ namespace ASC.Web.Files.Services.WCFService
public ItemList<FileOperationResult> DeleteFile(string action, T fileId, bool ignoreException = false, bool deleteAfter = false, bool immediately = false)
{
return FileOperationsManager.Delete(AuthContext.CurrentAccount.ID, TenantManager.CurrentTenant, new List<T>(), new List<T>() { fileId }, ignoreException, !deleteAfter, immediately, GetHttpHeaders());
return FileOperationsManager.Delete(AuthContext.CurrentAccount.ID, TenantManager.GetCurrentTenant(), new List<T>(), new List<T>() { fileId }, ignoreException, !deleteAfter, immediately, GetHttpHeaders());
}
public ItemList<FileOperationResult> DeleteFolder(string action, T folderId, bool ignoreException = false, bool deleteAfter = false, bool immediately = false)
{
return FileOperationsManager.Delete(AuthContext.CurrentAccount.ID, TenantManager.CurrentTenant, new List<T>() { folderId }, new List<T>(), ignoreException, !deleteAfter, immediately, GetHttpHeaders());
return FileOperationsManager.Delete(AuthContext.CurrentAccount.ID, TenantManager.GetCurrentTenant(), new List<T>() { folderId }, new List<T>(), ignoreException, !deleteAfter, immediately, GetHttpHeaders());
}
public ItemList<FileOperationResult> DeleteItems(string action, List<JsonElement> files, List<JsonElement> folders, bool ignoreException = false, bool deleteAfter = false, bool immediately = false)
{
return FileOperationsManager.Delete(AuthContext.CurrentAccount.ID, TenantManager.CurrentTenant, folders, files, ignoreException, !deleteAfter, immediately, GetHttpHeaders());
return FileOperationsManager.Delete(AuthContext.CurrentAccount.ID, TenantManager.GetCurrentTenant(), folders, files, ignoreException, !deleteAfter, immediately, GetHttpHeaders());
}
public ItemList<FileOperationResult> EmptyTrash()
@ -1452,7 +1463,7 @@ namespace ASC.Web.Files.Services.WCFService
var foldersId = folderDao.GetFolders(trashId).Select(f => f.ID).ToList();
var filesId = fileDao.GetFiles(trashId).ToList();
return FileOperationsManager.Delete(AuthContext.CurrentAccount.ID, TenantManager.CurrentTenant, foldersId, filesId, false, true, false, GetHttpHeaders());
return FileOperationsManager.Delete(AuthContext.CurrentAccount.ID, TenantManager.GetCurrentTenant(), foldersId, filesId, false, true, false, GetHttpHeaders());
}
public ItemList<FileOperationResult> CheckConversion(ItemList<ItemList<string>> filesInfoJSON)
@ -2253,46 +2264,46 @@ namespace ASC.Web.Files.Services.WCFService
{
if (services.TryAddScoped<FileStorageService<string>>())
{
services.TryAddScoped<FileStorageService<int>>();
//services.TryAddScoped<IFileStorageService, FileStorageService>();
return services
.AddGlobalService()
.AddGlobalStoreService()
.AddGlobalFolderHelperService()
.AddAuthContextService()
.AddUserManagerService()
.AddFilesLinkUtilityService()
.AddBaseCommonLinkUtilityService()
.AddCoreBaseSettingsService()
.AddCustomNamingPeopleService()
.AddDisplayUserSettingsService()
.AddPathProviderService()
.AddDaoFactoryService()
.AddFileMarkerService()
.AddFilesSettingsHelperService()
.AddFileUtilityService()
.AddFileSecurityService()
.AddFilesMessageService()
.AddFileShareLinkService()
.AddDocumentServiceConnectorService()
.AddEntryManagerService()
.AddDocumentServiceHelperService()
.AddThirdpartyConfigurationService()
.AddUrlShortener()
.AddDocuSignHelperService()
.AddDocuSignTokenService()
.AddFileConverterService()
.AddNotifyClientService()
.AddFileSharingService()
.AddDocumentServiceTrackerHelperService()
.AddSocketManagerService()
.AddFileOperationsManagerHelperService()
.AddFileSharingAceHelperService()
.AddTenantManagerService();
}
services.TryAddScoped<FileStorageService<int>>();
//services.TryAddScoped<IFileStorageService, FileStorageService>();
return services
.AddGlobalService()
.AddGlobalStoreService()
.AddGlobalFolderHelperService()
.AddAuthContextService()
.AddUserManagerService()
.AddFilesLinkUtilityService()
.AddBaseCommonLinkUtilityService()
.AddCoreBaseSettingsService()
.AddCustomNamingPeopleService()
.AddDisplayUserSettingsService()
.AddPathProviderService()
.AddDaoFactoryService()
.AddFileMarkerService()
.AddFilesSettingsHelperService()
.AddFileUtilityService()
.AddFileSecurityService()
.AddFilesMessageService()
.AddFileShareLinkService()
.AddDocumentServiceConnectorService()
.AddEntryManagerService()
.AddDocumentServiceHelperService()
.AddThirdpartyConfigurationService()
.AddUrlShortener()
.AddDocuSignHelperService()
.AddDocuSignTokenService()
.AddFileConverterService()
.AddNotifyClientService()
.AddFileSharingService()
.AddDocumentServiceTrackerHelperService()
.AddSocketManagerService()
.AddFileOperationsManagerHelperService()
.AddFileSharingAceHelperService()
.AddTenantManagerService();
}
return services;
}
return services;
}
}
public class FileModel<T>

View File

@ -95,7 +95,6 @@ namespace ASC.Web.Files.Core.Search
{
TenantManager.SetCurrentTenant(r.TenantId);
fileDao.InitDocument(r);
TenantManager.CurrentTenant = null;
});
Index(data);
}

View File

@ -127,6 +127,7 @@ namespace ASC.Files.Thirdparty
{
if (services.TryAddScoped<IProviderDao, ProviderAccountDao>())
{
services.TryAddScoped<CachedProviderAccountDao>();
services.TryAddSingleton<CachedProviderAccountDaoNotify>();
return services

View File

@ -529,7 +529,7 @@ namespace ASC.Files.Thirdparty.ProviderDao
{
if (services.TryAddScoped<ProviderFileDao>())
{
services.TryAddScoped<File<string>>();
services.TryAddTransient<File<string>>();
services.TryAddScoped<IFileDao<string>, ProviderFileDao>();
return services

View File

@ -140,7 +140,7 @@ namespace ASC.Web.Files.Configuration
Additional = new Dictionary<string, object>
{
{ "Author", r.CreateByString.HtmlEncode() },
{ "Path", FolderPathBuilder(EntryManager.GetBreadCrumbs(r.FolderID, folderDao)) },
{ "Path", FolderPathBuilder<int>(EntryManager.GetBreadCrumbs(r.FolderID, folderDao)) },
{ "Size", FileSizeComment.FilesSizeToString(r.ContentLength) }
}
}
@ -157,7 +157,7 @@ namespace ASC.Web.Files.Configuration
Additional = new Dictionary<string, object>
{
{ "Author", f.CreateByString.HtmlEncode() },
{ "Path", FolderPathBuilder(EntryManager.GetBreadCrumbs(f.ID, folderDao)) },
{ "Path", FolderPathBuilder<int>(EntryManager.GetBreadCrumbs(f.ID, folderDao)) },
{ "IsFolder", true }
}
});
@ -165,7 +165,7 @@ namespace ASC.Web.Files.Configuration
return result.Concat(resultFolder).ToArray();
}
private static string FolderPathBuilder<T>(IEnumerable<Folder<T>> folders)
private static string FolderPathBuilder<T>(IEnumerable<FileEntry> folders)
{
var titles = folders.Select(f => f.Title).ToList();
const string separator = " \\ ";

View File

@ -37,7 +37,7 @@ namespace ASC.Web.Files.Services.WCFService
public int Total { get; set; }
[JsonPropertyName("path_parts")]
public ItemList<T> FolderPathParts { get; set; }
public ItemList<object> FolderPathParts { get; set; }
[JsonPropertyName("folder_info")]
public Folder<T> FolderInfo { get; set; }

View File

@ -112,18 +112,18 @@ namespace ASC.Web.Files.Utils
AuthContext = authContext;
}
public List<Folder<T>> GetBreadCrumbs<T>(T folderId)
public List<FileEntry> GetBreadCrumbs<T>(T folderId)
{
var folderDao = DaoFactory.GetFolderDao<T>();
return GetBreadCrumbs(folderId, folderDao);
}
public List<Folder<T>> GetBreadCrumbs<T>(T folderId, IFolderDao<T> folderDao)
public List<FileEntry> GetBreadCrumbs<T>(T folderId, IFolderDao<T> folderDao)
{
if (folderId == null) return new List<Folder<T>>();
var breadCrumbs = FileSecurity.FilterRead(folderDao.GetParentFolders(folderId)).ToList();
if (folderId == null) return new List<FileEntry>();
var breadCrumbs = FileSecurity.FilterRead(folderDao.GetParentFolders(folderId)).Cast<FileEntry>().ToList();
var firstVisible = breadCrumbs.ElementAtOrDefault(0);
var firstVisible = breadCrumbs.ElementAtOrDefault(0) as Folder<T>;
var rootId = 0;
if (firstVisible == null)
@ -160,10 +160,12 @@ namespace ASC.Web.Files.Utils
break;
}
}
var folderDaoInt = DaoFactory.GetFolderDao<int>();
if (rootId != 0)
{
breadCrumbs.Insert(0, folderDao.GetFolder((T)Convert.ChangeType(rootId, typeof(T))));
breadCrumbs.Insert(0, folderDaoInt.GetFolder(rootId));
}
return breadCrumbs;
@ -715,12 +717,12 @@ namespace ASC.Web.Files.Utils
}
public List<Folder<T>> GetBreadCrumbs<T>(T folderId)
public List<FileEntry> GetBreadCrumbs<T>(T folderId)
{
return BreadCrumbsManager.GetBreadCrumbs(folderId);
}
public List<Folder<T>> GetBreadCrumbs<T>(T folderId, IFolderDao<T> folderDao)
public List<FileEntry> GetBreadCrumbs<T>(T folderId, IFolderDao<T> folderDao)
{
return BreadCrumbsManager.GetBreadCrumbs(folderId, folderDao);
}

View File

@ -880,13 +880,13 @@ namespace ASC.Api.Documents
/// <category>Folders</category>
/// <returns>Parent folders</returns>
[Read("folder/{folderId}/path", DisableFormat = true)]
public IEnumerable<FolderWrapper<string>> GetFolderPath(string folderId)
public IEnumerable<FileEntryWrapper> GetFolderPath(string folderId)
{
return FilesControllerHelperString.GetFolderPath(folderId);
}
[Read("folder/{folderId:int}/path")]
public IEnumerable<FolderWrapper<int>> GetFolderPath(int folderId)
public IEnumerable<FileEntryWrapper> GetFolderPath(int folderId)
{
return FilesControllerHelperInt.GetFolderPath(folderId);
}

View File

@ -340,9 +340,18 @@ namespace ASC.Files.Helpers
return FolderWrapperHelper.Get(folder);
}
public IEnumerable<FolderWrapper<T>> GetFolderPath(T folderId)
public IEnumerable<FileEntryWrapper> GetFolderPath(T folderId)
{
return EntryManager.GetBreadCrumbs(folderId).Select(FolderWrapperHelper.Get);
return EntryManager.GetBreadCrumbs(folderId).Select(r =>
{
if (r is Folder<string> f1)
return FolderWrapperHelper.Get(f1);
if (r is Folder<int> f2)
return FolderWrapperHelper.Get(f2);
return default(FileEntryWrapper);
});
}
public FileWrapper<T> GetFileInfo(T fileId, int version = -1)

View File

@ -4,10 +4,13 @@ using System.Text.Json.Serialization;
using ASC.Api.Core;
using ASC.Api.Documents;
using ASC.Common;
using ASC.Common.DependencyInjection;
using ASC.Web.Files;
using ASC.Web.Files.HttpHandlers;
using ASC.Web.Studio.Core.Notify;
using Autofac;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
@ -83,6 +86,11 @@ namespace ASC.Files
{
appBranch.UseDocuSignHandler();
});
}
public void ConfigureContainer(ContainerBuilder builder)
{
builder.Register(Configuration, HostEnvironment.ContentRootPath);
}
}
}

View File

@ -36,8 +36,6 @@ using System.ServiceModel.Security;
using System.Text.RegularExpressions;
using System.Web;
using ARSoft.Tools.Net.Dns;
using ASC.Api.Collections;
using ASC.Api.Core;
using ASC.Api.Utils;
@ -2355,11 +2353,11 @@ namespace ASC.Api.Settings
[Read("telegramlink")]
public object TelegramLink()
{
var currentLink = TelegramHelper.CurrentRegistrationLink(AuthContext.CurrentAccount.ID, TenantManager.CurrentTenant.TenantId);
var currentLink = TelegramHelper.CurrentRegistrationLink(AuthContext.CurrentAccount.ID, Tenant.TenantId);
if (string.IsNullOrEmpty(currentLink))
{
var url = TelegramHelper.RegisterUser(AuthContext.CurrentAccount.ID, TenantManager.CurrentTenant.TenantId);
var url = TelegramHelper.RegisterUser(AuthContext.CurrentAccount.ID, Tenant.TenantId);
return url;
}
else
@ -2375,7 +2373,7 @@ namespace ASC.Api.Settings
[Read("telegramisconnected")]
public object TelegramIsConnected()
{
return (int)TelegramHelper.UserIsConnected(AuthContext.CurrentAccount.ID, TenantManager.CurrentTenant.TenantId);
return (int)TelegramHelper.UserIsConnected(AuthContext.CurrentAccount.ID, Tenant.TenantId);
}
/// <summary>
@ -2384,7 +2382,7 @@ namespace ASC.Api.Settings
[Delete("telegramdisconnect")]
public void TelegramDisconnect()
{
TelegramHelper.Disconnect(AuthContext.CurrentAccount.ID, TenantManager.CurrentTenant.TenantId);
TelegramHelper.Disconnect(AuthContext.CurrentAccount.ID, Tenant.TenantId);
}
private readonly int maxCount = 10;