Skip to content

Commit b5c418d

Browse files
committed
Implement notification template update auditing
Signed-off-by: Danny Kopping <danny@coder.com>
1 parent 4242fd9 commit b5c418d

File tree

8 files changed

+37
-2
lines changed

8 files changed

+37
-2
lines changed

coderd/audit/diff.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ type Auditable interface {
2525
database.OAuth2ProviderAppSecret |
2626
database.CustomRole |
2727
database.AuditableOrganizationMember |
28-
database.Organization
28+
database.Organization |
29+
database.NotificationTemplate
2930
}
3031

3132
// Map is a map of changed fields in an audited resource. It maps field names to

coderd/audit/request.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"golang.org/x/xerrors"
1717

1818
"cdr.dev/slog"
19+
1920
"github.com/coder/coder/v2/coderd/database"
2021
"github.com/coder/coder/v2/coderd/database/dbtime"
2122
"github.com/coder/coder/v2/coderd/httpmw"
@@ -117,6 +118,8 @@ func ResourceTarget[T Auditable](tgt T) string {
117118
return typed.Username
118119
case database.Organization:
119120
return typed.Name
121+
case database.NotificationTemplate:
122+
return typed.Name
120123
default:
121124
panic(fmt.Sprintf("unknown resource %T for ResourceTarget", tgt))
122125
}
@@ -163,6 +166,8 @@ func ResourceID[T Auditable](tgt T) uuid.UUID {
163166
return typed.UserID
164167
case database.Organization:
165168
return typed.ID
169+
case database.NotificationTemplate:
170+
return typed.ID
166171
default:
167172
panic(fmt.Sprintf("unknown resource %T for ResourceID", tgt))
168173
}
@@ -206,6 +211,8 @@ func ResourceType[T Auditable](tgt T) database.ResourceType {
206211
return database.ResourceTypeOrganizationMember
207212
case database.Organization:
208213
return database.ResourceTypeOrganization
214+
case database.NotificationTemplate:
215+
return database.ResourceTypeNotificationTemplate
209216
default:
210217
panic(fmt.Sprintf("unknown resource %T for ResourceType", typed))
211218
}
@@ -251,6 +258,8 @@ func ResourceRequiresOrgID[T Auditable]() bool {
251258
return true
252259
case database.Organization:
253260
return true
261+
case database.NotificationTemplate:
262+
return false
254263
default:
255264
panic(fmt.Sprintf("unknown resource %T for ResourceRequiresOrgID", tgt))
256265
}

coderd/database/models.go

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

codersdk/audit.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const (
3333
ResourceTypeOAuth2ProviderAppSecret ResourceType = "oauth2_provider_app_secret"
3434
ResourceTypeCustomRole ResourceType = "custom_role"
3535
ResourceTypeOrganizationMember = "organization_member"
36+
ResourceTypeNotificationTemplate = "notification_template"
3637
)
3738

3839
func (r ResourceType) FriendlyString() string {
@@ -75,6 +76,8 @@ func (r ResourceType) FriendlyString() string {
7576
return "custom role"
7677
case ResourceTypeOrganizationMember:
7778
return "organization member"
79+
case ResourceTypeNotificationTemplate:
80+
return "notification template"
7881
default:
7982
return "unknown"
8083
}

docs/admin/audit-logs.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ We track the following resources:
1818
| GitSSHKey<br><i>create</i> | <table><thead><tr><th>Field</th><th>Tracked</th></tr></thead><tbody><tr><td>created_at</td><td>false</td></tr><tr><td>private_key</td><td>true</td></tr><tr><td>public_key</td><td>true</td></tr><tr><td>updated_at</td><td>false</td></tr><tr><td>user_id</td><td>true</td></tr></tbody></table> |
1919
| HealthSettings<br><i></i> | <table><thead><tr><th>Field</th><th>Tracked</th></tr></thead><tbody><tr><td>dismissed_healthchecks</td><td>true</td></tr><tr><td>id</td><td>false</td></tr></tbody></table> |
2020
| License<br><i>create, delete</i> | <table><thead><tr><th>Field</th><th>Tracked</th></tr></thead><tbody><tr><td>exp</td><td>true</td></tr><tr><td>id</td><td>false</td></tr><tr><td>jwt</td><td>false</td></tr><tr><td>uploaded_at</td><td>true</td></tr><tr><td>uuid</td><td>true</td></tr></tbody></table> |
21+
| NotificationTemplate<br><i></i> | <table><thead><tr><th>Field</th><th>Tracked</th></tr></thead><tbody><tr><td>actions</td><td>true</td></tr><tr><td>body_template</td><td>true</td></tr><tr><td>group</td><td>true</td></tr><tr><td>id</td><td>false</td></tr><tr><td>method</td><td>true</td></tr><tr><td>name</td><td>true</td></tr><tr><td>title_template</td><td>true</td></tr></tbody></table> |
2122
| NotificationsSettings<br><i></i> | <table><thead><tr><th>Field</th><th>Tracked</th></tr></thead><tbody><tr><td>id</td><td>false</td></tr><tr><td>notifier_paused</td><td>true</td></tr></tbody></table> |
2223
| OAuth2ProviderApp<br><i></i> | <table><thead><tr><th>Field</th><th>Tracked</th></tr></thead><tbody><tr><td>callback_url</td><td>true</td></tr><tr><td>created_at</td><td>false</td></tr><tr><td>icon</td><td>true</td></tr><tr><td>id</td><td>false</td></tr><tr><td>name</td><td>true</td></tr><tr><td>updated_at</td><td>false</td></tr></tbody></table> |
2324
| OAuth2ProviderAppSecret<br><i></i> | <table><thead><tr><th>Field</th><th>Tracked</th></tr></thead><tbody><tr><td>app_id</td><td>false</td></tr><tr><td>created_at</td><td>false</td></tr><tr><td>display_secret</td><td>false</td></tr><tr><td>hashed_secret</td><td>false</td></tr><tr><td>id</td><td>false</td></tr><tr><td>last_used_at</td><td>false</td></tr><tr><td>secret_prefix</td><td>false</td></tr></tbody></table> |

enterprise/audit/diff.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,13 @@ func convertDiffType(left, right any) (newLeft, newRight any, changed bool) {
142142
}
143143

144144
return leftInt64Ptr, rightInt64Ptr, true
145+
case database.NullNotificationMethod:
146+
vl, vr := string(typedLeft.NotificationMethod), ""
147+
if val, ok := right.(database.NullNotificationMethod); ok {
148+
vr = string(val.NotificationMethod)
149+
}
150+
151+
return vl, vr, true
145152
case database.TemplateACL:
146153
return fmt.Sprintf("%+v", left), fmt.Sprintf("%+v", right), true
147154
case database.CustomRolePermissions:

enterprise/audit/table.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,15 @@ var auditableResourcesTypes = map[any]map[string]Action{
271271
"display_name": ActionTrack,
272272
"icon": ActionTrack,
273273
},
274+
&database.NotificationTemplate{}: {
275+
"id": ActionIgnore,
276+
"name": ActionTrack,
277+
"title_template": ActionTrack,
278+
"body_template": ActionTrack,
279+
"actions": ActionTrack,
280+
"group": ActionTrack,
281+
"method": ActionTrack,
282+
},
274283
}
275284

276285
// auditMap converts a map of struct pointers to a map of struct names as

site/src/api/typesGenerated.ts

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)