Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 112 additions & 41 deletions coderd/database/dbauthz/dbauthz.go
Original file line number Diff line number Diff line change
Expand Up @@ -3356,17 +3356,14 @@ func (q *querier) GetChatIncludeDefaultSystemPrompt(ctx context.Context) (bool,
return q.db.GetChatIncludeDefaultSystemPrompt(ctx)
}

func (q *querier) GetChatMessageByID(ctx context.Context, id int64) (database.ChatMessage, error) {
// ChatMessages are authorized through their parent Chat.
// We need to fetch the message first to get its chat_id.
msg, err := q.db.GetChatMessageByID(ctx, id)
func (q *querier) GetChatMessageByIDRaw(ctx context.Context, id int64) (database.GetChatMessageByIDRawRow, error) {
msg, err := q.db.GetChatMessageByIDRaw(ctx, id)
if err != nil {
return database.ChatMessage{}, err
return database.GetChatMessageByIDRawRow{}, err
}
// Authorize read on the parent chat.
_, err = q.GetChatByID(ctx, msg.ChatID)
if err != nil {
return database.ChatMessage{}, err
return database.GetChatMessageByIDRawRow{}, err
}
return msg, nil
}
Expand All @@ -3379,46 +3376,44 @@ func (q *querier) GetChatMessageSummariesPerChat(ctx context.Context, createdAft
return q.db.GetChatMessageSummariesPerChat(ctx, createdAfter)
}

func (q *querier) GetChatMessagesByChatID(ctx context.Context, arg database.GetChatMessagesByChatIDParams) ([]database.ChatMessage, error) {
// Authorize read on the parent chat.
func (q *querier) GetChatMessagesByChatIDAscPaginatedRaw(ctx context.Context, arg database.GetChatMessagesByChatIDAscPaginatedRawParams) ([]database.GetChatMessagesByChatIDAscPaginatedRawRow, error) {
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return nil, err
}
return q.db.GetChatMessagesByChatID(ctx, arg)
return q.db.GetChatMessagesByChatIDAscPaginatedRaw(ctx, arg)
}

func (q *querier) GetChatMessagesByChatIDAscPaginated(ctx context.Context, arg database.GetChatMessagesByChatIDAscPaginatedParams) ([]database.ChatMessage, error) {
func (q *querier) GetChatMessagesByChatIDDescPaginatedRaw(ctx context.Context, arg database.GetChatMessagesByChatIDDescPaginatedRawParams) ([]database.GetChatMessagesByChatIDDescPaginatedRawRow, error) {
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return nil, err
}
return q.db.GetChatMessagesByChatIDAscPaginated(ctx, arg)
return q.db.GetChatMessagesByChatIDDescPaginatedRaw(ctx, arg)
}

func (q *querier) GetChatMessagesByChatIDDescPaginated(ctx context.Context, arg database.GetChatMessagesByChatIDDescPaginatedParams) ([]database.ChatMessage, error) {
func (q *querier) GetChatMessagesByChatIDRaw(ctx context.Context, arg database.GetChatMessagesByChatIDRawParams) ([]database.GetChatMessagesByChatIDRawRow, error) {
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return nil, err
}
return q.db.GetChatMessagesByChatIDDescPaginated(ctx, arg)
return q.db.GetChatMessagesByChatIDRaw(ctx, arg)
}

func (q *querier) GetChatMessagesByRevisionForStream(ctx context.Context, arg database.GetChatMessagesByRevisionForStreamParams) ([]database.ChatMessage, error) {
func (q *querier) GetChatMessagesByRevisionForStreamRaw(ctx context.Context, arg database.GetChatMessagesByRevisionForStreamRawParams) ([]database.GetChatMessagesByRevisionForStreamRawRow, error) {
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return nil, err
}
return q.db.GetChatMessagesByRevisionForStream(ctx, arg)
return q.db.GetChatMessagesByRevisionForStreamRaw(ctx, arg)
}

func (q *querier) GetChatMessagesForPromptByChatID(ctx context.Context, chatID uuid.UUID) ([]database.ChatMessage, error) {
// Authorize read on the parent chat.
func (q *querier) GetChatMessagesForPromptByChatIDRaw(ctx context.Context, chatID uuid.UUID) ([]database.GetChatMessagesForPromptByChatIDRawRow, error) {
_, err := q.GetChatByID(ctx, chatID)
if err != nil {
return nil, err
}
return q.db.GetChatMessagesForPromptByChatID(ctx, chatID)
return q.db.GetChatMessagesForPromptByChatIDRaw(ctx, chatID)
}

func (q *querier) GetChatModelConfigByID(ctx context.Context, id uuid.UUID) (database.ChatModelConfig, error) {
Expand Down Expand Up @@ -3460,31 +3455,31 @@ func (q *querier) GetChatPlanModeInstructions(ctx context.Context) (string, erro
return q.db.GetChatPlanModeInstructions(ctx)
}

func (q *querier) GetChatQueuedMessageByID(ctx context.Context, arg database.GetChatQueuedMessageByIDParams) (database.ChatQueuedMessage, error) {
func (q *querier) GetChatQueuedMessageByID(ctx context.Context, arg database.GetChatQueuedMessageByIDParams) (database.GetChatQueuedMessageByIDRow, error) {
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return database.ChatQueuedMessage{}, err
return database.GetChatQueuedMessageByIDRow{}, err
}
return q.db.GetChatQueuedMessageByID(ctx, arg)
}

func (q *querier) GetChatQueuedMessageHead(ctx context.Context, chatID uuid.UUID) (database.ChatQueuedMessage, error) {
func (q *querier) GetChatQueuedMessageHead(ctx context.Context, chatID uuid.UUID) (database.GetChatQueuedMessageHeadRow, error) {
_, err := q.GetChatByID(ctx, chatID)
if err != nil {
return database.ChatQueuedMessage{}, err
return database.GetChatQueuedMessageHeadRow{}, err
}
return q.db.GetChatQueuedMessageHead(ctx, chatID)
}

func (q *querier) GetChatQueuedMessages(ctx context.Context, chatID uuid.UUID) ([]database.ChatQueuedMessage, error) {
func (q *querier) GetChatQueuedMessages(ctx context.Context, chatID uuid.UUID) ([]database.GetChatQueuedMessagesRow, error) {
_, err := q.GetChatByID(ctx, chatID)
if err != nil {
return nil, err
}
return q.db.GetChatQueuedMessages(ctx, chatID)
}

func (q *querier) GetChatQueuedMessagesByPosition(ctx context.Context, chatID uuid.UUID) ([]database.ChatQueuedMessage, error) {
func (q *querier) GetChatQueuedMessagesByPosition(ctx context.Context, chatID uuid.UUID) ([]database.GetChatQueuedMessagesByPositionRow, error) {
_, err := q.GetChatByID(ctx, chatID)
if err != nil {
return nil, err
Expand Down Expand Up @@ -3933,13 +3928,12 @@ func (q *querier) GetInboxNotificationsByUserID(ctx context.Context, userID data
return fetchWithPostFilter(q.auth, policy.ActionRead, q.db.GetInboxNotificationsByUserID)(ctx, userID)
}

func (q *querier) GetLastChatMessageByRole(ctx context.Context, arg database.GetLastChatMessageByRoleParams) (database.ChatMessage, error) {
// Authorize read on the parent chat.
func (q *querier) GetLastChatMessageByRoleRaw(ctx context.Context, arg database.GetLastChatMessageByRoleRawParams) (database.GetLastChatMessageByRoleRawRow, error) {
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return database.ChatMessage{}, err
return database.GetLastChatMessageByRoleRawRow{}, err
}
return q.db.GetLastChatMessageByRole(ctx, arg)
return q.db.GetLastChatMessageByRoleRaw(ctx, arg)
}

func (q *querier) GetLastUpdateCheck(ctx context.Context) (string, error) {
Expand Down Expand Up @@ -5984,16 +5978,15 @@ func (q *querier) InsertChatFile(ctx context.Context, arg database.InsertChatFil
return insert(q.log, q.auth, rbac.ResourceChat.WithOwner(arg.OwnerID.String()).InOrg(arg.OrganizationID), q.db.InsertChatFile)(ctx, arg)
}

func (q *querier) InsertChatMessages(ctx context.Context, arg database.InsertChatMessagesParams) ([]database.ChatMessage, error) {
// Authorize create on the parent chat (using update permission).
func (q *querier) InsertChatMessagesRaw(ctx context.Context, arg database.InsertChatMessagesRawParams) ([]database.InsertChatMessagesRawRow, error) {
chat, err := q.db.GetChatByID(ctx, arg.ChatID)
if err != nil {
return nil, err
}
if err := q.authorizeContext(ctx, policy.ActionUpdate, chat); err != nil {
return nil, err
}
return q.db.InsertChatMessages(ctx, arg)
return q.db.InsertChatMessagesRaw(ctx, arg)
}

func (q *querier) InsertChatModelConfig(ctx context.Context, arg database.InsertChatModelConfigParams) (database.ChatModelConfig, error) {
Expand All @@ -6003,24 +5996,24 @@ func (q *querier) InsertChatModelConfig(ctx context.Context, arg database.Insert
return q.db.InsertChatModelConfig(ctx, arg)
}

func (q *querier) InsertChatQueuedMessage(ctx context.Context, arg database.InsertChatQueuedMessageParams) (database.ChatQueuedMessage, error) {
func (q *querier) InsertChatQueuedMessage(ctx context.Context, arg database.InsertChatQueuedMessageParams) (database.InsertChatQueuedMessageRow, error) {
chat, err := q.db.GetChatByID(ctx, arg.ChatID)
if err != nil {
return database.ChatQueuedMessage{}, err
return database.InsertChatQueuedMessageRow{}, err
}
if err := q.authorizeContext(ctx, policy.ActionUpdate, chat); err != nil {
return database.ChatQueuedMessage{}, err
return database.InsertChatQueuedMessageRow{}, err
}
return q.db.InsertChatQueuedMessage(ctx, arg)
}

func (q *querier) InsertChatQueuedMessageWithCreator(ctx context.Context, arg database.InsertChatQueuedMessageWithCreatorParams) (database.ChatQueuedMessage, error) {
func (q *querier) InsertChatQueuedMessageWithCreator(ctx context.Context, arg database.InsertChatQueuedMessageWithCreatorParams) (database.InsertChatQueuedMessageWithCreatorRow, error) {
chat, err := q.db.GetChatByID(ctx, arg.ChatID)
if err != nil {
return database.ChatQueuedMessage{}, err
return database.InsertChatQueuedMessageWithCreatorRow{}, err
}
if err := q.authorizeContext(ctx, policy.ActionUpdate, chat); err != nil {
return database.ChatQueuedMessage{}, err
return database.InsertChatQueuedMessageWithCreatorRow{}, err
}
_ = chat
return q.db.InsertChatQueuedMessageWithCreator(ctx, arg)
Expand Down Expand Up @@ -6952,13 +6945,13 @@ func (q *querier) PinChatByID(ctx context.Context, id uuid.UUID) error {
return q.db.PinChatByID(ctx, id)
}

func (q *querier) PopNextQueuedMessage(ctx context.Context, chatID uuid.UUID) (database.ChatQueuedMessage, error) {
func (q *querier) PopNextQueuedMessage(ctx context.Context, chatID uuid.UUID) (database.PopNextQueuedMessageRow, error) {
chat, err := q.db.GetChatByID(ctx, chatID)
if err != nil {
return database.ChatQueuedMessage{}, err
return database.PopNextQueuedMessageRow{}, err
}
if err := q.authorizeContext(ctx, policy.ActionUpdate, chat); err != nil {
return database.ChatQueuedMessage{}, err
return database.PopNextQueuedMessageRow{}, err
}
return q.db.PopNextQueuedMessage(ctx, chatID)
}
Expand Down Expand Up @@ -9303,3 +9296,81 @@ func (q *querier) GetAuthorizedChats(ctx context.Context, arg database.GetChatsP
func (q *querier) GetAuthorizedChatsByChatFileID(ctx context.Context, fileID uuid.UUID, prepared rbac.PreparedAuthorized) ([]database.Chat, error) {
return q.db.GetAuthorizedChatsByChatFileID(ctx, fileID, prepared)
}

func (q *querier) GetChatMessageByID(ctx context.Context, id int64) (database.ChatMessage, error) {
// ChatMessages are authorized through their parent Chat.
// We need to fetch the message first to get its chat_id.
msg, err := q.db.GetChatMessageByID(ctx, id)
if err != nil {
return database.ChatMessage{}, err
}
// Authorize read on the parent chat.
_, err = q.GetChatByID(ctx, msg.ChatID)
if err != nil {
return database.ChatMessage{}, err
}
return msg, nil
}

func (q *querier) GetChatMessagesByChatID(ctx context.Context, arg database.GetChatMessagesByChatIDParams) ([]database.ChatMessage, error) {
// Authorize read on the parent chat.
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return nil, err
}
return q.db.GetChatMessagesByChatID(ctx, arg)
}

func (q *querier) GetChatMessagesByRevisionForStream(ctx context.Context, arg database.GetChatMessagesByRevisionForStreamParams) ([]database.ChatMessage, error) {
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return nil, err
}
return q.db.GetChatMessagesByRevisionForStream(ctx, arg)
}

func (q *querier) GetChatMessagesByChatIDAscPaginated(ctx context.Context, arg database.GetChatMessagesByChatIDAscPaginatedParams) ([]database.ChatMessage, error) {
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return nil, err
}
return q.db.GetChatMessagesByChatIDAscPaginated(ctx, arg)
}

func (q *querier) GetChatMessagesByChatIDDescPaginated(ctx context.Context, arg database.GetChatMessagesByChatIDDescPaginatedParams) ([]database.ChatMessage, error) {
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return nil, err
}
return q.db.GetChatMessagesByChatIDDescPaginated(ctx, arg)
}

func (q *querier) GetChatMessagesForPromptByChatID(ctx context.Context, chatID uuid.UUID) ([]database.ChatMessage, error) {
// Authorize read on the parent chat.
_, err := q.GetChatByID(ctx, chatID)
if err != nil {
return nil, err
}
return q.db.GetChatMessagesForPromptByChatID(ctx, chatID)
}

func (q *querier) GetLastChatMessageByRole(ctx context.Context, arg database.GetLastChatMessageByRoleParams) (database.ChatMessage, error) {
// Authorize read on the parent chat.
_, err := q.GetChatByID(ctx, arg.ChatID)
if err != nil {
return database.ChatMessage{}, err
}
return q.db.GetLastChatMessageByRole(ctx, arg)
}

func (q *querier) InsertChatMessages(ctx context.Context, arg database.InsertChatMessagesParams) ([]database.ChatMessage, error) {
// Authorize create on the parent chat (using update permission).
chat, err := q.db.GetChatByID(ctx, arg.ChatID)
if err != nil {
return nil, err
}
if err := q.authorizeContext(ctx, policy.ActionUpdate, chat); err != nil {
return nil, err
}
return q.db.InsertChatMessages(ctx, arg)
}
Loading
Loading