@actuate-media/cms-admin 0.82.0 → 0.83.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @actuate-media/cms-admin
2
2
 
3
+ ## 0.83.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 3d1a79f: Timestamp-bound HMAC webhook signing with skew/replay verification (`verifyActuateWebhook`), delivery-id headers on form webhooks, publish secret reveal + 24h rotation grace, and consumer verification docs (#679).
8
+
3
9
  ## 0.82.0
4
10
 
5
11
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"WebhooksTab.d.ts","sourceRoot":"","sources":["../../../src/views/settings/WebhooksTab.tsx"],"names":[],"mappings":"AAkCA,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,2CAqPtD"}
1
+ {"version":3,"file":"WebhooksTab.d.ts","sourceRoot":"","sources":["../../../src/views/settings/WebhooksTab.tsx"],"names":[],"mappings":"AAoCA,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,2CAiTtD"}
@@ -21,6 +21,7 @@ export function WebhooksTab({ role }) {
21
21
  const [name, setName] = useState('');
22
22
  const [saving, setSaving] = useState(false);
23
23
  const [retryingId, setRetryingId] = useState(null);
24
+ const [revealedSecret, setRevealedSecret] = useState(null);
24
25
  const load = useCallback(async () => {
25
26
  setLoading(true);
26
27
  setError(null);
@@ -60,7 +61,10 @@ export function WebhooksTab({ role }) {
60
61
  toast.error(res.error);
61
62
  return;
62
63
  }
63
- toast.success('Publish webhook created');
64
+ toast.success('Publish webhook created — copy the signing secret now');
65
+ if (res.data?.id && typeof res.data.secret === 'string' && res.data.secret) {
66
+ setRevealedSecret({ id: res.data.id, secret: res.data.secret });
67
+ }
64
68
  setUrl('');
65
69
  setName('');
66
70
  void load();
@@ -72,6 +76,22 @@ export function WebhooksTab({ role }) {
72
76
  return;
73
77
  }
74
78
  toast.success('Webhook removed');
79
+ if (revealedSecret?.id === id)
80
+ setRevealedSecret(null);
81
+ void load();
82
+ }
83
+ async function rotateSecret(id) {
84
+ const res = await cmsApi(`/webhooks/${encodeURIComponent(id)}/rotate-secret`, {
85
+ method: 'POST',
86
+ });
87
+ if (res.error) {
88
+ toast.error(res.error);
89
+ return;
90
+ }
91
+ toast.success('Secret rotated — previous secret remains valid for 24 hours');
92
+ if (res.data?.id && typeof res.data.secret === 'string' && res.data.secret) {
93
+ setRevealedSecret({ id: res.data.id, secret: res.data.secret });
94
+ }
75
95
  void load();
76
96
  }
77
97
  async function retryDelivery(id) {
@@ -96,6 +116,9 @@ export function WebhooksTab({ role }) {
96
116
  if (error) {
97
117
  return (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive rounded-lg border p-3 text-sm", children: [error, _jsx("button", { type: "button", className: "ml-3 underline", onClick: () => void load(), children: "Retry" })] }));
98
118
  }
99
- return (_jsxs("div", { className: "space-y-4", children: [_jsx(SettingsCard, { title: "Publish webhooks", description: "Signed document.published notifications for Astro/Vercel rebuild or cache purge. A 2xx response means the host was notified \u2014 not that the public page is already live.", children: _jsxs("div", { className: "space-y-3", children: [endpoints.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "No webhooks yet. Without one, editors only see \u201CPublished in CMS\u201D and the public host may lag behind TTL caches." })) : (_jsx("ul", { className: "space-y-2", "aria-label": "Webhook endpoints", children: endpoints.map((ep) => (_jsxs("li", { className: "border-border flex items-start justify-between gap-3 rounded-md border p-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("p", { className: "text-foreground truncate text-sm font-medium", children: [ep.name || 'Untitled webhook', !ep.active && (_jsx("span", { className: "text-muted-foreground ml-2 text-xs", children: "(inactive)" }))] }), _jsx("p", { className: "text-muted-foreground truncate font-mono text-xs", children: ep.url }), _jsxs("p", { className: "text-muted-foreground mt-1 text-xs", children: ["Events: ", (Array.isArray(ep.events) ? ep.events : []).join(', ') || '—'] })] }), canEdit && (_jsxs("button", { type: "button", onClick: () => void removeEndpoint(ep.id), className: "text-muted-foreground hover:text-destructive inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs", "aria-label": `Delete ${ep.name || ep.url}`, children: [_jsx(Trash2, { size: 14 }), "Delete"] }))] }, ep.id))) })), canEdit && (_jsxs("div", { className: "border-border mt-4 space-y-2 border-t pt-4", children: [_jsxs("label", { className: "block text-sm", children: [_jsx("span", { className: "text-muted-foreground mb-1 block", children: "Name" }), _jsx("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: "Astro rebuild", className: "border-border bg-input-background w-full rounded-md border px-3 py-2 text-sm" })] }), _jsxs("label", { className: "block text-sm", children: [_jsx("span", { className: "text-muted-foreground mb-1 block", children: "HTTPS URL" }), _jsx("input", { type: "url", value: url, onChange: (e) => setUrl(e.target.value), placeholder: "https://api.vercel.com/.../deployments", className: "border-border bg-input-background w-full rounded-md border px-3 py-2 font-mono text-sm" })] }), _jsxs("p", { className: "text-muted-foreground text-xs", children: ["Creates an active endpoint for ", _jsx("code", { children: "document.published" }), " only. Payload is HMAC-signed with ", _jsx("code", { children: "X-Actuate-Signature" }), "."] }), _jsxs(Button, { type: "button", variant: "primary", size: "sm", onClick: () => void createEndpoint(), loading: saving, children: [_jsx(Plus, { size: 16 }), "Add publish webhook"] })] }))] }) }), _jsxs(SettingsCard, { title: "Failed deliveries", description: "Retry outbound webhook failures. Automatic retries also run on the cleanup cron.", children: [_jsx("div", { className: "mb-3 flex justify-end", children: _jsxs("button", { type: "button", onClick: () => void load(), className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs", children: [_jsx(RefreshCw, { size: 14 }), "Refresh"] }) }), deliveries.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "No failed or retrying deliveries." })) : (_jsx("ul", { className: "space-y-2", "aria-label": "Failed webhook deliveries", children: deliveries.map((d) => (_jsxs("li", { className: "border-border flex items-center justify-between gap-3 rounded-md border p-3 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("p", { className: "text-foreground flex items-center gap-1.5 font-medium", children: [_jsx(AlertTriangle, { size: 14, className: "text-destructive shrink-0", "aria-hidden": true }), d.event, " \u00B7 ", d.status] }), _jsxs("p", { className: "text-muted-foreground truncate text-xs", children: [d.endpoint?.name || d.endpoint?.url || d.endpoint?.id, " \u00B7 attempt ", d.attempts, "/", d.maxAttempts, d.responseStatus != null ? ` · HTTP ${d.responseStatus}` : ''] })] }), canEdit && (_jsxs("button", { type: "button", onClick: () => void retryDelivery(d.id), disabled: retryingId === d.id, className: "border-border hover:bg-accent inline-flex shrink-0 items-center gap-1 rounded-md border px-2 py-1 text-xs disabled:opacity-50", children: [_jsx(RotateCcw, { size: 12 }), "Retry"] }))] }, d.id))) }))] })] }));
119
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(SettingsCard, { title: "Publish webhooks", description: "Signed document.published notifications (HMAC + timestamp skew). Consumers must verify X-Actuate-Signature and reject replays outside the skew window before rebuild/purge. A 2xx response means notified \u2014 not that the public page is live.", children: _jsxs("div", { className: "space-y-3", children: [revealedSecret && (_jsxs("div", { className: "border-border bg-muted rounded-md border p-3 text-sm", role: "status", children: [_jsx("p", { className: "text-foreground mb-1 font-medium", children: "Signing secret (shown once \u2014 copy now)" }), _jsx("code", { className: "text-foreground block font-mono text-xs break-all", children: revealedSecret.secret }), _jsxs("div", { className: "mt-2 flex gap-2", children: [_jsx("button", { type: "button", className: "text-primary text-xs font-medium hover:underline", onClick: () => {
120
+ void navigator.clipboard.writeText(revealedSecret.secret);
121
+ toast.success('Secret copied');
122
+ }, children: "Copy" }), _jsx("button", { type: "button", className: "text-muted-foreground text-xs hover:underline", onClick: () => setRevealedSecret(null), children: "Dismiss" })] })] })), endpoints.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "No webhooks yet. Without one, editors only see \u201CPublished in CMS\u201D and the public host may lag behind TTL caches." })) : (_jsx("ul", { className: "space-y-2", "aria-label": "Webhook endpoints", children: endpoints.map((ep) => (_jsxs("li", { className: "border-border flex items-start justify-between gap-3 rounded-md border p-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("p", { className: "text-foreground truncate text-sm font-medium", children: [ep.name || 'Untitled webhook', !ep.active && (_jsx("span", { className: "text-muted-foreground ml-2 text-xs", children: "(inactive)" }))] }), _jsx("p", { className: "text-muted-foreground truncate font-mono text-xs", children: ep.url }), _jsxs("p", { className: "text-muted-foreground mt-1 text-xs", children: ["Events: ", (Array.isArray(ep.events) ? ep.events : []).join(', ') || '—'] })] }), canEdit && (_jsxs("div", { className: "flex shrink-0 flex-col gap-1", children: [_jsxs("button", { type: "button", onClick: () => void rotateSecret(ep.id), className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs", "aria-label": `Rotate secret for ${ep.name || ep.url}`, children: [_jsx(RefreshCw, { size: 14 }), "Rotate secret"] }), _jsxs("button", { type: "button", onClick: () => void removeEndpoint(ep.id), className: "text-muted-foreground hover:text-destructive inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs", "aria-label": `Delete ${ep.name || ep.url}`, children: [_jsx(Trash2, { size: 14 }), "Delete"] })] }))] }, ep.id))) })), canEdit && (_jsxs("div", { className: "border-border mt-4 space-y-2 border-t pt-4", children: [_jsxs("label", { className: "block text-sm", children: [_jsx("span", { className: "text-muted-foreground mb-1 block", children: "Name" }), _jsx("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: "Astro rebuild", className: "border-border bg-input-background w-full rounded-md border px-3 py-2 text-sm" })] }), _jsxs("label", { className: "block text-sm", children: [_jsx("span", { className: "text-muted-foreground mb-1 block", children: "HTTPS URL" }), _jsx("input", { type: "url", value: url, onChange: (e) => setUrl(e.target.value), placeholder: "https://api.vercel.com/.../deployments", className: "border-border bg-input-background w-full rounded-md border px-3 py-2 font-mono text-sm" })] }), _jsxs("p", { className: "text-muted-foreground text-xs", children: ["Creates an active endpoint for ", _jsx("code", { children: "document.published" }), " only. Payload is HMAC-signed with ", _jsx("code", { children: "X-Actuate-Signature" }), "."] }), _jsxs(Button, { type: "button", variant: "primary", size: "sm", onClick: () => void createEndpoint(), loading: saving, children: [_jsx(Plus, { size: 16 }), "Add publish webhook"] })] }))] }) }), _jsxs(SettingsCard, { title: "Failed deliveries", description: "Retry outbound webhook failures. Automatic retries also run on the cleanup cron.", children: [_jsx("div", { className: "mb-3 flex justify-end", children: _jsxs("button", { type: "button", onClick: () => void load(), className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs", children: [_jsx(RefreshCw, { size: 14 }), "Refresh"] }) }), deliveries.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "No failed or retrying deliveries." })) : (_jsx("ul", { className: "space-y-2", "aria-label": "Failed webhook deliveries", children: deliveries.map((d) => (_jsxs("li", { className: "border-border flex items-center justify-between gap-3 rounded-md border p-3 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("p", { className: "text-foreground flex items-center gap-1.5 font-medium", children: [_jsx(AlertTriangle, { size: 14, className: "text-destructive shrink-0", "aria-hidden": true }), d.event, " \u00B7 ", d.status] }), _jsxs("p", { className: "text-muted-foreground truncate text-xs", children: [d.endpoint?.name || d.endpoint?.url || d.endpoint?.id, " \u00B7 attempt ", d.attempts, "/", d.maxAttempts, d.responseStatus != null ? ` · HTTP ${d.responseStatus}` : ''] })] }), canEdit && (_jsxs("button", { type: "button", onClick: () => void retryDelivery(d.id), disabled: retryingId === d.id, className: "border-border hover:bg-accent inline-flex shrink-0 items-center gap-1 rounded-md border px-2 py-1 text-xs disabled:opacity-50", children: [_jsx(RotateCcw, { size: 12 }), "Retry"] }))] }, d.id))) }))] })] }));
100
123
  }
101
124
  //# sourceMappingURL=WebhooksTab.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebhooksTab.js","sourceRoot":"","sources":["../../../src/views/settings/WebhooksTab.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WebhooksTab.js","sourceRoot":"","sources":["../../../src/views/settings/WebhooksTab.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/cms-admin",
3
- "version": "0.82.0",
3
+ "version": "0.83.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -98,7 +98,7 @@
98
98
  "tailwindcss": "^4.0.0",
99
99
  "typescript": "^5.7.0",
100
100
  "vitest": "^4.1.0",
101
- "@actuate-media/cms-core": "0.105.0",
101
+ "@actuate-media/cms-core": "0.106.0",
102
102
  "@actuate-media/component-blocks": "0.2.2",
103
103
  "@actuate-media/plugin-ai": "0.5.6",
104
104
  "@actuate-media/plugin-blocks": "0.1.0",
@@ -17,6 +17,8 @@ interface WebhookEndpoint {
17
17
  url: string
18
18
  events: string[]
19
19
  active: boolean
20
+ /** Present only on create / rotate responses. */
21
+ secret?: string | null
20
22
  }
21
23
 
22
24
  interface DeliveryRow {
@@ -42,6 +44,7 @@ export function WebhooksTab({ role }: { role?: string }) {
42
44
  const [name, setName] = useState('')
43
45
  const [saving, setSaving] = useState(false)
44
46
  const [retryingId, setRetryingId] = useState<string | null>(null)
47
+ const [revealedSecret, setRevealedSecret] = useState<{ id: string; secret: string } | null>(null)
45
48
 
46
49
  const load = useCallback(async () => {
47
50
  setLoading(true)
@@ -84,7 +87,10 @@ export function WebhooksTab({ role }: { role?: string }) {
84
87
  toast.error(res.error)
85
88
  return
86
89
  }
87
- toast.success('Publish webhook created')
90
+ toast.success('Publish webhook created — copy the signing secret now')
91
+ if (res.data?.id && typeof res.data.secret === 'string' && res.data.secret) {
92
+ setRevealedSecret({ id: res.data.id, secret: res.data.secret })
93
+ }
88
94
  setUrl('')
89
95
  setName('')
90
96
  void load()
@@ -97,6 +103,22 @@ export function WebhooksTab({ role }: { role?: string }) {
97
103
  return
98
104
  }
99
105
  toast.success('Webhook removed')
106
+ if (revealedSecret?.id === id) setRevealedSecret(null)
107
+ void load()
108
+ }
109
+
110
+ async function rotateSecret(id: string) {
111
+ const res = await cmsApi<WebhookEndpoint>(`/webhooks/${encodeURIComponent(id)}/rotate-secret`, {
112
+ method: 'POST',
113
+ })
114
+ if (res.error) {
115
+ toast.error(res.error)
116
+ return
117
+ }
118
+ toast.success('Secret rotated — previous secret remains valid for 24 hours')
119
+ if (res.data?.id && typeof res.data.secret === 'string' && res.data.secret) {
120
+ setRevealedSecret({ id: res.data.id, secret: res.data.secret })
121
+ }
100
122
  void load()
101
123
  }
102
124
 
@@ -141,9 +163,38 @@ export function WebhooksTab({ role }: { role?: string }) {
141
163
  <div className="space-y-4">
142
164
  <SettingsCard
143
165
  title="Publish webhooks"
144
- description="Signed document.published notifications for Astro/Vercel rebuild or cache purge. A 2xx response means the host was notified — not that the public page is already live."
166
+ description="Signed document.published notifications (HMAC + timestamp skew). Consumers must verify X-Actuate-Signature and reject replays outside the skew window before rebuild/purge. A 2xx response means notified — not that the public page is live."
145
167
  >
146
168
  <div className="space-y-3">
169
+ {revealedSecret && (
170
+ <div className="border-border bg-muted rounded-md border p-3 text-sm" role="status">
171
+ <p className="text-foreground mb-1 font-medium">
172
+ Signing secret (shown once — copy now)
173
+ </p>
174
+ <code className="text-foreground block font-mono text-xs break-all">
175
+ {revealedSecret.secret}
176
+ </code>
177
+ <div className="mt-2 flex gap-2">
178
+ <button
179
+ type="button"
180
+ className="text-primary text-xs font-medium hover:underline"
181
+ onClick={() => {
182
+ void navigator.clipboard.writeText(revealedSecret.secret)
183
+ toast.success('Secret copied')
184
+ }}
185
+ >
186
+ Copy
187
+ </button>
188
+ <button
189
+ type="button"
190
+ className="text-muted-foreground text-xs hover:underline"
191
+ onClick={() => setRevealedSecret(null)}
192
+ >
193
+ Dismiss
194
+ </button>
195
+ </div>
196
+ </div>
197
+ )}
147
198
  {endpoints.length === 0 ? (
148
199
  <p className="text-muted-foreground text-sm">
149
200
  No webhooks yet. Without one, editors only see “Published in CMS” and the public host
@@ -169,15 +220,26 @@ export function WebhooksTab({ role }: { role?: string }) {
169
220
  </p>
170
221
  </div>
171
222
  {canEdit && (
172
- <button
173
- type="button"
174
- onClick={() => void removeEndpoint(ep.id)}
175
- className="text-muted-foreground hover:text-destructive inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs"
176
- aria-label={`Delete ${ep.name || ep.url}`}
177
- >
178
- <Trash2 size={14} />
179
- Delete
180
- </button>
223
+ <div className="flex shrink-0 flex-col gap-1">
224
+ <button
225
+ type="button"
226
+ onClick={() => void rotateSecret(ep.id)}
227
+ className="text-muted-foreground hover:text-foreground inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs"
228
+ aria-label={`Rotate secret for ${ep.name || ep.url}`}
229
+ >
230
+ <RefreshCw size={14} />
231
+ Rotate secret
232
+ </button>
233
+ <button
234
+ type="button"
235
+ onClick={() => void removeEndpoint(ep.id)}
236
+ className="text-muted-foreground hover:text-destructive inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs"
237
+ aria-label={`Delete ${ep.name || ep.url}`}
238
+ >
239
+ <Trash2 size={14} />
240
+ Delete
241
+ </button>
242
+ </div>
181
243
  )}
182
244
  </li>
183
245
  ))}