@@ -15,13 +15,16 @@ import (
1515 "golang.org/x/xerrors"
1616
1717 agpl "github.com/coder/coder/v2/coderd"
18+ "github.com/coder/coder/v2/coderd/audit"
1819 "github.com/coder/coder/v2/coderd/database"
1920 "github.com/coder/coder/v2/coderd/database/dbauthz"
2021 "github.com/coder/coder/v2/coderd/database/dbtime"
2122 "github.com/coder/coder/v2/coderd/httpapi"
2223 "github.com/coder/coder/v2/codersdk"
2324)
2425
26+ var SCIMAuditUserID = uuid .MustParse ("1f688bd1-8d6a-4a17-ae93-d0761f3b0a09" )
27+
2528func (api * API ) scimEnabledMW (next http.Handler ) http.Handler {
2629 return http .HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
2730 api .entitlementsMu .RLock ()
@@ -118,6 +121,11 @@ type SCIMUser struct {
118121 } `json:"meta"`
119122}
120123
124+ var SCIMAuditAdditionalFields = map [string ]string {
125+ "automatic_actor" : "coder" ,
126+ "automatic_subsystem" : "scim" ,
127+ }
128+
121129// scimPostUser creates a new user, or returns the existing user if it exists.
122130//
123131// @Summary SCIM 2.0: Create new user
@@ -135,6 +143,16 @@ func (api *API) scimPostUser(rw http.ResponseWriter, r *http.Request) {
135143 return
136144 }
137145
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+
138156 var sUser SCIMUser
139157 err := json .NewDecoder (r .Body ).Decode (& sUser )
140158 if err != nil {
@@ -170,7 +188,7 @@ func (api *API) scimPostUser(rw http.ResponseWriter, r *http.Request) {
170188
171189 if sUser .Active && dbUser .Status == database .UserStatusSuspended {
172190 //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 {
174192 ID : dbUser .ID ,
175193 // The user will get transitioned to Active after logging in.
176194 Status : database .UserStatusDormant ,
@@ -180,8 +198,13 @@ func (api *API) scimPostUser(rw http.ResponseWriter, r *http.Request) {
180198 _ = handlerutil .WriteError (rw , err )
181199 return
182200 }
201+ aReq .New = newUser
202+ } else {
203+ aReq .New = dbUser
183204 }
184205
206+ aReq .Old = dbUser
207+
185208 httpapi .Write (ctx , rw , http .StatusOK , sUser )
186209 return
187210 }
@@ -223,6 +246,8 @@ func (api *API) scimPostUser(rw http.ResponseWriter, r *http.Request) {
223246 _ = handlerutil .WriteError (rw , err )
224247 return
225248 }
249+ aReq .New = dbUser
250+ aReq .UserID = dbUser .ID
226251
227252 sUser .ID = dbUser .ID .String ()
228253 sUser .UserName = dbUser .Username
@@ -248,6 +273,15 @@ func (api *API) scimPatchUser(rw http.ResponseWriter, r *http.Request) {
248273 return
249274 }
250275
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+
251285 id := chi .URLParam (r , "id" )
252286
253287 var sUser SCIMUser
@@ -270,6 +304,8 @@ func (api *API) scimPatchUser(rw http.ResponseWriter, r *http.Request) {
270304 _ = handlerutil .WriteError (rw , err )
271305 return
272306 }
307+ aReq .Old = dbUser
308+ aReq .UserID = dbUser .ID
273309
274310 var status database.UserStatus
275311 if sUser .Active {
@@ -280,7 +316,7 @@ func (api *API) scimPatchUser(rw http.ResponseWriter, r *http.Request) {
280316 }
281317
282318 //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 {
284320 ID : dbUser .ID ,
285321 Status : status ,
286322 UpdatedAt : dbtime .Now (),
@@ -289,6 +325,7 @@ func (api *API) scimPatchUser(rw http.ResponseWriter, r *http.Request) {
289325 _ = handlerutil .WriteError (rw , err )
290326 return
291327 }
328+ aReq .New = userNew
292329
293330 httpapi .Write (ctx , rw , http .StatusOK , sUser )
294331}
0 commit comments