<feed xmlns='http://www.w3.org/2005/Atom'>
<title>progmaweb, branch feature/oauth-application-types</title>
<subtitle>The site and account service of Progmasoft: a Next.js frontend and an ASP.NET Core API.</subtitle>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/'/>
<entry>
<title>Withdraw an allowance only from the account's own authorizations</title>
<updated>2026-10-23T08:13:27+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-23T08:13:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/commit/?id=06dfa204e4a65c535eb9b3d775a77b5d14522060'/>
<id>06dfa204e4a65c535eb9b3d775a77b5d14522060</id>
<content type='text'>
CodeQL flagged the withdraw endpoint: the authorization was looked up by
the identifier in the address and then checked against the account. The
endpoint now searches only the signed-in account's authorizations for that
identifier and revokes the tokens by the identifier it found, so another
account's allowance is never loaded. A test withdraws as another account
and gets 404.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
CodeQL flagged the withdraw endpoint: the authorization was looked up by
the identifier in the address and then checked against the account. The
endpoint now searches only the signed-in account's authorizations for that
identifier and revokes the tokens by the identifier it found, so another
account's allowance is never loaded. A test withdraws as another account
and gets 404.
</pre>
</div>
</content>
</entry>
<entry>
<title>Move the OAuth pages to Next.js and split the authorize host and the console</title>
<updated>2026-10-23T08:02:39+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-23T08:02:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/commit/?id=9099e9fbb50d27b622362b0c2f0dda5085d1fa03'/>
<id>9099e9fbb50d27b622362b0c2f0dda5085d1fa03</id>
<content type='text'>
Progmasoft OAuth now runs on three hosts:

- credentials.progmasoft.com stays the issuer: discovery documents, key
  set, token, user information, revocation and introspection.
- authorize.progmasoft.com serves the pages people see: the
  authorization and end session endpoints (registered with OpenIddict as
  absolute URIs on that host), sign-in, the consent screen and the
  applications an account has allowed.
- console.progmasoft.com is the Progmasoft Console. Its overview links
  the areas; OAuth 2.1 tokens live under /credentials, with New token,
  then the application type, then its form.

The console has no sign-in of its own and never redirects. It uses the
Progmasoft account session, so production now shares that cookie with
progmasoft.com (__Secure-ProgmasoftSession, Domain=progmasoft.com,
HttpOnly, Secure, SameSite=Lax). Without AccountSessions:CookieDomain the
cookie stays host-only with the __Host- name, as in development and tests.

Application types replace the confidential/public switch: web,
single-page, desktop, mobile and service. Each type has its redirection
rules (RFC 8252), its secret or none, and its grants; only a service
uses client credentials and it registers no address or scope. The type is
kept as an application property and cannot change.

The HTML pages of the API are gone. The pages are Next.js pages in four
languages (en-US, de-DE, ru-RU, he-IL) that call JSON endpoints under
/api/v1/oauth. Requests that change state must come from the page's own
origin; antiforgery forms are no longer needed. The token, revocation and
user information endpoints answer CORS requests from the origins of
single-page applications, without credentials; the discovery documents
and the key set answer every origin.

The host filter keeps every path on its host. Nginx gains the authorize
and console virtual hosts, and the docs describe the hosts, the types and
the shared session.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Progmasoft OAuth now runs on three hosts:

- credentials.progmasoft.com stays the issuer: discovery documents, key
  set, token, user information, revocation and introspection.
- authorize.progmasoft.com serves the pages people see: the
  authorization and end session endpoints (registered with OpenIddict as
  absolute URIs on that host), sign-in, the consent screen and the
  applications an account has allowed.
- console.progmasoft.com is the Progmasoft Console. Its overview links
  the areas; OAuth 2.1 tokens live under /credentials, with New token,
  then the application type, then its form.

The console has no sign-in of its own and never redirects. It uses the
Progmasoft account session, so production now shares that cookie with
progmasoft.com (__Secure-ProgmasoftSession, Domain=progmasoft.com,
HttpOnly, Secure, SameSite=Lax). Without AccountSessions:CookieDomain the
cookie stays host-only with the __Host- name, as in development and tests.

Application types replace the confidential/public switch: web,
single-page, desktop, mobile and service. Each type has its redirection
rules (RFC 8252), its secret or none, and its grants; only a service
uses client credentials and it registers no address or scope. The type is
kept as an application property and cannot change.

The HTML pages of the API are gone. The pages are Next.js pages in four
languages (en-US, de-DE, ru-RU, he-IL) that call JSON endpoints under
/api/v1/oauth. Requests that change state must come from the page's own
origin; antiforgery forms are no longer needed. The token, revocation and
user information endpoints answer CORS requests from the origins of
single-page applications, without credentials; the discovery documents
and the key set answer every origin.

