fix: show audit logs for forgot password flow (#15181)

Fixes https://github.com/coder/coder/issues/15150

Audit logs for requesting a password reset, and a user updating their
password, now show up in the audit log.
This commit is contained in:
Danielle Maywood
2024-10-22 13:47:30 +01:00
committed by GitHub
parent 297089e944
commit 5076161078
17 changed files with 130 additions and 40 deletions
+2 -2
View File
@@ -2098,8 +2098,8 @@ export type AgentSubsystem = "envbox" | "envbuilder" | "exectrace"
export const AgentSubsystems: AgentSubsystem[] = ["envbox", "envbuilder", "exectrace"]
// From codersdk/audit.go
export type AuditAction = "create" | "delete" | "login" | "logout" | "register" | "start" | "stop" | "write"
export const AuditActions: AuditAction[] = ["create", "delete", "login", "logout", "register", "start", "stop", "write"]
export type AuditAction = "create" | "delete" | "login" | "logout" | "register" | "request_password_reset" | "start" | "stop" | "write"
export const AuditActions: AuditAction[] = ["create", "delete", "login", "logout", "register", "request_password_reset", "start", "stop", "write"]
// From codersdk/workspaces.go
export type AutomaticUpdates = "always" | "never"
@@ -1,6 +1,7 @@
import type { Meta, StoryObj } from "@storybook/react";
import {
MockAuditLog,
MockAuditLogRequestPasswordReset,
MockAuditLogSuccessfulLogin,
MockAuditLogUnsuccessfulLoginKnownUser,
MockAuditLogWithWorkspaceBuild,
@@ -57,6 +58,12 @@ export const UnsuccessfulLoginForUnknownUser: Story = {
},
};
export const RequestPasswordReset: Story = {
args: {
auditLog: MockAuditLogRequestPasswordReset,
},
};
export const CreateUser: Story = {
args: {
auditLog: {
@@ -9,6 +9,14 @@ const getDiffValue = (value: unknown): string => {
return `"${value}"`;
}
if (isTimeObject(value)) {
if (!value.Valid) {
return "null";
}
return new Date(value.Time).toLocaleString();
}
if (Array.isArray(value)) {
const values = value.map((v) => getDiffValue(v));
return `[${values.join(", ")}]`;
@@ -21,6 +29,19 @@ const getDiffValue = (value: unknown): string => {
return String(value);
};
const isTimeObject = (
value: unknown,
): value is { Time: string; Valid: boolean } => {
return (
value !== null &&
typeof value === "object" &&
"Time" in value &&
typeof value.Time === "string" &&
"Valid" in value &&
typeof value.Valid === "boolean"
);
};
interface AuditLogDiffProps {
diff: AuditDiff;
}
@@ -10,6 +10,7 @@ import {
MockAuditLog,
MockAuditLog2,
MockAuditLogGitSSH,
MockAuditLogRequestPasswordReset,
MockAuditLogWithDeletedResource,
MockAuditLogWithWorkspaceBuild,
MockUser,
@@ -122,6 +123,12 @@ export const WithOrganization: Story = {
},
};
export const WithDateDiffValue: Story = {
args: {
auditLog: MockAuditLogRequestPasswordReset,
},
};
export const NoUserAgent: Story = {
args: {
auditLog: {
+26
View File
@@ -2600,6 +2600,32 @@ export const MockAuditLogUnsuccessfulLoginKnownUser: TypesGen.AuditLog = {
status_code: 401,
};
export const MockAuditLogRequestPasswordReset: TypesGen.AuditLog = {
...MockAuditLog,
resource_type: "user",
resource_target: "member",
action: "request_password_reset",
description: "password reset requested for {target}",
diff: {
hashed_password: {
old: "",
new: "",
secret: true,
},
one_time_passcode_expires_at: {
old: {
Time: "0001-01-01T00:00:00Z",
Valid: false,
},
new: {
Time: "2024-10-22T09:03:23.961702Z",
Valid: true,
},
secret: false,
},
},
};
export const MockWorkspaceQuota: TypesGen.WorkspaceQuota = {
credits_consumed: 0,
budget: 100,