Files: pass CallbackUrl. Fix trackedit.

This commit is contained in:
pavelbannov 2020-12-25 23:25:37 +03:00
parent bb06f4aa53
commit 2fdcbee8ef
4 changed files with 71 additions and 43 deletions

View File

@ -160,7 +160,7 @@ namespace ASC.Files.Core.Data
query = query.OrderByDescending(r => r.Version);
return ToFile(FromQueryWithShared(query).SingleOrDefault());
return ToFile(FromQueryWithShared(query).Take(1).SingleOrDefault());
}
public List<File<int>> GetFileHistory(int fileId)

View File

@ -30,6 +30,7 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
@ -1147,13 +1148,26 @@ namespace ASC.Web.Files
}
private async Task TrackFile(HttpContext context)
{
var q = context.Request.Query[FilesLinkUtility.FileId];
if (int.TryParse(q, out var id))
{
await TrackFile(context, id);
}
else
{
await TrackFile(context, q.FirstOrDefault() ?? "");
}
}
private async Task TrackFile<T>(HttpContext context, T fileId)
{
var auth = context.Request.Query[FilesLinkUtility.AuthKey].FirstOrDefault();
var fileId = context.Request.Query[FilesLinkUtility.FileId].FirstOrDefault();
Logger.Debug("DocService track fileid: " + fileId);
var callbackSpan = TimeSpan.FromDays(128);
var validateResult = EmailValidationKeyProvider.ValidateEmailKey(fileId, auth ?? "", callbackSpan);
var validateResult = EmailValidationKeyProvider.ValidateEmailKey(fileId.ToString(), auth ?? "", callbackSpan);
if (validateResult != EmailValidationKeyProvider.ValidationResult.Ok)
{
Logger.ErrorFormat("DocService track auth error: {0}, {1}: {2}", validateResult.ToString(), FilesLinkUtility.AuthKey, auth);
@ -1165,8 +1179,8 @@ namespace ASC.Web.Files
{
string body;
var receiveStream = context.Request.Body;
var readStream = new StreamReader(receiveStream);
body = readStream.ReadToEnd();
using var readStream = new StreamReader(receiveStream);
body = await readStream.ReadToEndAsync();
Logger.Debug("DocService track body: " + body);
if (string.IsNullOrEmpty(body))
@ -1174,12 +1188,17 @@ namespace ASC.Web.Files
throw new ArgumentException("DocService request body is incorrect");
}
var data = JToken.Parse(body);
if (data == null)
var options = new JsonSerializerOptions
{
throw new ArgumentException("DocService request is incorrect");
AllowTrailingCommas = true,
PropertyNameCaseInsensitive = true
};
fileData = JsonSerializer.Deserialize<DocumentServiceTracker.TrackerData>(body, options);
}
fileData = data.ToObject<DocumentServiceTracker.TrackerData>();
catch(JsonException e)
{
Logger.Error("DocService track error read body", e);
throw new HttpException((int)HttpStatusCode.BadRequest, "DocService request is incorrect");
}
catch (Exception e)
{

View File

@ -81,18 +81,18 @@ namespace ASC.Web.Files.Services.DocumentService
[DebuggerDisplay("{Status} - {Key}")]
public class TrackerData
{
public List<Action> Actions;
public string ChangesUrl;
public ForceSaveInitiator ForceSaveType;
public object History;
public string Key;
public MailMergeData MailMerge;
public TrackerStatus Status;
public string Token;
public string Url;
public List<string> Users;
public string UserData;
public bool Encrypted;
public List<Action> Actions { get; set; }
public string ChangesUrl { get; set; }
public ForceSaveInitiator ForceSaveType { get; set; }
public object History { get; set; }
public string Key { get; set; }
public MailMergeData MailMerge { get; set; }
public TrackerStatus Status { get; set; }
public string Token { get; set; }
public string Url { get; set; }
public List<string> Users { get; set; }
public string UserData { get; set; }
public bool Encrypted { get; set; }
[DebuggerDisplay("{Type} - {UserId}")]
public class Action
@ -119,17 +119,17 @@ namespace ASC.Web.Files.Services.DocumentService
[DebuggerDisplay("{From}")]
public class MailMergeData
{
public int RecordCount;
public int RecordErrorCount;
public int RecordIndex;
public int RecordCount { get; set; }
public int RecordErrorCount { get; set; }
public int RecordIndex { get; set; }
public string From;
public string Subject;
public string To;
public MailMergeType Type;
public string From { get; set; }
public string Subject { get; set; }
public string To { get; set; }
public MailMergeType Type { get; set; }
public string Title; //attach
public string Message; //attach
public string Title { get; set; } //attach
public string Message { get; set; } //attach
}
[Serializable]
@ -150,7 +150,12 @@ namespace ASC.Web.Files.Services.DocumentService
public static string Serialize(TrackResponse response)
{
return JsonSerializer.Serialize(response);
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
return JsonSerializer.Serialize(response, options);
}
}
@ -219,23 +224,23 @@ namespace ASC.Web.Files.Services.DocumentService
Logger = options.CurrentValue;
}
public string GetCallbackUrl(string fileId)
public string GetCallbackUrl<T>(T fileId)
{
var callbackUrl = BaseCommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.FileHandlerPath
+ "?" + FilesLinkUtility.Action + "=track"
+ "&" + FilesLinkUtility.FileId + "=" + HttpUtility.UrlEncode(fileId)
+ "&" + FilesLinkUtility.AuthKey + "=" + EmailValidationKeyProvider.GetEmailKey(fileId));
+ "&" + FilesLinkUtility.FileId + "=" + HttpUtility.UrlEncode(fileId.ToString())
+ "&" + FilesLinkUtility.AuthKey + "=" + EmailValidationKeyProvider.GetEmailKey(fileId.ToString()));
callbackUrl = DocumentServiceConnector.ReplaceCommunityAdress(callbackUrl);
return callbackUrl;
}
public bool StartTrack(string fileId, string docKeyForTrack)
public bool StartTrack<T>(T fileId, string docKeyForTrack)
{
var callbackUrl = GetCallbackUrl(fileId);
return DocumentServiceConnector.Command(CommandMethod.Info, docKeyForTrack, fileId, callbackUrl);
}
public TrackResponse ProcessData(string fileId, TrackerData fileData)
public TrackResponse ProcessData<T>(T fileId, TrackerData fileData)
{
switch (fileData.Status)
{
@ -458,7 +463,7 @@ namespace ASC.Web.Files.Services.DocumentService
return result;
}
private TrackResponse ProcessMailMerge(string fileId, TrackerData fileData)
private TrackResponse ProcessMailMerge<T>(T fileId, TrackerData fileData)
{
if (fileData.Users == null || fileData.Users.Count == 0 || !Guid.TryParse(fileData.Users[0], out var userId))
{

View File

@ -57,7 +57,8 @@ namespace ASC.Files.Helpers
private EntryManager EntryManager { get; }
private FolderContentWrapperHelper FolderContentWrapperHelper { get; }
private ChunkedUploadSessionHelper ChunkedUploadSessionHelper { get; }
public ILog Logger { get; set; }
private DocumentServiceTrackerHelper DocumentServiceTracker { get; }
private ILog Logger { get; set; }
/// <summary>
/// </summary>
@ -80,6 +81,7 @@ namespace ASC.Files.Helpers
EntryManager entryManager,
FolderContentWrapperHelper folderContentWrapperHelper,
ChunkedUploadSessionHelper chunkedUploadSessionHelper,
DocumentServiceTrackerHelper documentServiceTracker,
IOptionsMonitor<ILog> optionMonitor)
{
ApiContext = context;
@ -98,6 +100,7 @@ namespace ASC.Files.Helpers
EntryManager = entryManager;
FolderContentWrapperHelper = folderContentWrapperHelper;
ChunkedUploadSessionHelper = chunkedUploadSessionHelper;
DocumentServiceTracker = documentServiceTracker;
Logger = optionMonitor.Get("ASC.Files");
}
@ -192,6 +195,7 @@ namespace ASC.Files.Helpers
{
DocumentServiceHelper.GetParams(fileId, version, doc, true, true, true, out var configuration);
configuration.EditorType = EditorType.External;
configuration.EditorConfig.CallbackUrl = DocumentServiceTracker.GetCallbackUrl(configuration.Document.Info.File.ID.ToString());
configuration.Token = DocumentServiceHelper.GetSignature(configuration);
return configuration;
}