Skip to content
This repository has been archived by the owner on Jan 14, 2025. It is now read-only.

Commit

Permalink
Upgrade the client to support sending datatypes metadata as raw xml s…
Browse files Browse the repository at this point in the history
…trings with Documents.
  • Loading branch information
AaronArrick committed Nov 29, 2019
1 parent ea09f80 commit fa23d18
Show file tree
Hide file tree
Showing 42 changed files with 2,359 additions and 173 deletions.
33 changes: 33 additions & 0 deletions Difi.SikkerDigitalPost.Klient.Docs/SendEksempler.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
using System;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using Difi.SikkerDigitalPost.Klient.Api;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Aktører;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.FysiskPost;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Interface;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Kvitteringer;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Kvitteringer.Forretning;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Kvitteringer.Transport;
Expand Down Expand Up @@ -96,6 +98,37 @@ public void OpprettForsendelse()
PostInfo postInfo = null; //Som initiert tidligere
var forsendelse = new Forsendelse(avsender, postInfo, dokumentpakke);
}

public void OpprettForsendelseMedUtvidelse()
{
var hoveddokument = new Dokument(
tittel: "Dokumenttittel",
dokumentsti: "/Dokumenter/Hoveddokument.pdf",
mimeType: "application/pdf",
språkkode: "NO",
filnavn: "filnavn"
);

var dokumentpakke = new Dokumentpakke(hoveddokument);

var vedleggssti = "/Dokumenter/Vedlegg.pdf";
var vedlegg = new Dokument(
tittel: "tittel",
dokumentsti: vedleggssti,
mimeType: "application/pdf",
språkkode: "NO",
filnavn: "filnavn");

dokumentpakke.LeggTilVedlegg(vedlegg);

var raw = "<?xml version=\"1.0\" encoding=\"utf-8\"?><lenke xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://begrep.difi.no/sdp/utvidelser/lenke\"><url>https://www.test.no</url><beskrivelse lang=\"nb\">This was raw string</beskrivelse></lenke>";

MetadataDocument metadataDocument = new MetadataDocument("lenke.xml", "application/vnd.difi.dpi.lenke", raw);

Avsender avsender = null; //Som initiert tidligere
PostInfo postInfo = null; //Som initiert tidligere
var forsendelse = new Forsendelse(avsender, postInfo, dokumentpakke) { MetadataDocument = metadataDocument };
}

public void OpprettKlientOgSendPost()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,25 +36,19 @@
<DocumentationFile>bin\Release\Difi.SikkerDigitalPost.Klient.Domene.XML</DocumentationFile>
</PropertyGroup>



<ItemGroup>
<Compile Include="..\SolutionItems\SharedAssemblyInfo.cs">
<Link>Properties\SharedAssemblyInfo.cs</Link>
</Compile>
</ItemGroup>



<ItemGroup>
<PackageReference Include="BouncyCastle" Version="1.8.5" />
<PackageReference Include="Difi.Felles.Utility" Version="3.0.2" />
<PackageReference Include="Digipost.Api.Client.Shared" Version="5.0.0" />
<PackageReference Include="System.Security.Cryptography.Xml" Version="4.5.0" />
</ItemGroup>




