Exemplo n.º 1
0
        public async Task DownloadZip(
            string fileName,
            IEnumerable <FileIdentifier> fileIdentifiers,
            HttpResponse response,
            Func <FileModel, PathIdentifier> pathGenerator = null,
            CancellationToken cancellationToken            = default(CancellationToken)
            )
        {
            if (pathGenerator == null)
            {
                pathGenerator = APIModelExtensions.MetaPathIdentifierRead;
            }

            response.StatusCode  = 200;
            response.ContentType = "application/zip";
            var contentDisposition = new ContentDispositionHeaderValue("attachment");

            contentDisposition.SetHttpFileName(fileName);
            response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString();

            var isEDiscoveryUser           = EDiscoveryUtility.IsUserEDiscovery(Connection.UserAccessIdentifiers);
            OrganizationModel organization = null;

            using (var archive = new ZipArchive(response.Body, ZipArchiveMode.Create))
            {
                foreach (var fileIdentifier in fileIdentifiers)
                {
                    if (organization == null || organization.Identifier.OrganizationKey != fileIdentifier.OrganizationKey)
                    {
                        organization = await Connection.Organization.GetAsync(fileIdentifier as OrganizationIdentifier);
                    }

                    var fileModel = await Connection.File.GetAsync(fileIdentifier);

                    var views = ViewSetService.DetectFileViews(organization, fileModel);

                    var newFileExtension       = null as string;
                    var contentsFileIdentifier = fileIdentifier;

                    if (views.Any())
                    {
                        var first = views.First();
                        switch (first.ViewerType)
                        {
                        case ManagerFileView.ViewerTypeEnum.Video:
                            var mediaSet = await viewSetService.LoadSet <MediaSet>(fileIdentifier);

                            var mp4 = mediaSet.Sources.FirstOrDefault(s => s.Type == "video/mp4");
                            if (mp4 != null)
                            {
                                newFileExtension       = "mp4";
                                contentsFileIdentifier = mp4.FileIdentifier;
                            }

                            break;

                        case ManagerFileView.ViewerTypeEnum.Document:

                            if (fileModel.Extension == "docx")
                            {
                                var documentSet = await viewSetService.LoadSet <DocumentSet>(fileIdentifier);

                                var pdf = documentSet.FileIdentifier;
                                if (pdf != null)
                                {
                                    newFileExtension       = "pdf";
                                    contentsFileIdentifier = pdf;
                                }
                            }
                            break;
                        }
                    }


                    var path = pathGenerator(fileModel);

                    string name = fileModel.Name;
                    if (newFileExtension != null)
                    {
                        name = $"{Path.GetFileNameWithoutExtension(name)}.{newFileExtension}";
                    }
                    else
                    {
                        newFileExtension = fileModel.Extension;
                    }

                    name = MakeFilenameSafe(name);

                    var filename = path != null
                        ? Path.Combine(path.PathKey, name)
                        : name;

                    var entry = archive.CreateEntry(filename);

                    using (var fileStream = entry.Open())
                    {
                        await Connection.File.DownloadAsync(
                            contentsFileIdentifier,
                            onStreamAvailable : async(stream, cancel) =>
                        {
                            if (isEDiscoveryUser && WatermarkFilter.IsSupportedFileType(newFileExtension))
                            {
                                var packageName = fileModel.Read <string>(
                                    MetadataKeyConstants.E_DISCOVERY_SHARE_PACKGAGE);

                                var watermarkUser = await Connection.User.GetAsync(Connection.UserIdentifier);

                                // this code is redundant with FileService.ExecuteDownload
                                await WatermarkFilter.Execute(stream,
                                                              fileStream,
                                                              newFileExtension,
                                                              $"Defense {packageName} {watermarkUser.EmailAddress}"
                                                              );
                            }
                            else
                            {
                                await stream.CopyToAsync(fileStream);
                            }
                        },

                            cancellationToken : cancellationToken
                            );
                    }
                }
            }
        }
