PageSourceSearch

https://platform.cequens.com/assets/AuditLogPage-CtsY45-V.js

js cequens.com collected 2026-10-02 05:34:21 UTC 18,208 bytes, 1 lines download raw bytes

1import{l as me,r,j as e}from"./vendor-react-BXs1OprT.js";import{u as ue}from"./use-permission-BP9_roX-.js";import{B as xe,C as pe,D as ge}from"./use-roles-CA_r4J4n.js";import{k as he,P as K,M as W,B as p,a9 as w,N as J,a8 as be,R as S,D as fe,f as ve,g as je,h as Ne,i as ye,j as ke}from"./index-CuGE_ghf.js";import{F as X}from"./filter-select-DIfa6Z29.js";import{C as G}from"./calendar-X4vopFPV.js";import{C as Ce,a as we,b as Se}from"./collapsible-B9qa68dP.js";import{A as Ae,b as Te,a as De}from"./alert-tItfIwZD.js";import{A as Oe,a as Ie,b as ze,c as _e,d as Ee,e as Pe,f as Re,g as Fe}from"./alert-dialog-DcTjdx5s.js";import{H as Me,a as Le,R as Be}from"./RbacPageShell-D5jb6X2q.js";import{a as He,g as Ue}from"./rbac-audit-labels-ChTR3a58.js";import{q as Ve,bh as Z,X as qe,b6 as Ke,af as We,ag as Je,h as Xe,aC as R,T,az as Ge,g as j,au as Ze,aA as F,aD as M,aB as $e,ap as $,a1 as Q,aE as Qe,d as Ye,a4 as et,aj as tt}from"./vendor-ui-BRcYFyVA.js";import{f as Y}from"./vendor-lib-D0CMuov3.js";import"./team-api-CrI9hchS.js";import"./export-timestamp-f3vYd0r1.js";import"./checkbox-BAyn9gxM.js";const st=["role.create","role.update","role.delete","role.assign","role.unassign","permission.create","permission.update","permission.delete","user.creation","user.update","user.deletion","user.invited","user.activated","user.deactivated","user.password.reset","user.role.change","user.login","user.logout","session.revoke","assignment.expired","security.policy-change","settings.update"],ee=25,at={"role.create":"default","role.update":"secondary","role.delete":"destructive","role.assign":"default","role.unassign":"outline","permission.create":"default","permission.update":"secondary","permission.delete":"destructive","user.invite":"default","user.update":"secondary","user.delete":"destructive","user.block":"destructive","user.unblock":"default","user.password-reset":"outline","user.mfa-reset":"outline","session.revoke":"destructive","assignment.expired":"outline","security.policy-change":"secondary"},rt={"role.create":Q,"role.update":$,"role.delete":F,"role.assign":M,"role.unassign":Qe,"permission.create":Q,"permission.update":$,"permission.delete":F,"user.creation":M,"user.update":R,"user.deletion":$e,"user.invited":M,"user.activated":T,"user.deactivated":F,"user.password.reset":Ze,"user.role.change":R,"user.login":j,"user.logout":j,"session.revoke":j,"assignment.expired":Ge,"security.policy-change":T,"settings.update":R},it={"role.create":{icon:"text-emerald-600 dark:text-emerald-400",bg:"bg-emerald-100 dark:bg-emerald-900/30"},"role.update":{icon:"text-blue-600 dark:text-blue-400",bg:"bg-blue-100 dark:bg-blue-900/30"},"role.delete":{icon:"text-destructive",bg:"bg-destructive/10"},"role.assign":{icon:"text-emerald-600 dark:text-emerald-400",bg:"bg-emerald-100 dark:bg-emerald-900/30"},"role.unassign":{icon:"text-amber-600 dark:text-amber-400",bg:"bg-amber-100 dark:bg-amber-900/30"},"permission.create":{icon:"text-emerald-600 dark:text-emerald-400",bg:"bg-emerald-100 dark:bg-emerald-900/30"},"permission.update":{icon:"text-blue-600 dark:text-blue-400",bg:"bg-blue-100 dark:bg-blue-900/30"},"permission.delete":{icon:"text-destructive",bg:"bg-destructive/10"},"session.revoke":{icon:"text-destructive",bg:"bg-destructive/10"},"assignment.expired":{icon:"text-amber-600 dark:text-amber-400",bg:"bg-amber-100 dark:bg-amber-900/30"},"security.policy-change":{icon:"text-blue-600 dark:text-blue-400",bg:"bg-blue-100 dark:bg-blue-900/30"}},nt={icon:"text-muted-foreground",bg:"bg-muted"};function wt(){const{t,i18n:m}=me(),u=ue("export-audit-log"),[l,g]=r.useState(""),[h,N]=r.useState([]),[c,i]=r.useState([]),[n,y]=r.useState(void 0),[o,b]=r.useState(void 0),[ae,L]=r.useState(!1),[re,B]=r.useState(!1),[f,d]=r.useState(1),[a,H]=r.useState(null),[v,D]=r.useState(null),k=xe(),U=r.useMemo(()=>({search:l||void 0,actions:h.length>0?h:void 0,serviceNames:c.length>0?c:void 0,fromDate:n?n.toISOString():void 0,toDate:o?o.toISOString():void 0,pageNo:f,pageSize:ee}),[l,h,c,n,o,f]),{data:O,isLoading:I,isError:V,refetch:ie}=pe(U),z=ge(),q=r.useMemo(()=>new Intl.DateTimeFormat(m.language,{dateStyle:"medium",timeStyle:"short"}),[m.language]),_=O?.total??0,E=Math.ceil(_/ee),P=!!l||h.length>0||c.length>0||!!n||!!o,ne=()=>{g(""),N([]),i([]),y(void 0),b(void 0),d(1)},oe=r.useMemo(()=>["Console","OCC","Analytics","Billing"].map(s=>({value:s,label:s})),[]),C=r.useMemo(()=>s=>He(s,t),[t]),le=r.useMemo(()=>st.map(s=>({value:s,label:C(s)})),[C]),ce=e.jsxs(Me,{title:t("rbac.help.auditTitle","About the audit log"),children:[e.jsx("p",{children:t("rbac.help.auditIntro","A tamper-evident, append-only record of every role and permission change. Required for SOC 2 CC6.6 (timely access removal) and CC7.2 (system monitoring).")}),e.jsx(Le,{heading:t("rbac.help.tipsHeading","Tips"),items:[t("rbac.help.tip.hashChain","Each entry links to the previous one via a hash. Click an entry to see the chain — any tampering breaks it."),t("rbac.help.tip.retention","Hot retention 90 days, cold (S3 Object Lock) 7 years. Export for offline review at any time."),t("rbac.help.tip.diff","Update entries show before/after side-by-side so you can see exactly what changed."),t("rbac.help.tip.export","Export respects the active filters — narrow first, then download.")]})]});
1return e.jsxs(Be,{backTo:"/settings/account/roles",backLabel:t("rbac.builder.backToList","Back to roles"),title:t("rbac.audit.title","Audit log"),subtitle:t("rbac.audit.subtitle","Tamper-evident record of every role and permission change."),actions:u?e.jsxs(p,{variant:"outline",disabled:z.isPending||_===0,onClick:()=>z.mutate(U),children:[e.jsx(et,{className:"me-2 size-4"}),z.isPending?t("common.exporting","Exporting..."):t("rbac.audit.exportCsv","Export CSV")]}):void 0,helpPanel:ce,children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("div",{className:"relative min-w-[260px] max-w-md flex-1",children:[e.jsx(Ve,{className:"absolute start-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground"}),e.jsx(he,{value:l,onChange:s=>{g(s.target.value),d(1)},placeholder:t("rbac.audit.searchPlaceholder","Actor, target, or request ID..."),className:"ps-9"})]}),e.jsx(X,{placeholder:t("rbac.audit.service","Service"),options:oe,selectedValues:c,onSelectionChange:s=>{i(s),d(1)},onClear:()=>{i([]),d(1)},contentWidth:"w-56"}),e.jsx(X,{placeholder:t("rbac.audit.action","Action"),options:le,selectedValues:h,onSelectionChange:s=>{N(s),d(1)},onClear:()=>{N([]),d(1)},contentWidth:"w-72",searchable:!0,searchPlaceholder:t("common.search","Search")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(K,{open:ae,onOpenChange:L,children:[e.jsx(W,{asChild:!0,children:e.jsxs(p,{type:"button",variant:"outline",size:"sm",className:w("h-9 min-w-[140px] justify-start text-start font-normal",!n&&"text-muted-foreground"),children:[e.jsx(Z,{className:"me-2 size-3.5"}),n?Y(n,"MMM d, yyyy"):t("rbac.audit.fromDate","From")]})}),e.jsx(J,{className:"w-auto p-0",align:"start",children:e.jsx(G,{mode:"single",selected:n,onSelect:s=>{y(s),L(!1),d(1)}})})]}),e.jsx("span",{className:"text-xs text-muted-foreground",children:t("common.to","to")}),e.jsxs(K,{open:re,onOpenChange:B,children:[e.jsx(W,{asChild:!0,children:e.jsxs(p,{type:"button",variant:"outline",size:"sm",className:w("h-9 min-w-[140px] justify-start text-start font-normal",!o&&"text-muted-foreground"),children:[e.jsx(Z,{className:"me-2 size-3.5"}),o?Y(o,"MMM d, yyyy"):t("rbac.audit.toDate","To")]})}),e.jsx(J,{className:"w-auto p-0",align:"start",children:e.jsx(G,{mode:"single",selected:o,onSelect:s=>{b(s),B(!1),d(1)},disabled:s=>n?s<n:!1})})]})]}),P&&e.jsxs(p,{variant:"ghost",size:"sm",onClick:ne,className:"gap-1",children:[e.jsx(qe,{className:"size-3.5"}),t("common.clearAll","Clear all")]}),e.jsxs("span",{className:"ms-auto inline-flex items-center gap-1 text-xs text-muted-foreground",children:[e.jsx(Ke,{className:"size-3.5"}),P?t("rbac.audit.filteringNote","Filters applied"):t("rbac.audit.noFilters","No filters")]})]}),V&&e.jsxs("div",{className:"border-destructive/40 bg-destructive/5 flex items-center justify-between rounded-md border p-4",children:[e.jsx("span",{className:"text-sm",children:t("rbac.audit.errorLoading","Failed to load audit log")}),e.jsx(p,{size:"sm",variant:"outline",onClick:()=>ie(),children:t("common.retry","Retry")})]}),e.jsxs("div",{className:"overflow-hidden rounded-xl border",children:[e.jsxs("div",{className:"bg-muted/50 grid grid-cols-[180px_1.2fr_2fr_120px_64px] gap-4 border-b px-4 py-2.5 text-xs font-medium text-muted-foreground",children:[e.jsx("div",{children:t("rbac.audit.col.when","When")}),e.jsx("div",{children:t("rbac.audit.col.actor","Actor")}),e.jsx("div",{children:t("rbac.audit.col.activity","Activity")}),e.jsx("div",{children:t("rbac.audit.col.service","Service")}),e.jsx("div",{className:"text-end",children:t("rbac.audit.col.actions","Actions")})]}),I&&e.jsx("div",{children:Array.from({length:6}).map((s,x)=>e.jsx("div",{className:"grid grid-cols-[180px_1.2fr_2fr_120px_64px] gap-4 border-b px-4 py-3 last:border-0",children:Array.from({length:5}).map((lt,de)=>e.jsx(be,{className:"h-4 w-3/4"},de))},x))}),!I&&!V&&O?.entries.length===0&&e.jsx("div",{className:"p-12 text-center text-sm text-muted-foreground",children:P?t("rbac.audit.noResults","No log entries match your filters"):t("rbac.audit.empty","No log entries yet")}),!I&&O?.entries.map(s=>{const x=Ue(s,t);return e.jsxs("div",{className:"hover:bg-muted/30 grid grid-cols-[180px_1.2fr_2fr_12
10px_64px] items-center gap-4 border-b px-4 py-3 text-sm transition-colors last:border-0",children:[e.jsx("div",{className:"whitespace-nowrap text-muted-foreground",children:q.format(new Date(s.timestamp))}),e.jsx("div",{className:"min-w-0",children:e.jsx("div",{className:"truncate",title:s.actorEmail,children:s.actorEmail})}),e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx(S,{variant:at[s.action]??"outline",className:"flex-shrink-0 text-xs",title:s.action,children:C(s.action)}),e.jsx("span",{className:"truncate",title:x,children:x})]}),e.jsx("div",{children:s.serviceName?e.jsx(S,{variant:"outline",className:"text-xs",children:s.serviceName}):e.jsx("span",{className:"text-muted-foreground",children:"—"})}),e.jsx("div",{className:"flex justify-end",children:e.jsx(p,{size:"sm",variant:"ghost",onClick:()=>H(s),"aria-label":t("common.viewDetails","View details"),children:e.jsx(We,{className:"size-4"})})})]},s.id)})]}),E>1&&e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:t("rbac.audit.pageInfo","Showing page {{page}} of {{total}} — {{count}} entries",{page:f,total:E,count:_})}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsxs(p,{size:"sm",variant:"outline",disabled:f<=1,onClick:()=>d(s=>s-1),children:[e.jsx(Je,{className:"size-4 rtl:rotate-180"}),t("common.previous","Previous")]}),e.jsxs(p,{size:"sm",variant:"outline",disabled:f>=E,onClick:()=>d(s=>s+1),children:[t("common.next","Next"),e.jsx(Xe,{className:"size-4 rtl:rotate-180"})]})]})]}),e.jsx(fe,{open:a!==null,onOpenChange:s=>!s&&H(null),children:e.jsx(ve,{className:"max-w-2xl",children:a&&e.jsxs(e.Fragment,{children:[e.jsx(je,{children:e.jsxs("div",{className:"flex items-start gap-3",children:[(()=>{const s=rt[a.action]??T,x=it[a.action]??nt;return e.jsx("span",{className:w("flex size-10 flex-shrink-0 items-center justify-center rounded-full",x.bg),children:e.jsx(s,{className:w("size-5",x.icon)})})})(),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx(Ne,{className:"text-base",children:C(a.action)}),e.jsx(ye,{children:t("rbac.audit.detail.byAt","{{actor}} · {{when}}",{actor:a.actorEmail,when:q.format(new Date(a.timestamp))})}),e.jsx("code",{className:"text-muted-foreground/80 mt-1 inline-block text-[10px]",children:a.action})]})]})}),e.jsxs(ke,{className:"max-h-[70vh] space-y-4 overflow-y-auto",children:[e.jsxs("dl",{className:"bg-muted/30 divide-y rounded-lg border",children:[e.jsx(A,{label:t("rbac.audit.col.target","Target"),children:e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-medium",children:a.targetName}),e.jsx(S,{variant:"outline",className:"text-xs capitalize",children:a.targetType})]})}),a.serviceName&&e.jsx(A,{label:t("rbac.audit.service","Service"),children:e.jsx(S,{variant:"outline",children:a.serviceName})}),e.jsx(A,{label:t("rbac.audit.detail.fromIp","From IP"),children:e.jsx(te,{value:a.ipAddress,t})}),e.jsx(A,{label:t("rbac.audit.requestId","Request ID"),children:e.jsx(te,{value:a.requestId,t})})]}),(a.before||a.after)&&e.jsx(ot,{before:a.before,after:a.after,t}),a.targetType==="assignment"&&e.jsxs(Ae,{className:"border-amber-200 bg-amber-50 text-amber-900 dark:border-amber-900/50 dark:bg-amber-950/30 dark:text-amber-200",children:[e.jsx(j,{}),e.jsx(Te,{children:t("rbac.audit.revoke.title","Force re-authentication")}),e.jsxs(De,{className:"text-amber-800/80 dark:text-amber-300/80",children:[t("rbac.audit.revoke.help","Revoke this user’s active sessions so the role change takes effect immediately instead of waiting for the JWT to expire."),e.jsxs(p,{size:"sm",variant:"outline",className:"mt-2 self-start border-amber-300 text-amber-900 hover:bg-amber-100 dark:border-amber-800 dark:text-amber-200 dark:hover:bg-amber-900/40",onClick:()=>D(a),children:[e.jsx(j,{className:"me-1.5 size-3.5"}),t("rbac.audit.revoke.action","Revoke session")]})]})]}),e.jsxs(Ce,{className:"bg-muted/20 group rounded-lg border",children:[e.jsxs(we,{className:"flex w-full cursor-pointer items-center justify-between gap-2 px-4 py-2.5 text-sm font-medium",children:[e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(T,{className:"size-4 text-muted-foreground"}),t("rbac.audit.detail.tamper","Tamper evidence")]}),e.jsx(Ye,{className:"size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180"})]}),e.jsxs(Se,{className:"space-y-2 px-4 pb-3 pt-1 text-xs",children:[e.jsx("p",{className:"text-muted-foreground",children:t("rbac.audit.detail.tamperHelp","Each entry is hashed and chained to the previous one. Mismatched hashes indicate tampering.")}),e.jsxs("div",{className:"space-y-1 break-all font-mono",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"prev:"})," ",a.previousHash??"—"]}
1),e.jsxs("div",{children:[e.jsx("span",{className:"text-muted-foreground",children:"this:"})," ",a.hash]})]})]})]})]})]})})}),e.jsx(Oe,{open:v!==null,onOpenChange:s=>{s||D(null)},children:e.jsxs(Ie,{children:[e.jsxs(ze,{children:[e.jsx(_e,{children:t("rbac.audit.revoke.confirmTitle","Revoke active sessions?")}),e.jsx(Ee,{children:t("rbac.audit.revoke.confirmBody","The user will be signed out of every device and must log in again. Their next token will reflect the latest role and permissions.")})]}),v&&e.jsxs("div",{className:"bg-muted/40 rounded-md border px-3 py-2 text-xs",children:[e.jsx("div",{className:"text-muted-foreground",children:t("rbac.audit.col.target","Target")}),e.jsx("div",{className:"mt-0.5 font-medium",children:v.targetName})]}),e.jsxs(Pe,{children:[e.jsx(Re,{disabled:k.isPending,children:t("common.cancel","Cancel")}),e.jsx(Fe,{className:"hover:bg-destructive/90 bg-destructive text-destructive-foreground",disabled:k.isPending,onClick:s=>{if(!v)return;s.preventDefault();const x=v.targetId;k.mutate(x,{onSettled:()=>D(null)})},children:k.isPending?t("rbac.audit.revoke.pending","Revoking…"):t("rbac.audit.revoke.action","Revoke session")})]})]})})]})}function A({label:t,children:m}){return e.jsxs("div",{className:"grid grid-cols-[110px_1fr] gap-3 px-4 py-2.5 text-sm",children:[e.jsx("dt",{className:"self-center text-xs font-medium text-muted-foreground",children:t}),e.jsx("dd",{className:"min-w-0",children:m})]})}function te({value:t,t:m}){const[u,l]=r.useState(!1),g=()=>{navigator.clipboard?.writeText(t).then(()=>{l(!0),window.setTimeout(()=>l(!1),1500)})};return e.jsxs("span",{className:"inline-flex max-w-full items-center gap-1.5",children:[e.jsx("code",{className:"truncate text-xs",children:t}),e.jsx("button",{type:"button",onClick:g,className:"flex-shrink-0 text-muted-foreground transition-colors hover:text-foreground","aria-label":m("common.copy","Copy"),children:e.jsx(tt,{className:"size-3"})}),u&&e.jsx("span",{className:"text-[10px] text-emerald-600 dark:text-emerald-400",children:m("common.copied","Copied")})]})}function ot({before:t,after:m,t:u}){const l=t??{},g=m??{},c=Array.from(new Set([...Object.keys(l),...Object.keys(g)])).map(i=>{const n=l[i],y=g[i],o=se(n),b=se(y);return{key:i,bStr:o,aStr:b,changed:o!==b}}).filter(i=>i.changed);return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h4",{className:"text-sm font-semibold",children:u("rbac.audit.diff","Change")}),c.length>0&&e.jsx("span",{className:"text-xs text-muted-foreground",children:u("rbac.audit.detail.changedCount","{{count}} field(s) changed",{count:c.length})})]}),c.length===0?e.jsx("div",{className:"bg-muted/30 rounded-md border p-3 text-xs text-muted-foreground",children:u("rbac.audit.detail.noFieldChanges","No field-level changes recorded for this action.")}):e.jsx("div",{className:"divide-y overflow-hidden rounded-md border",children:c.map(i=>e.jsxs("div",{className:"grid grid-cols-[140px_1fr_1fr] text-xs",children:[e.jsx("div",{className:"bg-muted/40 break-all border-e px-3 py-2 font-mono",children:i.key}),e.jsxs("div",{className:"bg-destructive/5 break-all px-3 py-2 font-mono",children:[e.jsx("div",{className:"mb-0.5 text-[10px] uppercase tracking-wide text-muted-foreground",children:u("rbac.audit.before","Before")}),i.bStr||"—"]}),e.jsxs("div",{className:"bg-primary/5 break-all border-s px-3 py-2 font-mono",children:[e.jsx("div",{className:"mb-0.5 text-[10px] uppercase tracking-wide text-muted-foreground",children:u("rbac.audit.after","After")}),i.aStr||"—"]})]},i.key))})]})}function se(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);try{return JSON.stringify(t)}catch{return String(t)}}export{wt as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.