<ItemGroup>
<Reference Include="Digipost.Api.Client.Shared, Version=3.0.0.0, Culture=neutral, PublicKeyToken=13a04c7692843c1c">
<HintPath>..\..\..\.nuget\packages\api-client-shared\3.0.0\lib\net46\Digipost.Api.Client.Shared.dll</HintPath>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Interface
{
internal interface IAsiceAttachable
public interface IAsiceAttachable
{
string Filnavn { get; }

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System.Text;

namespace Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Interface
{
public class MetadataDocument : IAsiceAttachable
{
public string Filnavn { get; }
public byte[] Bytes { get; }
public string MimeType { get; }
public string Id { get; }

public MetadataDocument(string filnavn, string mimeType, string xml)
{
Filnavn = filnavn;
MimeType = mimeType;
Bytes = Encoding.UTF8.GetBytes(xml);
Id = "Id_3";
}
}
}
13 changes: 8 additions & 5 deletions Difi.SikkerDigitalPost.Klient.Domene/Entiteter/Post/Dokument.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ public class Dokument : IAsiceAttachable
/// </param>
/// <param name="språkkode">Språkkode for dokumentet. Om ikke satt, brukes <see cref="Forsendelse" /> sitt språk.</param>
/// <param name="filnavn">Filnavnet til dokumentet.</param>
public Dokument(string tittel, string dokumentsti, string mimeType, string språkkode = null, string filnavn = null)
: this(tittel, File.ReadAllBytes(dokumentsti), mimeType, språkkode, filnavn ?? Path.GetFileName(dokumentsti))
public Dokument(string tittel, string dokumentsti, string mimeType, string språkkode = null, string filnavn = null, string dataType = null)
: this(tittel, File.ReadAllBytes(dokumentsti), mimeType, språkkode, filnavn ?? Path.GetFileName(dokumentsti), dataType)
{
}

Expand All @@ -30,8 +30,8 @@ public Dokument(string tittel, string dokumentsti, string mimeType, string språ
/// </param>
/// <param name="språkkode">Språkkode for dokumentet. Om ikke satt, brukes <see cref="Forsendelse" /> sitt språk.</param>
/// <param name="filnavn">Filnavnet til dokumentet.</param>
public Dokument(string tittel, Stream dokumentstrøm, string mimeType, string språkkode = null, string filnavn = null)
: this(tittel, File.ReadAllBytes(new StreamReader(dokumentstrøm).ReadToEnd()), mimeType, språkkode, filnavn)
public Dokument(string tittel, Stream dokumentstrøm, string mimeType, string språkkode = null, string filnavn = null, string dataType = null)
: this(tittel, File.ReadAllBytes(new StreamReader(dokumentstrøm).ReadToEnd()), mimeType, språkkode, filnavn, dataType)
{
}

Expand All @@ -43,7 +43,7 @@ public Dokument(string tittel, Stream dokumentstrøm, string mimeType, string sp
/// </param>
/// <param name="språkkode">Språkkode for dokumentet. Om ikke satt, brukes <see cref="Forsendelse" /> sitt språk.</param>
/// <param name="filnavn">Filnavnet til dokumentet.</param>
public Dokument(string tittel, byte[] dokumentbytes, string mimeType, string språkkode = null, string filnavn = null)
public Dokument(string tittel, byte[] dokumentbytes, string mimeType, string språkkode = null, string filnavn = null, string dataType = null)
{
filnavn = filnavn ?? Path.GetRandomFileName();
var vasketFilnavn = filnavn.RemoveIllegalCharacters();
Expand All @@ -54,6 +54,7 @@ public Dokument(string tittel, byte[] dokumentbytes, string mimeType, string spr
Filnavn = UrlEncode(filnavn.RemoveIllegalCharacters());
FilnavnRådata = vasketFilnavn;
Språkkode = språkkode;
DataType = dataType;
}

public string Tittel { get; private set; }
Expand All @@ -69,6 +70,8 @@ public Dokument(string tittel, byte[] dokumentbytes, string mimeType, string spr
public string MimeType { get; }

public string Id { get; set; }

public string DataType { get; set; }

private string UrlEncode(string raw)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ namespace Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Post
{
public class Dokumentpakke
{
internal static readonly int VEDLEGG_START_ID = 4;

private readonly List<Dokument> _vedlegg;

/// <param name="hoveddokument">Dokumentpakkens hoveddokument</param>
Expand Down Expand Up @@ -57,7 +59,7 @@ public void LeggTilVedlegg(IEnumerable<Dokument> dokumenter)
throw new KonfigurasjonsException(
$"Dokumentet {dokument.Filnavn} som du prøver å legge til som vedlegg er tomt. Det er ikke tillatt å sende tomme dokumenter.");

dokument.Id = $"Id_{i + 3 + startId}";
dokument.Id = $"Id_{i + VEDLEGG_START_ID + startId}";
_vedlegg.Add(dokument);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Linq;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Aktører;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Interface;
using Difi.SikkerDigitalPost.Klient.Domene.Enums;

namespace Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Post
Expand Down Expand Up @@ -104,6 +105,8 @@ public Forsendelse(Avsender avsender, PostInfo postInfo, Dokumentpakke dokumentp
/// </summary>
public string MpcId { get; set; }

public MetadataDocument MetadataDocument { get; set; }

/// <summary>
/// Returnerer en ferdig formattert mpc-Forretningskvittering.
/// </summary>
Expand Down
2 changes: 1 addition & 1 deletion Difi.SikkerDigitalPost.Klient.Tester/DokumentpakkeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public void LeggTilVedleggOgSjekkIdNummer()
for (var i = 0; i < dokumentpakke.Vedlegg.Count; i++)
{
var vedlegg = dokumentpakke.Vedlegg[i];
Assert.Equal(vedlegg.Id, "Id_" + (i + 3));
Assert.Equal(vedlegg.Id, "Id_" + (i + Dokumentpakke.VEDLEGG_START_ID));
}
}
}
Expand Down
12 changes: 12 additions & 0 deletions Difi.SikkerDigitalPost.Klient.Tester/SmokeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,18 @@ public void Send_digital_with_multiple_documents()
.Expect_Receipt_To_Be(typeof(Leveringskvittering))
.ConfirmReceipt();
}

[Fact]
public void Send_digital_with_Datatype()
{
_t
.Create_Digital_Forsendelse_with_Datatype()
.Send()
.Expect_Message_Response_To_Be_TransportOkKvittering()
.Fetch_Receipt()
.Expect_Receipt_To_Be(typeof(Leveringskvittering))
.ConfirmReceipt();
}

[Fact]
public void Send_physical()
Expand Down
16 changes: 16 additions & 0 deletions Difi.SikkerDigitalPost.Klient.Tester/SmokeTestsHelper.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
using System;
using System.Text;
using System.Threading;
using Difi.SikkerDigitalPost.Klient.Api;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Aktører;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Interface;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Kvitteringer;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Kvitteringer.Forretning;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Kvitteringer.Transport;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Post;
using Difi.SikkerDigitalPost.Klient.Internal.AsicE;
using Difi.SikkerDigitalPost.Klient.Tester.Utilities;
using Difi.SikkerDigitalPost.Klient.Utilities;
using Difi.SikkerDigitalPost.Klient.XmlValidering;
Expand Down Expand Up @@ -43,6 +46,19 @@ public SmokeTestsHelper(Miljø miljø, bool loggHttp = false, bool brukProxy = f
_klient = new SikkerDigitalPostKlient(new Databehandler(DomainUtility.Organisasjonsnummer(), DomainUtility.GetAvsenderCertificate()), config, serviceProvider.GetService<ILoggerFactory>());
}

public SmokeTestsHelper Create_Digital_Forsendelse_with_Datatype()
{
_forsendelse = DomainUtility.GetForsendelseSimple();

var raw = "<?xml version=\"1.0\" encoding=\"utf-8\"?><lenke xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://begrep.difi.no/sdp/utvidelser/lenke\"><url>https://www.test.no</url><beskrivelse lang=\"nb\">Dette er en lenke utvidelse</beskrivelse></lenke>";

MetadataDocument metadataDocument = new MetadataDocument("lenke.xml", "application/vnd.difi.dpi.lenke+xml", raw);

_forsendelse.MetadataDocument = metadataDocument;

return this;
}

public SmokeTestsHelper Create_Digital_Forsendelse_with_multiple_documents()
{
_forsendelse = DomainUtility.GetDigitalDigitalPostWithNotificationMultipleDocumentsAndHigherSecurity(3);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,11 @@ internal static Forsendelse GetForsendelseSimple()
{
return new Forsendelse(GetAvsender(), GetDigitalPostInfoSimple(), GetDokumentpakkeWithoutAttachments(), Prioritet.Normal, Guid.NewGuid().ToString());
}

internal static Forsendelse GetForsendelseWithDataType()
{
return new Forsendelse(GetAvsender(), GetDigitalPostInfoSimple(), GetDokumentpakkeWithoutAttachments(), Prioritet.Normal, Guid.NewGuid().ToString());
}

internal static Forsendelse GetForsendelseWithTestCertificate()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public override XmlNode Xml()
{
digitalPostElement.AppendChild(FysiskPostInfoElement());
}

digitalPostElement.AppendChild(DokumentpakkeFingeravtrykkElement());
}
return digitalPostElement;
Expand Down
21 changes: 17 additions & 4 deletions Difi.SikkerDigitalPost.Klient/Internal/AsicE/AsiceGenerator.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Xml;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Interface;
using Difi.SikkerDigitalPost.Klient.Domene.Entiteter.Post;
Expand All @@ -17,15 +18,27 @@ internal static DocumentBundle Create(Forsendelse forsendelse, GuidUtility guidU
var manifest = new Manifest(forsendelse);
ValidateXmlAndThrowIfInvalid(manifest.Xml(), "Manifest");

var signature = new Signature(forsendelse, manifest, senderCertificate);
ValidateXmlAndThrowIfInvalid(signature.Xml(), "Signatur");

var asiceAttachables = new List<IAsiceAttachable>();
asiceAttachables.AddRange(forsendelse.Dokumentpakke.Vedlegg);
asiceAttachables.Add(forsendelse.Dokumentpakke.Hoveddokument);
asiceAttachables.Add(manifest);
asiceAttachables.Add(signature);

if (forsendelse.MetadataDocument != null)
{
var signature = new Signature(forsendelse, manifest, senderCertificate, forsendelse.MetadataDocument);
ValidateXmlAndThrowIfInvalid(signature.Xml(), "Signatur");

asiceAttachables.Add(forsendelse.MetadataDocument);
asiceAttachables.Add(signature);
}
else
{
var signature = new Signature(forsendelse, manifest, senderCertificate);
ValidateXmlAndThrowIfInvalid(signature.Xml(), "Signatur");

asiceAttachables.Add(signature);
}

var asiceAttachableProcessors = ConvertDocumentBundleProcessorsToAsiceAttachableProcessors(forsendelse, asiceConfiguration);

var asiceArchive = new AsiceArchive(forsendelse.PostInfo.Mottaker.Sertifikat, guidUtility, asiceAttachableProcessors, asiceAttachables.ToArray());
Expand Down
8 changes: 8 additions & 0 deletions Difi.SikkerDigitalPost.Klient/Internal/AsicE/Manifest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,14 @@ private XmlElement DokumentNode(Dokument dokument, string elementnavn, string in
tittel.SetAttribute("lang", dokument.Språkkode ?? Forsendelse.Språkkode);
tittel.InnerText = innholdstekst;
}

if (Forsendelse.MetadataDocument != null)
{
var data = dokumentXml.AppendChildElement("data", NavneromUtility.DifiSdpSchema10, _manifestXml);
data.SetAttribute("href", Forsendelse.MetadataDocument.Filnavn);
data.SetAttribute("mime", Forsendelse.MetadataDocument.MimeType);
}

return dokumentXml;
}
}
Expand Down
14 changes: 11 additions & 3 deletions Difi.SikkerDigitalPost.Klient/Internal/AsicE/Signature.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,16 @@ internal class Signature : IAsiceAttachable
{
private readonly Forsendelse _forsendelse;
private readonly Manifest _manifest;
private readonly MetadataDocument _metadataDocument;
private readonly X509Certificate2 _sertifikat;
private XmlDocument _xml;

public Signature(Forsendelse forsendelse, Manifest manifest, X509Certificate2 sertifikat)
public Signature(Forsendelse forsendelse, Manifest manifest, X509Certificate2 sertifikat, MetadataDocument metadataDocument = null)
{
_forsendelse = forsendelse;
_manifest = manifest;
_sertifikat = sertifikat;
_metadataDocument = metadataDocument;
}

public string Filnavn => "META-INF/signatures.xml";
Expand All @@ -51,7 +53,7 @@ public XmlDocument Xml()
var signaturnode = Signaturnode();

var referanser = Referanser(_forsendelse.Dokumentpakke.Hoveddokument,
_forsendelse.Dokumentpakke.Vedlegg, _manifest);
_forsendelse.Dokumentpakke.Vedlegg, _manifest, _metadataDocument);
OpprettReferanser(signaturnode, referanser);

var keyInfoX509Data = new KeyInfoX509Data(_sertifikat, X509IncludeOption.EndCertOnly);
Expand Down Expand Up @@ -94,11 +96,17 @@ private void OpprettReferanser(SignedXml signaturnode, IEnumerable<IAsiceAttacha
signaturnode.AddReference(SignedPropertiesReferanse());
}

private static IEnumerable<IAsiceAttachable> Referanser(Dokument hoveddokument, IEnumerable<IAsiceAttachable> vedlegg, Manifest manifest)
private static IEnumerable<IAsiceAttachable> Referanser(Dokument hoveddokument, IEnumerable<IAsiceAttachable> vedlegg, Manifest manifest, MetadataDocument metadataDocument = null)
{
var referanser = new List<IAsiceAttachable> {hoveddokument};
referanser.AddRange(vedlegg);
referanser.Add(manifest);

if (metadataDocument != null)
{
referanser.Add(metadataDocument);
}

return referanser;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace Difi.SikkerDigitalPost.Klient.XmlValidering
internal class SdpXmlValidator : XmlValidator
{
private static readonly ResourceUtility ResourceUtility = new ResourceUtility(Assembly.GetExecutingAssembly(), "XmlValidering.xsd");

private SdpXmlValidator()
{
AddXsd(NavneromUtility.SoapEnvelopeEnv12, GetResource("w3", "soap-envelope.xsd"));
Expand Down
Loading

0 comments on commit fa23d18

Please sign in to comment.