@striae-org/striae 5.5.1 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.env.example +9 -1
  2. package/app/components/actions/case-export/download-handlers.ts +130 -62
  3. package/app/components/actions/case-manage/archive-package-builder.ts +299 -0
  4. package/app/components/actions/case-manage/delete-helpers.ts +61 -0
  5. package/app/components/actions/case-manage/index.ts +2 -0
  6. package/app/components/actions/case-manage/operations.ts +714 -0
  7. package/app/components/actions/case-manage/types.ts +21 -0
  8. package/app/components/actions/case-manage/utils.ts +34 -0
  9. package/app/components/actions/case-manage.ts +1 -1079
  10. package/app/components/navbar/case-import/case-import.module.css +2 -2
  11. package/app/components/navbar/case-import/case-import.tsx +0 -8
  12. package/app/components/navbar/case-import/components/CasePreviewSection.tsx +1 -1
  13. package/app/components/navbar/case-modals/all-cases-modal.tsx +13 -1
  14. package/app/components/navbar/navbar.tsx +8 -5
  15. package/app/components/sidebar/cases/case-sidebar.tsx +3 -2
  16. package/app/routes/auth/login.example.tsx +17 -5
  17. package/app/routes/striae/striae.tsx +36 -11
  18. package/app/types/export.ts +1 -0
  19. package/app/utils/forensics/SHA256.ts +2 -2
  20. package/app/utils/forensics/audit-export-signature.ts +1 -1
  21. package/app/utils/forensics/confirmation-signature.ts +1 -1
  22. package/app/utils/forensics/signature-utils.ts +7 -2
  23. package/functions/api/_shared/registration-allowlist.ts +38 -0
  24. package/functions/api/auth/can-register.ts +59 -0
  25. package/functions/api/user/[[path]].ts +34 -0
  26. package/members.emails.example +11 -0
  27. package/package.json +9 -9
  28. package/scripts/deploy-all.sh +2 -2
  29. package/scripts/deploy-members-emails.sh +102 -0
  30. package/scripts/deploy-pages-secrets.sh +13 -70
  31. package/scripts/deploy-primershear-emails.sh +7 -73
  32. package/worker-configuration.d.ts +2 -1
  33. package/workers/audit-worker/package.json +1 -5
  34. package/workers/audit-worker/wrangler.jsonc.example +1 -1
  35. package/workers/data-worker/package.json +1 -5
  36. package/workers/data-worker/src/signature-utils.ts +7 -2
  37. package/workers/data-worker/src/signing-payload-utils.ts +4 -4
  38. package/workers/data-worker/wrangler.jsonc.example +1 -1
  39. package/workers/image-worker/package.json +1 -5
  40. package/workers/image-worker/wrangler.jsonc.example +1 -1
  41. package/workers/pdf-worker/package.json +1 -5
  42. package/workers/pdf-worker/wrangler.jsonc.example +1 -1
  43. package/workers/user-worker/package.json +1 -5
  44. package/workers/user-worker/wrangler.jsonc.example +1 -1
  45. package/wrangler.toml.example +1 -1
