@@ -121,7 +121,10 @@ type workspaceQuerier interface {
121
121
func (q * sqlQuerier ) GetAuthorizedWorkspaces (ctx context.Context , arg GetWorkspacesParams , authorizedFilter rbac.AuthorizeFilter ) ([]Workspace , error ) {
122
122
// In order to properly use ORDER BY, OFFSET, and LIMIT, we need to inject the
123
123
// authorizedFilter between the end of the where clause and those statements.
124
- filter := strings .Replace (getWorkspaces , "-- @authorize_filter" , fmt .Sprintf (" AND %s" , authorizedFilter .SQLString (rbac .NoACLConfig ())), 1 )
124
+ filter , err := insertAuthorizedFilter (getWorkspaceCount , authorizedFilter , rbac .NoACLConfig ())
125
+ if err != nil {
126
+ return nil , err
127
+ }
125
128
// The name comment is for metric tracking
126
129
query := fmt .Sprintf ("-- name: GetAuthorizedWorkspaces :many\n %s" , filter )
127
130
rows , err := q .db .QueryContext (ctx , query ,
@@ -171,7 +174,10 @@ func (q *sqlQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg GetWorkspa
171
174
func (q * sqlQuerier ) GetAuthorizedWorkspaceCount (ctx context.Context , arg GetWorkspaceCountParams , authorizedFilter rbac.AuthorizeFilter ) (int64 , error ) {
172
175
// In order to properly use ORDER BY, OFFSET, and LIMIT, we need to inject the
173
176
// authorizedFilter between the end of the where clause and those statements.
174
- filter := strings .Replace (getWorkspaceCount , "-- @authorize_filter" , fmt .Sprintf (" AND %s" , authorizedFilter .SQLString (rbac .NoACLConfig ())), 1 )
177
+ filter , err := insertAuthorizedFilter (getWorkspaceCount , authorizedFilter , rbac .NoACLConfig ())
178
+ if err != nil {
179
+ return - 1 , err
180
+ }
175
181
// The name comment is for metric tracking
176
182
query := fmt .Sprintf ("-- name: GetAuthorizedWorkspaceCount :one\n %s" , filter )
177
183
row := q .db .QueryRowContext (ctx , query ,
@@ -184,6 +190,19 @@ func (q *sqlQuerier) GetAuthorizedWorkspaceCount(ctx context.Context, arg GetWor
184
190
arg .Name ,
185
191
)
186
192
var count int64
187
- err : = row .Scan (& count )
193
+ err = row .Scan (& count )
188
194
return count , err
189
195
}
196
+
197
+ // insertAuthorizedFilter is used to replace the @authorized_filter placeholder.
198
+ // It is crucial the placeholder exists, otherwise no auth checks are done. This
199
+ // is to prevent that mistake. If this function returns an error, it is
200
+ // a developer error.
201
+ func insertAuthorizedFilter (query string , authorizedFilter rbac.AuthorizeFilter , config rbac.SQLConfig ) (string , error ) {
202
+ replace := "-- @authorize_filter"
203
+ if ! strings .Contains (query , replace ) {
204
+ return "" , xerrors .Errorf ("query does not contain authorized replace string, this is not an authorized query" )
205
+ }
206
+ filter := strings .Replace (getWorkspaces , "-- @authorize_filter" , fmt .Sprintf (" AND %s" , authorizedFilter .SQLString (config )), 1 )
207
+ return filter , nil
208
+ }
0 commit comments