Ejemplo n.º 1
0
        async Task <UserFileAccessToken> IUserFileAccessTokenRepository.GenerateAsync(AuthenticatedUser authenticatedUser, File file, FileAccessPermission fileAccessPermission, DateTimeOffset expiresAtUtc, CancellationToken cancellationToken)
        {
            if (authenticatedUser is null)
            {
                throw new ArgumentNullException(nameof(authenticatedUser));
            }
            if (authenticatedUser.Id == Guid.Empty)
            {
                throw new ArgumentOutOfRangeException(nameof(authenticatedUser));
            }
            if (file.IsEmpty)
            {
                throw new ArgumentNullException(nameof(file));
            }
            if (expiresAtUtc == DateTimeOffset.MinValue)
            {
                throw new ArgumentOutOfRangeException(nameof(expiresAtUtc));
            }
            if (expiresAtUtc == DateTimeOffset.MaxValue)
            {
                throw new ArgumentOutOfRangeException(nameof(expiresAtUtc));
            }
            if (authenticatedUser.FileMetadata is null)
            {
                throw new ArgumentOutOfRangeException(nameof(authenticatedUser));
            }
            if (file != authenticatedUser.FileMetadata.AsFile())
            {
                throw new ArgumentOutOfRangeException(nameof(authenticatedUser));
            }

            cancellationToken.ThrowIfCancellationRequested();

            Debug.Assert(file.Id is not null);

            var id = Guid.NewGuid();

            var accessToken = new UserFileAccessToken(id, authenticatedUser, fileAccessPermission, expiresAtUtc);

            var serialisedAccessToken = JsonSerializer.Serialize(accessToken);

            var partitionKey = file.Id;
            var rowKey       = id.ToString();

            var record = new Dictionary <string, object>()
            {
                { "UserId", authenticatedUser.Id },
                { "FileId", file.Id },
                { "ExpiresAtUtc", expiresAtUtc },
                { "Token", serialisedAccessToken },
            };

            await _azureTableStoreClient.AddRecordAsync(_azureTableName, partitionKey, rowKey, record, cancellationToken);

            return(accessToken);
        }
Ejemplo n.º 2
0
        public async Task HandleAsync_(string title, string description, string groupName, string version, string owner, string fileName, string extension, ulong sizeInBytes, string contentHash)
        {
            var cancellationToken = CancellationToken.None;

            var file = FutureNHS.WOPIHost.File.With(fileName, version);

            var services = new ServiceCollection();

            var endpointForFileExtension = new Uri("https://domain.com/path?param=value", UriKind.Absolute);

            var wopiDiscoveryDocument = new Moq.Mock <IWopiDiscoveryDocument>();

            wopiDiscoveryDocument.Setup(o => o.GetEndpointForFileExtension(extension, "view", Moq.It.IsAny <Uri>())).Returns(endpointForFileExtension);
            wopiDiscoveryDocument.Setup(o => o.IsEmpty).Returns(false);
            wopiDiscoveryDocument.Setup(o => o.IsTainted).Returns(false);

            var wopiDiscoveryDocumentFactory = new Moq.Mock <IWopiDiscoveryDocumentFactory>();

            wopiDiscoveryDocumentFactory.Setup(o => o.CreateDocumentAsync(cancellationToken)).Returns(Task.FromResult(wopiDiscoveryDocument.Object));

            var fileId = Guid.NewGuid();

            var fileMetadata = new UserFileMetadata()
            {
                FileId                = fileId,
                Title                 = title,
                Description           = description,
                GroupName             = groupName,
                FileVersion           = version,
                OwnerUserName         = owner,
                Name                  = fileName,
                Extension             = extension,
                BlobName              = fileName,
                SizeInBytes           = sizeInBytes,
                LastWriteTimeUtc      = DateTimeOffset.UtcNow,
                ContentHash           = Convert.FromBase64String("aGFzaA == "),
                UserHasViewPermission = true,
                UserHasEditPermission = false
            };

            var authenticatedUser = new AuthenticatedUser(Guid.NewGuid(), default)
            {
                FileMetadata = fileMetadata
            };

            var wopiConfiguration = new WopiConfiguration {
                HostFilesUrl = new Uri("https://hostfiles.net/path", UriKind.Absolute)
            };

            var wopiConfigurationSnapshot = new Moq.Mock <IOptionsSnapshot <WopiConfiguration> >();

            wopiConfigurationSnapshot.Setup(o => o.Value).Returns(wopiConfiguration);

            var userAuthenticationService = new Moq.Mock <IUserAuthenticationService>();

            var permission = FileAccessPermission.View;

            var userFileAccessToken = new UserFileAccessToken(Guid.NewGuid(), authenticatedUser, permission, DateTimeOffset.UtcNow.AddDays(1));

            userAuthenticationService.Setup(x => x.GenerateAccessToken(authenticatedUser, file, permission, cancellationToken)).Returns(Task.FromResult(userFileAccessToken));

            services.AddScoped(sp => wopiDiscoveryDocumentFactory.Object);
            services.AddScoped(sp => wopiConfigurationSnapshot.Object);
            services.AddScoped(sp => new Moq.Mock <IAzureTableStoreClient>().Object);
            services.AddScoped(sp => userAuthenticationService.Object);
            services.AddScoped(sp => new Moq.Mock <IUserFileAccessTokenRepository>().Object);

            var httpContext = new DefaultHttpContext
            {
                RequestServices = services.BuildServiceProvider()
            };

            using var responseBodyStream = new MemoryStream();

            httpContext.Response.Body = responseBodyStream;

            var postAuthoriseUserRequestHandler = AuthoriseUserRequestHandler.With(authenticatedUser, permission, file);



            await postAuthoriseUserRequestHandler.HandleAsync(httpContext, cancellationToken);

            Assert.AreEqual((int)HttpStatusCode.OK, httpContext.Response.StatusCode);

            Assert.AreEqual("application/json; charset=utf-8", httpContext.Response.ContentType);

            Assert.AreSame(responseBodyStream, httpContext.Response.Body);

            responseBodyStream.Position = 0;

            dynamic responseBody = await JsonSerializer.DeserializeAsync <ExpandoObject>(responseBodyStream, cancellationToken : cancellationToken);

            Assert.IsNotNull(responseBody);

            var accessToken = ((JsonElement)(responseBody.accessToken)).GetString();

            Assert.IsNotNull(accessToken);

            var wopiClientUrlForFile = ((JsonElement)(responseBody.wopiClientUrlForFile)).GetString();

            Assert.IsTrue(Uri.IsWellFormedUriString(wopiClientUrlForFile, UriKind.Absolute));

            Assert.AreEqual(endpointForFileExtension, new Uri(wopiClientUrlForFile, UriKind.Absolute));
        }
    }