@@ -0,0 +1,102 @@
1
+ #!/bin/bash
2
+
3
+ # ============================================
4
+ # MEMBERS EMAIL LIST DEPLOYMENT SCRIPT
5
+ # ============================================
6
+ # Reads members.emails, updates REGISTRATION_EMAILS in .env,
7
+ # then deploys that secret directly to Cloudflare Pages (production).
8
+
9
+ set -e
10
+ set -o pipefail
11
+
12
+ RED='\033[0;31m'
13
+ GREEN='\033[0;32m'
14
+ YELLOW='\033[1;33m'
15
+ BLUE='\033[0;34m'
16
+ NC='\033[0m'
17
+
18
+ echo -e "${BLUE}👥 Members Email List Deployment${NC}"
19
+ echo "=================================="
20
+
21
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
22
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
23
+ cd "$PROJECT_ROOT"
24
+
25
+ trap 'echo -e "\n${RED}❌ deploy-members-emails.sh failed near line ${LINENO}${NC}"' ERR
26
+
27
+ # ── Read emails file ──────────────────────────────────────────────────────────
28
+
29
+ EMAILS_FILE="$PROJECT_ROOT/members.emails"
30
+
31
+ if [ ! -f "$EMAILS_FILE" ]; then
32
+ echo -e "${RED}❌ members.emails not found at: $EMAILS_FILE${NC}"
33
+ echo -e "${YELLOW} Create it with one email address or @domain.com wildcard per line.${NC}"
34
+ echo -e "${YELLOW} See members.emails.example for the format.${NC}"
35
+ exit 1
36
+ fi
37
+
38
+ # Strip comment lines and blank lines, then join with commas
39
+ # Use || true to avoid failure if paste gets no input (handles empty file gracefully)
40
+ REGISTRATION_EMAILS=$(grep -v '^[[:space:]]*#' "$EMAILS_FILE" | grep -v '^[[:space:]]*$' | paste -sd ',' - || true)
41
+
42
+ if [ -z "$REGISTRATION_EMAILS" ]; then
43
+ echo -e "${YELLOW}⚠️ members.emails contains no active entries.${NC}"
44
+ echo -e "${YELLOW} The secret will be set to an empty string, disabling the gateway (open registration).${NC}"
45
+ fi
46
+
47
+ ENTRY_COUNT=$(echo "$REGISTRATION_EMAILS" | tr ',' '\n' | grep -c '[^[:space:]]' || true)
48
+ echo -e "${GREEN}✅ Loaded $ENTRY_COUNT entry(ies) from members.emails${NC}"
49
+
50
+ # ── Update .env ───────────────────────────────────────────────────────────────
51
+
52
+ ENV_FILE="$PROJECT_ROOT/.env"
53
+
54
+ if [ ! -f "$ENV_FILE" ]; then
55
+ echo -e "${RED}❌ .env not found. Run deploy-config first.${NC}"
56
+ exit 1
57
+ fi
58
+
59
+ # Replace the REGISTRATION_EMAILS= line in .env (handles both empty and populated values)
60
+ if grep -q '^REGISTRATION_EMAILS=' "$ENV_FILE"; then
61
+ # Use a temp file to avoid sed -i portability issues across macOS/Linux
62
+ local_tmp=$(mktemp)
63
+ sed "s|^REGISTRATION_EMAILS=.*|REGISTRATION_EMAILS=${REGISTRATION_EMAILS}|" "$ENV_FILE" > "$local_tmp"
64
+ mv "$local_tmp" "$ENV_FILE"
65
+ echo -e "${GREEN}✅ Updated REGISTRATION_EMAILS in .env${NC}"
66
+ else
67
+ echo "" >> "$ENV_FILE"
68
+ echo "REGISTRATION_EMAILS=${REGISTRATION_EMAILS}" >> "$ENV_FILE"
69
+ echo -e "${GREEN}✅ Appended REGISTRATION_EMAILS to .env${NC}"
70
+ fi
71
+
72
+ # ── Deploy to Cloudflare Pages ────────────────────────────────────────────────
73
+
74
+ if ! command -v wrangler > /dev/null 2>&1; then
75
+ echo -e "${RED}❌ wrangler is not installed or not in PATH${NC}"
76
+ exit 1
77
+ fi
78
+
79
+ source "$ENV_FILE"
80
+
81
+ PAGES_PROJECT_NAME=$(echo "$PAGES_PROJECT_NAME" | tr -d '\r')
82
+ if [ -z "$PAGES_PROJECT_NAME" ]; then
83
+ echo -e "${RED}❌ PAGES_PROJECT_NAME is missing from .env${NC}"
84
+ exit 1
85
+ fi
86
+
87
+ echo -e "${YELLOW} Setting REGISTRATION_EMAILS for production...${NC}"
88
+ printf '%s' "$REGISTRATION_EMAILS" | wrangler pages secret put REGISTRATION_EMAILS \
89
+ --project-name "$PAGES_PROJECT_NAME"
90
+
91
+ echo -e "${GREEN}✅ REGISTRATION_EMAILS deployed to production${NC}"
92
+
93
+ # Deploy Pages so the new secret takes effect immediately
94
+ echo -e "\n${YELLOW}🚀 Building and deploying Pages to activate new secret...${NC}"
95
+
96
+ if ! npm run deploy-pages; then
97
+ echo -e "${RED}❌ Pages deployment failed${NC}"
98
+ exit 1
99
+ fi
100
+ echo -e "${GREEN}✅ Pages deployment complete${NC}"
101
+
102
+ echo -e "\n${GREEN}🎉 Members email list deployment complete!${NC}"
@@ -24,46 +24,6 @@ cd "$PROJECT_ROOT"
24
24
 
