public WopiDiscoveryDocumentRepository(IHttpClientFactory httpClientFactory, IOptionsSnapshot <WopiConfiguration> wopiConfiguration, ILogger <WopiDiscoveryDocumentRepository> logger)
        {
            _logger = logger;

            _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
            _wopiConfiguration = wopiConfiguration?.Value ?? throw new ArgumentNullException(nameof(wopiConfiguration));
        }
        public async Task CreateDocumentAsync_ReturnsPrimedDocumentWhenDiscoveryEndpointReturnsValidResponse()
        {
            var cancellationToken = new CancellationToken();

            var logger = new Moq.Mock <ILogger <WopiDiscoveryDocumentFactory> >().Object;

            var services = new ServiceCollection();

            services.AddMemoryCache();

            var serviceProvider = services.BuildServiceProvider();

            var memoryCache = serviceProvider.GetRequiredService <IMemoryCache>();

            var sourceEndpoint = new Uri(WopiDiscoveryDocumentTests.WOPI_ROOT + WopiDiscoveryDocumentTests.WOPI_DISCOVERY_DOCUMENT_URL, UriKind.Absolute);

            var wopiConfiguration = new WopiConfiguration()
            {
                ClientDiscoveryDocumentUrl = sourceEndpoint.AbsoluteUri
            };

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

            wopiConfigurationOptionsSnapshot.SetupGet(x => x.Value).Returns(wopiConfiguration);

            var httpClientFactory = new Moq.Mock <IHttpClientFactory>();

            var httpResponseMessage = new HttpResponseMessage(System.Net.HttpStatusCode.OK)
            {
                Content = new StringContent(WopiDiscoveryDocumentTests.WOPI_DISCOVERY_DOCUMENT_XML, Encoding.UTF8, "application/xml")
            };

            var httpMessageHandler = new HttpMessageHandlerStub((request, _) => httpResponseMessage);

            var httpClient = new HttpClient(httpMessageHandler, true);

            httpClientFactory.Setup(x => x.CreateClient("wopi-discovery-document")).Returns(httpClient);

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

            var wopiDiscoveryDocumentRepository = new Moq.Mock <IWopiDiscoveryDocumentRepository>();

            wopiDiscoveryDocumentRepository.Setup(x => x.GetAsync(Moq.It.IsAny <CancellationToken>())).Returns(Task.FromResult(newWopiDiscoveryDocument));

            IWopiDiscoveryDocumentFactory wopiDiscoveryDocumentFactory = new WopiDiscoveryDocumentFactory(memoryCache, wopiDiscoveryDocumentRepository.Object, logger);

            var wopiDiscoveryDocument = await wopiDiscoveryDocumentFactory.CreateDocumentAsync(cancellationToken);

            Assert.IsFalse(wopiDiscoveryDocument.IsEmpty, "Expected a none empty document to be returned when the discovery endpoint is known and returns a valid response");
        }
        public WopiDiscoveryDocumentRepository(IHttpClientFactory httpClientFactory, IOptionsSnapshot <WopiConfiguration> wopiConfiguration, ILogger <WopiDiscoveryDocumentRepository> logger)
        {
            _logger = logger;

            _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
            _wopiConfiguration = wopiConfiguration?.Value ?? throw new ArgumentNullException(nameof(wopiConfiguration));

            var clientDiscoveryDocumentUrl = _wopiConfiguration.ClientDiscoveryDocumentUrl;

            if (clientDiscoveryDocumentUrl is null)
            {
                throw new ApplicationException($"The {nameof(WopiConfiguration.ClientDiscoveryDocumentUrl)} is null");
            }

            if (!clientDiscoveryDocumentUrl.IsAbsoluteUri)
            {
                throw new ApplicationException($"The {nameof(WopiConfiguration.ClientDiscoveryDocumentUrl)} is not an absolute URI = {clientDiscoveryDocumentUrl}");
            }
        }
Exemplo n.º 4
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));
        }
    }