@@ -15,13 +15,16 @@ import (
15
15
"golang.org/x/xerrors"
16
16
17
17
agpl "github.com/coder/coder/v2/coderd"
18
+ "github.com/coder/coder/v2/coderd/audit"
18
19
"github.com/coder/coder/v2/coderd/database"
19
20
"github.com/coder/coder/v2/coderd/database/dbauthz"
20
21
"github.com/coder/coder/v2/coderd/database/dbtime"
21
22
"github.com/coder/coder/v2/coderd/httpapi"
22
23
"github.com/coder/coder/v2/codersdk"
23
24
)
24
25
26
+ var SCIMAuditUserID = uuid .MustParse ("1f688bd1-8d6a-4a17-ae93-d0761f3b0a09" )
27
+
25
28
func (api * API ) scimEnabledMW (next http.Handler ) http.Handler {
26
29
return http .HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
27
30
api .entitlementsMu .RLock ()
@@ -118,6 +121,11 @@ type SCIMUser struct {
118
121
} `json:"meta"`
119
122
}
120
123
124
+ var SCIMAuditAdditionalFields = map [string ]string {
125
+ "automatic_actor" : "coder" ,
126
+ "automatic_subsystem" : "scim" ,
127
+ }
128
+
121
129
// scimPostUser creates a new user, or returns the existing user if it exists.
122
130
//
123
131
// @Summary SCIM 2.0: Create new user
@@ -135,6 +143,16 @@ func (api *API) scimPostUser(rw http.ResponseWriter, r *http.Request) {
135
143
return
136
144
}
137
145
146
+ auditor := * api .AGPL .Auditor .Load ()
147
+ aReq , commitAudit := audit .InitRequest [database.User ](rw , & audit.RequestParams {
148
+ Audit : auditor ,
149
+ Log : api .Logger ,
150
+ Request : r ,
151
+ Action : database .AuditActionCreate ,
152
+ AdditionalFields : SCIMAuditAdditionalFields ,
153
+ })
154
+ defer commitAudit ()
155
+
138
156
var sUser SCIMUser
139
157
err := json .NewDecoder (r .Body ).Decode (& sUser )
140
158
if err != nil {
@@ -170,7 +188,7 @@ func (api *API) scimPostUser(rw http.ResponseWriter, r *http.Request) {
170
188
171
189
if sUser .Active && dbUser .Status == database .UserStatusSuspended {
172
190
//nolint:gocritic
173
- _ , err = api .Database .UpdateUserStatus (dbauthz .AsSystemRestricted (r .Context ()), database.UpdateUserStatusParams {
191
+ newUser , err : = api .Database .UpdateUserStatus (dbauthz .AsSystemRestricted (r .Context ()), database.UpdateUserStatusParams {
174
192
ID : dbUser .ID ,
175
193
// The user will get transitioned to Active after logging in.
176
194
Status : database .UserStatusDormant ,
@@ -180,8 +198,13 @@ func (api *API) scimPostUser(rw http.ResponseWriter, r *http.Request) {
180
198
_ = handlerutil .WriteError (rw , err )
181
199
return
182
200
}
201
+ aReq .New = newUser
202
+ } else {
203
+ aReq .New = dbUser
183
204
}
184
205
206
+ aReq .Old = dbUser
207
+
185
208
httpapi .Write (ctx , rw , http .StatusOK , sUser )
186
209
return
187
210
}
@@ -223,6 +246,8 @@ func (api *API) scimPostUser(rw http.ResponseWriter, r *http.Request) {
223
246
_ = handlerutil .WriteError (rw , err )
224
247
return
225
248
}
249
+ aReq .New = dbUser
250
+ aReq .UserID = dbUser .ID
226
251
227
252
sUser .ID = dbUser .ID .String ()
228
253
sUser .UserName = dbUser .Username
@@ -248,6 +273,15 @@ func (api *API) scimPatchUser(rw http.ResponseWriter, r *http.Request) {
248
273
return
249
274
}
250
275
276
+ auditor := * api .AGPL .Auditor .Load ()
277
+ aReq , commitAudit := audit .InitRequest [database.User ](rw , & audit.RequestParams {
278
+ Audit : auditor ,
279
+ Log : api .Logger ,
280
+ Request : r ,
281
+ Action : database .AuditActionWrite ,
282
+ })
283
+ defer commitAudit ()
284
+
251
285
id := chi .URLParam (r , "id" )
252
286
253
287
var sUser SCIMUser
@@ -270,6 +304,8 @@ func (api *API) scimPatchUser(rw http.ResponseWriter, r *http.Request) {
270
304
_ = handlerutil .WriteError (rw , err )
271
305
return
272
306
}
307
+ aReq .Old = dbUser
308
+ aReq .UserID = dbUser .ID
273
309
274
310
var status database.UserStatus
275
311
if sUser .Active {
@@ -280,7 +316,7 @@ func (api *API) scimPatchUser(rw http.ResponseWriter, r *http.Request) {
280
316
}
281
317
282
318
//nolint:gocritic // needed for SCIM
283
- _ , err = api .Database .UpdateUserStatus (dbauthz .AsSystemRestricted (r .Context ()), database.UpdateUserStatusParams {
319
+ userNew , err : = api .Database .UpdateUserStatus (dbauthz .AsSystemRestricted (r .Context ()), database.UpdateUserStatusParams {
284
320
ID : dbUser .ID ,
285
321
Status : status ,
286
322
UpdatedAt : dbtime .Now (),
@@ -289,6 +325,7 @@ func (api *API) scimPatchUser(rw http.ResponseWriter, r *http.Request) {
289
325
_ = handlerutil .WriteError (rw , err )
290
326
return
291
327
}
328
+ aReq .New = userNew
292
329
293
330
httpapi .Write (ctx , rw , http .StatusOK , sUser )
294
331
}
0 commit comments