diff --git a/Digipost.Signature.Api.Client.Core.Tests/BaseClientTests.cs b/Digipost.Signature.Api.Client.Core.Tests/BaseClientTests.cs new file mode 100755 index 00000000..0368ee17 --- /dev/null +++ b/Digipost.Signature.Api.Client.Core.Tests/BaseClientTests.cs @@ -0,0 +1,76 @@ +using Digipost.Signature.Api.Client.Core.Exceptions; +using Digipost.Signature.Api.Client.Core.Tests.Stubs; +using Digipost.Signature.Api.Client.Core.Tests.Utilities; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Digipost.Signature.Api.Client.Core.Tests +{ + [TestClass] + public class BaseClientTests + { + [TestClass] + public class CurrentSenderMethod : BaseClientTests + { + [TestMethod] + [ExpectedException(typeof (SenderNotSpecifiedException))] + public void ThrowsExceptionOnNoSender() + { + //Arrange + var clientConfiguration = new ClientConfiguration(Environment.DifiQa, CoreDomainUtility.GetPostenTestCertificate()); + var client = new ClientStub(clientConfiguration); + + //Act + client.GetCurrentSender(null); + + //Assert + Assert.Fail(); + } + + [TestMethod] + public void ReturnsClientClientConfigurationSenderIfOnlySet() + { + //Arrange + var expected = new Sender("000000000"); + var clientConfiguration = new ClientConfiguration(Environment.DifiQa, CoreDomainUtility.GetPostenTestCertificate(), expected); + var client = new ClientStub(clientConfiguration); + + //Act + var actual = client.GetCurrentSender(null); + + //Assert + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void ReturnsJobSenderIfOnlySet() + { + //Arrange + var expected = new Sender("000000000"); + var clientConfiguration = new ClientConfiguration(Environment.DifiQa, CoreDomainUtility.GetPostenTestCertificate()); + var client = new ClientStub(clientConfiguration); + + //Act + var actual = client.GetCurrentSender(expected); + + //Assert + Assert.AreEqual(expected, actual); + } + + [TestMethod] + public void ReturnsJobSenderIfBothSet() + { + //Arrange + var expected = new Sender("000000000"); + var clientConfigurationSender = new Sender("999999999"); + var clientConfiguration = new ClientConfiguration(Environment.DifiQa, CoreDomainUtility.GetPostenTestCertificate(), clientConfigurationSender); + var client = new ClientStub(clientConfiguration); + + //Act + var actual = client.GetCurrentSender(expected); + + //Assert + Assert.AreEqual(expected, actual); + } + } + } +} \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Core.Tests/ClientConfigurationTests.cs b/Digipost.Signature.Api.Client.Core.Tests/ClientConfigurationTests.cs index 4229ae3f..74f2987f 100755 --- a/Digipost.Signature.Api.Client.Core.Tests/ClientConfigurationTests.cs +++ b/Digipost.Signature.Api.Client.Core.Tests/ClientConfigurationTests.cs @@ -11,46 +11,64 @@ public class ClientConfigurationTests public class ConstructorMethod : ClientConfigurationTests { [TestMethod] - public void ConstructorWithCertificate() + public void ConstructorWithNoSenderAndCertificateThumbprintExists() + { + //Arrange + + //Act + new ClientConfiguration(Environment.DifiQa, GetFirstCertificateFromCurrentUserStore()); + + //Assert + } + + [TestMethod] + public void ConstructorWithCertificateThumbprint() { //Arrange var environment = Environment.DifiQa; var sender = CoreDomainUtility.GetSender(); - var x509Certificate = CoreDomainUtility.GetTestCertificate(); + + var aCertificateFromCertificateStore = GetFirstCertificateFromCurrentUserStore(); //Act var clientConfiguration = new ClientConfiguration( environment, - sender, - x509Certificate - ); + aCertificateFromCertificateStore.Thumbprint, sender); //Assert Assert.AreEqual(environment, clientConfiguration.Environment); Assert.AreEqual(sender, clientConfiguration.Sender); - Assert.AreEqual(x509Certificate, clientConfiguration.Certificate); + Assert.AreEqual(aCertificateFromCertificateStore, clientConfiguration.Certificate); } [TestMethod] - public void ConstructorWithCertificateThumbprint() + public void ConstructorWithCertificate() { //Arrange var environment = Environment.DifiQa; var sender = CoreDomainUtility.GetSender(); - - var aCertificateFromCertificateStore = GetFirstCertificateFromCurrentUserStore(); + var x509Certificate = CoreDomainUtility.GetTestCertificate(); //Act var clientConfiguration = new ClientConfiguration( environment, - sender, - aCertificateFromCertificateStore.Thumbprint - ); + x509Certificate, sender); //Assert Assert.AreEqual(environment, clientConfiguration.Environment); Assert.AreEqual(sender, clientConfiguration.Sender); - Assert.AreEqual(aCertificateFromCertificateStore, clientConfiguration.Certificate); + Assert.AreEqual(x509Certificate, clientConfiguration.Certificate); + } + + [TestMethod] + public void ConstructorWithNoSenderAndCertificateExists() + { + //Arrange + + //Act + new ClientConfiguration(Environment.DifiQa, new X509Certificate2()); + + //Assert } private static X509Certificate2 GetFirstCertificateFromCurrentUserStore() diff --git a/Digipost.Signature.Api.Client.Core.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs b/Digipost.Signature.Api.Client.Core.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs index 9f996794..2036ed5e 100755 --- a/Digipost.Signature.Api.Client.Core.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs +++ b/Digipost.Signature.Api.Client.Core.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs @@ -2,7 +2,6 @@ using System.Linq; using Digipost.Signature.Api.Client.Core.DataTransferObjects; using Digipost.Signature.Api.Client.Core.Tests.Utilities.CompareObjects; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Digipost.Signature.Api.Client.Core.Tests.DataTransferObjects diff --git a/Digipost.Signature.Api.Client.Core.Tests/Digipost.Signature.Api.Client.Core.Tests.csproj b/Digipost.Signature.Api.Client.Core.Tests/Digipost.Signature.Api.Client.Core.Tests.csproj index 3a6ccbbc..34fe27bd 100755 --- a/Digipost.Signature.Api.Client.Core.Tests/Digipost.Signature.Api.Client.Core.Tests.csproj +++ b/Digipost.Signature.Api.Client.Core.Tests/Digipost.Signature.Api.Client.Core.Tests.csproj @@ -83,6 +83,7 @@ + @@ -98,6 +99,7 @@ + diff --git a/Digipost.Signature.Api.Client.Core.Tests/Smoke/SmokeTests.cs b/Digipost.Signature.Api.Client.Core.Tests/Smoke/SmokeTests.cs index 8159a3fa..535e233f 100755 --- a/Digipost.Signature.Api.Client.Core.Tests/Smoke/SmokeTests.cs +++ b/Digipost.Signature.Api.Client.Core.Tests/Smoke/SmokeTests.cs @@ -13,7 +13,7 @@ protected static Client ClientType return Client.DifiQa; } - return Client.DifiTest; + return Client.Localhost; } } diff --git a/Digipost.Signature.Api.Client.Core.Tests/Stubs/ClientStub.cs b/Digipost.Signature.Api.Client.Core.Tests/Stubs/ClientStub.cs new file mode 100755 index 00000000..5645e049 --- /dev/null +++ b/Digipost.Signature.Api.Client.Core.Tests/Stubs/ClientStub.cs @@ -0,0 +1,15 @@ +namespace Digipost.Signature.Api.Client.Core.Tests.Stubs +{ + internal class ClientStub : BaseClient + { + public ClientStub(ClientConfiguration clientConfiguration) + : base(clientConfiguration) + { + } + + public Sender GetCurrentSender(Sender jobSender) + { + return CurrentSender(jobSender); + } + } +} \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Core.Tests/Utilities/CoreDomainUtility.cs b/Digipost.Signature.Api.Client.Core.Tests/Utilities/CoreDomainUtility.cs index 35fb1b2a..e17b2e9f 100755 --- a/Digipost.Signature.Api.Client.Core.Tests/Utilities/CoreDomainUtility.cs +++ b/Digipost.Signature.Api.Client.Core.Tests/Utilities/CoreDomainUtility.cs @@ -13,7 +13,7 @@ public static class CoreDomainUtility public static ClientConfiguration GetClientConfiguration() { - return new ClientConfiguration(Environment.DifiQa, GetSender(), GetTestCertificate()); + return new ClientConfiguration(Environment.DifiQa, GetTestCertificate(), GetSender()); } public static Document GetDocument() diff --git a/Digipost.Signature.Api.Client.Core/Asice/AsiceSignature/SignatureGenerator.cs b/Digipost.Signature.Api.Client.Core/Asice/AsiceSignature/SignatureGenerator.cs index 7c65ada7..a6b1e40a 100755 --- a/Digipost.Signature.Api.Client.Core/Asice/AsiceSignature/SignatureGenerator.cs +++ b/Digipost.Signature.Api.Client.Core/Asice/AsiceSignature/SignatureGenerator.cs @@ -71,7 +71,6 @@ private XmlDocument CreateXadesSignatureElement() signatureDocument.AppendChild(signatureDocument.CreateElement("xades", "XAdESSignatures", NavneromUtility.UriEtsi121)); signatureDocument.DocumentElement.SetAttribute("xmlns", NavneromUtility.UriEtsi132); - //Todo: Legg til foerst signatureDocument.InsertBefore(xmlDeclaration, signatureDocument.DocumentElement); return signatureDocument; } diff --git a/Digipost.Signature.Api.Client.Core/BaseClient.cs b/Digipost.Signature.Api.Client.Core/BaseClient.cs index 6ae1c1c8..6072e298 100755 --- a/Digipost.Signature.Api.Client.Core/BaseClient.cs +++ b/Digipost.Signature.Api.Client.Core/BaseClient.cs @@ -3,6 +3,7 @@ using System.Net.Http; using System.Net.Security; using System.Security.Cryptography.X509Certificates; +using Digipost.Signature.Api.Client.Core.Exceptions; using Digipost.Signature.Api.Client.Core.Internal; namespace Digipost.Signature.Api.Client.Core @@ -34,6 +35,17 @@ internal HttpClient HttpClient internal RequestHelper RequestHelper { get; set; } + protected Sender CurrentSender(Sender jobSender) + { + var sender = jobSender ?? ClientConfiguration.Sender; + if (sender == null) + { + throw new SenderNotSpecifiedException(); + } + + return sender; + } + private HttpClient MutualTlsClient() { var mutualTlsHandler = MutualTlsHandler(); diff --git a/Digipost.Signature.Api.Client.Core/ClientConfiguration.cs b/Digipost.Signature.Api.Client.Core/ClientConfiguration.cs index 8a8005aa..0787dad0 100755 --- a/Digipost.Signature.Api.Client.Core/ClientConfiguration.cs +++ b/Digipost.Signature.Api.Client.Core/ClientConfiguration.cs @@ -6,12 +6,12 @@ namespace Digipost.Signature.Api.Client.Core { public class ClientConfiguration { - public ClientConfiguration(Environment environment, Sender sender, string certificateThumbprint) - : this(environment, sender, CertificateUtility.SenderCertificate(certificateThumbprint, Language.English)) + public ClientConfiguration(Environment environment, string certificateThumbprint, Sender sender = null) + : this(environment, CertificateUtility.SenderCertificate(certificateThumbprint, Language.English), sender) { } - public ClientConfiguration(Environment environment, Sender sender, X509Certificate2 certificate) + public ClientConfiguration(Environment environment, X509Certificate2 certificate, Sender sender = null) { Environment = environment; Sender = sender; diff --git a/Digipost.Signature.Api.Client.Core/DataTransferObjects/DataTransferObjectConverter.cs b/Digipost.Signature.Api.Client.Core/DataTransferObjects/DataTransferObjectConverter.cs index f31fcee9..20b3882c 100755 --- a/Digipost.Signature.Api.Client.Core/DataTransferObjects/DataTransferObjectConverter.cs +++ b/Digipost.Signature.Api.Client.Core/DataTransferObjects/DataTransferObjectConverter.cs @@ -1,6 +1,4 @@ -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; - -namespace Digipost.Signature.Api.Client.Core.DataTransferObjects +namespace Digipost.Signature.Api.Client.Core.DataTransferObjects { public static class DataTransferObjectConverter { diff --git a/Digipost.Signature.Api.Client.Core/Digipost.Signature.Api.Client.Core.csproj b/Digipost.Signature.Api.Client.Core/Digipost.Signature.Api.Client.Core.csproj index 5577e79e..a1188dea 100755 --- a/Digipost.Signature.Api.Client.Core/Digipost.Signature.Api.Client.Core.csproj +++ b/Digipost.Signature.Api.Client.Core/Digipost.Signature.Api.Client.Core.csproj @@ -86,6 +86,7 @@ + diff --git a/Digipost.Signature.Api.Client.Core/Exceptions/SenderNotSpecifiedException.cs b/Digipost.Signature.Api.Client.Core/Exceptions/SenderNotSpecifiedException.cs new file mode 100755 index 00000000..11c9785c --- /dev/null +++ b/Digipost.Signature.Api.Client.Core/Exceptions/SenderNotSpecifiedException.cs @@ -0,0 +1,10 @@ +namespace Digipost.Signature.Api.Client.Core.Exceptions +{ + public class SenderNotSpecifiedException : SignatureException + { + public SenderNotSpecifiedException() + : base("A sender must either be specified globally in ClientConfiguration or for each job.") + { + } + } +} \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Core/Internal/CreateAction.cs b/Digipost.Signature.Api.Client.Core/Internal/CreateAction.cs index c82566fe..ae5bbb42 100755 --- a/Digipost.Signature.Api.Client.Core/Internal/CreateAction.cs +++ b/Digipost.Signature.Api.Client.Core/Internal/CreateAction.cs @@ -1,12 +1,15 @@ using System; using System.Net.Http; using System.Net.Http.Headers; +using System.Reflection; using Digipost.Signature.Api.Client.Core.Asice; +using log4net; namespace Digipost.Signature.Api.Client.Core.Internal { internal abstract class CreateAction : SignatureAction { + private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private readonly DocumentBundle _documentBundle; protected CreateAction(IRequestContent job, DocumentBundle documentBundle, Func serializeFunc) diff --git a/Digipost.Signature.Api.Client.Core/RequestHelper.cs b/Digipost.Signature.Api.Client.Core/RequestHelper.cs index 57bacd40..f19be185 100755 --- a/Digipost.Signature.Api.Client.Core/RequestHelper.cs +++ b/Digipost.Signature.Api.Client.Core/RequestHelper.cs @@ -9,7 +9,6 @@ using Digipost.Signature.Api.Client.Core.Asice; using Digipost.Signature.Api.Client.Core.DataTransferObjects; using Digipost.Signature.Api.Client.Core.Exceptions; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using log4net; namespace Digipost.Signature.Api.Client.Core diff --git a/Digipost.Signature.Api.Client.Direct.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs b/Digipost.Signature.Api.Client.Direct.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs index fe8023a8..64c0c11d 100755 --- a/Digipost.Signature.Api.Client.Direct.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs +++ b/Digipost.Signature.Api.Client.Direct.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs @@ -4,7 +4,6 @@ using Digipost.Signature.Api.Client.Core; using Digipost.Signature.Api.Client.Core.Tests.Utilities; using Digipost.Signature.Api.Client.Core.Tests.Utilities.CompareObjects; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using Digipost.Signature.Api.Client.Direct.DataTransferObjects; using Digipost.Signature.Api.Client.Direct.Enums; using Digipost.Signature.Api.Client.Direct.Internal.AsicE; @@ -38,9 +37,9 @@ public void ConvertsDirectJobSuccessfully() reference = reference, exiturls = new exiturls { - cancellationurl = exitUrls.CancellationUrl.AbsoluteUri, - completionurl = exitUrls.CompletionUrl.AbsoluteUri, - errorurl = exitUrls.ErrorUrl.AbsoluteUri + completionurl = source.ExitUrls.CompletionUrl.AbsoluteUri, + rejectionurl = source.ExitUrls.RejectionUrl.AbsoluteUri, + errorurl = source.ExitUrls.ErrorUrl.AbsoluteUri } }; @@ -62,7 +61,7 @@ public void ConvertsExitUrlsSuccessfully() var expected = new exiturls { completionurl = source.CompletionUrl.AbsoluteUri, - cancellationurl = source.CancellationUrl.AbsoluteUri, + rejectionurl = source.RejectionUrl.AbsoluteUri, errorurl = source.ErrorUrl.AbsoluteUri }; @@ -143,12 +142,12 @@ public void ConvertsUnsignedDirectJobStatusSuccessfully() var source = new directsignaturejobstatusresponse { signaturejobid = 77, - status = directsignaturejobstatus.CREATED + status = directsignaturejobstatus.REJECTED }; var expected = new DirectJobStatusResponse( source.signaturejobid, - JobStatus.Created, + JobStatus.Rejected, new JobReferences(null, null, null) ); diff --git a/Digipost.Signature.Api.Client.Direct.Tests/Digipost.Signature.Api.Client.Direct.Tests.csproj b/Digipost.Signature.Api.Client.Direct.Tests/Digipost.Signature.Api.Client.Direct.Tests.csproj index a5a82afd..d65d28be 100755 --- a/Digipost.Signature.Api.Client.Direct.Tests/Digipost.Signature.Api.Client.Direct.Tests.csproj +++ b/Digipost.Signature.Api.Client.Direct.Tests/Digipost.Signature.Api.Client.Direct.Tests.csproj @@ -57,6 +57,7 @@ + diff --git a/Digipost.Signature.Api.Client.Direct.Tests/DirectClientTests.cs b/Digipost.Signature.Api.Client.Direct.Tests/DirectClientTests.cs index 48c0cea1..2cf96c1f 100755 --- a/Digipost.Signature.Api.Client.Direct.Tests/DirectClientTests.cs +++ b/Digipost.Signature.Api.Client.Direct.Tests/DirectClientTests.cs @@ -1,11 +1,14 @@ using System; using System.Net.Http; using System.Threading.Tasks; +using Digipost.Signature.Api.Client.Core; using Digipost.Signature.Api.Client.Core.Exceptions; using Digipost.Signature.Api.Client.Core.Tests.Fakes; using Digipost.Signature.Api.Client.Core.Tests.Utilities; using Digipost.Signature.Api.Client.Direct.Tests.Fakes; +using Digipost.Signature.Api.Client.Direct.Tests.Utilities; using Microsoft.VisualStudio.TestTools.UnitTesting; +using Environment = Digipost.Signature.Api.Client.Core.Environment; namespace Digipost.Signature.Api.Client.Direct.Tests { @@ -31,6 +34,26 @@ public void SimpleConstructor() } } + [TestClass] + public class CreateMethod : DirectClientTests + { + [TestMethod] + [ExpectedException(typeof (SenderNotSpecifiedException))] + public async Task ThrowsExceptionOnNoSender() + { + //Arrange + var clientConfiguration = new ClientConfiguration(Environment.DifiQa, CoreDomainUtility.GetPostenTestCertificate()); + var directClient = new DirectClient(clientConfiguration); + var directJob = new DirectJob(CoreDomainUtility.GetDocument(), CoreDomainUtility.GetSigner(), "SendersReference", DomainUtility.GetExitUrls()); + + //Act + await directClient.Create(directJob); + + //Assert + Assert.Fail(); + } + } + [TestClass] public class GetStatusMethod : DirectClientTests { @@ -44,7 +67,7 @@ public async Task ReturnsStatusResponse() }; //Act - var result = await directClient.GetStatus(new StatusReference(new Uri("http://statusReference.no"))); + var result = await directClient.GetStatus(new StatusReference(new Uri("http://statusReference.no"), "StatusQueryToken")); //Assert Assert.IsNotNull(result); @@ -61,7 +84,7 @@ public async Task GetStatusThrowsSignatureException() }; //Act - await directClient.GetStatus(new StatusReference(new Uri("http://statusReference.no"))); + await directClient.GetStatus(new StatusReference(new Uri("http://statusReference.no"), "StatusQueryToken")); //Assert Assert.Fail(); diff --git a/Digipost.Signature.Api.Client.Direct.Tests/DirectJobTests.cs b/Digipost.Signature.Api.Client.Direct.Tests/DirectJobTests.cs index ab1c3c4a..857fce76 100755 --- a/Digipost.Signature.Api.Client.Direct.Tests/DirectJobTests.cs +++ b/Digipost.Signature.Api.Client.Direct.Tests/DirectJobTests.cs @@ -1,6 +1,6 @@ -using System; -using Digipost.Signature.Api.Client.Core; +using Digipost.Signature.Api.Client.Core; using Digipost.Signature.Api.Client.Core.Tests.Utilities; +using Digipost.Signature.Api.Client.Direct.Tests.Utilities; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Digipost.Signature.Api.Client.Direct.Tests @@ -11,6 +11,15 @@ public class DirectJobTests [TestClass] public class ConstructorMethod : DirectJobTests { + [TestMethod] + public void ConstructorWithoutSenderExists() + { + //Act + new DirectJob(null, null, null, null); + + //Assert + } + [TestMethod] public void SimpleConstructor() { @@ -18,20 +27,18 @@ public void SimpleConstructor() var id = "IdDirectJob"; var signer = new Signer("01013300001"); var document = CoreDomainUtility.GetDocument(); - var exitUrls = new ExitUrls( - new Uri("http://localhost.completed"), - new Uri("http://localhost.cancelled"), - new Uri("http://localhost.error") - ); + var exitUrls = DomainUtility.GetExitUrls(); + var sender = CoreDomainUtility.GetSender(); //Act - var directJob = new DirectJob(document, signer, id, exitUrls); + var directJob = new DirectJob(document, signer, id, exitUrls, sender); //Assert Assert.AreEqual(id, directJob.Reference); Assert.AreEqual(signer, directJob.Signer); Assert.AreEqual(document, directJob.Document); Assert.AreEqual(exitUrls, directJob.ExitUrls); + Assert.AreEqual(sender, directJob.Sender); } } } diff --git a/Digipost.Signature.Api.Client.Direct.Tests/ExitUrlsTests.cs b/Digipost.Signature.Api.Client.Direct.Tests/ExitUrlsTests.cs index 05db09cd..97f600cb 100755 --- a/Digipost.Signature.Api.Client.Direct.Tests/ExitUrlsTests.cs +++ b/Digipost.Signature.Api.Client.Direct.Tests/ExitUrlsTests.cs @@ -22,7 +22,7 @@ public void SimpleContructor() //Assert Assert.AreEqual(completionUrl, exitUrls.CompletionUrl); - Assert.AreEqual(cancellationUrl, exitUrls.CancellationUrl); + Assert.AreEqual(cancellationUrl, exitUrls.RejectionUrl); Assert.AreEqual(errorUrl, exitUrls.ErrorUrl); } } diff --git a/Digipost.Signature.Api.Client.Direct.Tests/Integration/DirectClientIntegrationTests.cs b/Digipost.Signature.Api.Client.Direct.Tests/Integration/DirectClientIntegrationTests.cs index b7e90bb8..0991c45e 100755 --- a/Digipost.Signature.Api.Client.Direct.Tests/Integration/DirectClientIntegrationTests.cs +++ b/Digipost.Signature.Api.Client.Direct.Tests/Integration/DirectClientIntegrationTests.cs @@ -55,7 +55,7 @@ public async Task SendsSuccessfully() var directJobResponse = DomainUtility.GetDirectJobResponse(); //Act - var result = await directClient.GetStatus(directJobResponse.ResponseUrls.Status); + var result = await directClient.GetStatus(directJobResponse.ResponseUrls.Status("StatusQueryToken")); //Assert Assert.IsNotNull(result.JobId); diff --git a/Digipost.Signature.Api.Client.Direct.Tests/ResponseUrlsTests.cs b/Digipost.Signature.Api.Client.Direct.Tests/ResponseUrlsTests.cs index 4c0dec6d..4c7c4288 100755 --- a/Digipost.Signature.Api.Client.Direct.Tests/ResponseUrlsTests.cs +++ b/Digipost.Signature.Api.Client.Direct.Tests/ResponseUrlsTests.cs @@ -23,7 +23,28 @@ public void SimpleConstructor() //Assert Assert.AreEqual(redirectUrl, responseUrls.Redirect.Url); - Assert.AreEqual(statusUrl, responseUrls.Status.Url); + } + } + + [TestClass] + public class StatusMethod : ResponseurlsTests + { + [TestMethod] + public void ReturnsStatusNotNull() + { + //Arrange + var redirectUrl = new Uri("http://responseurl.no"); + var statusUrl = new Uri("http://statusurl.no"); + var statusQueryToken = "StatusQueryToken"; + + //Act + var responseUrls = new ResponseUrls( + redirectUrl, + statusUrl + ); + + //Assert + Assert.IsNotNull(responseUrls.Status(statusQueryToken)); } } } diff --git a/Digipost.Signature.Api.Client.Direct.Tests/Smoke/DirectClientSmokeTests.cs b/Digipost.Signature.Api.Client.Direct.Tests/Smoke/DirectClientSmokeTests.cs index 212644a5..90f42ebf 100755 --- a/Digipost.Signature.Api.Client.Direct.Tests/Smoke/DirectClientSmokeTests.cs +++ b/Digipost.Signature.Api.Client.Direct.Tests/Smoke/DirectClientSmokeTests.cs @@ -1,5 +1,6 @@ using System; using System.Threading.Tasks; +using System.Web; using Digipost.Signature.Api.Client.Core; using Digipost.Signature.Api.Client.Core.Tests.Smoke; using Digipost.Signature.Api.Client.Core.Tests.Utilities; @@ -42,7 +43,7 @@ protected static DirectClient GetDirectClient() private static DirectClient DirectClient(Environment environment) { var sender = new Sender("988015814"); - var clientConfig = new ClientConfiguration(environment, sender, CoreDomainUtility.GetTestIntegrasjonSertifikat()); + var clientConfig = new ClientConfiguration(environment, CoreDomainUtility.GetTestIntegrasjonSertifikat(), sender); var client = new DirectClient(clientConfig); return client; } @@ -62,6 +63,12 @@ internal static DirectJobStatusResponse MorphDirectJobStatusResponseIfMayBe(Dire return directJobResponse; } + internal static StatusReference MorphStatusReferenceIfMayBe(StatusReference statusReference) + { + var statusReferenceUri = GetUriFromRelativePath(statusReference.Url().AbsolutePath); + return new StatusReference(statusReferenceUri, statusReference.StatusQueryToken); + } + [TestClass] public class RunsEndpointCallsSuccessfully : DirectClientSmokeTests { @@ -73,22 +80,34 @@ public static void CreateAndGetStatus(TestContext context) var directJob = DomainUtility.GetDirectJob(); //Act - var result = directClient.Create(directJob).Result; - directClient.AutoSign(result.JobId).Wait(); - _statusReference = new StatusReference(GetUriFromRelativePath(result.ResponseUrls.Status.Url.AbsolutePath)); + var directJobResponse = directClient.Create(directJob).Result; + var statusQueryToken = AutoSignAndGetToken(directClient, directJobResponse); + _statusReference = MorphStatusReferenceIfMayBe(directJobResponse.ResponseUrls.Status(statusQueryToken)); + + var jobStatusResponse = directClient.GetStatus(_statusReference).Result; - var directJobStatusResponse = MorphDirectJobStatusResponseIfMayBe(directClient.GetStatus(_statusReference).Result); + var directJobStatusResponse = MorphDirectJobStatusResponseIfMayBe(jobStatusResponse); _xadesReference = directJobStatusResponse.References.Xades; _padesReference = directJobStatusResponse.References.Pades; _confirmationReference = directJobStatusResponse.References.Confirmation; //Assert - Assert.IsNotNull(result.JobId); + Assert.IsNotNull(_statusReference); + Assert.IsNotNull(directJobResponse.JobId); Assert.IsNotNull(_xadesReference); Assert.IsNotNull(_padesReference); Assert.IsNotNull(_confirmationReference); } + private static string AutoSignAndGetToken(DirectClient directClient, DirectJobResponse directJobResponse) + { + var statusUrl = directClient.AutoSign(directJobResponse.JobId).Result; + var queryParams = new Uri(statusUrl).Query; + var queryDictionary = HttpUtility.ParseQueryString(queryParams); + var statusQueryToken = queryDictionary.Get(0); + return statusQueryToken; + } + [TestMethod] public async Task CreatesSuccessfully() { diff --git a/Digipost.Signature.Api.Client.Direct.Tests/StatusReferenceTests.cs b/Digipost.Signature.Api.Client.Direct.Tests/StatusReferenceTests.cs index 9b9aa567..9f83122c 100755 --- a/Digipost.Signature.Api.Client.Direct.Tests/StatusReferenceTests.cs +++ b/Digipost.Signature.Api.Client.Direct.Tests/StatusReferenceTests.cs @@ -13,13 +13,15 @@ public class ConstructorMethod : StatusReferenceTests public void SimpleConstructor() { //Arrange - var jobReference = new Uri("http://signatureserviceroot.digipost.no/urlidurl/id030302"); + var urlWithoutToken = new Uri("http://organizationdomain.com/completionUrl/"); + var statusQueryToken = "ALongToken"; //Act - var directJobReference = new StatusReference(jobReference); + var statusReference = new StatusReference(urlWithoutToken, statusQueryToken); //Assert - Assert.AreEqual(jobReference, directJobReference.Url); + Assert.AreEqual(urlWithoutToken, statusReference.BaseUrl); + Assert.AreEqual(statusQueryToken, statusReference.StatusQueryToken); } } } diff --git a/Digipost.Signature.Api.Client.Direct/DataTransferObjects/DataTransferObjectConverter.cs b/Digipost.Signature.Api.Client.Direct/DataTransferObjects/DataTransferObjectConverter.cs index 046e5d6c..c068cb11 100755 --- a/Digipost.Signature.Api.Client.Direct/DataTransferObjects/DataTransferObjectConverter.cs +++ b/Digipost.Signature.Api.Client.Direct/DataTransferObjects/DataTransferObjectConverter.cs @@ -1,6 +1,5 @@ using System; using Digipost.Signature.Api.Client.Core; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using Digipost.Signature.Api.Client.Direct.Enums; using Digipost.Signature.Api.Client.Direct.Internal.AsicE; @@ -22,9 +21,9 @@ public static exiturls ToDataTransferObject(ExitUrls exitUrls) { return new exiturls { - cancellationurl = exitUrls.CancellationUrl.AbsoluteUri, - completionurl = exitUrls.CompletionUrl.AbsoluteUri, - errorurl = exitUrls.ErrorUrl.AbsoluteUri + completionurl = exitUrls.CompletionUrl.ToString(), + errorurl = exitUrls.ErrorUrl.ToString(), + rejectionurl = exitUrls.RejectionUrl.ToString() }; } diff --git a/Digipost.Signature.Api.Client.Direct/DirectClient.cs b/Digipost.Signature.Api.Client.Direct/DirectClient.cs index efae367c..db49e22f 100755 --- a/Digipost.Signature.Api.Client.Direct/DirectClient.cs +++ b/Digipost.Signature.Api.Client.Direct/DirectClient.cs @@ -7,7 +7,6 @@ using System.Threading.Tasks; using Digipost.Signature.Api.Client.Core; using Digipost.Signature.Api.Client.Core.Asice; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using Digipost.Signature.Api.Client.Direct.DataTransferObjects; using Digipost.Signature.Api.Client.Direct.Internal; using Digipost.Signature.Api.Client.Direct.Internal.AsicE; @@ -18,20 +17,20 @@ namespace Digipost.Signature.Api.Client.Direct public class DirectClient : BaseClient { private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private readonly Uri _subPath; public DirectClient(ClientConfiguration clientConfiguration) : base(clientConfiguration) { - _subPath = new Uri($"/api/{clientConfiguration.Sender.OrganizationNumber}/direct/signature-jobs", UriKind.Relative); - Log.Debug($"Creating DirectClient, endpoint {new Uri(clientConfiguration.Environment.Url, _subPath)}"); } public async Task Create(DirectJob directJob) { - var documentBundle = AsiceGenerator.CreateAsice(ClientConfiguration.Sender, directJob.Document, directJob.Signer, ClientConfiguration.Certificate); + var sender = CurrentSender(directJob.Sender); + var relativeUrl = new Uri($"/api/{sender.OrganizationNumber}/direct/signature-jobs", UriKind.Relative); + + var documentBundle = AsiceGenerator.CreateAsice(sender, directJob.Document, directJob.Signer, ClientConfiguration.Certificate); var createAction = new DirectCreateAction(directJob, documentBundle); - var directJobResponse = await RequestHelper.Create(_subPath, createAction.Content(), DirectCreateAction.DeserializeFunc); + var directJobResponse = await RequestHelper.Create(relativeUrl, createAction.Content(), DirectCreateAction.DeserializeFunc); Log.Debug($"Successfully created Direct Job with JobId: {directJobResponse.JobId}."); @@ -42,7 +41,7 @@ public async Task GetStatus(StatusReference statusRefer { var request = new HttpRequestMessage { - RequestUri = statusReference.Url, + RequestUri = statusReference.Url(), Method = HttpMethod.Get }; request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); @@ -76,11 +75,12 @@ public async Task Confirm(ConfirmationReference confirmationReference) await RequestHelper.Confirm(confirmationReference); } - internal async Task AutoSign(long jobId) + internal async Task AutoSign(long jobId) { Log.Warn($"Autosigning DirectJob with id: `{jobId}`. Should only happen in tests."); var url = new Uri($"/web/signature-jobs/{jobId}/devmodesign", UriKind.Relative); - await HttpClient.PostAsync(url, null); + var httpResponseMessage = await HttpClient.PostAsync(url, null); + return await httpResponseMessage.Content.ReadAsStringAsync(); } } } \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Direct/DirectJob.cs b/Digipost.Signature.Api.Client.Direct/DirectJob.cs index d590cb7f..e7b6c557 100755 --- a/Digipost.Signature.Api.Client.Direct/DirectJob.cs +++ b/Digipost.Signature.Api.Client.Direct/DirectJob.cs @@ -5,20 +5,23 @@ namespace Digipost.Signature.Api.Client.Direct { public class DirectJob : IRequestContent { - public DirectJob(Document document, Signer signer, string reference, ExitUrls exitUrls) + public DirectJob(Document document, Signer signer, string reference, ExitUrls exitUrls, Sender sender = null) { Reference = reference; Signer = signer; Document = document; ExitUrls = exitUrls; + Sender = sender; } - public string Reference { get; private set; } + public string Reference { get; } - public Signer Signer { get; private set; } + public Signer Signer { get; } - public Document Document { get; private set; } + public Document Document { get; } - public ExitUrls ExitUrls { get; private set; } + public ExitUrls ExitUrls { get; } + + public Sender Sender { get; } } } \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Direct/Enums/JobStatus.cs b/Digipost.Signature.Api.Client.Direct/Enums/JobStatus.cs index 503d48e0..62ee3d51 100755 --- a/Digipost.Signature.Api.Client.Direct/Enums/JobStatus.cs +++ b/Digipost.Signature.Api.Client.Direct/Enums/JobStatus.cs @@ -2,8 +2,8 @@ { public enum JobStatus { - Created, - Signed, - Cancelled + Cancelled, + Rejected, + Signed } } \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Direct/ExitUrls.cs b/Digipost.Signature.Api.Client.Direct/ExitUrls.cs index ef293228..820767eb 100755 --- a/Digipost.Signature.Api.Client.Direct/ExitUrls.cs +++ b/Digipost.Signature.Api.Client.Direct/ExitUrls.cs @@ -4,16 +4,16 @@ namespace Digipost.Signature.Api.Client.Direct { public class ExitUrls { - public ExitUrls(Uri completionUrl, Uri cancellationUrl, Uri errorUrl) + public ExitUrls(Uri completionUrl, Uri rejectionUrl, Uri errorUrl) { CompletionUrl = completionUrl; - CancellationUrl = cancellationUrl; + RejectionUrl = rejectionUrl; ErrorUrl = errorUrl; } public Uri CompletionUrl { get; set; } - public Uri CancellationUrl { get; set; } + public Uri RejectionUrl { get; set; } public Uri ErrorUrl { get; set; } } diff --git a/Digipost.Signature.Api.Client.Direct/Internal/DirectCreateAction.cs b/Digipost.Signature.Api.Client.Direct/Internal/DirectCreateAction.cs index c1f586f3..6695898a 100755 --- a/Digipost.Signature.Api.Client.Direct/Internal/DirectCreateAction.cs +++ b/Digipost.Signature.Api.Client.Direct/Internal/DirectCreateAction.cs @@ -1,7 +1,6 @@ using System; using Digipost.Signature.Api.Client.Core.Asice; using Digipost.Signature.Api.Client.Core.Internal; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using Digipost.Signature.Api.Client.Direct.DataTransferObjects; namespace Digipost.Signature.Api.Client.Direct.Internal diff --git a/Digipost.Signature.Api.Client.Direct/ResponseUrls.cs b/Digipost.Signature.Api.Client.Direct/ResponseUrls.cs index c36e57e7..89711e05 100755 --- a/Digipost.Signature.Api.Client.Direct/ResponseUrls.cs +++ b/Digipost.Signature.Api.Client.Direct/ResponseUrls.cs @@ -4,14 +4,19 @@ namespace Digipost.Signature.Api.Client.Direct { public class ResponseUrls { + private readonly Uri _statusUrl; + public ResponseUrls(Uri redirectUrl, Uri statusUrl) { + _statusUrl = statusUrl; Redirect = new RedirectReference(redirectUrl); - Status = new StatusReference(statusUrl); } public RedirectReference Redirect { get; set; } - public StatusReference Status { get; set; } + public StatusReference Status(string statusQueryToken) + { + return new StatusReference(_statusUrl, statusQueryToken); + } } } \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Direct/StatusReference.cs b/Digipost.Signature.Api.Client.Direct/StatusReference.cs index 6615dc60..f747a88d 100755 --- a/Digipost.Signature.Api.Client.Direct/StatusReference.cs +++ b/Digipost.Signature.Api.Client.Direct/StatusReference.cs @@ -4,11 +4,19 @@ namespace Digipost.Signature.Api.Client.Direct { public class StatusReference { - public StatusReference(Uri url) + public StatusReference(Uri baseUrl, string statusQueryToken) { - Url = url; + BaseUrl = baseUrl; + StatusQueryToken = statusQueryToken; } - public Uri Url { get; internal set; } + public string StatusQueryToken { get; } + + internal Uri BaseUrl { get; } + + public Uri Url() + { + return new Uri($"{BaseUrl.AbsoluteUri}?status_query_token={StatusQueryToken}"); + } } } \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Portal.Tests/AvailabilityTests.cs b/Digipost.Signature.Api.Client.Portal.Tests/AvailabilityTests.cs new file mode 100755 index 00000000..105bdcaf --- /dev/null +++ b/Digipost.Signature.Api.Client.Portal.Tests/AvailabilityTests.cs @@ -0,0 +1,39 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Digipost.Signature.Api.Client.Portal.Tests +{ + [TestClass] + public class AvailabilityTests + { + [TestClass] + public class AvailableForMethod : AvailabilityTests + { + [TestMethod] + public void ReturnsZeroWhenUninitialized() + { + //Arrange + var expectedAvailableSeconds = 0; + + //Act + var availability = new Availability(); + + //Assert + Assert.AreEqual(expectedAvailableSeconds, availability.AvailableSeconds); + } + + [TestMethod] + public void ReturnsSecondsWhenInitialized() + { + //Arrange + var expectedAvailableSeconds = 86400 + 3600 + 60 + 1; + + //Act + var availability = new Availability {AvailableFor = new TimeSpan(1, 1, 1, 1)}; + + //Assert + Assert.AreEqual(expectedAvailableSeconds, availability.AvailableSeconds); + } + } + } +} \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Portal.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs b/Digipost.Signature.Api.Client.Portal.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs index 43b652c3..7c113ede 100755 --- a/Digipost.Signature.Api.Client.Portal.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs +++ b/Digipost.Signature.Api.Client.Portal.Tests/DataTransferObjects/DataTransferObjectConverterTests.cs @@ -4,7 +4,6 @@ using Digipost.Signature.Api.Client.Core; using Digipost.Signature.Api.Client.Core.Tests.Utilities; using Digipost.Signature.Api.Client.Core.Tests.Utilities.CompareObjects; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using Digipost.Signature.Api.Client.Portal.DataTransferObjects; using Digipost.Signature.Api.Client.Portal.Enums; using Digipost.Signature.Api.Client.Portal.Extensions; @@ -80,7 +79,7 @@ public void ConvertsManifestWithoutAvailabilitySuccessfully() } [TestMethod] - public void ConvertsManifestWithOnlyExpirationAvailabilitySuccessfully() + public void ConvertsManifestWithOnlyAvailableSecondsSuccessfully() { //Arrange const string organizationNumberSender = "12345678902"; @@ -89,7 +88,7 @@ public void ConvertsManifestWithOnlyExpirationAvailabilitySuccessfully() { Availability = new Availability { - Expiration = DateTime.Now.AddHours(22) + AvailableFor = new TimeSpan(0, 0, 1, 0) } }; @@ -110,7 +109,7 @@ public void ConvertsManifestWithOnlyExpirationAvailabilitySuccessfully() }, availability = new availability { - expirationtime = source.Availability.Expiration.Value + availableseconds = source.Availability.AvailableSeconds } }; @@ -125,7 +124,7 @@ public void ConvertsManifestWithOnlyExpirationAvailabilitySuccessfully() } [TestMethod] - public void ConvertsManifestWithOnlyActiviationAvailabilitySuccessfully() + public void ConvertsManifestWithOnlyActivationAvailabilitySuccessfully() { //Arrange const string organizationNumberSender = "12345678902"; @@ -198,7 +197,7 @@ public void ConvertsManifestWithAvailabilitySuccessfully() availability = new availability { activationtime = source.Availability.Activation.Value, - expirationtime = source.Availability.Expiration.Value + availableseconds = source.Availability.AvailableSeconds } }; diff --git a/Digipost.Signature.Api.Client.Portal.Tests/Digipost.Signature.Api.Client.Portal.Tests.csproj b/Digipost.Signature.Api.Client.Portal.Tests/Digipost.Signature.Api.Client.Portal.Tests.csproj index 0fecd73e..03df7adb 100755 --- a/Digipost.Signature.Api.Client.Portal.Tests/Digipost.Signature.Api.Client.Portal.Tests.csproj +++ b/Digipost.Signature.Api.Client.Portal.Tests/Digipost.Signature.Api.Client.Portal.Tests.csproj @@ -82,9 +82,11 @@ Properties\SharedAssemblyInfo.cs + + diff --git a/Digipost.Signature.Api.Client.Portal.Tests/Extensions/EnumExtensionsTests.cs b/Digipost.Signature.Api.Client.Portal.Tests/Extensions/EnumExtensionsTests.cs index 49d29684..01e8205c 100755 --- a/Digipost.Signature.Api.Client.Portal.Tests/Extensions/EnumExtensionsTests.cs +++ b/Digipost.Signature.Api.Client.Portal.Tests/Extensions/EnumExtensionsTests.cs @@ -1,5 +1,4 @@ -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; -using Digipost.Signature.Api.Client.Portal.Enums; +using Digipost.Signature.Api.Client.Portal.Enums; using Digipost.Signature.Api.Client.Portal.Extensions; using Microsoft.VisualStudio.TestTools.UnitTesting; diff --git a/Digipost.Signature.Api.Client.Portal.Tests/Fakes/FakeHttpClientHandlerChecksCorrectSenderResponse.cs b/Digipost.Signature.Api.Client.Portal.Tests/Fakes/FakeHttpClientHandlerChecksCorrectSenderResponse.cs new file mode 100755 index 00000000..d49e15c6 --- /dev/null +++ b/Digipost.Signature.Api.Client.Portal.Tests/Fakes/FakeHttpClientHandlerChecksCorrectSenderResponse.cs @@ -0,0 +1,25 @@ +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Digipost.Signature.Api.Client.Core.Tests.Fakes; +using Digipost.Signature.Api.Client.Portal.Tests.Utilities; + +namespace Digipost.Signature.Api.Client.Portal.Tests.Fakes +{ + internal class FakeHttpClientHandlerChecksCorrectSenderResponse : FakeHttpClientHandlerResponse + { + public string RequestUri { get; internal set; } + + protected override async Task SendAsync( + HttpRequestMessage request, CancellationToken cancellationToken) + { + RequestUri = request.RequestUri.ToString(); + return await base.SendAsync(request, cancellationToken); + } + + public override HttpContent GetContent() + { + return new StringContent(ResponseUtility.GetJobStatusChangeResponse()); + } + } +} \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Portal.Tests/PortalClientTests.cs b/Digipost.Signature.Api.Client.Portal.Tests/PortalClientTests.cs index c6dad7da..afc51cf7 100755 --- a/Digipost.Signature.Api.Client.Portal.Tests/PortalClientTests.cs +++ b/Digipost.Signature.Api.Client.Portal.Tests/PortalClientTests.cs @@ -8,6 +8,7 @@ using Digipost.Signature.Api.Client.Portal.Exceptions; using Digipost.Signature.Api.Client.Portal.Tests.Fakes; using Microsoft.VisualStudio.TestTools.UnitTesting; +using Environment = Digipost.Signature.Api.Client.Core.Environment; namespace Digipost.Signature.Api.Client.Portal.Tests { @@ -22,9 +23,87 @@ internal HttpClient GetHttpClientWithHandler(DelegatingHandler delegatingHandler }; } + [TestClass] + public class CreateMethod : PortalClientTests + { + [TestMethod] + [ExpectedException(typeof (SenderNotSpecifiedException))] + public async Task ThrowsExceptionOnNoSender() + { + //Arrange + var clientConfiguration = new ClientConfiguration(Environment.DifiQa, CoreDomainUtility.GetPostenTestCertificate()); + var portalClient = new PortalClient(clientConfiguration); + var portalJob = new PortalJob(CoreDomainUtility.GetDocument(), CoreDomainUtility.GetSigners(1), "SendersReference"); + + //Act + await portalClient.Create(portalJob); + + //Assert + Assert.Fail(); + } + } + [TestClass] public class GetStatusChangeMethod : PortalClientTests { + [TestMethod] + [ExpectedException(typeof (SenderNotSpecifiedException))] + public async Task ThrowsExceptionOnSenderNotSpecified() + { + //Arrange + var clientConfiguration = new ClientConfiguration(Environment.DifiQa, CoreDomainUtility.GetPostenTestCertificate()); + var fakeHttpClientHandlerChecksCorrectSender = new FakeHttpClientHandlerForJobStatusChangeResponse(); + var portalClient = new PortalClient(clientConfiguration) + { + HttpClient = GetHttpClientWithHandler(fakeHttpClientHandlerChecksCorrectSender) + }; + + //Act + await portalClient.GetStatusChange(); + + //Assert + Assert.Fail(); + } + + [TestMethod] + public async Task CanBeCalledWithoutSenderUsesSenderInClientConfiguration() + { + //Arrange + var sender = CoreDomainUtility.GetSender(); + var clientConfiguration = new ClientConfiguration(Environment.DifiQa, CoreDomainUtility.GetPostenTestCertificate(), sender); + var fakeHttpClientHandlerChecksCorrectSender = new FakeHttpClientHandlerChecksCorrectSenderResponse(); + var portalClient = new PortalClient(clientConfiguration) + { + HttpClient = GetHttpClientWithHandler(fakeHttpClientHandlerChecksCorrectSender) + }; + + //Act + await portalClient.GetStatusChange(); + + //Assert + Assert.IsTrue(fakeHttpClientHandlerChecksCorrectSender.RequestUri.Contains(sender.OrganizationNumber)); + } + + [TestMethod] + public async Task CalledWithBothSendersUsesInput() + { + //Arrange + var parameterSender = new Sender("000000000"); + var clientConfigurationSender = new Sender("999999999"); + var clientConfiguration = new ClientConfiguration(Environment.DifiQa, CoreDomainUtility.GetPostenTestCertificate(), clientConfigurationSender); + var fakeHttpClientHandlerChecksCorrectSender = new FakeHttpClientHandlerChecksCorrectSenderResponse(); + var portalClient = new PortalClient(clientConfiguration) + { + HttpClient = GetHttpClientWithHandler(fakeHttpClientHandlerChecksCorrectSender) + }; + + //Act + await portalClient.GetStatusChange(parameterSender); + + //Assert + Assert.IsTrue(fakeHttpClientHandlerChecksCorrectSender.RequestUri.Contains(parameterSender.OrganizationNumber)); + } + [TestMethod] public async Task ReturnsEmptyObjectOnEmptyQueue() { diff --git a/Digipost.Signature.Api.Client.Portal.Tests/PortalJobTests.cs b/Digipost.Signature.Api.Client.Portal.Tests/PortalJobTests.cs index 8625b300..87ad5648 100755 --- a/Digipost.Signature.Api.Client.Portal.Tests/PortalJobTests.cs +++ b/Digipost.Signature.Api.Client.Portal.Tests/PortalJobTests.cs @@ -9,6 +9,17 @@ public class PortalJobTests [TestClass] public class ConstructorMethod : PortalJobTests { + [TestMethod] + public void ConstructorWithoutSenderExists() + { + //Arrange + + //Act + new PortalJob(null, null, null); + + //Assert + } + [TestMethod] public void SimpleConstructor() { diff --git a/Digipost.Signature.Api.Client.Portal.Tests/Smoke/PortalClientSmokeTests.cs b/Digipost.Signature.Api.Client.Portal.Tests/Smoke/PortalClientSmokeTests.cs index 63455c20..4124d619 100755 --- a/Digipost.Signature.Api.Client.Portal.Tests/Smoke/PortalClientSmokeTests.cs +++ b/Digipost.Signature.Api.Client.Portal.Tests/Smoke/PortalClientSmokeTests.cs @@ -44,7 +44,7 @@ protected static PortalClient GetPortalClient() private static PortalClient GetPortalClient(Environment environment) { var sender = new Sender("988015814"); - var clientConfig = new ClientConfiguration(environment, sender, CoreDomainUtility.GetTestIntegrasjonSertifikat()); + var clientConfig = new ClientConfiguration(environment, CoreDomainUtility.GetTestIntegrasjonSertifikat(), sender); var client = new PortalClient(clientConfig); return client; } @@ -150,9 +150,10 @@ public async Task CancelsSuccessfully() var portalClient = GetPortalClient(); var portalJobResponse = await portalClient.Create(portalJob); + var cancellationReference = new CancellationReference(GetUriFromRelativePath(portalJobResponse.CancellationReference.Url.AbsolutePath)); //Act - portalClient.Cancel(portalJobResponse.CancellationReference).Wait(); + portalClient.Cancel(cancellationReference).Wait(); var changeResponse = await portalClient.GetStatusChange(); diff --git a/Digipost.Signature.Api.Client.Portal.Tests/Utilities/DomainUtility.cs b/Digipost.Signature.Api.Client.Portal.Tests/Utilities/DomainUtility.cs index c3651620..ccc47945 100755 --- a/Digipost.Signature.Api.Client.Portal.Tests/Utilities/DomainUtility.cs +++ b/Digipost.Signature.Api.Client.Portal.Tests/Utilities/DomainUtility.cs @@ -17,13 +17,20 @@ public static Availability GetAvailability() return new Availability { Activation = DateTime.Now.AddHours(2), - Expiration = DateTime.Now.AddDays(3) + AvailableFor = new TimeSpan(1, 0, 0, 0) }; } public static PortalJob GetPortalJob(int signers) { - return new PortalJob(CoreDomainUtility.GetDocument(), CoreDomainUtility.GetSigners(signers), "PortalJobReference"); + return new PortalJob(CoreDomainUtility.GetDocument(), CoreDomainUtility.GetSigners(signers), "PortalJobReference") + { + Availability = new Availability + { + Activation = DateTime.Now, + AvailableFor = new TimeSpan(0, 0, 10, 0) + } + }; } internal static PortalManifest GetPortalManifest() diff --git a/Digipost.Signature.Api.Client.Portal/Availability.cs b/Digipost.Signature.Api.Client.Portal/Availability.cs index db8f9846..fb2e225d 100755 --- a/Digipost.Signature.Api.Client.Portal/Availability.cs +++ b/Digipost.Signature.Api.Client.Portal/Availability.cs @@ -6,6 +6,11 @@ public class Availability { public DateTime? Activation { get; set; } - public DateTime? Expiration { get; set; } + public long AvailableSeconds { get; private set; } + + public TimeSpan AvailableFor + { + set { AvailableSeconds = (long) value.TotalSeconds; } + } } } \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Portal/DataTransferObjects/DataTransferObjectConverter.cs b/Digipost.Signature.Api.Client.Portal/DataTransferObjects/DataTransferObjectConverter.cs index 05501c60..9747227f 100755 --- a/Digipost.Signature.Api.Client.Portal/DataTransferObjects/DataTransferObjectConverter.cs +++ b/Digipost.Signature.Api.Client.Portal/DataTransferObjects/DataTransferObjectConverter.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Digipost.Signature.Api.Client.Core; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using Digipost.Signature.Api.Client.Portal.Enums; using Digipost.Signature.Api.Client.Portal.Extensions; using Digipost.Signature.Api.Client.Portal.Internal.AsicE; @@ -34,17 +33,13 @@ public static portalsignaturejobmanifest ToDataTransferObject(PortalManifest por { dataTransferObject.availability = new availability(); var activationTime = portalManifest.Availability.Activation; - var expirationTime = portalManifest.Availability.Expiration; if (activationTime != null) { dataTransferObject.availability.activationtime = portalManifest.Availability.Activation.Value; } - if (expirationTime != null) - { - dataTransferObject.availability.expirationtime = portalManifest.Availability.Expiration.Value; - } + dataTransferObject.availability.availableseconds = portalManifest.Availability.AvailableSeconds; } return dataTransferObject; diff --git a/Digipost.Signature.Api.Client.Portal/Extensions/EnumExtensions.cs b/Digipost.Signature.Api.Client.Portal/Extensions/EnumExtensions.cs index aa29571c..a5a8d88c 100755 --- a/Digipost.Signature.Api.Client.Portal/Extensions/EnumExtensions.cs +++ b/Digipost.Signature.Api.Client.Portal/Extensions/EnumExtensions.cs @@ -1,5 +1,4 @@ using System; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using Digipost.Signature.Api.Client.Portal.Enums; namespace Digipost.Signature.Api.Client.Portal.Extensions diff --git a/Digipost.Signature.Api.Client.Portal/Internal/AsicE/AsiceGenerator.cs b/Digipost.Signature.Api.Client.Portal/Internal/AsicE/AsiceGenerator.cs index e6bc99b2..c3a5aca2 100755 --- a/Digipost.Signature.Api.Client.Portal/Internal/AsicE/AsiceGenerator.cs +++ b/Digipost.Signature.Api.Client.Portal/Internal/AsicE/AsiceGenerator.cs @@ -8,11 +8,14 @@ namespace Digipost.Signature.Api.Client.Portal.Internal.AsicE { internal class AsiceGenerator { - public static DocumentBundle CreateAsice(Sender sender, Document document, IEnumerable signers, X509Certificate2 certificate) + public static DocumentBundle CreateAsice(Sender sender, Document document, IEnumerable signers, Availability availability, X509Certificate2 certificate) { - var manifest = new PortalManifest(sender, document, signers); - var signature = new SignatureGenerator(certificate, document, manifest); + var manifest = new PortalManifest(sender, document, signers) + { + Availability = availability + }; + var signature = new SignatureGenerator(certificate, document, manifest); var asiceArchive = new AsiceArchive(document, signature, manifest); return new DocumentBundle(asiceArchive.Bytes); diff --git a/Digipost.Signature.Api.Client.Portal/Internal/PortalCreateAction.cs b/Digipost.Signature.Api.Client.Portal/Internal/PortalCreateAction.cs index 9c50498f..b75308dc 100755 --- a/Digipost.Signature.Api.Client.Portal/Internal/PortalCreateAction.cs +++ b/Digipost.Signature.Api.Client.Portal/Internal/PortalCreateAction.cs @@ -1,7 +1,6 @@ using System; using Digipost.Signature.Api.Client.Core.Asice; using Digipost.Signature.Api.Client.Core.Internal; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using Digipost.Signature.Api.Client.Portal.DataTransferObjects; namespace Digipost.Signature.Api.Client.Portal.Internal diff --git a/Digipost.Signature.Api.Client.Portal/PortalClient.cs b/Digipost.Signature.Api.Client.Portal/PortalClient.cs index eaaa369e..ed38e111 100755 --- a/Digipost.Signature.Api.Client.Portal/PortalClient.cs +++ b/Digipost.Signature.Api.Client.Portal/PortalClient.cs @@ -8,7 +8,6 @@ using System.Threading.Tasks; using Digipost.Signature.Api.Client.Core; using Digipost.Signature.Api.Client.Core.Asice; -using Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code; using Digipost.Signature.Api.Client.Portal.DataTransferObjects; using Digipost.Signature.Api.Client.Portal.Exceptions; using Digipost.Signature.Api.Client.Portal.Internal; @@ -23,34 +22,33 @@ public class PortalClient : BaseClient private const string NextPermittedPollTimeHeader = "X-Next-permitted-poll-time"; private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private readonly Uri _subPath; public PortalClient(ClientConfiguration clientConfiguration) : base(clientConfiguration) { - _subPath = new Uri($"/api/{clientConfiguration.Sender.OrganizationNumber}/portal/signature-jobs", UriKind.Relative); - - Log.Debug($"Creating PortalClient, endpoint `{new Uri(clientConfiguration.Environment.Url, _subPath)}`"); } public async Task Create(PortalJob portalJob) { - var documentBundle = AsiceGenerator.CreateAsice(ClientConfiguration.Sender, portalJob.Document, portalJob.Signers, ClientConfiguration.Certificate); + var sender = CurrentSender(portalJob.Sender); + var relativeUrl = RelativeUrl(sender); + + var documentBundle = AsiceGenerator.CreateAsice(sender, portalJob.Document, portalJob.Signers, portalJob.Availability, ClientConfiguration.Certificate); var portalCreateAction = new PortalCreateAction(portalJob, documentBundle); - var portalJobResponse = await RequestHelper.Create(_subPath, portalCreateAction.Content(), PortalCreateAction.DeserializeFunc); + var portalJobResponse = await RequestHelper.Create(relativeUrl, portalCreateAction.Content(), PortalCreateAction.DeserializeFunc); Log.Debug($"Successfully created Portal Job with JobId: {portalJobResponse.JobId}."); return portalJobResponse; } - public async Task GetStatusChange() + public async Task GetStatusChange(Sender sender = null) { PortalJobStatusChangeResponse portalJobStatusChangeResponse; var request = new HttpRequestMessage { - RequestUri = _subPath, + RequestUri = RelativeUrl(CurrentSender(sender)), Method = HttpMethod.Get }; request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); @@ -84,6 +82,11 @@ public async Task GetStatusChange() return portalJobStatusChangeResponse; } + private static Uri RelativeUrl(Sender sender) + { + return new Uri($"/api/{sender.OrganizationNumber}/portal/signature-jobs", UriKind.Relative); + } + private static async Task ParseResponseToPortalJobStatusChangeResponse(string requestContent) { var deserialized = SerializeUtility.Deserialize(requestContent); diff --git a/Digipost.Signature.Api.Client.Portal/PortalJob.cs b/Digipost.Signature.Api.Client.Portal/PortalJob.cs index cbf1dd01..9622e38d 100755 --- a/Digipost.Signature.Api.Client.Portal/PortalJob.cs +++ b/Digipost.Signature.Api.Client.Portal/PortalJob.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using Digipost.Signature.Api.Client.Core; using Digipost.Signature.Api.Client.Core.Internal; @@ -7,19 +6,22 @@ namespace Digipost.Signature.Api.Client.Portal { public class PortalJob : IRequestContent { - public PortalJob(Document document, IEnumerable signers, string reference) + public PortalJob(Document document, IEnumerable signers, string reference, Sender sender = null) { Document = document; Signers = signers; Reference = reference; + Sender = sender; } - public Document Document { get; set; } + public Document Document { get; } - public string Reference { get; private set; } + public IEnumerable Signers { get; } - public IEnumerable Signers { get; private set; } + public string Reference { get; } - public DateTime DistributionTime { get; private set; } + public Sender Sender { get; } + + public Availability Availability { get; set; } } } \ No newline at end of file diff --git a/Digipost.Signature.Api.Client.Scripts/XsdToCode/Code/direct-and-portal.cs b/Digipost.Signature.Api.Client.Scripts/XsdToCode/Code/direct-and-portal.cs index 87a81747..6bf40762 100755 --- a/Digipost.Signature.Api.Client.Scripts/XsdToCode/Code/direct-and-portal.cs +++ b/Digipost.Signature.Api.Client.Scripts/XsdToCode/Code/direct-and-portal.cs @@ -10,794 +10,795 @@ using System.Xml.Serialization; -namespace Digipost.Signature.Api.Client.DataTransferObjects.XsdToCode.Code -{ // +// // This source code was auto-generated by xsd, Version=4.6.1055.0. // +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] +[System.Xml.Serialization.XmlRootAttribute(Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] +public partial class error { + + private string errorcodeField; + + private string errormessageField; + + private string errortypeField; + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] - [XmlRoot(Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] - public partial class error { - - private string errorcodeField; - - private string errormessageField; - - private string errortypeField; - - /// - [XmlElement("error-code")] - public string errorcode { - get { - return this.errorcodeField; - } - set { - this.errorcodeField = value; - } - } - - /// - [XmlElement("error-message")] - public string errormessage { - get { - return this.errormessageField; - } - set { - this.errormessageField = value; - } - } - - /// - [XmlElement("error-type")] - public string errortype { - get { - return this.errortypeField; - } - set { - this.errortypeField = value; - } + [System.Xml.Serialization.XmlElementAttribute("error-code")] + public string errorcode { + get { + return this.errorcodeField; + } + set { + this.errorcodeField = value; } } - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(Namespace="http://signering.posten.no/schema/v1")] - public partial class signature { + [System.Xml.Serialization.XmlElementAttribute("error-message")] + public string errormessage { + get { + return this.errormessageField; + } + set { + this.errormessageField = value; + } + } - private signaturestatus statusField; + /// + [System.Xml.Serialization.XmlElementAttribute("error-type")] + public string errortype { + get { + return this.errortypeField; + } + set { + this.errortypeField = value; + } + } +} + +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://signering.posten.no/schema/v1")] +public partial class signature { - private string personalidentificationnumberField; + private signaturestatus statusField; - private string xadesurlField; + private string personalidentificationnumberField; - /// - public signaturestatus status { - get { - return this.statusField; - } - set { - this.statusField = value; - } + private string xadesurlField; + + /// + public signaturestatus status { + get { + return this.statusField; + } + set { + this.statusField = value; } + } - /// - [XmlElement("personal-identification-number")] - public string personalidentificationnumber { - get { - return this.personalidentificationnumberField; - } - set { - this.personalidentificationnumberField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("personal-identification-number")] + public string personalidentificationnumber { + get { + return this.personalidentificationnumberField; + } + set { + this.personalidentificationnumberField = value; } + } - /// - [XmlElement("xades-url")] - public string xadesurl { - get { - return this.xadesurlField; - } - set { - this.xadesurlField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("xades-url")] + public string xadesurl { + get { + return this.xadesurlField; + } + set { + this.xadesurlField = value; } } +} +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Xml.Serialization.XmlTypeAttribute(TypeName="signature-status", Namespace="http://signering.posten.no/schema/v1")] +public enum signaturestatus { + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [XmlType(TypeName="signature-status", Namespace="http://signering.posten.no/schema/v1")] - public enum signaturestatus { + WAITING, - /// - WAITING, + /// + REJECTED, - /// - REJECTED, + /// + CANCELLED, - /// - CANCELLED, + /// + EXPIRED, - /// - SIGNED, - } - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(Namespace="http://signering.posten.no/schema/v1")] - public partial class signatures { + SIGNED, +} + +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://signering.posten.no/schema/v1")] +public partial class signatures { - private signature[] signatureField; + private signature[] signatureField; - private string padesurlField; + private string padesurlField; - /// - [XmlElement("signature")] - public signature[] signature { - get { - return this.signatureField; - } - set { - this.signatureField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("signature")] + public signature[] signature { + get { + return this.signatureField; } - - /// - [XmlElement("pades-url")] - public string padesurl { - get { - return this.padesurlField; - } - set { - this.padesurlField = value; - } + set { + this.signatureField = value; } } - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(Namespace="http://signering.posten.no/schema/v1")] - public partial class availability { - - private System.DateTime activationtimeField; - - private bool activationtimeFieldSpecified; - - private System.DateTime expirationtimeField; - - private bool expirationtimeFieldSpecified; - - /// - [XmlElement("activation-time")] - public System.DateTime activationtime { - get { - return this.activationtimeField; - } - set { - this.activationtimeField = value; - } - } - - /// - [XmlIgnore()] - public bool activationtimeSpecified { - get { - return this.activationtimeFieldSpecified; - } - set { - this.activationtimeFieldSpecified = value; - } - } - - /// - [XmlElement("expiration-time")] - public System.DateTime expirationtime { - get { - return this.expirationtimeField; - } - set { - this.expirationtimeField = value; - } - } - - /// - [XmlIgnore()] - public bool expirationtimeSpecified { - get { - return this.expirationtimeFieldSpecified; - } - set { - this.expirationtimeFieldSpecified = value; - } + [System.Xml.Serialization.XmlElementAttribute("pades-url")] + public string padesurl { + get { + return this.padesurlField; + } + set { + this.padesurlField = value; } } +} - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(Namespace="http://signering.posten.no/schema/v1")] - public partial class document { +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://signering.posten.no/schema/v1")] +public partial class availability { - private string titleField; + private System.DateTime activationtimeField; - private string descriptionField; + private bool activationtimeFieldSpecified; - private string hrefField; + private long availablesecondsField; - private string mimeField; + private bool availablesecondsFieldSpecified; - /// - public string title { - get { - return this.titleField; - } - set { - this.titleField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("activation-time")] + public System.DateTime activationtime { + get { + return this.activationtimeField; + } + set { + this.activationtimeField = value; } + } - /// - public string description { - get { - return this.descriptionField; - } - set { - this.descriptionField = value; - } + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool activationtimeSpecified { + get { + return this.activationtimeFieldSpecified; + } + set { + this.activationtimeFieldSpecified = value; } + } - /// - [XmlAttribute()] - public string href { - get { - return this.hrefField; - } - set { - this.hrefField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("available-seconds")] + public long availableseconds { + get { + return this.availablesecondsField; + } + set { + this.availablesecondsField = value; } + } - /// - [XmlAttribute()] - public string mime { - get { - return this.mimeField; - } - set { - this.mimeField = value; - } + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool availablesecondsSpecified { + get { + return this.availablesecondsFieldSpecified; + } + set { + this.availablesecondsFieldSpecified = value; } } +} +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://signering.posten.no/schema/v1")] +public partial class document { + + private string titleField; + + private string descriptionField; + + private string hrefField; + + private string mimeField; + + /// + public string title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(Namespace="http://signering.posten.no/schema/v1")] - public partial class sender { + public string description { + get { + return this.descriptionField; + } + set { + this.descriptionField = value; + } + } - private string organizationnumberField; + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string href { + get { + return this.hrefField; + } + set { + this.hrefField = value; + } + } - /// - [XmlElement("organization-number")] - public string organizationnumber { - get { - return this.organizationnumberField; - } - set { - this.organizationnumberField = value; - } + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string mime { + get { + return this.mimeField; + } + set { + this.mimeField = value; } } +} - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(Namespace="http://signering.posten.no/schema/v1")] - public partial class signer { +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://signering.posten.no/schema/v1")] +public partial class sender { - private string personalidentificationnumberField; + private string organizationnumberField; - /// - [XmlElement("personal-identification-number")] - public string personalidentificationnumber { - get { - return this.personalidentificationnumberField; - } - set { - this.personalidentificationnumberField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("organization-number")] + public string organizationnumber { + get { + return this.organizationnumberField; + } + set { + this.organizationnumberField = value; } } +} +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://signering.posten.no/schema/v1")] +public partial class signer { + + private string personalidentificationnumberField; + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(TypeName="exit-urls", Namespace="http://signering.posten.no/schema/v1")] - public partial class exiturls { + [System.Xml.Serialization.XmlElementAttribute("personal-identification-number")] + public string personalidentificationnumber { + get { + return this.personalidentificationnumberField; + } + set { + this.personalidentificationnumberField = value; + } + } +} + +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(TypeName="exit-urls", Namespace="http://signering.posten.no/schema/v1")] +public partial class exiturls { - private string completionurlField; + private string completionurlField; - private string cancellationurlField; + private string rejectionurlField; - private string errorurlField; + private string errorurlField; - /// - [XmlElement("completion-url")] - public string completionurl { - get { - return this.completionurlField; - } - set { - this.completionurlField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("completion-url")] + public string completionurl { + get { + return this.completionurlField; + } + set { + this.completionurlField = value; } + } - /// - [XmlElement("cancellation-url")] - public string cancellationurl { - get { - return this.cancellationurlField; - } - set { - this.cancellationurlField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("rejection-url")] + public string rejectionurl { + get { + return this.rejectionurlField; + } + set { + this.rejectionurlField = value; } + } - /// - [XmlElement("error-url")] - public string errorurl { - get { - return this.errorurlField; - } - set { - this.errorurlField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("error-url")] + public string errorurl { + get { + return this.errorurlField; + } + set { + this.errorurlField = value; } } +} - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] - [XmlRoot("direct-signature-job-request", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] - public partial class directsignaturejobrequest { +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] +[System.Xml.Serialization.XmlRootAttribute("direct-signature-job-request", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] +public partial class directsignaturejobrequest { - private string referenceField; + private string referenceField; - private exiturls exiturlsField; + private exiturls exiturlsField; - /// - public string reference { - get { - return this.referenceField; - } - set { - this.referenceField = value; - } + /// + public string reference { + get { + return this.referenceField; + } + set { + this.referenceField = value; } + } - /// - [XmlElement("exit-urls")] - public exiturls exiturls { - get { - return this.exiturlsField; - } - set { - this.exiturlsField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("exit-urls")] + public exiturls exiturls { + get { + return this.exiturlsField; + } + set { + this.exiturlsField = value; } } +} - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] - [XmlRoot("direct-signature-job-manifest", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] - public partial class directsignaturejobmanifest { +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] +[System.Xml.Serialization.XmlRootAttribute("direct-signature-job-manifest", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] +public partial class directsignaturejobmanifest { - private signer signerField; + private signer signerField; - private sender senderField; + private sender senderField; - private document documentField; + private document documentField; - /// - public signer signer { - get { - return this.signerField; - } - set { - this.signerField = value; - } + /// + public signer signer { + get { + return this.signerField; + } + set { + this.signerField = value; } + } - /// - public sender sender { - get { - return this.senderField; - } - set { - this.senderField = value; - } + /// + public sender sender { + get { + return this.senderField; + } + set { + this.senderField = value; } + } - /// - public document document { - get { - return this.documentField; - } - set { - this.documentField = value; - } + /// + public document document { + get { + return this.documentField; + } + set { + this.documentField = value; } } +} +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] +[System.Xml.Serialization.XmlRootAttribute("direct-signature-job-response", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] +public partial class directsignaturejobresponse { + + private long signaturejobidField; + + private string redirecturlField; + + private string statusurlField; + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] - [XmlRoot("direct-signature-job-response", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] - public partial class directsignaturejobresponse { - - private long signaturejobidField; - - private string redirecturlField; - - private string statusurlField; - - /// - [XmlElement("signature-job-id")] - public long signaturejobid { - get { - return this.signaturejobidField; - } - set { - this.signaturejobidField = value; - } - } - - /// - [XmlElement("redirect-url")] - public string redirecturl { - get { - return this.redirecturlField; - } - set { - this.redirecturlField = value; - } - } - - /// - [XmlElement("status-url")] - public string statusurl { - get { - return this.statusurlField; - } - set { - this.statusurlField = value; - } + [System.Xml.Serialization.XmlElementAttribute("signature-job-id")] + public long signaturejobid { + get { + return this.signaturejobidField; + } + set { + this.signaturejobidField = value; } } - + + /// + [System.Xml.Serialization.XmlElementAttribute("redirect-url")] + public string redirecturl { + get { + return this.redirecturlField; + } + set { + this.redirecturlField = value; + } + } + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] - [XmlRoot("direct-signature-job-status-response", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] - public partial class directsignaturejobstatusresponse { - - private long signaturejobidField; - - private directsignaturejobstatus statusField; - - private string confirmationurlField; - - private string xadesurlField; - - private string padesurlField; - - /// - [XmlElement("signature-job-id")] - public long signaturejobid { - get { - return this.signaturejobidField; - } - set { - this.signaturejobidField = value; - } - } - - /// - public directsignaturejobstatus status { - get { - return this.statusField; - } - set { - this.statusField = value; - } - } - - /// - [XmlElement("confirmation-url")] - public string confirmationurl { - get { - return this.confirmationurlField; - } - set { - this.confirmationurlField = value; - } - } - - /// - [XmlElement("xades-url")] - public string xadesurl { - get { - return this.xadesurlField; - } - set { - this.xadesurlField = value; - } - } - - /// - [XmlElement("pades-url")] - public string padesurl { - get { - return this.padesurlField; - } - set { - this.padesurlField = value; - } + [System.Xml.Serialization.XmlElementAttribute("status-url")] + public string statusurl { + get { + return this.statusurlField; + } + set { + this.statusurlField = value; } } +} +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] +[System.Xml.Serialization.XmlRootAttribute("direct-signature-job-status-response", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] +public partial class directsignaturejobstatusresponse { + + private long signaturejobidField; + + private directsignaturejobstatus statusField; + + private string confirmationurlField; + + private string xadesurlField; + + private string padesurlField; + + /// + [System.Xml.Serialization.XmlElementAttribute("signature-job-id")] + public long signaturejobid { + get { + return this.signaturejobidField; + } + set { + this.signaturejobidField = value; + } + } + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [XmlType(TypeName="direct-signature-job-status", Namespace="http://signering.posten.no/schema/v1")] - public enum directsignaturejobstatus { + public directsignaturejobstatus status { + get { + return this.statusField; + } + set { + this.statusField = value; + } + } - /// - CREATED, + /// + [System.Xml.Serialization.XmlElementAttribute("confirmation-url")] + public string confirmationurl { + get { + return this.confirmationurlField; + } + set { + this.confirmationurlField = value; + } + } - /// - SIGNED, + /// + [System.Xml.Serialization.XmlElementAttribute("xades-url")] + public string xadesurl { + get { + return this.xadesurlField; + } + set { + this.xadesurlField = value; + } + } - /// - CANCELLED, + /// + [System.Xml.Serialization.XmlElementAttribute("pades-url")] + public string padesurl { + get { + return this.padesurlField; + } + set { + this.padesurlField = value; + } } +} +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Xml.Serialization.XmlTypeAttribute(TypeName="direct-signature-job-status", Namespace="http://signering.posten.no/schema/v1")] +public enum directsignaturejobstatus { + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] - [XmlRoot("portal-signature-job-request", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] - public partial class portalsignaturejobrequest { + SIGNED, - private string referenceField; + /// + REJECTED, + + /// + FAILED, +} + +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] +[System.Xml.Serialization.XmlRootAttribute("portal-signature-job-request", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] +public partial class portalsignaturejobrequest { + + private string referenceField; - /// - public string reference { - get { - return this.referenceField; - } - set { - this.referenceField = value; - } + /// + public string reference { + get { + return this.referenceField; + } + set { + this.referenceField = value; } } +} - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] - [XmlRoot("portal-signature-job-manifest", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] - public partial class portalsignaturejobmanifest { +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] +[System.Xml.Serialization.XmlRootAttribute("portal-signature-job-manifest", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] +public partial class portalsignaturejobmanifest { - private signer[] signersField; + private signer[] signersField; - private sender senderField; + private sender senderField; - private document documentField; + private document documentField; - private availability availabilityField; + private availability availabilityField; - /// - [XmlArrayItem(IsNullable=false)] - public signer[] signers { - get { - return this.signersField; - } - set { - this.signersField = value; - } + /// + [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)] + public signer[] signers { + get { + return this.signersField; } + set { + this.signersField = value; + } + } - /// - public sender sender { - get { - return this.senderField; - } - set { - this.senderField = value; - } + /// + public sender sender { + get { + return this.senderField; } + set { + this.senderField = value; + } + } - /// - public document document { - get { - return this.documentField; - } - set { - this.documentField = value; - } + /// + public document document { + get { + return this.documentField; } + set { + this.documentField = value; + } + } - /// - public availability availability { - get { - return this.availabilityField; - } - set { - this.availabilityField = value; - } + /// + public availability availability { + get { + return this.availabilityField; + } + set { + this.availabilityField = value; } } +} - /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] - [XmlRoot("portal-signature-job-response", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] - public partial class portalsignaturejobresponse { +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] +[System.Xml.Serialization.XmlRootAttribute("portal-signature-job-response", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] +public partial class portalsignaturejobresponse { - private long signaturejobidField; + private long signaturejobidField; - private string cancellationurlField; + private string cancellationurlField; - /// - [XmlElement("signature-job-id")] - public long signaturejobid { - get { - return this.signaturejobidField; - } - set { - this.signaturejobidField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("signature-job-id")] + public long signaturejobid { + get { + return this.signaturejobidField; } + set { + this.signaturejobidField = value; + } + } - /// - [XmlElement("cancellation-url")] - public string cancellationurl { - get { - return this.cancellationurlField; - } - set { - this.cancellationurlField = value; - } + /// + [System.Xml.Serialization.XmlElementAttribute("cancellation-url")] + public string cancellationurl { + get { + return this.cancellationurlField; + } + set { + this.cancellationurlField = value; } } +} +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Diagnostics.DebuggerStepThroughAttribute()] +[System.ComponentModel.DesignerCategoryAttribute("code")] +[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] +[System.Xml.Serialization.XmlRootAttribute("portal-signature-job-status-change-response", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] +public partial class portalsignaturejobstatuschangeresponse { + + private long signaturejobidField; + + private portalsignaturejobstatus statusField; + + private string confirmationurlField; + + private string cancellationurlField; + + private signatures signaturesField; + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - [XmlType(AnonymousType=true, Namespace="http://signering.posten.no/schema/v1")] - [XmlRoot("portal-signature-job-status-change-response", Namespace="http://signering.posten.no/schema/v1", IsNullable=false)] - public partial class portalsignaturejobstatuschangeresponse { - - private long signaturejobidField; - - private portalsignaturejobstatus statusField; - - private string confirmationurlField; - - private string cancellationurlField; - - private signatures signaturesField; - - /// - [XmlElement("signature-job-id")] - public long signaturejobid { - get { - return this.signaturejobidField; - } - set { - this.signaturejobidField = value; - } - } - - /// - public portalsignaturejobstatus status { - get { - return this.statusField; - } - set { - this.statusField = value; - } - } - - /// - [XmlElement("confirmation-url")] - public string confirmationurl { - get { - return this.confirmationurlField; - } - set { - this.confirmationurlField = value; - } - } - - /// - [XmlElement("cancellation-url")] - public string cancellationurl { - get { - return this.cancellationurlField; - } - set { - this.cancellationurlField = value; - } - } - - /// - public signatures signatures { - get { - return this.signaturesField; - } - set { - this.signaturesField = value; - } + [System.Xml.Serialization.XmlElementAttribute("signature-job-id")] + public long signaturejobid { + get { + return this.signaturejobidField; + } + set { + this.signaturejobidField = value; } } - + + /// + public portalsignaturejobstatus status { + get { + return this.statusField; + } + set { + this.statusField = value; + } + } + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] - [System.SerializableAttribute()] - [XmlType(TypeName="portal-signature-job-status", Namespace="http://signering.posten.no/schema/v1")] - public enum portalsignaturejobstatus { + [System.Xml.Serialization.XmlElementAttribute("confirmation-url")] + public string confirmationurl { + get { + return this.confirmationurlField; + } + set { + this.confirmationurlField = value; + } + } - /// - PARTIALLY_COMPLETED, + /// + [System.Xml.Serialization.XmlElementAttribute("cancellation-url")] + public string cancellationurl { + get { + return this.cancellationurlField; + } + set { + this.cancellationurlField = value; + } + } - /// - COMPLETED, + /// + public signatures signatures { + get { + return this.signaturesField; + } + set { + this.signaturesField = value; + } } -} \ No newline at end of file +} + +/// +[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] +[System.SerializableAttribute()] +[System.Xml.Serialization.XmlTypeAttribute(TypeName="portal-signature-job-status", Namespace="http://signering.posten.no/schema/v1")] +public enum portalsignaturejobstatus { + + /// + PARTIALLY_COMPLETED, + + /// + COMPLETED, +} diff --git a/Digipost.Signature.Api.Client.Scripts/XsdToCode/Xsd/common.xsd b/Digipost.Signature.Api.Client.Scripts/XsdToCode/Xsd/common.xsd index e572dab1..2b3df9b3 100755 --- a/Digipost.Signature.Api.Client.Scripts/XsdToCode/Xsd/common.xsd +++ b/Digipost.Signature.Api.Client.Scripts/XsdToCode/Xsd/common.xsd @@ -1,5 +1,4 @@ - - +