25
25
  trap 'echo -e "\n${RED}❌ deploy-pages-secrets.sh failed near line ${LINENO}${NC}"' ERR
26
26
 
27
- show_help=false
28
- deploy_production=true
29
- deploy_preview=true
30
-
31
- for arg in "$@"; do
32
- case "$arg" in
33
- -h|--help)
34
- show_help=true
35
- ;;
36
- --production-only)
37
- deploy_production=true
38
- deploy_preview=false
39
- ;;
40
- --preview-only)
41
- deploy_production=false
42
- deploy_preview=true
43
- ;;
44
- *)
45
- echo -e "${RED}❌ Unknown option: $arg${NC}"
46
- echo "Use --help to see supported options."
47
- exit 1
48
- ;;
49
- esac
50
- done
51
-
52
- if [ "$show_help" = "true" ]; then
53
- echo "Usage: bash ./scripts/deploy-pages-secrets.sh [--production-only|--preview-only]"
54
- echo ""
55
- echo "Options:"
56
- echo " --production-only Deploy secrets only to the production Pages environment"
57
- echo " --preview-only Deploy secrets only to the preview Pages environment"
58
- echo " -h, --help Show this help message"
59
- exit 0
60
- fi
61
-
62
- if [ "$deploy_production" != "true" ] && [ "$deploy_preview" != "true" ]; then
63
- echo -e "${RED}❌ No target environment selected${NC}"
64
- exit 1
65
- fi
66
-
67
27
  require_command() {
68
28
  local cmd=$1
69
29
  if ! command -v "$cmd" > /dev/null 2>&1; then
@@ -145,40 +105,29 @@ get_optional_value() {
145
105
  printf '%s' "$value"
146
106
  }
147
107
 
148
- set_pages_secret() {
149
- local secret_name=$1
150
- local secret_value=$2
151
- local pages_env=$3
152
-
153
- echo -e "${YELLOW} Setting $secret_name for $pages_env...${NC}"
154
-
155
- if [ "$pages_env" = "production" ]; then
156
- printf '%s' "$secret_value" | wrangler pages secret put "$secret_name" --project-name "$PAGES_PROJECT_NAME"
157
- return 0
158
- fi
159
-
160
- printf '%s' "$secret_value" | wrangler pages secret put "$secret_name" --project-name "$PAGES_PROJECT_NAME" --env "$pages_env"
161
- }
162
-
163
- deploy_pages_environment_secrets() {
164
- local pages_env=$1
108
+ deploy_pages_secrets() {
165
109
  local secret
166
110
  local secret_value
167
111
 
168
- echo -e "\n${BLUE}🔧 Deploying Pages secrets to $pages_env...${NC}"
112
+ echo -e "\n${BLUE}🔧 Deploying Pages secrets to production...${NC}"
169
113
 
170
114
  for secret in "${required_pages_secrets[@]}"; do
171
115
  secret_value=$(get_required_value "$secret")
172
- set_pages_secret "$secret" "$secret_value" "$pages_env"
116
+ echo -e "${YELLOW} Setting $secret...${NC}"
117
+ printf '%s' "$secret_value" | wrangler pages secret put "$secret" --project-name "$PAGES_PROJECT_NAME"
173
118
  done
174
119
 
175
120
  local optional_primershear_emails
176
121
  optional_primershear_emails=$(get_optional_value "PRIMERSHEAR_EMAILS")
177
- if [ -n "$optional_primershear_emails" ]; then
178
- set_pages_secret "PRIMERSHEAR_EMAILS" "$optional_primershear_emails" "$pages_env"
179
- fi
122
+ echo -e "${YELLOW} Setting PRIMERSHEAR_EMAILS...${NC}"
123
+ printf '%s' "$optional_primershear_emails" | wrangler pages secret put "PRIMERSHEAR_EMAILS" --project-name "$PAGES_PROJECT_NAME"
180
124
 
181
- echo -e "${GREEN}✅ Pages secrets deployed to $pages_env${NC}"
125
+ local optional_registration_emails
126
+ optional_registration_emails=$(get_optional_value "REGISTRATION_EMAILS")
127
+ echo -e "${YELLOW} Setting REGISTRATION_EMAILS...${NC}"
128
+ printf '%s' "$optional_registration_emails" | wrangler pages secret put "REGISTRATION_EMAILS" --project-name "$PAGES_PROJECT_NAME"
129
+
130
+ echo -e "${GREEN}✅ Pages secrets deployed to production${NC}"
182
131
  }
183
132
 
184
133
  require_command wrangler
@@ -220,12 +169,6 @@ for secret in "${required_pages_secrets[@]}"; do
220
169
  done
221
170
  echo -e "${GREEN}✅ Required Pages secret values found${NC}"
222
171
 
223
- if [ "$deploy_production" = "true" ]; then
224
- deploy_pages_environment_secrets "production"
225
- fi
226
-
227
- if [ "$deploy_preview" = "true" ]; then
228
- deploy_pages_environment_secrets "preview"
229
- fi
172
+ deploy_pages_secrets
230
173
 
231
174
  echo -e "\n${GREEN}🎉 Pages secrets deployment completed!${NC}"
@@ -4,16 +4,7 @@
4
4
  # PRIMERSHEAR EMAIL LIST DEPLOYMENT SCRIPT
5
5
  # ============================================
6
6
  # Reads primershear.emails, updates PRIMERSHEAR_EMAILS in .env,
7
- # then deploys that secret directly to Cloudflare Pages.
8
- #
9
- # Usage:
10
- # bash ./scripts/deploy-primershear-emails.sh [--production-only|--preview-only|--env-only]
11
- #
12
- # Options:
13
- # --production-only Deploy to production Pages environment only
14
- # --preview-only Deploy to preview Pages environment only
15
- # --env-only Update .env only; do not deploy to Cloudflare
16
- # -h, --help Show this help message
7
+ # then deploys that secret directly to Cloudflare Pages (production).
17
8
 
18
9
  set -e
19
10
  set -o pipefail
@@ -33,43 +24,6 @@ cd "$PROJECT_ROOT"
33
24
 
34
25
  trap 'echo -e "\n${RED}❌ deploy-primershear-emails.sh failed near line ${LINENO}${NC}"' ERR
35
26
 
36
- # ── Argument parsing ─────────────────────────────────────────────────────────
37
-
38
- deploy_production=true
39
- deploy_preview=true
40
- env_only=false
41
-
42
- for arg in "$@"; do
43
- case "$arg" in
44
- -h|--help)
45
- echo "Usage: bash ./scripts/deploy-primershear-emails.sh [--production-only|--preview-only|--env-only]"
46
- echo ""
47
- echo "Options:"
48
- echo " --production-only Deploy to production Pages environment only"
49
- echo " --preview-only Deploy to preview Pages environment only"
50
- echo " --env-only Update .env only; do not deploy to Cloudflare"
51
- echo " -h, --help Show this help message"
52
- exit 0
53
- ;;
54
- --production-only)
55
- deploy_production=true
56
- deploy_preview=false
57
- ;;
58
- --preview-only)
59
- deploy_production=false
60
- deploy_preview=true
61
- ;;
62
- --env-only)
63
- env_only=true
64
- ;;
65
- *)
66
- echo -e "${RED}❌ Unknown option: $arg${NC}"
67
- echo "Use --help to see supported options."
68
- exit 1
69
- ;;
70
- esac
71
- done
72
-
73
27
  # ── Read emails file ──────────────────────────────────────────────────────────
