<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
  <title>Korrali Blog</title>
  <link>https://korrali.com/blog/</link>
  <description>Engineering write-ups from Ashish Bhagat: building the identity and SSO platform for Oman's National Port Community System, solo, backend to frontend.</description>
  <language>en-us</language>
  <lastBuildDate>Thu, 13 Aug 2026 00:00:00 GMT</lastBuildDate>
  <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="https://korrali.com/feed.xml" rel="self" type="application/rss+xml" />

  <item>
    <title>AVA not a sequence: a Java 17 SAML cert bug</title>
    <link>https://korrali.com/blog/ava-not-a-sequence/</link>
    <guid>https://korrali.com/blog/ava-not-a-sequence/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>Java 17's stricter X.509 parser rejected a government IdP's SAML certificate with 'AVA not a sequence.' The fix: parse it with BouncyCastle instead.</description>
  </item>
  <item>
    <title>Hot-reloading a SAML signing certificate in prod</title>
    <link>https://korrali.com/blog/hot-reload-saml-signing-certificate/</link>
    <guid>https://korrali.com/blog/hot-reload-saml-signing-certificate/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>A cached SAML signing certificate breaks the moment an IdP rotates it. How I made ours hot-reloadable with automatic on-failure refresh instead of an outage.</description>
  </item>
  <item>
    <title>Bank Muscat Error 10001: a GET that ate a POST</title>
    <link>https://korrali.com/blog/bank-muscat-error-10001/</link>
    <guid>https://korrali.com/blog/bank-muscat-error-10001/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>A browser GET to Bank Muscat's payment endpoint silently dropped the encrypted POST body. The fix: a backend-rendered auto-submit form instead of a redirect.</description>
  </item>
  <item>
    <title>Three clocks racing: a payment reconciliation bug</title>
    <link>https://korrali.com/blog/three-clocks-racing/</link>
    <guid>https://korrali.com/blog/three-clocks-racing/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>A 10-minute invoice expiry, 2-minute polling, and 60-second reconciliation could all disagree. Two finalization paths and an idempotency guard fixed it.</description>
  </item>
  <item>
    <title>It was never the network</title>
    <link>https://korrali.com/blog/it-was-never-the-network/</link>
    <guid>https://korrali.com/blog/it-was-never-the-network/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>Intermittent 500s and 503s during UAT looked like India–Oman latency. A 60-second timeout against 100–250ms real RTT proved it couldn't be.</description>
  </item>
  <item>
    <title>Fixing IDOR properly</title>
    <link>https://korrali.com/blog/fixing-idor-properly/</link>
    <guid>https://korrali.com/blog/fixing-idor-properly/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>A pentest found five IDOR-class findings — any user could delete or lock any other. The fix: object-level authorization plus a build-failing regression suite.</description>
  </item>
  <item>
    <title>Spring Data JPA's null-version trap</title>
    <link>https://korrali.com/blog/spring-data-jpa-null-version-trap/</link>
    <guid>https://korrali.com/blog/spring-data-jpa-null-version-trap/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>@Version plus save() on a fresh entity throws duplicate-key errors, not optimistic-lock exceptions. Why, and the find-then-update pattern that fixes it.</description>
  </item>
  <item>
    <title>Designing an SSO handshake with no standard</title>
    <link>https://korrali.com/blog/sso-handshake-no-standard/</link>
    <guid>https://korrali.com/blog/sso-handshake-no-standard/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>No RFC covers silently launching a downstream app after your own SSO event. Designing a one-time-token handshake from scratch, and what broke on first contact.</description>
  </item>
  <item>
    <title>Hand-rolling SOAP clients against undocumented APIs</title>
    <link>https://korrali.com/blog/hand-rolled-soap-clients/</link>
    <guid>https://korrali.com/blog/hand-rolled-soap-clients/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>Two government SOAP APIs, neither with a WSDL you could actually generate stubs from. Building the client by hand with DOM and XPath instead.</description>
  </item>
  <item>
    <title>Hexagonal architecture you can verify with grep</title>
    <link>https://korrali.com/blog/hexagonal-architecture-verify-by-grep/</link>
    <guid>https://korrali.com/blog/hexagonal-architecture-verify-by-grep/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>Anyone can claim hexagonal architecture. The real test: grep the domain package for framework imports. Here's what that discipline actually buys you.</description>
  </item>
  <item>
    <title>Angular 18 to 21: 48 vulnerabilities down to 2</title>
    <link>https://korrali.com/blog/angular-18-to-21-security-upgrade/</link>
    <guid>https://korrali.com/blog/angular-18-to-21-security-upgrade/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>A mid-project Angular 18 to 21 upgrade, done to close an npm audit backlog before a VAPT cycle: 48 vulnerabilities, 28 high, down to 2 moderate.</description>
  </item>
  <item>
    <title>Mock and real adapters behind every port</title>
    <link>https://korrali.com/blog/mock-and-real-adapters-behind-ports/</link>
    <guid>https://korrali.com/blog/mock-and-real-adapters-behind-ports/</guid>
    <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    <description>Every external dependency in CLP had a mock and a real adapter behind the same port, toggled by Spring profile. What that bought, and what it couldn't.</description>
  </item>

</channel>
</rss>
