Merge branch 'master' into feature/crm-migrate
This commit is contained in:
commit
ab87be50f8
51
common/ASC.Api.Core/Core/Update.cs
Normal file
51
common/ASC.Api.Core/Core/Update.cs
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
*
|
||||
* (c) Copyright Ascensio System Limited 2010-2020
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace ASC.Api.Utils
|
||||
{
|
||||
public static class Update
|
||||
{
|
||||
public static T IfNotEquals<T>(T current, T @new)
|
||||
{
|
||||
if (!Equals(current, @new))
|
||||
{
|
||||
return @new;
|
||||
}
|
||||
return current;
|
||||
}
|
||||
|
||||
public static T IfNotEmptyAndNotEquals<T>(T current, T @new)
|
||||
{
|
||||
if (Equals(@new, default(T))) return current;
|
||||
|
||||
if (!Equals(current, @new))
|
||||
{
|
||||
return @new;
|
||||
}
|
||||
return current;
|
||||
}
|
||||
}
|
||||
}
|
@ -142,7 +142,7 @@ server {
|
||||
try_files /$basename /index.html =404;
|
||||
}
|
||||
|
||||
location ~* /httphandlers/filehandler.ashx {
|
||||
location ~* (/httphandlers/filehandler.ashx|ChunkedUploader.ashx) {
|
||||
proxy_pass http://localhost:5007;
|
||||
proxy_set_header X-REWRITER-URL $X_REWRITER_URL;
|
||||
}
|
||||
|
@ -315,7 +315,7 @@ namespace ASC.Web.Files.Helpers
|
||||
// new RecipientEvent {RecipientEventStatusCode = "AuthenticationFailed"},
|
||||
// new RecipientEvent {RecipientEventStatusCode = "AutoResponded"},
|
||||
// },
|
||||
Url = BaseCommonLinkUtility.GetFullAbsolutePath(DocuSignHandler.Path(FilesLinkUtility) + "?" + FilesLinkUtility.Action + "=webhook"),
|
||||
Url = BaseCommonLinkUtility.GetFullAbsolutePath(DocuSignHandlerService.Path(FilesLinkUtility) + "?" + FilesLinkUtility.Action + "=webhook"),
|
||||
};
|
||||
|
||||
Log.Debug("DocuSign hook url: " + eventNotification.Url);
|
||||
@ -367,7 +367,7 @@ namespace ASC.Web.Files.Helpers
|
||||
var envelopeId = envelopeSummary.EnvelopeId;
|
||||
var url = envelopesApi.CreateSenderView(accountId, envelopeId, new ReturnUrlRequest
|
||||
{
|
||||
ReturnUrl = BaseCommonLinkUtility.GetFullAbsolutePath(DocuSignHandler.Path(FilesLinkUtility) + "?" + FilesLinkUtility.Action + "=redirect")
|
||||
ReturnUrl = BaseCommonLinkUtility.GetFullAbsolutePath(DocuSignHandlerService.Path(FilesLinkUtility) + "?" + FilesLinkUtility.Action + "=redirect")
|
||||
});
|
||||
Log.Debug("DocuSign senderView: " + url.Url);
|
||||
|
||||
|
@ -253,11 +253,11 @@ namespace ASC.Files.Helpers
|
||||
{
|
||||
var session = FileUploader.InitiateUpload(file.FolderID, (file.ID ?? default), file.Title, file.ContentLength, encrypted);
|
||||
|
||||
var response = ChunkedUploadSessionHelper.ToResponseObject(session, true);
|
||||
var responseObject = ChunkedUploadSessionHelper.ToResponseObject(session, true);
|
||||
return new
|
||||
{
|
||||
success = true,
|
||||
data = response
|
||||
data = responseObject
|
||||
};
|
||||
}
|
||||
|
||||
@ -279,11 +279,10 @@ namespace ASC.Files.Helpers
|
||||
ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true;
|
||||
}
|
||||
|
||||
using (var response = request.GetResponse())
|
||||
using (var responseStream = response.GetResponseStream())
|
||||
{
|
||||
return JObject.Parse(new StreamReader(responseStream).ReadToEnd()); //result is json string
|
||||
}
|
||||
using var response = request.GetResponse();
|
||||
using var responseStream = response.GetResponseStream();
|
||||
using var streamReader = new StreamReader(responseStream);
|
||||
return JObject.Parse(streamReader.ReadToEnd()); //result is json string
|
||||
}
|
||||
|
||||
public FileWrapper<T> CreateTextFile(T folderId, string title, string content)
|
||||
|
@ -45,16 +45,37 @@ using ASC.Web.Files.Helpers;
|
||||
using ASC.Web.Files.Utils;
|
||||
using ASC.Web.Studio.Core;
|
||||
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace ASC.Web.Files.HttpHandlers
|
||||
{
|
||||
public class ChunkedUploaderHandler //: AbstractHttpAsyncHandler
|
||||
public class ChunkedUploaderHandler
|
||||
{
|
||||
public RequestDelegate Next { get; }
|
||||
public IServiceProvider ServiceProvider { get; }
|
||||
|
||||
public ChunkedUploaderHandler(RequestDelegate next, IServiceProvider serviceProvider)
|
||||
{
|
||||
Next = next;
|
||||
ServiceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
public async Task Invoke(HttpContext context)
|
||||
{
|
||||
using var scope = ServiceProvider.CreateScope();
|
||||
var chunkedUploaderHandlerService = scope.ServiceProvider.GetService<ChunkedUploaderHandlerService>();
|
||||
await chunkedUploaderHandlerService.Invoke(context);
|
||||
await Next.Invoke(context);
|
||||
}
|
||||
}
|
||||
|
||||
public class ChunkedUploaderHandlerService
|
||||
{
|
||||
public TenantManager TenantManager { get; }
|
||||
public FileUploader FileUploader { get; }
|
||||
public FilesMessageService FilesMessageService { get; }
|
||||
@ -67,8 +88,7 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
public ChunkedUploadSessionHelper ChunkedUploadSessionHelper { get; }
|
||||
public ILog Logger { get; }
|
||||
|
||||
public ChunkedUploaderHandler(
|
||||
RequestDelegate next,
|
||||
public ChunkedUploaderHandlerService(
|
||||
IOptionsMonitor<ILog> optionsMonitor,
|
||||
TenantManager tenantManager,
|
||||
FileUploader fileUploader,
|
||||
@ -81,7 +101,6 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
ChunkedUploadSessionHolder chunkedUploadSessionHolder,
|
||||
ChunkedUploadSessionHelper chunkedUploadSessionHelper)
|
||||
{
|
||||
Next = next;
|
||||
TenantManager = tenantManager;
|
||||
FileUploader = fileUploader;
|
||||
FilesMessageService = filesMessageService;
|
||||
@ -96,69 +115,80 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
}
|
||||
|
||||
public async Task Invoke(HttpContext context)
|
||||
{
|
||||
var uploadSession = ChunkedUploadSessionHolder.GetSession(context.Request.Query["uid"]);
|
||||
|
||||
if (uploadSession as ChunkedUploadSession<int> != null)
|
||||
{
|
||||
await Invoke<int>(context);
|
||||
return;
|
||||
}
|
||||
|
||||
await Invoke<string>(context);
|
||||
}
|
||||
|
||||
public async Task Invoke<T>(HttpContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
var request = new ChunkedRequestHelper(context.Request);
|
||||
var request = new ChunkedRequestHelper<T>(context.Request);
|
||||
|
||||
if (!TryAuthorize(request))
|
||||
{
|
||||
WriteError(context, "Can't authorize given initiate session request or session with specified upload id already expired");
|
||||
await WriteError(context, "Can't authorize given initiate session request or session with specified upload id already expired");
|
||||
return;
|
||||
}
|
||||
|
||||
if (TenantManager.GetCurrentTenant().Status != TenantStatus.Active)
|
||||
{
|
||||
WriteError(context, "Can't perform upload for deleted or transfering portals");
|
||||
await WriteError(context, "Can't perform upload for deleted or transfering portals");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (request.Type(InstanceCrypto))
|
||||
{
|
||||
case ChunkedRequestType.Abort:
|
||||
FileUploader.AbortUpload<string>(request.UploadId);
|
||||
WriteSuccess(context, null);
|
||||
FileUploader.AbortUpload<T>(request.UploadId);
|
||||
await WriteSuccess(context, null);
|
||||
return;
|
||||
|
||||
case ChunkedRequestType.Initiate:
|
||||
var createdSession = FileUploader.InitiateUpload(request.FolderId, request.FileId, request.FileName, request.FileSize, request.Encrypted);
|
||||
WriteSuccess(context, ChunkedUploadSessionHelper.ToResponseObject(createdSession, true));
|
||||
await WriteSuccess(context, ChunkedUploadSessionHelper.ToResponseObject(createdSession, true));
|
||||
return;
|
||||
|
||||
case ChunkedRequestType.Upload:
|
||||
var resumedSession = FileUploader.UploadChunk<string>(request.UploadId, request.ChunkStream, request.ChunkSize);
|
||||
var resumedSession = FileUploader.UploadChunk<T>(request.UploadId, request.ChunkStream, request.ChunkSize);
|
||||
|
||||
if (resumedSession.BytesUploaded == resumedSession.BytesTotal)
|
||||
{
|
||||
WriteSuccess(context, ToResponseObject(resumedSession.File), (int)HttpStatusCode.Created);
|
||||
await WriteSuccess(context, ToResponseObject(resumedSession.File), (int)HttpStatusCode.Created);
|
||||
FilesMessageService.Send(resumedSession.File, MessageAction.FileUploaded, resumedSession.File.Title);
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteSuccess(context, ChunkedUploadSessionHelper.ToResponseObject(resumedSession));
|
||||
await WriteSuccess(context, ChunkedUploadSessionHelper.ToResponseObject(resumedSession));
|
||||
}
|
||||
return;
|
||||
|
||||
default:
|
||||
WriteError(context, "Unknown request type.");
|
||||
await WriteError(context, "Unknown request type.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (FileNotFoundException error)
|
||||
{
|
||||
Logger.Error(error);
|
||||
WriteError(context, FilesCommonResource.ErrorMassage_FileNotFound);
|
||||
await WriteError(context, FilesCommonResource.ErrorMassage_FileNotFound);
|
||||
}
|
||||
catch (Exception error)
|
||||
{
|
||||
Logger.Error(error);
|
||||
WriteError(context, error.Message);
|
||||
await WriteError(context, error.Message);
|
||||
}
|
||||
|
||||
await Next.Invoke(context);
|
||||
}
|
||||
|
||||
private bool TryAuthorize(ChunkedRequestHelper request)
|
||||
private bool TryAuthorize<T>(ChunkedRequestHelper<T> request)
|
||||
{
|
||||
if (request.Type(InstanceCrypto) == ChunkedRequestType.Initiate)
|
||||
{
|
||||
@ -172,7 +202,7 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
|
||||
if (!string.IsNullOrEmpty(request.UploadId))
|
||||
{
|
||||
var uploadSession = ChunkedUploadSessionHolder.GetSession<string>(request.UploadId);
|
||||
var uploadSession = ChunkedUploadSessionHolder.GetSession(request.UploadId);
|
||||
if (uploadSession != null)
|
||||
{
|
||||
TenantManager.SetCurrentTenant(uploadSession.TenantId);
|
||||
@ -187,21 +217,21 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void WriteError(HttpContext context, string message)
|
||||
private static async Task WriteError(HttpContext context, string message)
|
||||
{
|
||||
WriteResponse(context, false, null, message, (int)HttpStatusCode.OK);
|
||||
await WriteResponse(context, false, null, message, (int)HttpStatusCode.OK);
|
||||
}
|
||||
|
||||
private static void WriteSuccess(HttpContext context, object data, int statusCode = (int)HttpStatusCode.OK)
|
||||
private static async Task WriteSuccess(HttpContext context, object data, int statusCode = (int)HttpStatusCode.OK)
|
||||
{
|
||||
WriteResponse(context, true, data, string.Empty, statusCode);
|
||||
await WriteResponse(context, true, data, string.Empty, statusCode);
|
||||
}
|
||||
|
||||
private static void WriteResponse(HttpContext context, bool success, object data, string message, int statusCode)
|
||||
private static async Task WriteResponse(HttpContext context, bool success, object data, string message, int statusCode)
|
||||
{
|
||||
context.Response.StatusCode = statusCode;
|
||||
context.Response.WriteAsync(JsonConvert.SerializeObject(new { success, data, message })).Wait();
|
||||
context.Response.ContentType = "application/json";
|
||||
await context.Response.WriteAsync(JsonConvert.SerializeObject(new { success, data, message }));
|
||||
}
|
||||
|
||||
private static object ToResponseObject<T>(File<T> file)
|
||||
@ -216,151 +246,151 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
uploaded = true
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private enum ChunkedRequestType
|
||||
public enum ChunkedRequestType
|
||||
{
|
||||
None,
|
||||
Initiate,
|
||||
Abort,
|
||||
Upload
|
||||
}
|
||||
|
||||
[DebuggerDisplay("{Type} ({UploadId})")]
|
||||
public class ChunkedRequestHelper<T>
|
||||
{
|
||||
private readonly HttpRequest _request;
|
||||
private IFormFile _file;
|
||||
private int? _tenantId;
|
||||
private long? _fileContentLength;
|
||||
private Guid? _authKey;
|
||||
private CultureInfo _cultureInfo;
|
||||
|
||||
public ChunkedRequestType Type(InstanceCrypto instanceCrypto)
|
||||
{
|
||||
None,
|
||||
Initiate,
|
||||
Abort,
|
||||
Upload
|
||||
if (_request.Query["initiate"] == "true" && IsAuthDataSet(instanceCrypto) && IsFileDataSet())
|
||||
return ChunkedRequestType.Initiate;
|
||||
|
||||
if (_request.Query["abort"] == "true" && !string.IsNullOrEmpty(UploadId))
|
||||
return ChunkedRequestType.Abort;
|
||||
|
||||
return !string.IsNullOrEmpty(UploadId)
|
||||
? ChunkedRequestType.Upload
|
||||
: ChunkedRequestType.None;
|
||||
}
|
||||
|
||||
[DebuggerDisplay("{Type} ({UploadId})")]
|
||||
private class ChunkedRequestHelper
|
||||
public string UploadId
|
||||
{
|
||||
private readonly HttpRequest _request;
|
||||
private IFormFile _file;
|
||||
private int? _tenantId;
|
||||
private long? _fileContentLength;
|
||||
private Guid? _authKey;
|
||||
private CultureInfo _cultureInfo;
|
||||
get { return _request.Query["uid"]; }
|
||||
}
|
||||
|
||||
public ChunkedRequestType Type(InstanceCrypto instanceCrypto)
|
||||
public int TenantId
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_request.Query["initiate"] == "true" && IsAuthDataSet(instanceCrypto) && IsFileDataSet())
|
||||
return ChunkedRequestType.Initiate;
|
||||
|
||||
if (_request.Query["abort"] == "true" && !string.IsNullOrEmpty(UploadId))
|
||||
return ChunkedRequestType.Abort;
|
||||
|
||||
return !string.IsNullOrEmpty(UploadId)
|
||||
? ChunkedRequestType.Upload
|
||||
: ChunkedRequestType.None;
|
||||
}
|
||||
|
||||
public string UploadId
|
||||
{
|
||||
get { return _request.Query["uid"]; }
|
||||
}
|
||||
|
||||
public int TenantId
|
||||
{
|
||||
get
|
||||
if (!_tenantId.HasValue)
|
||||
{
|
||||
if (!_tenantId.HasValue)
|
||||
{
|
||||
if (int.TryParse(_request.Query["tid"], out var v))
|
||||
_tenantId = v;
|
||||
else
|
||||
_tenantId = -1;
|
||||
}
|
||||
return _tenantId.Value;
|
||||
if (int.TryParse(_request.Query["tid"], out var v))
|
||||
_tenantId = v;
|
||||
else
|
||||
_tenantId = -1;
|
||||
}
|
||||
return _tenantId.Value;
|
||||
}
|
||||
}
|
||||
|
||||
public Guid AuthKey(InstanceCrypto instanceCrypto)
|
||||
public Guid AuthKey(InstanceCrypto instanceCrypto)
|
||||
{
|
||||
if (!_authKey.HasValue)
|
||||
{
|
||||
if (!_authKey.HasValue)
|
||||
_authKey = !string.IsNullOrEmpty(_request.Query["userid"])
|
||||
? new Guid(instanceCrypto.Decrypt(_request.Query["userid"]))
|
||||
: Guid.Empty;
|
||||
}
|
||||
return _authKey.Value;
|
||||
}
|
||||
|
||||
public T FolderId
|
||||
{
|
||||
get { return (T)Convert.ChangeType(_request.Query[FilesLinkUtility.FolderId], typeof(T)); }
|
||||
}
|
||||
|
||||
public T FileId
|
||||
{
|
||||
get { return (T)Convert.ChangeType(_request.Query[FilesLinkUtility.FileId], typeof(T)); }
|
||||
}
|
||||
|
||||
public string FileName
|
||||
{
|
||||
get { return _request.Query[FilesLinkUtility.FileTitle]; }
|
||||
}
|
||||
|
||||
public long FileSize
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!_fileContentLength.HasValue)
|
||||
{
|
||||
_authKey = !string.IsNullOrEmpty(_request.Query["userid"])
|
||||
? new Guid(instanceCrypto.Decrypt(_request.Query["userid"]))
|
||||
: Guid.Empty;
|
||||
long.TryParse(_request.Query["fileSize"], out var v);
|
||||
_fileContentLength = v;
|
||||
}
|
||||
return _authKey.Value;
|
||||
return _fileContentLength.Value;
|
||||
}
|
||||
}
|
||||
|
||||
public string FolderId
|
||||
public long ChunkSize
|
||||
{
|
||||
get { return File.Length; }
|
||||
}
|
||||
|
||||
public Stream ChunkStream
|
||||
{
|
||||
get { return File.OpenReadStream(); }
|
||||
}
|
||||
|
||||
public CultureInfo CultureInfo(SetupInfo setupInfo)
|
||||
{
|
||||
if (_cultureInfo != null)
|
||||
return _cultureInfo;
|
||||
|
||||
var culture = _request.Query["culture"];
|
||||
if (string.IsNullOrEmpty(culture)) culture = "en-US";
|
||||
|
||||
return _cultureInfo = setupInfo.EnabledCulturesPersonal.Find(c => string.Equals(c.Name, culture, StringComparison.InvariantCultureIgnoreCase));
|
||||
}
|
||||
|
||||
public bool Encrypted
|
||||
{
|
||||
get { return _request.Query["encrypted"] == "true"; }
|
||||
}
|
||||
|
||||
private IFormFile File
|
||||
{
|
||||
get
|
||||
{
|
||||
get { return _request.Query[FilesLinkUtility.FolderId]; }
|
||||
if (_file != null)
|
||||
return _file;
|
||||
|
||||
if (_request.Form.Files.Count > 0)
|
||||
return _file = _request.Form.Files[0];
|
||||
|
||||
throw new Exception("HttpRequest.Files is empty");
|
||||
}
|
||||
}
|
||||
|
||||
public string FileId
|
||||
{
|
||||
get { return _request.Query[FilesLinkUtility.FileId]; }
|
||||
}
|
||||
public ChunkedRequestHelper(HttpRequest request)
|
||||
{
|
||||
_request = request ?? throw new ArgumentNullException("request");
|
||||
}
|
||||
|
||||
public string FileName
|
||||
{
|
||||
get { return _request.Query[FilesLinkUtility.FileTitle]; }
|
||||
}
|
||||
private bool IsAuthDataSet(InstanceCrypto instanceCrypto)
|
||||
{
|
||||
return TenantId > -1 && AuthKey(instanceCrypto) != Guid.Empty;
|
||||
}
|
||||
|
||||
public long FileSize
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!_fileContentLength.HasValue)
|
||||
{
|
||||
long.TryParse(_request.Query["fileSize"], out var v);
|
||||
_fileContentLength = v;
|
||||
}
|
||||
return _fileContentLength.Value;
|
||||
}
|
||||
}
|
||||
|
||||
public long ChunkSize
|
||||
{
|
||||
get { return File.Length; }
|
||||
}
|
||||
|
||||
public Stream ChunkStream
|
||||
{
|
||||
get { return File.OpenReadStream(); }
|
||||
}
|
||||
|
||||
public CultureInfo CultureInfo(SetupInfo setupInfo)
|
||||
{
|
||||
if (_cultureInfo != null)
|
||||
return _cultureInfo;
|
||||
|
||||
var culture = _request.Query["culture"];
|
||||
if (string.IsNullOrEmpty(culture)) culture = "en-US";
|
||||
|
||||
return _cultureInfo = setupInfo.EnabledCulturesPersonal.Find(c => string.Equals(c.Name, culture, StringComparison.InvariantCultureIgnoreCase));
|
||||
}
|
||||
|
||||
public bool Encrypted
|
||||
{
|
||||
get { return _request.Query["encrypted"] == "true"; }
|
||||
}
|
||||
|
||||
private IFormFile File
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_file != null)
|
||||
return _file;
|
||||
|
||||
if (_request.Form.Files.Count > 0)
|
||||
return _file = _request.Form.Files[0];
|
||||
|
||||
throw new Exception("HttpRequest.Files is empty");
|
||||
}
|
||||
}
|
||||
|
||||
public ChunkedRequestHelper(HttpRequest request)
|
||||
{
|
||||
_request = request ?? throw new ArgumentNullException("request");
|
||||
}
|
||||
|
||||
private bool IsAuthDataSet(InstanceCrypto instanceCrypto)
|
||||
{
|
||||
return TenantId > -1 && AuthKey(instanceCrypto) != Guid.Empty;
|
||||
}
|
||||
|
||||
private bool IsFileDataSet()
|
||||
{
|
||||
return !string.IsNullOrEmpty(FileName) && !string.IsNullOrEmpty(FolderId);
|
||||
}
|
||||
private bool IsFileDataSet()
|
||||
{
|
||||
return !string.IsNullOrEmpty(FileName) && !FolderId.Equals(default(T));
|
||||
}
|
||||
}
|
||||
|
||||
@ -368,7 +398,7 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
{
|
||||
public static DIHelper AddChunkedUploaderHandlerService(this DIHelper services)
|
||||
{
|
||||
services.TryAddScoped<ChunkedUploaderHandler>();
|
||||
services.TryAddScoped<ChunkedUploaderHandlerService>();
|
||||
return services
|
||||
.AddTenantManagerService()
|
||||
.AddFileUploaderService()
|
||||
@ -381,5 +411,10 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
.AddChunkedUploadSessionHolderService()
|
||||
.AddChunkedUploadSessionHelperService();
|
||||
}
|
||||
|
||||
public static IApplicationBuilder UseChunkedUploaderHandler(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseMiddleware<ChunkedUploaderHandler>();
|
||||
}
|
||||
}
|
||||
}
|
@ -65,8 +65,6 @@ using Microsoft.Extensions.Options;
|
||||
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
using static ASC.Web.Core.Files.DocumentService;
|
||||
|
||||
using FileShare = ASC.Files.Core.Security.FileShare;
|
||||
using MimeMapping = ASC.Common.Web.MimeMapping;
|
||||
using SecurityContext = ASC.Core.SecurityContext;
|
||||
|
@ -30,6 +30,7 @@ using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
|
||||
using ASC.Common;
|
||||
using ASC.Common.Logging;
|
||||
using ASC.Core;
|
||||
using ASC.Core.Common;
|
||||
@ -37,37 +38,54 @@ using ASC.Files.Resources;
|
||||
using ASC.Web.Files.ThirdPartyApp;
|
||||
using ASC.Web.Studio.Utility;
|
||||
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace ASC.Web.Files.HttpHandlers
|
||||
{
|
||||
public class ThirdPartyAppHandler //: IHttpHandler
|
||||
public class ThirdPartyAppHandler
|
||||
{
|
||||
public RequestDelegate Next { get; }
|
||||
public IServiceProvider ServiceProvider { get; }
|
||||
|
||||
public ThirdPartyAppHandler(RequestDelegate next, IServiceProvider serviceProvider)
|
||||
{
|
||||
Next = next;
|
||||
ServiceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
public async Task Invoke(HttpContext context)
|
||||
{
|
||||
using var scope = ServiceProvider.CreateScope();
|
||||
var thirdPartyAppHandlerService = scope.ServiceProvider.GetService<ThirdPartyAppHandlerService>();
|
||||
thirdPartyAppHandlerService.Invoke(context);
|
||||
await Next.Invoke(context);
|
||||
}
|
||||
}
|
||||
|
||||
public class ThirdPartyAppHandlerService
|
||||
{
|
||||
public AuthContext AuthContext { get; }
|
||||
public BaseCommonLinkUtility BaseCommonLinkUtility { get; }
|
||||
public CommonLinkUtility CommonLinkUtility { get; }
|
||||
private ILog Log { get; set; }
|
||||
|
||||
public string HandlerPath { get; set; }
|
||||
|
||||
public ThirdPartyAppHandler(
|
||||
RequestDelegate next,
|
||||
public ThirdPartyAppHandlerService(
|
||||
IOptionsMonitor<ILog> optionsMonitor,
|
||||
AuthContext authContext,
|
||||
BaseCommonLinkUtility baseCommonLinkUtility,
|
||||
CommonLinkUtility commonLinkUtility)
|
||||
{
|
||||
Next = next;
|
||||
AuthContext = authContext;
|
||||
BaseCommonLinkUtility = baseCommonLinkUtility;
|
||||
CommonLinkUtility = commonLinkUtility;
|
||||
Log = optionsMonitor.CurrentValue;
|
||||
HandlerPath = baseCommonLinkUtility.ToAbsolute("~/thirdpartyapp");
|
||||
}
|
||||
|
||||
public async Task Invoke(HttpContext context)
|
||||
public void Invoke(HttpContext context)
|
||||
{
|
||||
Log.Debug("ThirdPartyApp: handler request - " + context.Request.Url());
|
||||
|
||||
@ -80,13 +98,11 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
|
||||
if (app.Request(context))
|
||||
{
|
||||
await Next.Invoke(context);
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (ThreadAbortException)
|
||||
{
|
||||
await Next.Invoke(context);
|
||||
//Thats is responce ending
|
||||
return;
|
||||
}
|
||||
@ -111,7 +127,23 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
redirectUrl += HttpUtility.UrlEncode(message);
|
||||
}
|
||||
context.Response.Redirect(redirectUrl, true);
|
||||
await Next.Invoke(context);
|
||||
}
|
||||
}
|
||||
|
||||
public static class ThirdPartyAppHandlerExtention
|
||||
{
|
||||
public static DIHelper AddThirdPartyAppHandlerService(this DIHelper services)
|
||||
{
|
||||
services.TryAddScoped<ThirdPartyAppHandlerService>();
|
||||
return services
|
||||
.AddCommonLinkUtilityService()
|
||||
.AddBaseCommonLinkUtilityService()
|
||||
.AddAuthContextService();
|
||||
}
|
||||
|
||||
public static IApplicationBuilder UseThirdPartyAppHandler(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseMiddleware<ThirdPartyAppHandler>();
|
||||
}
|
||||
}
|
||||
}
|
@ -41,13 +41,35 @@ using ASC.Web.Files.Classes;
|
||||
using ASC.Web.Files.Helpers;
|
||||
using ASC.Web.Files.Services.NotifyService;
|
||||
using ASC.Web.Studio.Utility;
|
||||
|
||||
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace ASC.Web.Files.HttpHandlers
|
||||
{
|
||||
public class DocuSignHandler
|
||||
public class DocuSignHandler
|
||||
{
|
||||
public RequestDelegate Next { get; }
|
||||
public IServiceProvider ServiceProvider { get; }
|
||||
|
||||
public DocuSignHandler(RequestDelegate next, IServiceProvider serviceProvider)
|
||||
{
|
||||
Next = next;
|
||||
ServiceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
public async Task Invoke(HttpContext context)
|
||||
{
|
||||
using var scope = ServiceProvider.CreateScope();
|
||||
var docuSignHandlerService = scope.ServiceProvider.GetService<DocuSignHandlerService>();
|
||||
await docuSignHandlerService.Invoke(context);
|
||||
await Next.Invoke(context);
|
||||
}
|
||||
}
|
||||
|
||||
public class DocuSignHandlerService
|
||||
{
|
||||
public static string Path(FilesLinkUtility filesLinkUtility)
|
||||
{
|
||||
@ -55,23 +77,18 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
}
|
||||
|
||||
private ILog Log { get; set; }
|
||||
|
||||
public RequestDelegate Next { get; }
|
||||
|
||||
public TenantExtra TenantExtra { get; }
|
||||
public DocuSignHelper DocuSignHelper { get; }
|
||||
public SecurityContext SecurityContext { get; }
|
||||
public NotifyClient NotifyClient { get; }
|
||||
|
||||
public DocuSignHandler(
|
||||
RequestDelegate next,
|
||||
public DocuSignHandlerService(
|
||||
IOptionsMonitor<ILog> optionsMonitor,
|
||||
TenantExtra tenantExtra,
|
||||
DocuSignHelper docuSignHelper,
|
||||
SecurityContext securityContext,
|
||||
NotifyClient notifyClient)
|
||||
{
|
||||
Next = next;
|
||||
TenantExtra = tenantExtra;
|
||||
DocuSignHelper = docuSignHelper;
|
||||
SecurityContext = securityContext;
|
||||
@ -84,7 +101,7 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
if (TenantExtra.IsNotPaid())
|
||||
{
|
||||
context.Response.StatusCode = (int)HttpStatusCode.PaymentRequired;
|
||||
context.Response.WriteAsync("Payment Required.").Wait();
|
||||
await context.Response.WriteAsync("Payment Required.");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -106,8 +123,6 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
{
|
||||
throw new HttpException((int)HttpStatusCode.InternalServerError, FilesCommonResource.ErrorMassage_BadRequest, e);
|
||||
}
|
||||
|
||||
await Next.Invoke(context);
|
||||
}
|
||||
|
||||
private void Redirect(HttpContext context)
|
||||
@ -241,13 +256,18 @@ namespace ASC.Web.Files.HttpHandlers
|
||||
{
|
||||
public static DIHelper AddDocuSignHandlerService(this DIHelper services)
|
||||
{
|
||||
services.TryAddScoped<DocuSignHandler>();
|
||||
services.TryAddScoped<DocuSignHandlerService>();
|
||||
return services
|
||||
.AddFilesLinkUtilityService()
|
||||
.AddTenantExtraService()
|
||||
.AddDocuSignHelperService()
|
||||
.AddSecurityContextService()
|
||||
.AddNotifyClientService();
|
||||
}
|
||||
|
||||
public static IApplicationBuilder UseDocuSignHandler(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseMiddleware<DocuSignHandler>();
|
||||
}
|
||||
}
|
||||
}
|
@ -43,8 +43,6 @@ using ASC.Web.Files.Classes;
|
||||
using ASC.Web.Files.Utils;
|
||||
using ASC.Web.Studio.Core;
|
||||
|
||||
using static ASC.Web.Core.Files.DocumentService;
|
||||
|
||||
using FileShare = ASC.Files.Core.Security.FileShare;
|
||||
|
||||
namespace ASC.Web.Files.Services.DocumentService
|
||||
|
@ -9,6 +9,7 @@ using ASC.Common;
|
||||
using ASC.Common.DependencyInjection;
|
||||
using ASC.Common.Logging;
|
||||
using ASC.Web.Files;
|
||||
using ASC.Web.Files.HttpHandlers;
|
||||
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
@ -83,7 +84,10 @@ namespace ASC.Files
|
||||
diHelper
|
||||
.AddDocumentsControllerService()
|
||||
.AddEncryptionControllerService()
|
||||
.AddFileHandlerService();
|
||||
.AddFileHandlerService()
|
||||
.AddChunkedUploaderHandlerService()
|
||||
.AddThirdPartyAppHandlerService()
|
||||
.AddDocuSignHandlerService();
|
||||
|
||||
services.AddAutofac(Configuration, HostEnvironment.ContentRootPath);
|
||||
}
|
||||
@ -129,6 +133,27 @@ namespace ASC.Files
|
||||
appBranch.UseFileHandler();
|
||||
});
|
||||
|
||||
app.MapWhen(
|
||||
context => context.Request.Path.ToString().EndsWith("ChunkedUploader.ashx"),
|
||||
appBranch =>
|
||||
{
|
||||
appBranch.UseChunkedUploaderHandler();
|
||||
});
|
||||
|
||||
app.MapWhen(
|
||||
context => context.Request.Path.ToString().EndsWith("ThirdPartyAppHandler.ashx"),
|
||||
appBranch =>
|
||||
{
|
||||
appBranch.UseThirdPartyAppHandler();
|
||||
});
|
||||
|
||||
app.MapWhen(
|
||||
context => context.Request.Path.ToString().EndsWith("DocuSignHandler.ashx"),
|
||||
appBranch =>
|
||||
{
|
||||
appBranch.UseDocuSignHandler();
|
||||
});
|
||||
|
||||
app.UseStaticFiles();
|
||||
}
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ namespace ASC.Web.Files.ThirdPartyApp
|
||||
public SetupInfo SetupInfo { get; }
|
||||
public TokenHelper TokenHelper { get; }
|
||||
public DocumentServiceConnector DocumentServiceConnector { get; }
|
||||
public ThirdPartyAppHandler ThirdPartyAppHandler { get; }
|
||||
public ThirdPartyAppHandlerService ThirdPartyAppHandlerService { get; }
|
||||
public IServiceProvider ServiceProvider { get; }
|
||||
public ILog Logger { get; }
|
||||
|
||||
@ -137,7 +137,7 @@ namespace ASC.Web.Files.ThirdPartyApp
|
||||
SetupInfo setupInfo,
|
||||
TokenHelper tokenHelper,
|
||||
DocumentServiceConnector documentServiceConnector,
|
||||
ThirdPartyAppHandler thirdPartyAppHandler,
|
||||
ThirdPartyAppHandlerService thirdPartyAppHandlerService,
|
||||
IServiceProvider serviceProvider,
|
||||
TenantManager tenantManager,
|
||||
CoreBaseSettings coreBaseSettings,
|
||||
@ -165,7 +165,7 @@ namespace ASC.Web.Files.ThirdPartyApp
|
||||
SetupInfo = setupInfo;
|
||||
TokenHelper = tokenHelper;
|
||||
DocumentServiceConnector = documentServiceConnector;
|
||||
ThirdPartyAppHandler = thirdPartyAppHandler;
|
||||
ThirdPartyAppHandlerService = thirdPartyAppHandlerService;
|
||||
ServiceProvider = serviceProvider;
|
||||
Logger = option.CurrentValue;
|
||||
}
|
||||
@ -251,7 +251,7 @@ namespace ASC.Web.Files.ThirdPartyApp
|
||||
|
||||
Logger.Debug("BoxApp: get file stream url " + fileId);
|
||||
|
||||
var uriBuilder = new UriBuilder(BaseCommonLinkUtility.GetFullAbsolutePath(ThirdPartyAppHandler.HandlerPath));
|
||||
var uriBuilder = new UriBuilder(BaseCommonLinkUtility.GetFullAbsolutePath(ThirdPartyAppHandlerService.HandlerPath));
|
||||
if (uriBuilder.Uri.IsLoopback)
|
||||
{
|
||||
uriBuilder.Host = Dns.GetHostName();
|
||||
|
@ -116,7 +116,7 @@ namespace ASC.Web.Files.ThirdPartyApp
|
||||
public GoogleLoginProvider GoogleLoginProvider { get; }
|
||||
public TokenHelper TokenHelper { get; }
|
||||
public DocumentServiceConnector DocumentServiceConnector { get; }
|
||||
public ThirdPartyAppHandler ThirdPartyAppHandler { get; }
|
||||
public ThirdPartyAppHandlerService ThirdPartyAppHandlerService { get; }
|
||||
public IServiceProvider ServiceProvider { get; }
|
||||
|
||||
public GoogleDriveApp()
|
||||
@ -147,7 +147,7 @@ namespace ASC.Web.Files.ThirdPartyApp
|
||||
GoogleLoginProvider googleLoginProvider,
|
||||
TokenHelper tokenHelper,
|
||||
DocumentServiceConnector documentServiceConnector,
|
||||
ThirdPartyAppHandler thirdPartyAppHandler,
|
||||
ThirdPartyAppHandlerService thirdPartyAppHandlerService,
|
||||
IServiceProvider serviceProvider,
|
||||
TenantManager tenantManager,
|
||||
CoreBaseSettings coreBaseSettings,
|
||||
@ -180,7 +180,7 @@ namespace ASC.Web.Files.ThirdPartyApp
|
||||
GoogleLoginProvider = googleLoginProvider;
|
||||
TokenHelper = tokenHelper;
|
||||
DocumentServiceConnector = documentServiceConnector;
|
||||
ThirdPartyAppHandler = thirdPartyAppHandler;
|
||||
ThirdPartyAppHandlerService = thirdPartyAppHandlerService;
|
||||
ServiceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
@ -257,7 +257,7 @@ namespace ASC.Web.Files.ThirdPartyApp
|
||||
{
|
||||
Logger.Debug("GoogleDriveApp: get file stream url " + fileId);
|
||||
|
||||
var uriBuilder = new UriBuilder(BaseCommonLinkUtility.GetFullAbsolutePath(ThirdPartyAppHandler.HandlerPath));
|
||||
var uriBuilder = new UriBuilder(BaseCommonLinkUtility.GetFullAbsolutePath(ThirdPartyAppHandlerService.HandlerPath));
|
||||
if (uriBuilder.Uri.IsLoopback)
|
||||
{
|
||||
uriBuilder.Host = Dns.GetHostName();
|
||||
|
@ -75,7 +75,11 @@ namespace ASC.Web.Files.Utils
|
||||
|
||||
public ChunkedUploadSession<T> GetSession<T>(string sessionId)
|
||||
{
|
||||
return (ChunkedUploadSession<T>)CommonSessionHolder(false).Get(sessionId);
|
||||
return (ChunkedUploadSession<T>)GetSession(sessionId);
|
||||
}
|
||||
public CommonChunkedUploadSession GetSession(string sessionId)
|
||||
{
|
||||
return CommonSessionHolder(false).Get(sessionId);
|
||||
}
|
||||
|
||||
public ChunkedUploadSession<T> CreateUploadSession<T>(File<T> file, long contentLength)
|
||||
|
Loading…
Reference in New Issue
Block a user