74
28
 
75
29
  EMAILS_FILE="$PROJECT_ROOT/primershear.emails"
@@ -114,11 +68,6 @@ else
114
68
  echo -e "${GREEN}✅ Appended PRIMERSHEAR_EMAILS to .env${NC}"
115
69
  fi
116
70
 
117
- if [ "$env_only" = "true" ]; then
118
- echo -e "\n${GREEN}🎉 .env updated. Skipping Cloudflare deployment (--env-only).${NC}"
119
- exit 0
120
- fi
121
-
122
71
  # ── Deploy to Cloudflare Pages ────────────────────────────────────────────────
123
72
 
124
73
  if ! command -v wrangler > /dev/null 2>&1; then
@@ -134,31 +83,16 @@ if [ -z "$PAGES_PROJECT_NAME" ]; then
134
83
  exit 1
135
84
  fi
136
85
 
137
- set_secret() {
138
- local pages_env=$1
139
- echo -e "${YELLOW} Setting PRIMERSHEAR_EMAILS for $pages_env...${NC}"
140
- if [ "$pages_env" = "production" ]; then
141
- printf '%s' "$PRIMERSHEAR_EMAILS" | wrangler pages secret put PRIMERSHEAR_EMAILS \
142
- --project-name "$PAGES_PROJECT_NAME"
143
- else
144
- printf '%s' "$PRIMERSHEAR_EMAILS" | wrangler pages secret put PRIMERSHEAR_EMAILS \
145
- --project-name "$PAGES_PROJECT_NAME" --env "$pages_env"
146
- fi
147
- }
148
-
149
- if [ "$deploy_production" = "true" ]; then
150
- set_secret "production"
151
- echo -e "${GREEN}✅ PRIMERSHEAR_EMAILS deployed to production${NC}"
152
- fi
86
+ echo -e "${YELLOW} Setting PRIMERSHEAR_EMAILS for production...${NC}"
87
+ printf '%s' "$PRIMERSHEAR_EMAILS" | wrangler pages secret put PRIMERSHEAR_EMAILS \
88
+ --project-name "$PAGES_PROJECT_NAME"
153
89
 
