Compare commits
2
Commits
fe007fbfe1
...
8bdce810f2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8bdce810f2 | ||
|
|
d0678cef9a |
@@ -14,6 +14,8 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
publish-packages:
|
publish-packages:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
GITEA_REPOSITORY: ${{ gitea.repository }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
|
||||||
with:
|
with:
|
||||||
@@ -29,7 +31,6 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
REQUESTED_TAG: ${{ inputs.release_tag }}
|
REQUESTED_TAG: ${{ inputs.release_tag }}
|
||||||
TRIGGER_TAG: ${{ gitea.ref_name }}
|
TRIGGER_TAG: ${{ gitea.ref_name }}
|
||||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
tag="${REQUESTED_TAG:-$TRIGGER_TAG}"
|
tag="${REQUESTED_TAG:-$TRIGGER_TAG}"
|
||||||
@@ -43,24 +44,6 @@ jobs:
|
|||||||
echo "Release tag is not contained in main" >&2
|
echo "Release tag is not contained in main" >&2
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
python - "$tag" <<'PY'
|
|
||||||
import fnmatch
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import urllib.request
|
|
||||||
|
|
||||||
tag = sys.argv[1]
|
|
||||||
repository = os.environ["GITEA_REPOSITORY"]
|
|
||||||
request = urllib.request.Request(
|
|
||||||
f"{os.environ['GITEA_API_URL']}/repos/{repository}/tag_protections",
|
|
||||||
headers={"Authorization": f"token {os.environ['GITEA_TOKEN']}"},
|
|
||||||
)
|
|
||||||
with urllib.request.urlopen(request, timeout=30) as response:
|
|
||||||
protections = json.load(response)
|
|
||||||
if not any(fnmatch.fnmatchcase(tag, item.get("name_pattern", "")) for item in protections):
|
|
||||||
raise SystemExit(f"Release tag {tag!r} is not covered by repository tag protection")
|
|
||||||
PY
|
|
||||||
git checkout --detach "$tag"
|
git checkout --detach "$tag"
|
||||||
printf 'RELEASE_TAG=%s\n' "$tag" >> "$GITEA_ENV"
|
printf 'RELEASE_TAG=%s\n' "$tag" >> "$GITEA_ENV"
|
||||||
printf 'SOURCE_DATE_EPOCH=%s\n' "$(git show -s --format=%ct HEAD)" >> "$GITEA_ENV"
|
printf 'SOURCE_DATE_EPOCH=%s\n' "$(git show -s --format=%ct HEAD)" >> "$GITEA_ENV"
|
||||||
@@ -130,7 +113,7 @@ jobs:
|
|||||||
const escapedRepository = repository.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
const escapedRepository = repository.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
||||||
const gitTag = specifier.match(
|
const gitTag = specifier.match(
|
||||||
new RegExp(
|
new RegExp(
|
||||||
`^git\\+(?:ssh://git@|https://)git\\.add-ideas\\.de/GovOPlaN/${escapedRepository}\\.git#v([0-9]+\\.[0-9]+\\.[0-9]+)$`,
|
`^git\\+(?:ssh://git@|https://)git\\.add-ideas\\.de/(?:GovOPlaN|add-ideas)/${escapedRepository}\\.git#v([0-9]+\\.[0-9]+\\.[0-9]+)$`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
if (gitTag) {
|
if (gitTag) {
|
||||||
@@ -203,7 +186,7 @@ jobs:
|
|||||||
'@govoplan:registry=https://git.add-ideas.de/api/packages/GovOPlaN/npm/' \
|
'@govoplan:registry=https://git.add-ideas.de/api/packages/GovOPlaN/npm/' \
|
||||||
"//git.add-ideas.de/api/packages/GovOPlaN/npm/:_authToken=$PACKAGE_TOKEN" \
|
"//git.add-ideas.de/api/packages/GovOPlaN/npm/:_authToken=$PACKAGE_TOKEN" \
|
||||||
> "$npmrc"
|
> "$npmrc"
|
||||||
NPM_CONFIG_USERCONFIG="$npmrc" npm publish "${webui_packages[0]}" \
|
NPM_CONFIG_USERCONFIG="$npmrc" npm publish "./${webui_packages[0]}" \
|
||||||
--ignore-scripts --access public \
|
--ignore-scripts --access public \
|
||||||
--registry https://git.add-ideas.de/api/packages/GovOPlaN/npm/
|
--registry https://git.add-ideas.de/api/packages/GovOPlaN/npm/
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -71,6 +71,35 @@ stores only same-tenant evidence references. Cases and Workflow Engine retain
|
|||||||
their own target state; Runtime stores only a permitted same-tenant handoff
|
their own target state; Runtime stores only a permitted same-tenant handoff
|
||||||
reference and status evidence.
|
reference and status evidence.
|
||||||
|
|
||||||
|
## Approved Intake And Evidence Profiles
|
||||||
|
|
||||||
|
The product and security profile approved on 2026-08-04 sets the next
|
||||||
|
implementation boundary:
|
||||||
|
|
||||||
|
- authenticated-account and invitation-token intake are the first public entry
|
||||||
|
profiles;
|
||||||
|
- anonymous intake is available only through an explicit per-form policy
|
||||||
|
opt-in, while a pseudonymous profile remains deferred;
|
||||||
|
- an anonymous submission cannot later be claimed by an identity; an invitation
|
||||||
|
submission can be linked only with explicit consent and proof of that
|
||||||
|
invitation;
|
||||||
|
- invitation tokens are hashed, tenant/form bound, replay safe, rate limited,
|
||||||
|
and expire after 14 days by default;
|
||||||
|
- drafts expire after 30 days by default, while every service/form must declare
|
||||||
|
submitted-data retention explicitly; and
|
||||||
|
- CAPTCHA remains an optional privacy-approved provider instead of a mandatory
|
||||||
|
external dependency.
|
||||||
|
|
||||||
|
Files is the first attachment provider and retains byte storage, quarantine,
|
||||||
|
scanning, classification, retention, and legal-hold ownership. Runtime stores
|
||||||
|
only immutable same-tenant evidence references and must fail closed when a
|
||||||
|
required item is pending, rejected, expired, unavailable, or unverifiable.
|
||||||
|
|
||||||
|
The first native signature profile is an authenticated acknowledgement. It is
|
||||||
|
not an advanced or qualified electronic signature. Those assurance levels
|
||||||
|
require a separately selected external trust-service provider and current
|
||||||
|
provider evidence; a required signature never silently degrades.
|
||||||
|
|
||||||
## Recovery And Operations
|
## Recovery And Operations
|
||||||
|
|
||||||
Database recovery restores identities, revisions, and events together. After
|
Database recovery restores identities, revisions, and events together. After
|
||||||
@@ -84,8 +113,8 @@ Destructive retirement is blocked while state exists and requires a verified
|
|||||||
database snapshot plus an export or retention decision for referenced evidence.
|
database snapshot plus an export or retention decision for referenced evidence.
|
||||||
No local generated files are required, so API and worker nodes remain stateless.
|
No local generated files are required, so API and worker nodes remain stateless.
|
||||||
|
|
||||||
Anonymous public intake and concrete file/signature upload adapters remain
|
The approved public-intake and concrete file/signature provider profiles remain
|
||||||
product depth. Conditional multi-page definitions are resolved from Forms, and
|
implementation depth. Conditional multi-page definitions are resolved from Forms, and
|
||||||
native Case/Workflow handoffs execute automatically when the exact owner
|
native Case/Workflow handoffs execute automatically when the exact owner
|
||||||
capability is installed. Additional target kinds remain adapter depth; the
|
capability is installed. Additional target kinds remain adapter depth; the
|
||||||
owner and security boundaries no longer depend on those additions.
|
owner and security boundaries no longer depend on those additions.
|
||||||
|
|||||||
Reference in New Issue
Block a user