Files: optimization
This commit is contained in:
parent
a62a555217
commit
fb3bfba1bd
@ -36,11 +36,11 @@ namespace ASC.Security.Cryptography
|
||||
[Singletone]
|
||||
public class InstanceCrypto
|
||||
{
|
||||
private MachinePseudoKeys MachinePseudoKeys { get; }
|
||||
private byte[] EKey { get; }
|
||||
|
||||
public InstanceCrypto(MachinePseudoKeys machinePseudoKeys)
|
||||
{
|
||||
MachinePseudoKeys = machinePseudoKeys;
|
||||
EKey = machinePseudoKeys.GetMachineConstant(32);
|
||||
}
|
||||
|
||||
public string Encrypt(string data)
|
||||
@ -50,8 +50,8 @@ namespace ASC.Security.Cryptography
|
||||
|
||||
public byte[] Encrypt(byte[] data)
|
||||
{
|
||||
var hasher = Aes.Create();
|
||||
hasher.Key = EKey();
|
||||
using var hasher = Aes.Create();
|
||||
hasher.Key = EKey;
|
||||
hasher.IV = new byte[hasher.BlockSize >> 3];
|
||||
|
||||
using var ms = new MemoryStream();
|
||||
@ -70,24 +70,17 @@ namespace ASC.Security.Cryptography
|
||||
|
||||
public string Decrypt(byte[] data)
|
||||
{
|
||||
var hasher = Aes.Create();
|
||||
hasher.Key = EKey();
|
||||
using var hasher = Aes.Create();
|
||||
hasher.Key = EKey;
|
||||
hasher.IV = new byte[hasher.BlockSize >> 3];
|
||||
|
||||
using (MemoryStream msDecrypt = new MemoryStream(data))
|
||||
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, hasher.CreateDecryptor(), CryptoStreamMode.Read))
|
||||
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
|
||||
{
|
||||
using var msDecrypt = new MemoryStream(data);
|
||||
using var csDecrypt = new CryptoStream(msDecrypt, hasher.CreateDecryptor(), CryptoStreamMode.Read);
|
||||
using var srDecrypt = new StreamReader(csDecrypt);
|
||||
|
||||
// Read the decrypted bytes from the decrypting stream
|
||||
// and place them in a string.
|
||||
return srDecrypt.ReadToEnd();
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] EKey()
|
||||
{
|
||||
return MachinePseudoKeys.GetMachineConstant(32);
|
||||
// Read the decrypted bytes from the decrypting stream
|
||||
// and place them in a string.
|
||||
return srDecrypt.ReadToEnd();
|
||||
}
|
||||
}
|
||||
}
|
@ -62,12 +62,12 @@ namespace ASC.Core.Data
|
||||
[Scope]
|
||||
class DbQuotaService : IQuotaService
|
||||
{
|
||||
private Expression<Func<DbQuota, TenantQuota>> FromDbQuotaToTenantQuota { get; set; }
|
||||
private Expression<Func<DbQuotaRow, TenantQuotaRow>> FromDbQuotaRowToTenantQuotaRow { get; set; }
|
||||
private static Expression<Func<DbQuota, TenantQuota>> FromDbQuotaToTenantQuota { get; set; }
|
||||
private static Expression<Func<DbQuotaRow, TenantQuotaRow>> FromDbQuotaRowToTenantQuotaRow { get; set; }
|
||||
internal CoreDbContext CoreDbContext { get => LazyCoreDbContext.Value; }
|
||||
internal Lazy<CoreDbContext> LazyCoreDbContext { get; set; }
|
||||
|
||||
public DbQuotaService()
|
||||
static DbQuotaService()
|
||||
{
|
||||
FromDbQuotaToTenantQuota = r => new TenantQuota()
|
||||
{
|
||||
@ -91,7 +91,7 @@ namespace ASC.Core.Data
|
||||
};
|
||||
}
|
||||
|
||||
public DbQuotaService(DbContextManager<CoreDbContext> dbContextManager) : this()
|
||||
public DbQuotaService(DbContextManager<CoreDbContext> dbContextManager)
|
||||
{
|
||||
LazyCoreDbContext = new Lazy<CoreDbContext>(() => dbContextManager.Value);
|
||||
}
|
||||
|
@ -26,30 +26,37 @@
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace ASC.FederatedLogin
|
||||
{
|
||||
[DebuggerDisplay("{AccessToken} (expired: {IsExpired})")]
|
||||
public class OAuth20Token
|
||||
{
|
||||
[JsonPropertyName("access_token")]
|
||||
public string AccessToken { get; set; }
|
||||
|
||||
[JsonPropertyName("refresh_token")]
|
||||
public string RefreshToken { get; set; }
|
||||
|
||||
[JsonPropertyName("expires_in")]
|
||||
[JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
|
||||
public long ExpiresIn { get; set; }
|
||||
|
||||
[JsonPropertyName("client_id")]
|
||||
public string ClientID { get; set; }
|
||||
|
||||
[JsonPropertyName("client_secret")]
|
||||
public string ClientSecret { get; set; }
|
||||
|
||||
[JsonPropertyName("redirect_uri")]
|
||||
public string RedirectUri { get; set; }
|
||||
|
||||
[JsonPropertyName("timestamp")]
|
||||
public DateTime Timestamp { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public string OriginJson { get; set; }
|
||||
|
||||
public OAuth20Token()
|
||||
@ -92,55 +99,19 @@ namespace ASC.FederatedLogin
|
||||
public static OAuth20Token FromJson(string json)
|
||||
{
|
||||
if (string.IsNullOrEmpty(json)) return null;
|
||||
var parser = JObject.Parse(json);
|
||||
if (parser == null) return null;
|
||||
|
||||
var accessToken = parser.Value<string>("access_token");
|
||||
|
||||
if (string.IsNullOrEmpty(accessToken))
|
||||
return null;
|
||||
|
||||
var token = new OAuth20Token
|
||||
{
|
||||
AccessToken = accessToken,
|
||||
RefreshToken = parser.Value<string>("refresh_token"),
|
||||
ClientID = parser.Value<string>("client_id"),
|
||||
ClientSecret = parser.Value<string>("client_secret"),
|
||||
RedirectUri = parser.Value<string>("redirect_uri"),
|
||||
OriginJson = json,
|
||||
};
|
||||
|
||||
if (long.TryParse(parser.Value<string>("expires_in"), out var expiresIn))
|
||||
token.ExpiresIn = expiresIn;
|
||||
|
||||
try
|
||||
{
|
||||
token.Timestamp =
|
||||
!string.IsNullOrEmpty(parser.Value<string>("timestamp"))
|
||||
? parser.Value<DateTime>("timestamp")
|
||||
: DateTime.UtcNow;
|
||||
return JsonSerializer.Deserialize<OAuth20Token>(json);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
token.Timestamp = DateTime.MinValue;
|
||||
return null;
|
||||
}
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
public string ToJson()
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append("{");
|
||||
sb.AppendFormat(" \"access_token\": \"{0}\"", AccessToken);
|
||||
sb.AppendFormat(", \"refresh_token\": \"{0}\"", RefreshToken);
|
||||
sb.AppendFormat(", \"expires_in\": \"{0}\"", ExpiresIn);
|
||||
sb.AppendFormat(", \"client_id\": \"{0}\"", ClientID);
|
||||
sb.AppendFormat(", \"client_secret\": \"{0}\"", ClientSecret);
|
||||
sb.AppendFormat(", \"redirect_uri\": \"{0}\"", RedirectUri);
|
||||
sb.AppendFormat(", \"timestamp\": \"{0}\"", Timestamp.ToString("o", new CultureInfo("en-US")));
|
||||
sb.Append("}");
|
||||
return sb.ToString();
|
||||
return JsonSerializer.Serialize(this);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
|
@ -82,7 +82,7 @@ namespace ASC.Files.Core.Data
|
||||
CoreConfiguration coreConfiguration,
|
||||
SettingsManager settingsManager,
|
||||
AuthContext authContext,
|
||||
IServiceProvider serviceProvider,
|
||||
IServiceProvider serviceProvider,
|
||||
ICache cache)
|
||||
{
|
||||
this.cache = cache;
|
||||
@ -128,7 +128,7 @@ namespace ASC.Files.Core.Data
|
||||
.Join(FilesDbContext.Tree, a => a.FolderId, b => b.FolderId, (file, tree) => new { file, tree })
|
||||
.Where(r => r.file.TenantId == f.TenantId)
|
||||
.Where(r => r.tree.ParentId == f.Id)
|
||||
.Select(r=> r.file.Id)
|
||||
.Select(r => r.file.Id)
|
||||
.Distinct()
|
||||
.Count();
|
||||
|
||||
@ -191,7 +191,7 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
internal static IQueryable<T> BuildSearch<T>(IQueryable<T> query, string text, SearhTypeEnum searhTypeEnum) where T : IDbSearch
|
||||
{
|
||||
var lowerText = text.ToLower().Trim().Replace("%", "\\%").Replace("_", "\\_");
|
||||
var lowerText = GetSearchText(text);
|
||||
|
||||
return searhTypeEnum switch
|
||||
{
|
||||
@ -200,7 +200,9 @@ namespace ASC.Files.Core.Data
|
||||
SearhTypeEnum.Any => query.Where(r => r.Title.ToLower().Contains(lowerText)),
|
||||
_ => query,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
internal static string GetSearchText(string text) => (text ?? "").ToLower().Trim().Replace("%", "\\%").Replace("_", "\\_");
|
||||
|
||||
internal enum SearhTypeEnum
|
||||
{
|
||||
|
@ -116,6 +116,19 @@ namespace ASC.Files.Core.Data
|
||||
return FromQuery(q);
|
||||
}
|
||||
|
||||
static Func<EF.FilesDbContext, int, Guid, IEnumerable<TagType>, HashSet<string>, HashSet<string>, IEnumerable<TagLinkData>> getTagsQuery =
|
||||
Microsoft.EntityFrameworkCore.EF.CompileQuery((EF.FilesDbContext ctx, int tenantId, Guid subject, IEnumerable<TagType> tagType, HashSet<string> filesId, HashSet<string> foldersId) =>
|
||||
ctx.Tag
|
||||
.AsNoTracking()
|
||||
.Where(r => r.TenantId == tenantId)
|
||||
.Where(r => tagType.Contains(r.Flag))
|
||||
.Join(ctx.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link })
|
||||
.Where(r => r.Link.TenantId == r.Tag.TenantId)
|
||||
.Where(r => r.Link.EntryType == FileEntryType.File && filesId.Contains(r.Link.EntryId)
|
||||
|| r.Link.EntryType == FileEntryType.Folder && foldersId.Contains(r.Link.EntryId))
|
||||
.Where(r => subject == Guid.Empty || r.Link.CreateBy == subject)
|
||||
);
|
||||
|
||||
public IDictionary<object, IEnumerable<Tag>> GetTags(Guid subject, IEnumerable<TagType> tagType, IEnumerable<FileEntry<T>> fileEntries)
|
||||
{
|
||||
var filesId = new HashSet<string>();
|
||||
@ -136,19 +149,7 @@ namespace ASC.Files.Core.Data
|
||||
|
||||
if (fileEntries.Any())
|
||||
{
|
||||
var q = Query(FilesDbContext.Tag)
|
||||
.Where(r => tagType.Contains(r.Flag))
|
||||
.Join(FilesDbContext.TagLink, r => r.Id, l => l.TagId, (tag, link) => new TagLinkData { Tag = tag, Link = link })
|
||||
.Where(r => r.Link.TenantId == r.Tag.TenantId)
|
||||
.Where(r => r.Link.EntryType == FileEntryType.File && filesId.Contains(r.Link.EntryId)
|
||||
|| r.Link.EntryType == FileEntryType.Folder && foldersId.Contains(r.Link.EntryId));
|
||||
|
||||
if (subject != Guid.Empty)
|
||||
{
|
||||
q = q.Where(r => r.Link.CreateBy == subject);
|
||||
}
|
||||
|
||||
return FromQuery(q)
|
||||
return FromQuery(getTagsQuery(FilesDbContext, TenantID, subject, tagType, filesId, foldersId))
|
||||
.GroupBy(r => r.EntryId)
|
||||
.ToDictionary(r => r.Key, r => r.AsEnumerable());
|
||||
}
|
||||
@ -779,8 +780,8 @@ namespace ASC.Files.Core.Data
|
||||
}
|
||||
})
|
||||
.AsEnumerable()
|
||||
.ToList()
|
||||
.ConvertAll(ToTag);
|
||||
.Select(ToTag)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
protected List<Tag> FromQuery(IEnumerable<TagLinkData> dbFilesTags)
|
||||
@ -803,8 +804,8 @@ namespace ASC.Files.Core.Data
|
||||
}
|
||||
})
|
||||
.AsEnumerable()
|
||||
.ToList()
|
||||
.ConvertAll(ToTag);
|
||||
.Select(ToTag)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
private Tag ToTag(TagLinkData r)
|
||||
|
@ -53,6 +53,7 @@ using ASC.Security.Cryptography;
|
||||
using ASC.Web.Files.Classes;
|
||||
using ASC.Web.Files.Helpers;
|
||||
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
@ -136,7 +137,7 @@ namespace ASC.Files.Thirdparty
|
||||
return FilesDbContext.ThirdpartyAccount
|
||||
.Where(r => r.TenantId == TenantID)
|
||||
.Where(r => r.UserId == userId)
|
||||
.ToList()
|
||||
.AsEnumerable()
|
||||
.Select(ToProviderInfo)
|
||||
.ToList();
|
||||
}
|
||||
@ -145,35 +146,25 @@ namespace ASC.Files.Thirdparty
|
||||
Logger.Error(string.Format("GetProvidersInfoInternal: user = {0}", userId), e);
|
||||
return new List<IProviderInfo>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Func<FilesDbContext, int, int, FolderType, Guid, string, IEnumerable<DbFilesThirdpartyAccount>> getProvidersInfoQuery =
|
||||
EF.CompileQuery((FilesDbContext ctx, int tenantId, int linkId, FolderType folderType, Guid userId, string searchText) =>
|
||||
ctx.ThirdpartyAccount
|
||||
.AsNoTracking()
|
||||
.Where(r => r.TenantId == tenantId)
|
||||
.Where(r => !(folderType == FolderType.USER || folderType == FolderType.DEFAULT && linkId == -1) || r.UserId == userId)
|
||||
.Where(r => linkId == -1 || r.Id == linkId)
|
||||
.Where(r => folderType == FolderType.DEFAULT || r.FolderType == folderType)
|
||||
.Where(r => searchText == "" || r.Title.ToLower().Contains(searchText))
|
||||
);
|
||||
|
||||
private List<IProviderInfo> GetProvidersInfoInternal(int linkId = -1, FolderType folderType = FolderType.DEFAULT, string searchText = null)
|
||||
{
|
||||
var querySelect = FilesDbContext.ThirdpartyAccount.Where(r => r.TenantId == TenantID);
|
||||
|
||||
if (folderType == FolderType.USER || folderType == FolderType.DEFAULT && linkId == -1)
|
||||
{
|
||||
querySelect = querySelect.Where(r => r.UserId == SecurityContext.CurrentAccount.ID);
|
||||
}
|
||||
|
||||
if (linkId != -1)
|
||||
{
|
||||
querySelect = querySelect.Where(r => r.Id == linkId);
|
||||
}
|
||||
|
||||
if (folderType != FolderType.DEFAULT)
|
||||
{
|
||||
querySelect = querySelect.Where(r => r.FolderType == folderType);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(searchText))
|
||||
{
|
||||
querySelect = BuildSearch(querySelect, searchText, SearhTypeEnum.Any);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return querySelect.ToList()
|
||||
return getProvidersInfoQuery(FilesDbContext, TenantID, linkId, folderType, SecurityContext.CurrentAccount.ID, GetSearchText(searchText))
|
||||
.AsEnumerable()
|
||||
.Select(ToProviderInfo)
|
||||
.ToList();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user