154
- if [ "$deploy_preview" = "true" ]; then
155
- set_secret "preview"
156
- echo -e "${GREEN}✅ PRIMERSHEAR_EMAILS deployed to preview${NC}"
157
- fi
90
+ echo -e "${GREEN}✅ PRIMERSHEAR_EMAILS deployed to production${NC}"
158
91
 
159
92
  # Deploy Pages so the new secret takes effect immediately
160
93
  echo -e "\n${YELLOW}🚀 Building and deploying Pages to activate new secret...${NC}"
161
- if ! npm run deploy; then
94
+
95
+ if ! npm run deploy-pages; then
162
96
  echo -e "${RED}❌ Pages deployment failed${NC}"
163
97
  exit 1
164
98
  fi
@@ -58,6 +58,7 @@ declare namespace Cloudflare {
58
58
  PDF_WORKER_AUTH: string;
59
59
  BROWSER_API_TOKEN: string;
60
60
  PRIMERSHEAR_EMAILS: string;
61
+ REGISTRATION_EMAILS: string;
61
62
  }
62
63
  }
63
64
  interface Env extends Cloudflare.Env {}
@@ -65,7 +66,7 @@ type StringifyValues<EnvType extends Record<string, unknown>> = {
65
66
  [Binding in keyof EnvType]: EnvType[Binding] extends string ? EnvType[Binding] : string;
66
67
  };
