private void StreamFile(HttpContext context) { try { var fileId = context.Request.Query[FilesLinkUtility.FileId]; var auth = context.Request.Query[FilesLinkUtility.AuthKey]; var userId = context.Request.Query[CommonLinkUtility.ParamName_UserUserID]; Logger.Debug("BoxApp: get file stream " + fileId); var validateResult = EmailValidationKeyProvider.ValidateEmailKey(fileId + userId, auth, Global.StreamUrlExpire); if (validateResult != EmailValidationKeyProvider.ValidationResult.Ok) { var exc = new HttpException((int)HttpStatusCode.Forbidden, FilesCommonResource.ErrorMassage_SecurityException); Logger.Error(string.Format("BoxApp: validate error {0} {1}: {2}", FilesLinkUtility.AuthKey, validateResult, context.Request.Url()), exc); throw exc; } Token token = null; if (Guid.TryParse(userId, out var userIdGuid)) { token = TokenHelper.GetToken(AppAttr, userIdGuid); } if (token == null) { Logger.Error("BoxApp: token is null"); throw new SecurityException("Access token is null"); } var request = (HttpWebRequest)WebRequest.Create(BoxUrlFile.Replace("{fileId}", fileId) + "/content"); request.Method = "GET"; request.Headers.Add("Authorization", "Bearer " + token); using var stream = new ResponseStream(request.GetResponse()); stream.CopyTo(context.Response.Body); } catch (Exception ex) { context.Response.StatusCode = (int)HttpStatusCode.BadRequest; context.Response.WriteAsync(ex.Message).Wait(); Logger.Error("BoxApp: Error request " + context.Request.Url(), ex); } try { context.Response.Body.Flush(); //TODO //context.Response.Body.SuppressContent = true; //context.ApplicationInstance.CompleteRequest(); } catch (HttpException ex) { Logger.Error("BoxApp StreamFile", ex); } }
private void StreamFile(HttpContext context) { try { var fileId = context.Request.Query[FilesLinkUtility.FileId]; var auth = context.Request.Query[FilesLinkUtility.AuthKey]; var userId = context.Request.Query[CommonLinkUtility.ParamName_UserUserID]; Logger.Debug("GoogleDriveApp: get file stream " + fileId); var validateResult = EmailValidationKeyProvider.ValidateEmailKey(fileId + userId, auth, Global.StreamUrlExpire); if (validateResult != EmailValidationKeyProvider.ValidationResult.Ok) { var exc = new HttpException((int)HttpStatusCode.Forbidden, FilesCommonResource.ErrorMassage_SecurityException); Logger.Error(string.Format("GoogleDriveApp: validate error {0} {1}: {2}", FilesLinkUtility.AuthKey, validateResult, context.Request.Url()), exc); throw exc; } Token token = null; if (Guid.TryParse(userId, out var userIdGuid)) { token = TokenHelper.GetToken(AppAttr, userIdGuid); } if (token == null) { Logger.Error("BoxApp: token is null"); throw new SecurityException("Access token is null"); } var driveFile = GetDriveFile(fileId, token); var jsonFile = JObject.Parse(driveFile); var downloadUrl = GoogleLoginProvider.GoogleUrlFile + fileId + "?alt=media"; if (string.IsNullOrEmpty(downloadUrl)) { Logger.Error("GoogleDriveApp: downloadUrl is null"); throw new Exception("downloadUrl is null"); } Logger.Debug("GoogleDriveApp: get file stream downloadUrl - " + downloadUrl); var request = (HttpWebRequest)WebRequest.Create(downloadUrl); request.Method = "GET"; request.Headers.Add("Authorization", "Bearer " + token); using (var response = request.GetResponse()) using (var stream = new ResponseStream(response)) { stream.CopyTo(context.Response.Body); var contentLength = jsonFile.Value <string>("size"); Logger.Debug("GoogleDriveApp: get file stream contentLength - " + contentLength); context.Response.Headers.Add("Content-Length", contentLength); } } catch (Exception ex) { context.Response.StatusCode = (int)HttpStatusCode.BadRequest; context.Response.WriteAsync(ex.Message).Wait(); Logger.Error("GoogleDriveApp: Error request " + context.Request.Url(), ex); } try { context.Response.Body.Flush(); //TODO //context.Response.SuppressContent = true; //context.ApplicationInstance.CompleteRequest(); } catch (HttpException ex) { Logger.Error("GoogleDriveApp StreamFile", ex); } }
public static File SaveEditing(String fileId, string fileExtension, string downloadUri, Stream stream, String doc, string comment = null, bool checkRight = true, bool encrypted = false, ForcesaveType?forcesave = null) { var newExtension = string.IsNullOrEmpty(fileExtension) ? FileUtility.GetFileExtension(downloadUri) : fileExtension; var app = ThirdPartySelector.GetAppByFileId(fileId); if (app != null) { app.SaveFile(fileId, newExtension, downloadUri, stream); return(null); } File file; using (var fileDao = Global.DaoFactory.GetFileDao()) { var editLink = FileShareLink.Check(doc, false, fileDao, out file); if (file == null) { file = fileDao.GetFile(fileId); } if (file == null) { throw new FileNotFoundException(FilesCommonResource.ErrorMassage_FileNotFound); } var fileSecurity = Global.GetFilesSecurity(); if (checkRight && !editLink && (!(fileSecurity.CanEdit(file) || fileSecurity.CanReview(file)) || CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsVisitor())) { throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException_EditFile); } if (checkRight && FileLockedForMe(file.ID)) { throw new Exception(FilesCommonResource.ErrorMassage_LockedFile); } if (checkRight && FileTracker.IsEditing(file.ID)) { throw new Exception(FilesCommonResource.ErrorMassage_SecurityException_UpdateEditingFile); } if (file.RootFolderType == FolderType.TRASH) { throw new Exception(FilesCommonResource.ErrorMassage_ViewTrashItem); } var currentExt = file.ConvertedExtension; if (string.IsNullOrEmpty(newExtension)) { newExtension = FileUtility.GetInternalExtension(file.Title); } var replaceVersion = false; if (file.Forcesave != ForcesaveType.None) { if (file.Forcesave == ForcesaveType.User && FilesSettings.StoreForcesave) { file.Version++; } else { replaceVersion = true; } } else { if (file.Version != 1) { file.VersionGroup++; } else { var storeTemplate = Global.GetStoreTemplate(); var path = FileConstant.NewDocPath + Thread.CurrentThread.CurrentCulture + "/"; if (!storeTemplate.IsDirectory(path)) { path = FileConstant.NewDocPath + "default/"; } path += "new" + FileUtility.GetInternalExtension(file.Title); //todo: think about the criteria for saving after creation if (file.ContentLength != storeTemplate.GetFileSize("", path)) { file.VersionGroup++; } } file.Version++; } file.Forcesave = forcesave.HasValue ? forcesave.Value : ForcesaveType.None; if (string.IsNullOrEmpty(comment)) { comment = FilesCommonResource.CommentEdit; } file.Encrypted = encrypted; file.ConvertedType = FileUtility.GetFileExtension(file.Title) != newExtension ? newExtension : null; if (file.ProviderEntry && !newExtension.Equals(currentExt)) { if (FileUtility.ExtsConvertible.Keys.Contains(newExtension) && FileUtility.ExtsConvertible[newExtension].Contains(currentExt)) { if (stream != null) { downloadUri = PathProvider.GetTempUrl(stream, newExtension); downloadUri = DocumentServiceConnector.ReplaceCommunityAdress(downloadUri); } var key = DocumentServiceConnector.GenerateRevisionId(downloadUri); DocumentServiceConnector.GetConvertedUri(downloadUri, newExtension, currentExt, key, null, false, out downloadUri); stream = null; } else { file.ID = null; file.Title = FileUtility.ReplaceFileExtension(file.Title, newExtension); } file.ConvertedType = null; } using (var tmpStream = new MemoryStream()) { if (stream != null) { stream.CopyTo(tmpStream); } else { // hack. http://ubuntuforums.org/showthread.php?t=1841740 if (WorkContext.IsMono) { ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; } var req = (HttpWebRequest)WebRequest.Create(downloadUri); using (var editedFileStream = new ResponseStream(req.GetResponse())) { editedFileStream.CopyTo(tmpStream); } } tmpStream.Position = 0; file.ContentLength = tmpStream.Length; file.Comment = string.IsNullOrEmpty(comment) ? null : comment; if (replaceVersion) { file = fileDao.ReplaceFileVersion(file, tmpStream); } else { file = fileDao.SaveFile(file, tmpStream); } } } FileMarker.MarkAsNew(file); FileMarker.RemoveMarkAsNew(file); return(file); }
public void SaveFile(string fileId, string fileType, string downloadUrl, Stream stream) { Logger.Debug("BoxApp: save file stream " + fileId + (stream == null ? " from - " + downloadUrl : " from stream")); fileId = ThirdPartySelector.GetFileId(fileId.ToString()); var token = TokenHelper.GetToken(AppAttr); var boxFile = GetBoxFile(fileId.ToString(), token); if (boxFile == null) { Logger.Error("BoxApp: file is null"); throw new Exception("File not found"); } var jsonFile = JObject.Parse(boxFile); var title = Global.ReplaceInvalidCharsAndTruncate(jsonFile.Value <string>("name")); var currentType = FileUtility.GetFileExtension(title); if (!fileType.Equals(currentType)) { try { if (stream != null) { downloadUrl = PathProvider.GetTempUrl(stream, fileType); downloadUrl = DocumentServiceConnector.ReplaceCommunityAdress(downloadUrl); } Logger.Debug("BoxApp: GetConvertedUri from " + fileType + " to " + currentType + " - " + downloadUrl); var key = DocumentServiceConnector.GenerateRevisionId(downloadUrl); DocumentServiceConnector.GetConvertedUri(downloadUrl, fileType, currentType, key, null, null, null, false, out downloadUrl); stream = null; } catch (Exception e) { Logger.Error("BoxApp: Error convert", e); } } var request = (HttpWebRequest)WebRequest.Create(BoxUrlUpload.Replace("{fileId}", fileId)); using (var tmpStream = new MemoryStream()) { var boundary = DateTime.UtcNow.Ticks.ToString("x"); var metadata = string.Format("Content-Disposition: form-data; name=\"filename\"; filename=\"{0}\"\r\nContent-Type: application/octet-stream\r\n\r\n", title); var metadataPart = string.Format("--{0}\r\n{1}", boundary, metadata); var bytes = Encoding.UTF8.GetBytes(metadataPart); tmpStream.Write(bytes, 0, bytes.Length); if (stream != null) { stream.CopyTo(tmpStream); } else { var downloadRequest = (HttpWebRequest)WebRequest.Create(downloadUrl); using var downloadStream = new ResponseStream(downloadRequest.GetResponse()); downloadStream.CopyTo(tmpStream); } var mediaPartEnd = string.Format("\r\n--{0}--\r\n", boundary); bytes = Encoding.UTF8.GetBytes(mediaPartEnd); tmpStream.Write(bytes, 0, bytes.Length); request.Method = "POST"; request.Headers.Add("Authorization", "Bearer " + token); request.ContentType = "multipart/form-data; boundary=" + boundary; request.ContentLength = tmpStream.Length; Logger.Debug("BoxApp: save file totalSize - " + tmpStream.Length); const int bufferSize = 2048; var buffer = new byte[bufferSize]; int readed; tmpStream.Seek(0, SeekOrigin.Begin); while ((readed = tmpStream.Read(buffer, 0, bufferSize)) > 0) { request.GetRequestStream().Write(buffer, 0, readed); } } try { using var response = request.GetResponse(); using var responseStream = response.GetResponseStream(); string result = null; if (responseStream != null) { using var readStream = new StreamReader(responseStream); result = readStream.ReadToEnd(); } Logger.Debug("BoxApp: save file response - " + result); } catch (WebException e) { Logger.Error("BoxApp: Error save file", e); request.Abort(); var httpResponse = (HttpWebResponse)e.Response; if (httpResponse.StatusCode == HttpStatusCode.Forbidden || httpResponse.StatusCode == HttpStatusCode.Unauthorized) { throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException, e); } throw; } }
public static File SaveEditing(String fileId, int version, Guid tabId, string fileExtension, string downloadUri, Stream stream, bool asNew, String shareLinkKey, string comment = null, bool checkRight = true) { var newExtension = string.IsNullOrEmpty(fileExtension) ? FileUtility.GetFileExtension(downloadUri) : fileExtension; var app = ThirdPartySelector.GetAppByFileId(fileId); if (app != null) { app.SaveFile(fileId, newExtension, downloadUri, stream); return(null); } File file; using (var fileDao = Global.DaoFactory.GetFileDao()) { var editLink = FileShareLink.Check(shareLinkKey, false, fileDao, out file); if (file == null) { file = fileDao.GetFile(fileId); } if (file == null) { throw new FileNotFoundException(FilesCommonResource.ErrorMassage_FileNotFound); } var fileSecurity = Global.GetFilesSecurity(); if (checkRight && !editLink && (!(fileSecurity.CanEdit(file) || fileSecurity.CanReview(file)) || CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsVisitor())) { throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException_EditFile); } if (checkRight && FileLockedForMe(file.ID)) { throw new Exception(FilesCommonResource.ErrorMassage_LockedFile); } if (file.RootFolderType == FolderType.TRASH) { throw new Exception(FilesCommonResource.ErrorMassage_ViewTrashItem); } var currentExt = file.ConvertedExtension; if (string.IsNullOrEmpty(newExtension)) { newExtension = FileUtility.GetInternalExtension(file.Title); } if ((file.Version <= version || !newExtension.Equals(currentExt) || version < 1) && (file.Version > 1 || !asNew) && !FileTracker.FixedVersion(file.ID)) { file.Version++; if (string.IsNullOrEmpty(comment)) { comment = FilesCommonResource.CommentEdit; } } else { if (string.IsNullOrEmpty(comment)) { comment = FilesCommonResource.CommentCreate; } } file.ConvertedType = FileUtility.GetFileExtension(file.Title) != newExtension ? newExtension : null; if (file.ProviderEntry && !newExtension.Equals(currentExt)) { if (FileUtility.ExtsConvertible.Keys.Contains(newExtension) && FileUtility.ExtsConvertible[newExtension].Contains(currentExt)) { var key = DocumentServiceConnector.GenerateRevisionId(downloadUri ?? Guid.NewGuid().ToString()); if (stream != null) { using (var tmpStream = new MemoryStream()) { stream.CopyTo(tmpStream); downloadUri = DocumentServiceConnector.GetExternalUri(tmpStream, newExtension, key); } } DocumentServiceConnector.GetConvertedUri(downloadUri, newExtension, currentExt, key, false, out downloadUri); stream = null; } else { file.ID = null; file.Title = FileUtility.ReplaceFileExtension(file.Title, newExtension); } file.ConvertedType = null; } using (var tmpStream = new MemoryStream()) { if (stream != null) { stream.CopyTo(tmpStream); } else { // hack. http://ubuntuforums.org/showthread.php?t=1841740 if (WorkContext.IsMono) { ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; } var req = (HttpWebRequest)WebRequest.Create(downloadUri); using (var editedFileStream = new ResponseStream(req.GetResponse())) { editedFileStream.CopyTo(tmpStream); } } tmpStream.Position = 0; file.ContentLength = tmpStream.Length; file.Comment = string.IsNullOrEmpty(comment) ? null : comment; file = fileDao.SaveFile(file, tmpStream); } } checkRight = FileTracker.ProlongEditing(file.ID, tabId, true, SecurityContext.CurrentAccount.ID); if (checkRight) { FileTracker.ChangeRight(file.ID, SecurityContext.CurrentAccount.ID, false); } FileMarker.MarkAsNew(file); FileMarker.RemoveMarkAsNew(file); return(file); }
public void SaveFile(string fileId, string downloadUrl) { Global.Logger.Debug("BoxApp: save file stream " + fileId + " from - " + downloadUrl); fileId = ThirdPartySelector.GetFileId(fileId); var token = Token.GetToken(AppAttr); if (token == null) { Global.Logger.Error("BoxApp: token is null"); throw new SecurityException("Access token is null"); } var boxFile = GetBoxFile(fileId, token); if (boxFile == null) { Global.Logger.Error("BoxApp: file is null"); throw new Exception("File not found"); } var jsonFile = JObject.Parse(boxFile); var title = Global.ReplaceInvalidCharsAndTruncate(jsonFile.Value <string>("name")); var request = (HttpWebRequest)WebRequest.Create(BoxUrlUpload.Replace("{fileId}", fileId)); using (var tmpStream = new MemoryStream()) { var boundary = DateTime.UtcNow.Ticks.ToString("x"); var metadata = string.Format("Content-Disposition: form-data; name=\"filename\"; filename=\"{0}\"\r\nContent-Type: application/octet-stream\r\n\r\n", title); var metadataPart = string.Format("--{0}\r\n{1}", boundary, metadata); var bytes = Encoding.UTF8.GetBytes(metadataPart); tmpStream.Write(bytes, 0, bytes.Length); var downloadRequest = WebRequest.Create(downloadUrl); using (var downloadResponse = downloadRequest.GetResponse()) using (var downloadStream = new ResponseStream(downloadResponse)) { downloadStream.CopyTo(tmpStream); } var mediaPartEnd = string.Format("\r\n--{0}--\r\n", boundary); bytes = Encoding.UTF8.GetBytes(mediaPartEnd); tmpStream.Write(bytes, 0, bytes.Length); request.Method = "POST"; request.Headers.Add("Authorization", "Bearer " + token.AccessToken); request.ContentType = "multipart/form-data; boundary=" + boundary; request.ContentLength = tmpStream.Length; Global.Logger.Debug("BoxApp: save file totalSize - " + tmpStream.Length); const int bufferSize = 2048; var buffer = new byte[bufferSize]; int readed; tmpStream.Seek(0, SeekOrigin.Begin); while ((readed = tmpStream.Read(buffer, 0, bufferSize)) > 0) { request.GetRequestStream().Write(buffer, 0, readed); } } try { using (var response = request.GetResponse()) using (var stream = response.GetResponseStream()) { var result = stream != null ? new StreamReader(stream).ReadToEnd() : null; Global.Logger.Debug("BoxApp: save file response - " + result); } } catch (WebException e) { Global.Logger.Error("BoxApp: Error save file", e); request.Abort(); var httpResponse = (HttpWebResponse)e.Response; if (httpResponse.StatusCode == HttpStatusCode.Forbidden) { throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException, e); } throw; } }
public void SaveFile(string fileId, string downloadUrl) { Global.Logger.Debug("BoxApp: save file stream " + fileId + " from - " + downloadUrl); fileId = ThirdPartySelector.GetFileId(fileId); var token = Token.GetToken(AppAttr); if (token == null) { Global.Logger.Error("BoxApp: token is null"); throw new SecurityException("Access token is null"); } var boxFile = GetBoxFile(fileId, token); if (boxFile == null) { Global.Logger.Error("BoxApp: file is null"); throw new Exception("File not found"); } var jsonFile = JObject.Parse(boxFile); var title = Global.ReplaceInvalidCharsAndTruncate(jsonFile.Value<string>("name")); var request = (HttpWebRequest)WebRequest.Create(BoxUrlUpload.Replace("{fileId}", fileId)); using (var tmpStream = new MemoryStream()) { var boundary = DateTime.UtcNow.Ticks.ToString("x"); var metadata = string.Format("Content-Disposition: form-data; name=\"filename\"; filename=\"{0}\"\r\nContent-Type: application/octet-stream\r\n\r\n", title); var metadataPart = string.Format("--{0}\r\n{1}", boundary, metadata); var bytes = Encoding.UTF8.GetBytes(metadataPart); tmpStream.Write(bytes, 0, bytes.Length); var downloadRequest = WebRequest.Create(downloadUrl); using (var downloadResponse = downloadRequest.GetResponse()) using (var downloadStream = new ResponseStream(downloadResponse)) { downloadStream.CopyTo(tmpStream); } var mediaPartEnd = string.Format("\r\n--{0}--\r\n", boundary); bytes = Encoding.UTF8.GetBytes(mediaPartEnd); tmpStream.Write(bytes, 0, bytes.Length); request.Method = "POST"; request.Headers.Add("Authorization", "Bearer " + token.AccessToken); request.ContentType = "multipart/form-data; boundary=" + boundary; request.ContentLength = tmpStream.Length; Global.Logger.Debug("BoxApp: save file totalSize - " + tmpStream.Length); const int bufferSize = 2048; var buffer = new byte[bufferSize]; int readed; tmpStream.Seek(0, SeekOrigin.Begin); while ((readed = tmpStream.Read(buffer, 0, bufferSize)) > 0) { request.GetRequestStream().Write(buffer, 0, readed); } } try { using (var response = request.GetResponse()) using (var stream = response.GetResponseStream()) { var result = stream != null ? new StreamReader(stream).ReadToEnd() : null; Global.Logger.Debug("BoxApp: save file response - " + result); } } catch (WebException e) { Global.Logger.Error("BoxApp: Error save file", e); request.Abort(); var httpResponse = (HttpWebResponse)e.Response; if (httpResponse.StatusCode == HttpStatusCode.Forbidden) { throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException, e); } throw; } }