Exemplo n.º 2
0
        public async Task <T> LoadSet <T>(FileIdentifier fileIdentifier)
            where T : BaseSet
        {
            var file = await api.File.GetAsync(fileIdentifier);

            var fileStatus = await api.File.GetOnlineStatusAsync(fileIdentifier);


            var organization = await api.Organization.GetAsync(fileIdentifier as OrganizationIdentifier);

            BaseSet set = null;

            // this is awful, but no clear security check to perform
            bool isPrivileged = !EDiscoveryUtility.IsUserEDiscovery(this.api.UserAccessIdentifiers) &&
                                !LEOUploadUtility.IsUserLeo(this.api.UserAccessIdentifiers);

            if (typeof(T).Equals(typeof(TextSet)))
            {
                set = TextService.TextSetGet(file, true);
            }

            if (typeof(T).Equals(typeof(DocumentSet)))
            {
                set = DocumentSetService.DocumentSetGet(file);
            }

            if (typeof(T).Equals(typeof(MediaSet)))
            {
                set = MediaService.MediaSetGet(organization, file, isPrivileged);
            }

            if (typeof(T).Equals(typeof(TranscriptSet)))
            {
                var transcriptSet = TranscriptService.TranscriptSetGet(organization, file);
                transcriptSet.Segments = await TranscriptService.LoadSegments(api, transcriptSet.Subtitles?.FirstOrDefault()?.FileIdentifier);

                set = transcriptSet;
            }

            if (typeof(T).Equals(typeof(ClipSet)))
            {
                var clipSet = ClipService.ClipSetGet(organization, file);
                set = clipSet;
            }

            if (typeof(T).Equals(typeof(ImageSet)))
            {
                set = ImageService.ImageSetGet(file);
            }

            if (typeof(T).Equals(typeof(UnknownSet)))
            {
                set = UnknownService.UnknownSetGet(file);
            }

            if (set.AllowedOperations == null)
            {
                set.AllowedOperations = new[]
                {
                    AllowedOperation.GetAllowedOperationDownload(fileIdentifier, false)
                }
            }
            ;

            set.RootFileIdentifier = file.Read(MetadataKeyConstants.CHILDOF, defaultValue: file.Identifier);

            if (set.RootFileIdentifier.Equals(fileIdentifier))
            {
                set.Views = DetectFileViews(organization, file);
            }
            else
            {
                set.Views = DetectFileViews(organization, await api.File.GetAsync(set.RootFileIdentifier));
            }


            // some wierd logic for eDiscovery
            // if eDiscovery, then no subtitles
            if (set is MediaSet && EDiscoveryUtility.IsUserEDiscovery(api.UserAccessIdentifiers))
            {
                var media = set as MediaSet;
                media.Subtitles = null;
            }


            if (fileStatus != FileModel.OnlineStatus.Online)
            {
                set.Views = new ManagerFileView[] { new ManagerFileView {
                                                        ViewerType = ManagerFileView.ViewerTypeEnum.Offline,
                                                        Identifier = set.RootFileIdentifier
                                                    } };

                set.AllowedOperations = new AllowedOperation[]
                {
                    AllowedOperation.GetAllowedOperationRequestOnlineFolder(set.RootFileIdentifier)
                };

                set.RootFileIdentifier = null;
            }

            return(set as T);
        }
Exemplo n.º 3
0
        public override void BuildDynamicFolders(PathIdentifier identifier, ItemQueryResponse page, FolderModel folder, bool isRestrictedView)
        {
            if (!page?.PathTree?.Paths?.Any(p => p.Identifier.PathKey == EDiscoveryUtility.E_DISCOVERY_PATH_KEY) ?? false)
            {
                if (page.PathTree.Paths == null)
                {
                    page.PathTree.Paths = new List <ManagerPathModel>();
                }

                var managerPathModels = new List <ManagerPathModel>();

                // we have to build up the children first.
                // First we get all the dated package dynamic paths.
                var datedPackagePaths = BuildDatedPackagesDynamicFolder(folder);

                var eDiscoveryIdentifier = new PathIdentifier(identifier)
                {
                    PathKey = EDiscoveryUtility.E_DISCOVERY_PATH_KEY
                };

                // Last the parent / root node of 'eDiscovery'
                var eDiscoveryPath = new ManagerPathModel
                {
                    Identifier        = eDiscoveryIdentifier,
                    Icons             = new string[] { EDiscoveryUtility.EDISCOVERY_FOLDER_COLOR_STYLE },
                    Name              = EDiscoveryUtility.E_DISCOVERY_PATH_NAME,
                    FullPath          = EDiscoveryUtility.E_DISCOVERY_PATH_KEY,
                    AllowedOperations = null,
                    Paths             = new List <ManagerPathModel>(),
                    IsExpanded        = datedPackagePaths.Count > 0 || EDiscoveryUtility.GetStagedCount(folder) > 0,
                };

                if (datedPackagePaths.Any())
                {
                    var allPackagesIdentifier = new PathIdentifier(identifier as FolderIdentifier, EDiscoveryUtility.E_DISCOVERY_ALL_PACKAGE_PATH_KEY);

                    var packageName = "All";

                    var processor = new PathProcessor(folder.Identifier);
                    processor.Read(folder, skipFolderPaths: true, pathReader: f => {
                        var sharePath = f.MetaEDiscoveryPathIdentifierRead();

                        if (sharePath != null)
                        {
                            return(allPackagesIdentifier.CreateChild(sharePath.PathKey));
                        }
                        else
                        {
                            return(sharePath);
                        }
                    });


                    datedPackagePaths.Insert(0, new EDiscoveryManagerPathModel()
                    {
                        Identifier = allPackagesIdentifier,
                        Icons      = new string[] { EDiscoveryUtility.EDISCOVERY_FOLDER_COLOR_STYLE },
                        Name       = packageName,
                        FullPath   = allPackagesIdentifier.FullName,
                        Paths      = processor[allPackagesIdentifier]?.Paths
                    });
                }

                eDiscoveryPath.Paths = eDiscoveryPath.Paths.Concat(datedPackagePaths).ToList();

                if (!isRestrictedView)
                {
                    eDiscoveryPath.Paths.Add(GetNotSharedYetPath(folder));
                }

                page.PathTree.Paths.Add(eDiscoveryPath);
            }
        }