67
68
  declare namespace NodeJS {
68
- interface ProcessEnv extends StringifyValues<Pick<Cloudflare.Env, "ACCOUNT_ID" | "USER_DB_AUTH" | "R2_KEY_SECRET" | "IMAGES_API_TOKEN" | "API_KEY" | "AUTH_DOMAIN" | "PROJECT_ID" | "STORAGE_BUCKET" | "MESSAGING_SENDER_ID" | "APP_ID" | "MEASUREMENT_ID" | "FIREBASE_SERVICE_ACCOUNT_EMAIL" | "FIREBASE_SERVICE_ACCOUNT_PRIVATE_KEY" | "USER_KV_ENCRYPTION_PRIVATE_KEY" | "USER_KV_ENCRYPTION_KEY_ID" | "USER_KV_ENCRYPTION_PUBLIC_KEY" | "USER_KV_WRITE_ENDPOINTS_ENABLED" | "USER_KV_ENCRYPTION_KEYS_JSON" | "USER_KV_ENCRYPTION_ACTIVE_KEY_ID" | "MANIFEST_SIGNING_PRIVATE_KEY" | "MANIFEST_SIGNING_KEY_ID" | "MANIFEST_SIGNING_PUBLIC_KEY" | "EXPORT_ENCRYPTION_PRIVATE_KEY" | "EXPORT_ENCRYPTION_KEY_ID" | "EXPORT_ENCRYPTION_PUBLIC_KEY" | "EXPORT_ENCRYPTION_KEYS_JSON" | "EXPORT_ENCRYPTION_ACTIVE_KEY_ID" | "DATA_AT_REST_ENCRYPTION_ENABLED" | "DATA_AT_REST_ENCRYPTION_PRIVATE_KEY" | "DATA_AT_REST_ENCRYPTION_KEY_ID" | "DATA_AT_REST_ENCRYPTION_PUBLIC_KEY" | "DATA_AT_REST_ENCRYPTION_KEYS_JSON" | "DATA_AT_REST_ENCRYPTION_ACTIVE_KEY_ID" | "PAGES_PROJECT_NAME" | "PAGES_CUSTOM_DOMAIN" | "USER_WORKER_NAME" | "USER_WORKER_DOMAIN" | "KV_STORE_ID" | "DATA_WORKER_NAME" | "DATA_BUCKET_NAME" | "FILES_BUCKET_NAME" | "DATA_WORKER_DOMAIN" | "AUDIT_WORKER_NAME" | "AUDIT_BUCKET_NAME" | "AUDIT_WORKER_DOMAIN" | "IMAGES_WORKER_NAME" | "IMAGES_WORKER_DOMAIN" | "IMAGE_SIGNED_URL_SECRET" | "IMAGE_SIGNED_URL_TTL_SECONDS" | "IMAGE_SIGNED_URL_BASE_URL" | "PDF_WORKER_NAME" | "PDF_WORKER_DOMAIN" | "PDF_WORKER_AUTH" | "BROWSER_API_TOKEN" | "PRIMERSHEAR_EMAILS">> {}
69
+ interface ProcessEnv extends StringifyValues<Pick<Cloudflare.Env, "ACCOUNT_ID" | "USER_DB_AUTH" | "R2_KEY_SECRET" | "IMAGES_API_TOKEN" | "API_KEY" | "AUTH_DOMAIN" | "PROJECT_ID" | "STORAGE_BUCKET" | "MESSAGING_SENDER_ID" | "APP_ID" | "MEASUREMENT_ID" | "FIREBASE_SERVICE_ACCOUNT_EMAIL" | "FIREBASE_SERVICE_ACCOUNT_PRIVATE_KEY" | "USER_KV_ENCRYPTION_PRIVATE_KEY" | "USER_KV_ENCRYPTION_KEY_ID" | "USER_KV_ENCRYPTION_PUBLIC_KEY" | "USER_KV_WRITE_ENDPOINTS_ENABLED" | "USER_KV_ENCRYPTION_KEYS_JSON" | "USER_KV_ENCRYPTION_ACTIVE_KEY_ID" | "MANIFEST_SIGNING_PRIVATE_KEY" | "MANIFEST_SIGNING_KEY_ID" | "MANIFEST_SIGNING_PUBLIC_KEY" | "EXPORT_ENCRYPTION_PRIVATE_KEY" | "EXPORT_ENCRYPTION_KEY_ID" | "EXPORT_ENCRYPTION_PUBLIC_KEY" | "EXPORT_ENCRYPTION_KEYS_JSON" | "EXPORT_ENCRYPTION_ACTIVE_KEY_ID" | "DATA_AT_REST_ENCRYPTION_ENABLED" | "DATA_AT_REST_ENCRYPTION_PRIVATE_KEY" | "DATA_AT_REST_ENCRYPTION_KEY_ID" | "DATA_AT_REST_ENCRYPTION_PUBLIC_KEY" | "DATA_AT_REST_ENCRYPTION_KEYS_JSON" | "DATA_AT_REST_ENCRYPTION_ACTIVE_KEY_ID" | "PAGES_PROJECT_NAME" | "PAGES_CUSTOM_DOMAIN" | "USER_WORKER_NAME" | "USER_WORKER_DOMAIN" | "KV_STORE_ID" | "DATA_WORKER_NAME" | "DATA_BUCKET_NAME" | "FILES_BUCKET_NAME" | "DATA_WORKER_DOMAIN" | "AUDIT_WORKER_NAME" | "AUDIT_BUCKET_NAME" | "AUDIT_WORKER_DOMAIN" | "IMAGES_WORKER_NAME" | "IMAGES_WORKER_DOMAIN" | "IMAGE_SIGNED_URL_SECRET" | "IMAGE_SIGNED_URL_TTL_SECONDS" | "IMAGE_SIGNED_URL_BASE_URL" | "PDF_WORKER_NAME" | "PDF_WORKER_DOMAIN" | "PDF_WORKER_AUTH" | "BROWSER_API_TOKEN" | "PRIMERSHEAR_EMAILS" | "REGISTRATION_EMAILS">> {}
69
70
  }
