├── IsoBridge.Tests ├── Usings.cs ├── TestServerFixture.cs ├── AuditRepositoryTests.cs ├── Iso8583ParserTests.cs ├── IsoBridge.Tests.csproj ├── AuditVerifierTests.cs ├── IsoBridge.IntegrationTests.cs └── AuditTamperTests.cs ├── IsoBridge.Web ├── Views │ ├── _ViewStart.cshtml │ ├── _ViewImports.cshtml │ ├── Home │ │ ├── Privacy.cshtml │ │ └── Index.cshtml │ ├── Shared │ │ ├── _ValidationScriptsPartial.cshtml │ │ ├── Error.cshtml │ │ ├── _Layout.cshtml.css │ │ └── _Layout.cshtml │ ├── IsoPreview │ │ └── Index.cshtml │ ├── AdminForward │ │ └── Index.cshtml │ └── AdminAudit │ │ └── Index.cshtml ├── audit.db ├── wwwroot │ ├── favicon.ico │ ├── js │ │ ├── site.js │ │ └── iso-preview.js │ ├── css │ │ ├── site.css │ │ └── output.css │ └── lib │ │ ├── jquery-validation-unobtrusive │ │ ├── LICENSE.txt │ │ ├── jquery.validate.unobtrusive.min.js │ │ └── jquery.validate.unobtrusive.js │ │ ├── jquery-validation │ │ └── LICENSE.md │ │ ├── bootstrap │ │ └── LICENSE │ │ └── jquery │ │ └── LICENSE.txt ├── postcss.config.js ├── Models │ ├── ErrorViewModel.cs │ ├── BuildIsoRequest.cs │ ├── ParseIsoRequest.cs │ ├── IsoResponse.cs │ └── ForwardIsoRequest.cs ├── package.json ├── tailwind.config.js ├── .github │ └── workflows │ │ └── ci.yml ├── Properties │ └── launchSettings.json ├── Controllers │ ├── HomeController.cs │ ├── AdminForwardController.cs │ ├── IsoPreviewController.cs │ ├── AdminAuditController.cs │ ├── SoapController.cs │ └── IsoController.cs ├── appsettings.json ├── Dockerfile ├── appsettings.Development.json ├── IsoBridge.Web.csproj ├── Program.cs └── Services │ ├── AuditLoggingService.cs │ └── ForwardingService.cs ├── IsoBridge.Core ├── Class1.cs ├── DI │ └── CoreMarker.cs ├── IsoBridge.Core.csproj ├── Models │ ├── IsoMessage.cs │ ├── ParseResult.cs │ └── Soap │ │ ├── PaymentAuthResponse.cs │ │ └── PaymentAuthRequest.cs ├── Audit │ ├── AuditSecurityOptions.cs │ ├── IAuditHasher.cs │ ├── AuditContracts.cs │ └── AuditEntry.cs └── ISO │ └── IsoParserAbstraction.cs ├── IsoBridge.Adapters ├── Class1.cs ├── Forwarding │ ├── IForwarder.cs │ ├── ForwardingOptions.cs │ ├── ForwarderRouter.cs │ ├── RestForwarder.cs │ └── SoapForwarder.cs ├── IsoBridge.Adapters.csproj └── ServiceCollectionExtensions.cs ├── docs └── screenshots │ ├── admin-ui.png │ ├── audit-log.png │ ├── iso-forward.png │ ├── iso-preview.png │ ├── swagger-ui.png │ ├── admin-ui-head.png │ ├── iso-forward-head.png │ └── iso-preview-head.png ├── IsoBridge.ISO8583 ├── Iso8583Options.cs ├── ServiceCollectionExtensions.cs ├── Templates │ └── Iso8583Template.cs ├── IsoBridge.ISO8583.csproj ├── TemplateLoader.cs ├── BitmapUtils.cs ├── FieldCodec.cs ├── DefaultIsoParser.cs └── Config │ └── iso8583-templates.json ├── docker-compose.yml ├── .gitignore ├── LICENSE ├── IsoBridge.Infrastructure ├── IsoBridge.Infrastructure.csproj ├── Audit │ ├── AuditDbContext.cs │ ├── AuditServices.cs │ ├── AuditRepository.cs │ └── AuditVerifier.cs └── Migrations │ ├── 20251108225418_InitAudit.cs │ ├── AuditDbContextModelSnapshot.cs │ └── 20251108225418_InitAudit.Designer.cs ├── IsoBridge.sln └── README.md /IsoBridge.Tests/Usings.cs: -------------------------------------------------------------------------------- 1 | global using Xunit; -------------------------------------------------------------------------------- /IsoBridge.Web/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /IsoBridge.Core/Class1.cs: -------------------------------------------------------------------------------- 1 | namespace IsoBridge.Core; 2 | public class Class1 3 | { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /IsoBridge.Web/audit.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabyslaw/IsoBridge/HEAD/IsoBridge.Web/audit.db -------------------------------------------------------------------------------- /IsoBridge.Adapters/Class1.cs: -------------------------------------------------------------------------------- 1 | namespace IsoBridge.Adapters; 2 | public class Class1 3 | { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /docs/screenshots/admin-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabyslaw/IsoBridge/HEAD/docs/screenshots/admin-ui.png -------------------------------------------------------------------------------- /docs/screenshots/audit-log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabyslaw/IsoBridge/HEAD/docs/screenshots/audit-log.png -------------------------------------------------------------------------------- /docs/screenshots/iso-forward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabyslaw/IsoBridge/HEAD/docs/screenshots/iso-forward.png -------------------------------------------------------------------------------- /docs/screenshots/iso-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabyslaw/IsoBridge/HEAD/docs/screenshots/iso-preview.png -------------------------------------------------------------------------------- /docs/screenshots/swagger-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabyslaw/IsoBridge/HEAD/docs/screenshots/swagger-ui.png -------------------------------------------------------------------------------- /IsoBridge.Web/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabyslaw/IsoBridge/HEAD/IsoBridge.Web/wwwroot/favicon.ico -------------------------------------------------------------------------------- /docs/screenshots/admin-ui-head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabyslaw/IsoBridge/HEAD/docs/screenshots/admin-ui-head.png -------------------------------------------------------------------------------- /docs/screenshots/iso-forward-head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabyslaw/IsoBridge/HEAD/docs/screenshots/iso-forward-head.png -------------------------------------------------------------------------------- /docs/screenshots/iso-preview-head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabyslaw/IsoBridge/HEAD/docs/screenshots/iso-preview-head.png -------------------------------------------------------------------------------- /IsoBridge.Web/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /IsoBridge.Web/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using IsoBridge.Web 2 | @using IsoBridge.Web.Models 3 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 4 | -------------------------------------------------------------------------------- /IsoBridge.Web/Views/Home/Privacy.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewData["Title"] = "Privacy Policy"; 3 | } 4 |
Use this page to detail your site's privacy policy.
7 | -------------------------------------------------------------------------------- /IsoBridge.Core/DI/CoreMarker.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace IsoBridge.Core.DI 7 | { 8 | public sealed class CoreMarker { } 9 | } -------------------------------------------------------------------------------- /IsoBridge.Web/Views/Shared/_ValidationScriptsPartial.cshtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /IsoBridge.Web/Models/ErrorViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace IsoBridge.Web.Models; 2 | 3 | public class ErrorViewModel 4 | { 5 | public string? RequestId { get; set; } 6 | 7 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 8 | } 9 | -------------------------------------------------------------------------------- /IsoBridge.Web/wwwroot/js/site.js: -------------------------------------------------------------------------------- 1 | // Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification 2 | // for details on configuring this project to bundle and minify static web assets. 3 | 4 | // Write your JavaScript code. 5 | -------------------------------------------------------------------------------- /IsoBridge.Core/IsoBridge.Core.csproj: -------------------------------------------------------------------------------- 1 |Learn about building Web apps with ASP.NET Core.
8 |
12 | Request ID: @Model.RequestId
13 |
18 | Swapping to Development environment will display more detailed information about the error that occurred. 19 |
20 |21 | The Development environment shouldn't be enabled for deployed applications. 22 | It can result in displaying sensitive information from exceptions to end users. 23 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development 24 | and restarting the app. 25 |
26 | -------------------------------------------------------------------------------- /IsoBridge.Adapters/Forwarding/ForwardingOptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace IsoBridge.Adapters.Forwarding 7 | { 8 | public sealed class ForwardingOptions 9 | { 10 | public Dictionary${content}`;
32 | };
33 |
34 |
35 | buildForm?.addEventListener("submit", async (e) => {
36 | e.preventDefault();
37 | const formData = new FormData(buildForm);
38 | const payload = {
39 | mti: formData.get("mti"),
40 | fields: JSON.parse(formData.get("fields") || "{}")
41 | };
42 |
43 | try {
44 | const res = await fetch("/api/iso/build", {
45 | method: "POST",
46 | headers: { "Content-Type": "application/json" },
47 | body: JSON.stringify(payload)
48 | });
49 |
50 | const text = await res.text();
51 | showResult(buildResult, text, !res.ok);
52 | } catch (err) {
53 | showResult(buildResult, `Error: ${err.message}`, true);
54 | }
55 |
56 | refreshMetrics();
57 | setInterval(refreshMetrics, 10000);
58 | });
59 |
60 | parseForm?.addEventListener("submit", async (e) => {
61 | e.preventDefault();
62 | const formData = new FormData(parseForm);
63 | const payload = {
64 | payload: formData.get("payload"),
65 | encoding: formData.get("encoding")
66 | };
67 |
68 | try {
69 | const res = await fetch("/api/iso/parse", {
70 | method: "POST",
71 | headers: { "Content-Type": "application/json" },
72 | body: JSON.stringify(payload)
73 | });
74 |
75 | const json = await res.json();
76 | showResult(parseResult, JSON.stringify(json, null, 2), !res.ok);
77 | } catch (err) {
78 | showResult(parseResult, `Error: ${err.message}`, true);
79 | }
80 |
81 | refreshMetrics();
82 | setInterval(refreshMetrics, 10000);
83 | });
84 |
85 | // Initial metrics + periodic refresh
86 | refreshMetrics();
87 | setInterval(refreshMetrics, 10000);
88 | });
89 |
--------------------------------------------------------------------------------
/IsoBridge.ISO8583/DefaultIsoParser.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using IsoBridge.Core.ISO;
7 | using IsoBridge.Core.Models;
8 | using Microsoft.Extensions.Options;
9 |
10 | namespace IsoBridge.ISO8583
11 | {
12 | public sealed class DefaultIsoParser : IIsoParser
13 | {
14 | private readonly Iso8583Options _options;
15 | private readonly TemplateLoader _templates;
16 | private readonly IFieldCodec _codec;
17 |
18 | public DefaultIsoParser(IOptionsSuccessful build requests
47 |Successful parse requests
52 |Failed operations logged
57 |Recent ISO activity
62 |Use this tool to send ISO messages to a configured upstream (REST/SOAP).
42 | 43 |All audit records
93 |Last write origin
111 |HMAC + hash chain
128 |Page render time
146 |Latest append-only audit records
165 || Timestamp (UTC) | 176 |Actor | 177 |Service | 178 |Hash | 179 |HMAC | 180 |PrevHash | 181 |
|---|---|---|---|---|---|
| No audit entries yet. | 188 ||||||
| @e.TimestampUtc.ToString("dd MMM yyyy HH:mm:ss") | 196 |@e.Actor | 197 |@e.Service | 198 |@e.Hash | 199 |@e.HmacSignature | 200 |@e.PrevHash | 201 |