The host filter keeps every path on its host. Nginx gains the authorize
and console virtual hosts, and the docs describe the hosts, the types and
the shared session.
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #43 from Progmasoft/feature/progmasoft-credentials</title>
<updated>2026-10-23T05:01:02+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-10-23T05:01:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/commit/?id=3481b5fe411fb3aa5898b0965e42cc852f3d690c'/>
<id>3481b5fe411fb3aa5898b0965e42cc852f3d690c</id>
<content type='text'>
Add Progmasoft OAuth, an OAuth 2.1 and OpenID Connect provider</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Add Progmasoft OAuth, an OAuth 2.1 and OpenID Connect provider</pre>
</div>
</content>
</entry>
<entry>
<title>Merge branch 'main' into feature/progmasoft-credentials</title>
<updated>2026-10-23T03:36:56+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-10-23T03:36:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/commit/?id=7f1cb91eb16bc3d7fd78320465c32d5e2f47ec97'/>
<id>7f1cb91eb16bc3d7fd78320465c32d5e2f47ec97</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #42 from Progmasoft/ops/harden-systemd-units</title>
<updated>2026-10-23T03:36:23+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-10-23T03:36:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/commit/?id=a68bb18e2d750fabcbcff985b5fe921d7c828d7e'/>
<id>a68bb18e2d750fabcbcff985b5fe921d7c828d7e</id>
<content type='text'>
Harden the systemd units of the API and the web frontend</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Harden the systemd units of the API and the web frontend</pre>
</div>
</content>
</entry>
<entry>
<title>Merge branch 'main' into feature/progmasoft-credentials</title>
<updated>2026-10-23T03:08:33+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-10-23T03:08:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/commit/?id=d8c4fafd30647b0063e3ec52e1c4a95cf61106eb'/>
<id>d8c4fafd30647b0063e3ec52e1c4a95cf61106eb</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge branch 'main' into ops/harden-systemd-units</title>
<updated>2026-10-23T03:08:30+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-10-23T03:08:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/commit/?id=8a2a3ed0bdc109216a75a345407d61deda60fa28'/>
<id>8a2a3ed0bdc109216a75a345407d61deda60fa28</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #44 from Progmasoft/security/next-16.4.2</title>
<updated>2026-10-23T03:07:50+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-10-23T03:07:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/commit/?id=415e949e6621b3d21dd5fbe7cd66440af14e410d'/>
<id>415e949e6621b3d21dd5fbe7cd66440af14e410d</id>
<content type='text'>
Update Next.js to 16.4.2 for an unauthenticated RCE</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Update Next.js to 16.4.2 for an unauthenticated RCE</pre>
</div>
</content>
</entry>
<entry>
<title>Document every OAuth member and namespace for the API reference</title>
<updated>2026-10-23T03:01:51+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-23T03:01:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/commit/?id=a8d768876e7cff3e3eeaa6e310149ed7f5894db0'/>
<id>a8d768876e7cff3e3eeaa6e310149ed7f5894db0</id>
<content type='text'>
The documentation check of CI requires a comment on every API item and
a page for every namespace; 38 items of Progmasoft.OAuth had none. The
private handlers and helpers get summaries, MemoryOAuthDatabase its
field, and docs/api/namespaces describes Progmasoft.OAuth and its
Developers, Endpoints, Pages and Storage namespaces.

Verified: dotnet build in Release, dotnet docfx with warnings as
errors, and CheckDocumentation: all 353 API items are documented.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The documentation check of CI requires a comment on every API item and
a page for every namespace; 38 items of Progmasoft.OAuth had none. The
private handlers and helpers get summaries, MemoryOAuthDatabase its
field, and docs/api/namespaces describes Progmasoft.OAuth and its
Developers, Endpoints, Pages and Storage namespaces.

Verified: dotnet build in Release, dotnet docfx with warnings as
errors, and CheckDocumentation: all 353 API items are documented.
</pre>
</div>
</content>
</entry>
<entry>
<title>Update Next.js to 16.4.2 for an unauthenticated RCE</title>
<updated>2026-10-23T02:57:26+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-10-23T02:57:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/progmaweb/commit/?id=8e4f376c19a05c3a7ac73576515f4baa62ed206d'/>
<id>8e4f376c19a05c3a7ac73576515f4baa62ed206d</id>
<content type='text'>
pnpm audit reports a critical advisory for next &gt;=16.0.0 &lt;=16.4.0:
unauthenticated remote code execution through the Image Optimization
API when SVG files are used. progmasoft.com runs 16.3.8. The site sets
no images option and the optimizer refused an SVG request in a check
from outside, but the version is in the affected range, so it moves to
16.4.2, the latest patch release; eslint-config-next follows.

Verified: pnpm check, pnpm test:coverage, pnpm lint and pnpm build
pass; pnpm audit --audit-level high reports nothing beyond the one
advisory already ignored.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
pnpm audit reports a critical advisory for next &gt;=16.0.0 &lt;=16.4.0:
unauthenticated remote code execution through the Image Optimization
API when SVG files are used. progmasoft.com runs 16.3.8. The site sets
no images option and the optimizer refused an SVG request in a check
from outside, but the version is in the affected range, so it moves to
16.4.2, the latest patch release; eslint-config-next follows.

Verified: pnpm check, pnpm test:coverage, pnpm lint and pnpm build
pass; pnpm audit --audit-level high reports nothing beyond the one
advisory already ignored.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
</feed>