70
71
 
71
72
  // Begin runtime types
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "audit-worker",
3
- "version": "5.5.1",
3
+ "version": "6.0.0",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "deploy": "wrangler deploy",
@@ -9,9 +9,5 @@
9
9
  },
10
10
  "devDependencies": {
11
11
  "wrangler": "^4.81.1"
12
- },
13
- "overrides": {
14
- "undici": "7.24.1",
15
- "yauzl": "3.2.1"
16
12
  }
17
13
  }
@@ -7,7 +7,7 @@
7
7
  "name": "AUDIT_WORKER_NAME",
8
8
  "account_id": "ACCOUNT_ID",
9
9
  "main": "src/audit-worker.ts",
10
- "compatibility_date": "2026-04-09",
10
+ "compatibility_date": "2026-04-11",
11
11
  "compatibility_flags": [
12
12
  "nodejs_compat"
13
13
  ],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "data-worker",
3
- "version": "5.5.1",
3
+ "version": "6.0.0",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "deploy": "wrangler deploy",
@@ -9,9 +9,5 @@
9
9
  },
10
10
  "devDependencies": {
11
11
  "wrangler": "^4.81.1"
12
- },
13
- "overrides": {
14
- "undici": "7.24.1",
15
- "yauzl": "3.2.1"
16
12
  }
17
13
  }
@@ -5,6 +5,8 @@ export interface WorkerSignatureEnvelope {
5
5
  value: string;
6
6
  }
7
7
 
8
+ const RSA_PSS_SALT_LENGTH = 32;
9
+
8
10
  function base64UrlEncode(value: Uint8Array): string {
9
11
  let binary = '';
10
12
  for (const byte of value) {
@@ -57,7 +59,7 @@ export async function signPayload(
57
59
  'pkcs8',
58
60
  parsePkcs8PrivateKey(privateKey),
59
61
  {
60
- name: 'RSASSA-PKCS1-v1_5',
62
+ name: 'RSA-PSS',
61
63
  hash: 'SHA-256'
62
64
  },
63
65
  false,
@@ -65,7 +67,10 @@ export async function signPayload(
65
67
  );
66
68
 
67
69
  const signature = await crypto.subtle.sign(
68
- { name: 'RSASSA-PKCS1-v1_5' },
70
+ {
71
+ name: 'RSA-PSS',
72
+ saltLength: RSA_PSS_SALT_LENGTH
73
+ },
69
74
  signingKey,
70
75
  new TextEncoder().encode(payload)
71
76
  );
@@ -52,10 +52,10 @@ export interface AuditExportSigningPayload {
52
52
  hash: string;
53
53
  }
54
54
 
55
- export const FORENSIC_MANIFEST_VERSION = '2.0';
56
- export const CONFIRMATION_SIGNATURE_VERSION = '2.0';
57
- export const AUDIT_EXPORT_SIGNATURE_VERSION = '1.0';
58
- export const FORENSIC_MANIFEST_SIGNATURE_ALGORITHM = 'RSASSA-PKCS1-v1_5-SHA-256';
55
+ export const FORENSIC_MANIFEST_VERSION = '3.0';
56
+ export const CONFIRMATION_SIGNATURE_VERSION = '3.0';
57
+ export const AUDIT_EXPORT_SIGNATURE_VERSION = '2.0';
58
+ export const FORENSIC_MANIFEST_SIGNATURE_ALGORITHM = 'RSASSA-PSS-SHA-256';
59
59
 
60
60
  const SHA256_HEX_REGEX = /^[a-f0-9]{64}$/i;
61
61
 
@@ -5,7 +5,7 @@
5
5
  "name": "DATA_WORKER_NAME",
6
6
  "account_id": "ACCOUNT_ID",
7
7
  "main": "src/data-worker.ts",
8
- "compatibility_date": "2026-04-09",
8
+ "compatibility_date": "2026-04-11",
9
9
  "compatibility_flags": [
10
10
  "nodejs_compat"
11
11
  ],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "image-worker",
3
- "version": "5.5.1",
3
+ "version": "6.0.0",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "deploy": "wrangler deploy",
@@ -9,9 +9,5 @@
9
9
  },
10
10
  "devDependencies": {
11
11
  "wrangler": "^4.81.1"
12
- },
13
- "overrides": {
14
- "undici": "7.24.1",
15
- "yauzl": "3.2.1"
16
12
  }
17
13
  }
@@ -2,7 +2,7 @@
2
2
  "name": "IMAGES_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/image-worker.ts",
5
- "compatibility_date": "2026-04-09",
5
+ "compatibility_date": "2026-04-11",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pdf-worker",
3
- "version": "5.5.1",
3
+ "version": "6.0.0",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "generate:assets": "node scripts/generate-assets.js",
@@ -10,9 +10,5 @@
10
10
  },
11
11
  "devDependencies": {
12
12
  "wrangler": "^4.81.1"
13
- },
14
- "overrides": {
15
- "undici": "7.24.1",
16
- "yauzl": "3.2.1"
17
13
  }
18
14
  }
@@ -2,7 +2,7 @@
2
2
  "name": "PDF_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/pdf-worker.ts",
5
- "compatibility_date": "2026-04-09",
5
+ "compatibility_date": "2026-04-11",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "user-worker",
3
- "version": "5.5.1",
3
+ "version": "6.0.0",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "deploy": "wrangler deploy",
@@ -9,9 +9,5 @@
9
9
  },
10
10
  "devDependencies": {
11
11
  "wrangler": "^4.81.1"
12
- },
13
- "overrides": {
14
- "undici": "7.24.1",
15
- "yauzl": "3.2.1"
16
12
  }
17
13
  }
@@ -2,7 +2,7 @@
2
2
  "name": "USER_WORKER_NAME",
3
3
  "account_id": "ACCOUNT_ID",
4
4
  "main": "src/user-worker.ts",
5
- "compatibility_date": "2026-04-09",
5
+ "compatibility_date": "2026-04-11",
6
6
  "compatibility_flags": [
7
7
  "nodejs_compat"
8
8
  ],
@@ -1,6 +1,6 @@
1
1
  #:schema node_modules/wrangler/config-schema.json
2
2
  name = "PAGES_PROJECT_NAME"
3
- compatibility_date = "2026-04-09"
3
+ compatibility_date = "2026-04-11"
4
4
  compatibility_flags = ["nodejs_compat"]
5
5
  pages_build_output_dir = "./build/client"
6
6