refactor: upgrade golangci-lint to v2.0.2 (#28416)

This commit is contained in:
McKayla はな
2026-08-21 23:46:27 -06:00
committed by GitHub
parent 610f321d52
commit 5ca0143992
134 changed files with 552 additions and 626 deletions
+1 -1
View File
@@ -297,7 +297,7 @@ func (a *API) Serve(ctx context.Context, l net.Listener) error {
return xerrors.Errorf("create agent API server: %w", err)
}
if err := a.ResourcesMonitoringAPI.InitMonitors(ctx); err != nil {
if err := a.InitMonitors(ctx); err != nil {
return xerrors.Errorf("initialize resource monitoring: %w", err)
}
@@ -192,7 +192,7 @@ func (b *Batcher) Close() {
// to the same metadata key for the same agent are deduplicated in the batch,
// keeping only the value with the most recent collectedAt timestamp.
func (b *Batcher) Add(agentID uuid.UUID, keys []string, values []string, errors []string, collectedAt []time.Time) error {
if !(len(keys) == len(values) && len(values) == len(errors) && len(errors) == len(collectedAt)) {
if len(keys) != len(values) || len(values) != len(errors) || len(errors) != len(collectedAt) {
return xerrors.Errorf("invalid Add call, all inputs must have the same number of items; keys: %d, values: %d, errors: %d, collectedAt: %d", len(keys), len(values), len(errors), len(collectedAt))
}
+1 -1
View File
@@ -43,7 +43,7 @@ func (api *API) RegisterInMemoryAIBridgedHTTPHandler(srv http.Handler) {
api.aiGatewayHandler = srv
factory := aibridged.NewTransportFactory(http.StripPrefix(agplaibridge.AIGatewayRootPath, srv))
var asInterface agplaibridge.TransportFactory = factory
asInterface := factory
api.AIBridgeTransportFactory.Store(&asInterface)
}
+5 -5
View File
@@ -383,12 +383,12 @@ func deriveTaskCurrentState(
ws.LatestBuild.Status == codersdk.WorkspaceStatusStarting:
message = fmt.Sprintf("Workspace is %s", ws.LatestBuild.Status)
case taskAgentLifecycle != nil:
switch {
case *taskAgentLifecycle == codersdk.WorkspaceAgentLifecycleCreated:
switch *taskAgentLifecycle {
case codersdk.WorkspaceAgentLifecycleCreated:
message = "Agent is connecting"
case *taskAgentLifecycle == codersdk.WorkspaceAgentLifecycleStarting:
case codersdk.WorkspaceAgentLifecycleStarting:
message = "Agent is starting"
case *taskAgentLifecycle == codersdk.WorkspaceAgentLifecycleReady:
case codersdk.WorkspaceAgentLifecycleReady:
if taskAppHealth != nil && *taskAppHealth == codersdk.WorkspaceAppHealthInitializing {
message = "App is initializing"
} else {
@@ -572,7 +572,7 @@ func (api *API) taskGet(rw http.ResponseWriter, r *http.Request) {
workspace,
data.builds[0],
data.templates[0],
api.Options.AllowWorkspaceRenames,
api.AllowWorkspaceRenames,
appStatus,
)
if err != nil {
+3 -2
View File
@@ -2377,10 +2377,11 @@ func TestTasksNotification(t *testing.T) {
startedAt sql.NullTime
readyAt sql.NullTime
)
if tc.agentLifecycle == database.WorkspaceAgentLifecycleStateReady {
switch tc.agentLifecycle {
case database.WorkspaceAgentLifecycleStateReady:
startedAt = sql.NullTime{Time: clock.Now(), Valid: true}
readyAt = sql.NullTime{Time: clock.Now(), Valid: true}
} else if tc.agentLifecycle == database.WorkspaceAgentLifecycleStateStarting {
case database.WorkspaceAgentLifecycleStateStarting:
startedAt = sql.NullTime{Time: clock.Now(), Valid: true}
}
+2 -2
View File
@@ -93,7 +93,7 @@ func ResourceTarget[T Auditable](tgt T) string {
case database.GitSSHKey:
return typed.PublicKey
case database.AuditableGroup:
return typed.Group.Name
return typed.Name
case database.APIKey:
if typed.TokenName != "nil" {
return typed.TokenName
@@ -206,7 +206,7 @@ func ResourceID[T Auditable](tgt T) uuid.UUID {
case database.GitSSHKey:
return typed.UserID
case database.AuditableGroup:
return typed.Group.ID
return typed.ID
case database.APIKey:
return typed.UserID
case database.License:
+3 -3
View File
@@ -46,10 +46,10 @@ func AnalyzeOIDCLinks(ctx context.Context, db database.Store, expectedIssuer str
for _, row := range rows {
count := int(row.Count)
analysis.Total += count
switch {
case row.IssuerPrefix == "":
switch row.IssuerPrefix {
case "":
analysis.Unlinked += count
case row.IssuerPrefix == expectedIssuer:
case expectedIssuer:
analysis.CorrectIssuer += count
default:
analysis.MismatchedCounts[row.IssuerPrefix] += count
+6 -6
View File
@@ -988,8 +988,8 @@ func New(options *Options) *API {
}
api.NetworkTelemetryBatcher = tailnet.NewNetworkTelemetryBatcher(
quartz.NewReal(),
api.Options.NetworkTelemetryBatchFrequency,
api.Options.NetworkTelemetryBatchMaxSize,
api.NetworkTelemetryBatchFrequency,
api.NetworkTelemetryBatchMaxSize,
api.handleNetworkTelemetry,
)
if options.CoordinatorResumeTokenProvider == nil {
@@ -998,10 +998,10 @@ func New(options *Options) *API {
api.TailnetClientService, err = tailnet.NewClientService(tailnet.ClientServiceOptions{
Logger: api.Logger.Named("tailnetclient"),
CoordPtr: &api.TailnetCoordinator,
DERPMapUpdateFrequency: api.Options.DERPMapUpdateFrequency,
DERPMapUpdateFrequency: api.DERPMapUpdateFrequency,
DERPMapFn: api.DERPMap,
NetworkTelemetryHandler: api.NetworkTelemetryBatcher.Handler,
ResumeTokenProvider: api.Options.CoordinatorResumeTokenProvider,
ResumeTokenProvider: api.CoordinatorResumeTokenProvider,
WorkspaceUpdatesProvider: api.UpdatesProvider,
})
if err != nil {
@@ -2743,10 +2743,10 @@ func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, n
func (api *API) DERPMap() *tailcfg.DERPMap {
fn := api.DERPMapper.Load()
if fn != nil {
return (*fn)(api.Options.BaseDERPMap)
return (*fn)(api.BaseDERPMap)
}
return api.Options.BaseDERPMap
return api.BaseDERPMap
}
// nolint:revive
+4 -4
View File
@@ -441,12 +441,12 @@ func TestDERPMetrics(t *testing.T) {
_, _, api := coderdtest.NewWithAPI(t, nil)
require.NotNil(t, api.Options.DERPServer, "DERP server should be configured")
require.NotNil(t, api.Options.PrometheusRegistry, "Prometheus registry should be configured")
require.NotNil(t, api.DERPServer, "DERP server should be configured")
require.NotNil(t, api.PrometheusRegistry, "Prometheus registry should be configured")
// The registry is created internally by coderd. Gather from it
// to verify DERP metrics were registered during startup.
metrics, err := api.Options.PrometheusRegistry.Gather()
metrics, err := api.PrometheusRegistry.Gather()
require.NoError(t, err)
names := make(map[string]struct{})
@@ -518,7 +518,7 @@ func TestWebSocketProbeMetrics(t *testing.T) {
// Assert the probe metric was recorded.
testutil.Eventually(ctx, t, func(context.Context) bool {
metrics, err := api.Options.PrometheusRegistry.Gather()
metrics, err := api.PrometheusRegistry.Gather()
assert.NoError(t, err)
return testutil.PromCounterHasValue(t, metrics, 1,
"coderd_api_websocket_probes_total", "/api/v2/notifications/inbox/watch", "ok")
+1 -1
View File
@@ -1258,7 +1258,7 @@ func (f *FakeIDP) httpHandler(t testing.TB) http.Handler {
mux.Handle(revokeTokenPath, http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
if f.revokeTokenGitHubFormat {
u, p, ok := r.BasicAuth()
if !ok || !(u == f.clientID && p == f.clientSecret) {
if !ok || (u != f.clientID || p != f.clientSecret) {
httpError(rw, http.StatusForbidden, xerrors.Errorf("basic auth failed"))
return
}
+3 -2
View File
@@ -121,9 +121,10 @@ func parseSwaggerComment(commentGroup *ast.CommentGroup) SwaggerComment {
r.model = args[2]
}
if annotationName == "@Success" {
switch annotationName {
case "@Success":
c.successes = append(c.successes, r)
} else if annotationName == "@Failure" {
case "@Failure":
c.failures = append(c.failures, r)
}
case "@Param":
+2 -3
View File
@@ -2283,8 +2283,7 @@ func (q *querier) DeleteExpiredAPIKeys(ctx context.Context, arg database.DeleteE
func (q *querier) DeleteExternalAuthLink(ctx context.Context, arg database.DeleteExternalAuthLinkParams) error {
return fetchAndExec(q.log, q.auth, policy.ActionUpdatePersonal, func(ctx context.Context, arg database.DeleteExternalAuthLinkParams) (database.ExternalAuthLink, error) {
//nolint:gosimple
return q.db.GetExternalAuthLink(ctx, database.GetExternalAuthLinkParams{UserID: arg.UserID, ProviderID: arg.ProviderID})
return q.db.GetExternalAuthLink(ctx, database.GetExternalAuthLinkParams(arg))
}, q.db.DeleteExternalAuthLink)(ctx, arg)
}
@@ -9028,7 +9027,7 @@ func (q *querier) UpsertChatTitleGenerationModelOverride(ctx context.Context, va
return q.db.UpsertChatTitleGenerationModelOverride(ctx, value)
}
//nolint:revive // Parameter name matches the generated querier interface.
//nolint:revive,staticcheck // Parameter name matches the generated querier interface.
func (q *querier) UpsertChatWorkspaceTTL(ctx context.Context, workspaceTtl string) error {
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceDeploymentConfig); err != nil {
return err
+2 -2
View File
@@ -803,7 +803,7 @@ func WorkspaceAgentScriptTiming(t testing.TB, db database.Store, orig database.W
}
// Some tests run WorkspaceAgentScriptTiming in a loop and run into
// a unique violation - 2 rows get the same started_at value.
if (database.IsUniqueViolation(err, database.UniqueWorkspaceAgentScriptTimingsScriptIDStartedAtKey) && orig.StartedAt == time.Time{}) {
if (database.IsUniqueViolation(err, database.UniqueWorkspaceAgentScriptTimingsScriptIDStartedAtKey) && orig.StartedAt.Equal(time.Time{})) {
// Wait 1 millisecond so dbtime.Now() changes
time.Sleep(time.Millisecond * 1)
continue
@@ -1174,7 +1174,7 @@ func GroupMember(t testing.TB, db database.Store, member database.GroupMemberTab
require.NotEqual(t, member.UserID, uuid.Nil, "A user id is required to use 'dbgen.GroupMember', use 'dbgen.User'.")
require.NotEqual(t, member.GroupID, uuid.Nil, "A group id is required to use 'dbgen.GroupMember', use 'dbgen.Group'.")
//nolint:gosimple
//nolint:staticcheck
err := db.InsertGroupMember(genCtx, database.InsertGroupMemberParams{
UserID: member.UserID,
GroupID: member.GroupID,
+7 -7
View File
@@ -197,8 +197,8 @@ func createDatabaseFromTemplate(t TBSubset, connParams ConnectionParams, db *sql
// Template database already exists and we successfully created the new database.
return nil
}
tplDbDoesNotExistOccurred := strings.Contains(err.Error(), "template database") && strings.Contains(err.Error(), "does not exist")
if (tplDbDoesNotExistOccurred && !emptyTemplateDBName) || !tplDbDoesNotExistOccurred {
tplDBDoesNotExistOccurred := strings.Contains(err.Error(), "template database") && strings.Contains(err.Error(), "does not exist")
if (tplDBDoesNotExistOccurred && !emptyTemplateDBName) || !tplDBDoesNotExistOccurred {
// First and case: user passed a templateDBName that doesn't exist.
// Second and case: some other error.
return xerrors.Errorf("create db with template: %w", err)
@@ -273,26 +273,26 @@ func createAndInitDatabase(t TBSubset, connParams ConnectionParams, db *sql.DB,
if _, err := db.Exec("CREATE DATABASE " + tmpDBName); err != nil {
return xerrors.Errorf("create tmp db: %w", err)
}
tmpDbURL := ConnectionParams{
tmpDBURL := ConnectionParams{
Username: connParams.Username,
Password: connParams.Password,
Host: connParams.Host,
Port: connParams.Port,
DBName: tmpDBName,
}.DSN()
tmpDb, err := sql.Open("postgres", tmpDbURL)
tmpDB, err := sql.Open("postgres", tmpDBURL)
if err != nil {
return xerrors.Errorf("connect to template db: %w", err)
}
defer func() {
if err := tmpDb.Close(); err != nil {
if err := tmpDB.Close(); err != nil {
t.Logf("failed to close temp db: %s\n", err.Error())
}
}()
if err := initialize(tmpDb); err != nil {
if err := initialize(tmpDB); err != nil {
return xerrors.Errorf("initialize: %w", err)
}
if err := tmpDb.Close(); err != nil {
if err := tmpDB.Close(); err != nil {
return xerrors.Errorf("close template db: %w", err)
}
if _, err := db.Exec("ALTER DATABASE " + tmpDBName + " RENAME TO " + name); err != nil {
+6 -6
View File
@@ -58,12 +58,12 @@ func TestOpen_ValidDBFrom(t *testing.T) {
require.NoError(t, err)
templateDBName := "tpl_" + migrations.GetMigrationsHash()[:32]
tplDbExistsRes, err := db.Query("SELECT 1 FROM pg_database WHERE datname = $1", templateDBName)
tplDBExistsRes, err := db.Query("SELECT 1 FROM pg_database WHERE datname = $1", templateDBName)
if err != nil {
require.NoError(t, err)
}
require.True(t, tplDbExistsRes.Next())
require.NoError(t, tplDbExistsRes.Close())
require.True(t, tplDBExistsRes.Next())
require.NoError(t, tplDBExistsRes.Close())
// now populate the db with some data and use it as a new template db
// to verify that dbtestutil.Open respects WithDBFrom
@@ -91,13 +91,13 @@ func TestOpen_ValidDBFrom(t *testing.T) {
newDsn, err := dbtestutil.Open(t, dbtestutil.WithDBFrom(freshTemplateDBName))
require.NoError(t, err)
newDb, err := sql.Open("postgres", newDsn)
newDB, err := sql.Open("postgres", newDsn)
require.NoError(t, err)
t.Cleanup(func() {
require.NoError(t, newDb.Close())
require.NoError(t, newDB.Close())
})
rows, err = newDb.Query("SELECT 1 FROM my_wonderful_table WHERE name = 'test'")
rows, err = newDB.Query("SELECT 1 FROM my_wonderful_table WHERE name = 'test'")
require.NoError(t, err)
require.True(t, rows.Next())
require.NoError(t, rows.Close())
@@ -9,7 +9,7 @@ import (
// ChatProvider is the fixture shape accepted by dbgen.ChatProvider.
//
//nolint:revive
//nolint:revive,staticcheck // Field names match the legacy generated database models.
type ChatProvider struct {
ID uuid.UUID
Provider string
@@ -29,7 +29,7 @@ type ChatProvider struct {
// InsertChatProviderParams is the callback parameter shape accepted by
// dbgen.ChatProvider.
//
//nolint:revive
//nolint:revive,staticcheck // Field names match the legacy generated database parameters.
type InsertChatProviderParams struct {
Provider string
DisplayName string
+18 -16
View File
@@ -3858,7 +3858,7 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
var allLogs []database.ConnectionLog
db, _ := dbtestutil.NewDB(t)
authz := rbac.NewAuthorizer(prometheus.NewRegistry())
authDb := dbauthz.New(db, authz, slogtest.Make(t, &slogtest.Options{}), coderdtest.AccessControlStorePointer())
authDB := dbauthz.New(db, authz, slogtest.Make(t, &slogtest.Options{}), coderdtest.AccessControlStorePointer())
orgA := dbfake.Organization(t, db).Do()
orgB := dbfake.Organization(t, db).Do()
@@ -3891,7 +3891,7 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
}
for orgID, ids := range orgConnectionLogs {
for _, id := range ids {
allLogs = append(allLogs, dbgen.ConnectionLog(t, authDb, database.UpsertConnectionLogParams{
allLogs = append(allLogs, dbgen.ConnectionLog(t, authDB, database.UpsertConnectionLogParams{
WorkspaceID: wsID,
WorkspaceOwnerID: user.ID,
ID: id,
@@ -3928,12 +3928,12 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
})
// When: The user queries for connection logs
logs, err := authDb.GetConnectionLogsOffset(memberCtx, database.GetConnectionLogsOffsetParams{})
logs, err := authDB.GetConnectionLogsOffset(memberCtx, database.GetConnectionLogsOffsetParams{})
require.NoError(t, err)
// Then: No logs returned
require.Len(t, logs, 0, "no logs should be returned")
// And: The count matches the number of logs returned
count, err := authDb.CountConnectionLogs(memberCtx, database.CountConnectionLogsParams{})
count, err := authDB.CountConnectionLogs(memberCtx, database.CountConnectionLogsParams{})
require.NoError(t, err)
require.EqualValues(t, len(logs), count)
})
@@ -3951,12 +3951,12 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
})
// When: the auditor queries for connection logs
logs, err := authDb.GetConnectionLogsOffset(siteAuditorCtx, database.GetConnectionLogsOffsetParams{})
logs, err := authDB.GetConnectionLogsOffset(siteAuditorCtx, database.GetConnectionLogsOffsetParams{})
require.NoError(t, err)
// Then: All logs are returned
require.ElementsMatch(t, connectionOnlyIDs(allLogs), connectionOnlyIDs(logs))
// And: The count matches the number of logs returned
count, err := authDb.CountConnectionLogs(siteAuditorCtx, database.CountConnectionLogsParams{})
count, err := authDB.CountConnectionLogs(siteAuditorCtx, database.CountConnectionLogsParams{})
require.NoError(t, err)
require.EqualValues(t, len(logs), count)
})
@@ -3975,12 +3975,12 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
})
// When: The auditor queries for connection logs
logs, err := authDb.GetConnectionLogsOffset(orgAuditCtx, database.GetConnectionLogsOffsetParams{})
logs, err := authDB.GetConnectionLogsOffset(orgAuditCtx, database.GetConnectionLogsOffsetParams{})
require.NoError(t, err)
// Then: Only the logs for the organization are returned
require.ElementsMatch(t, orgConnectionLogs[orgID], connectionOnlyIDs(logs))
// And: The count matches the number of logs returned
count, err := authDb.CountConnectionLogs(orgAuditCtx, database.CountConnectionLogsParams{})
count, err := authDB.CountConnectionLogs(orgAuditCtx, database.CountConnectionLogsParams{})
require.NoError(t, err)
require.EqualValues(t, len(logs), count)
})
@@ -4000,12 +4000,12 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
})
// When: The user queries for connection logs
logs, err := authDb.GetConnectionLogsOffset(multiOrgAuditCtx, database.GetConnectionLogsOffsetParams{})
logs, err := authDB.GetConnectionLogsOffset(multiOrgAuditCtx, database.GetConnectionLogsOffsetParams{})
require.NoError(t, err)
// Then: All logs for both organizations are returned
require.ElementsMatch(t, append(orgConnectionLogs[first], orgConnectionLogs[second]...), connectionOnlyIDs(logs))
// And: The count matches the number of logs returned
count, err := authDb.CountConnectionLogs(multiOrgAuditCtx, database.CountConnectionLogsParams{})
count, err := authDB.CountConnectionLogs(multiOrgAuditCtx, database.CountConnectionLogsParams{})
require.NoError(t, err)
require.EqualValues(t, len(logs), count)
})
@@ -4023,12 +4023,12 @@ func TestGetAuthorizedConnectionLogsOffset(t *testing.T) {
})
// When: The user queries for audit logs
logs, err := authDb.GetConnectionLogsOffset(userCtx, database.GetConnectionLogsOffsetParams{})
logs, err := authDB.GetConnectionLogsOffset(userCtx, database.GetConnectionLogsOffsetParams{})
require.NoError(t, err)
// Then: No logs are returned
require.Len(t, logs, 0, "no logs should be returned")
// And: The count matches the number of logs returned
count, err := authDb.CountConnectionLogs(userCtx, database.CountConnectionLogsParams{})
count, err := authDB.CountConnectionLogs(userCtx, database.CountConnectionLogsParams{})
require.NoError(t, err)
require.EqualValues(t, len(logs), count)
})
@@ -6207,15 +6207,17 @@ func TestGetUserStatusCounts(t *testing.T) {
case row.Date.Before(userCreatedAt):
require.Equal(t, int64(0), row.Count)
case row.Date.Before(firstStatusChange):
if row.Status == stc.initialStatus {
switch row.Status {
case stc.initialStatus:
require.Equal(t, int64(1), row.Count)
} else if row.Status == stc.targetStatus {
case stc.targetStatus:
require.Equal(t, int64(0), row.Count)
}
case !row.Date.After(tc.reportUntil):
if row.Status == stc.initialStatus {
switch row.Status {
case stc.initialStatus:
require.Equal(t, int64(0), row.Count)
} else if row.Status == stc.targetStatus {
case stc.targetStatus:
require.Equal(t, int64(1), row.Count)
}
default:
+1 -1
View File
@@ -184,7 +184,7 @@ func (t *WorkspaceACL) Scan(src interface{}) error {
return xerrors.Errorf("unexpected type %T", src)
}
//nolint:revive
//nolint:revive,staticcheck // Receiver name matches the other WorkspaceACL methods in this file.
func (w WorkspaceACL) RBACACL() map[string][]policy.Action {
// Convert WorkspaceACL to a map of string to []policy.Action.
// This is used for RBAC checks.
+3 -3
View File
@@ -64,7 +64,7 @@ func (api *API) debugTailnet(rw http.ResponseWriter, r *http.Request) {
// @Param force query boolean false "Force a healthcheck to run"
func (api *API) debugDeploymentHealth(rw http.ResponseWriter, r *http.Request) {
apiKey := httpmw.APITokenFromRequest(r)
ctx, cancel := context.WithTimeout(r.Context(), api.Options.HealthcheckTimeout)
ctx, cancel := context.WithTimeout(r.Context(), api.HealthcheckTimeout)
defer cancel()
// Load sections previously marked as dismissed.
@@ -78,7 +78,7 @@ func (api *API) debugDeploymentHealth(rw http.ResponseWriter, r *http.Request) {
// Get cached report if it exists and the requester did not force a refresh.
if !forced {
if report := api.healthCheckCache.Load(); report != nil {
if time.Since(report.Time) < api.Options.HealthcheckRefresh {
if time.Since(report.Time) < api.HealthcheckRefresh {
formatHealthcheck(ctx, rw, r, *report, dismissed...)
return
}
@@ -87,7 +87,7 @@ func (api *API) debugDeploymentHealth(rw http.ResponseWriter, r *http.Request) {
resChan := api.healthCheckGroup.DoChan("", func() (*healthsdk.HealthcheckReport, error) {
// Create a new context not tied to the request.
ctx, cancel := context.WithTimeout(context.Background(), api.Options.HealthcheckTimeout)
ctx, cancel := context.WithTimeout(context.Background(), api.HealthcheckTimeout)
defer cancel()
// Create and store progress tracker for timeout diagnostics.
+3 -3
View File
@@ -117,10 +117,10 @@ func DiagnosticErrorString(d *hcl.Diagnostic) string {
func DiagnosticsErrorString(d hcl.Diagnostics) string {
count := len(d)
switch {
case count == 0:
switch count {
case 0:
return "no diagnostics"
case count == 1:
case 1:
return DiagnosticErrorString(d[0])
default:
for _, d := range d {
+8 -8
View File
@@ -659,7 +659,7 @@ func TestPostChats(t *testing.T) {
OrganizationID: firstUser.OrganizationID,
Enabled: true,
})
disabledCfg, err := client.Client.UpdateMCPServerConfig(ctx, enabledCfg.OrganizationID, enabledCfg.ID, codersdk.UpdateMCPServerConfigRequest{
disabledCfg, err := client.UpdateMCPServerConfig(ctx, enabledCfg.OrganizationID, enabledCfg.ID, codersdk.UpdateMCPServerConfigRequest{
Enabled: ptr.Ref(false),
})
require.NoError(t, err)
@@ -734,7 +734,7 @@ func TestPostChats(t *testing.T) {
})
require.NoError(t, err)
_, err = client.Client.UpdateMCPServerConfig(ctx, cfg.OrganizationID, cfg.ID, codersdk.UpdateMCPServerConfigRequest{
_, err = client.UpdateMCPServerConfig(ctx, cfg.OrganizationID, cfg.ID, codersdk.UpdateMCPServerConfigRequest{
Enabled: ptr.Ref(false),
})
require.NoError(t, err)
@@ -761,7 +761,7 @@ func TestPostChats(t *testing.T) {
OrganizationID: firstUser.OrganizationID,
Enabled: true,
})
_, err = client.Client.UpdateMCPServerConfig(ctx, secondCfg.OrganizationID, secondCfg.ID, codersdk.UpdateMCPServerConfigRequest{
_, err = client.UpdateMCPServerConfig(ctx, secondCfg.OrganizationID, secondCfg.ID, codersdk.UpdateMCPServerConfigRequest{
Enabled: ptr.Ref(false),
})
require.NoError(t, err)
@@ -1385,7 +1385,7 @@ func TestChats_ForceOnMCPServerEnforced(t *testing.T) {
_ = createChatModelConfig(t, client)
// An admin marks an MCP server as Force On.
forced, err := client.Client.CreateMCPServerConfig(ctx, firstUser.OrganizationID, codersdk.CreateMCPServerConfigRequest{
forced, err := client.CreateMCPServerConfig(ctx, firstUser.OrganizationID, codersdk.CreateMCPServerConfigRequest{
DisplayName: "Forced Server",
Slug: "forced-server",
Transport: "streamable_http",
@@ -1931,7 +1931,7 @@ func TestListChats(t *testing.T) {
Pagination: codersdk.Pagination{Limit: pageSize},
}
if afterID != uuid.Nil {
opts.Pagination.AfterID = afterID
opts.AfterID = afterID
}
page, listErr := client.ListChats(ctx, opts)
require.NoError(t, listErr)
@@ -11359,7 +11359,7 @@ This arrived as octet-stream.
client := newChatClient(t)
firstUser := coderdtest.CreateFirstUser(t, client.Client)
_, err := client.UploadChatFile(ctx, firstUser.OrganizationID, "application/octet-stream", "payload.zip", bytes.NewReader([]byte("PK")))
_, err := client.UploadChatFile(ctx, firstUser.OrganizationID, "application/octet-stream", "payload.zip", bytes.NewReader([]byte("PK\x03\x04")))
sdkErr := requireSDKError(t, err, http.StatusBadRequest)
require.Contains(t, sdkErr.Message, "Unsupported file type")
})
@@ -11370,7 +11370,7 @@ This arrived as octet-stream.
client := newChatClient(t)
firstUser := coderdtest.CreateFirstUser(t, client.Client)
_, err := client.UploadChatFile(ctx, firstUser.OrganizationID, "application/zip", "test.zip", bytes.NewReader([]byte("PK")))
_, err := client.UploadChatFile(ctx, firstUser.OrganizationID, "application/zip", "test.zip", bytes.NewReader([]byte("PK\x03\x04")))
requireSDKError(t, err, http.StatusBadRequest)
})
@@ -11912,7 +11912,7 @@ func TestChatFileDownloadURL(t *testing.T) {
// Suspending the minting user invalidates the URL because
// redemption requires the token's user to still be active.
_, err = client.Client.UpdateUserStatus(ctx, member.ID.String(), codersdk.UserStatusSuspended)
_, err = client.UpdateUserStatus(ctx, member.ID.String(), codersdk.UserStatusSuspended)
require.NoError(t, err)
res := get(t, ctx, download.URL)
+5 -5
View File
@@ -636,7 +636,7 @@ func (c *Config) ValidateToken(ctx context.Context, token *oauth2.Token) (bool,
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token.AccessToken))
res, err := c.InstrumentedOAuth2Config.Do(ctx, promoauth.SourceValidateToken, req)
res, err := c.Do(ctx, promoauth.SourceValidateToken, req)
if err != nil {
return false, nil, err
}
@@ -765,7 +765,7 @@ func (c *Config) AppInstallations(ctx context.Context, token string) ([]codersdk
return nil, false, err
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
res, err := c.InstrumentedOAuth2Config.Do(ctx, promoauth.SourceAppInstallations, req)
res, err := c.Do(ctx, promoauth.SourceAppInstallations, req)
if err != nil {
return nil, false, err
}
@@ -817,7 +817,7 @@ func (c *Config) RevokeToken(ctx context.Context, link database.ExternalAuthLink
return false, err
}
res, err := c.InstrumentedOAuth2Config.Do(ctx, promoauth.SourceRevoke, req)
res, err := c.Do(ctx, promoauth.SourceRevoke, req)
if err != nil {
return false, err
}
@@ -1634,8 +1634,8 @@ func (s *entraV1TokenSource) Token() (*oauth2.Token, error) {
oauth2.SetAuthURLParam("grant_type", "refresh_token"),
oauth2.SetAuthURLParam("refresh_token", refreshToken),
}
if len(s.cfg.Config.Scopes) > 0 {
refreshOpts = append(refreshOpts, oauth2.SetAuthURLParam("scope", strings.Join(s.cfg.Config.Scopes, " ")))
if len(s.cfg.Scopes) > 0 {
refreshOpts = append(refreshOpts, oauth2.SetAuthURLParam("scope", strings.Join(s.cfg.Scopes, " ")))
}
token, err := s.cfg.Exchange(s.ctx, "", refreshOpts...)
+1 -1
View File
@@ -256,7 +256,7 @@ func (r *NodeReport) derpURL() *url.URL {
if r.Node.HostName == "" {
derpURL.Host = r.Node.IPv4
}
if r.Node.DERPPort != 0 && !(r.Node.DERPPort == 443 && derpURL.Scheme == "https") && !(r.Node.DERPPort == 80 && derpURL.Scheme == "http") {
if r.Node.DERPPort != 0 && (r.Node.DERPPort != 443 || derpURL.Scheme != "https") && (r.Node.DERPPort != 80 || derpURL.Scheme != "http") {
derpURL.Host = fmt.Sprintf("%s:%d", derpURL.Host, r.Node.DERPPort)
}
+1 -1
View File
@@ -120,7 +120,7 @@ func (s *WebsocketEchoServer) ServeHTTP(rw http.ResponseWriter, r *http.Request)
c, err := websocket.Accept(rw, r, &websocket.AcceptOptions{})
if err != nil {
rw.WriteHeader(http.StatusBadRequest)
_, _ = rw.Write([]byte(fmt.Sprint("unable to accept:", err)))
_, _ = fmt.Fprint(rw, "unable to accept:", err)
return
}
defer c.Close(websocket.StatusGoingAway, "goodbye")
+1 -1
View File
@@ -392,7 +392,7 @@ func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (
sendEvent := func(newEvent codersdk.ServerSentEvent) error {
buf := &bytes.Buffer{}
_, err := buf.WriteString(fmt.Sprintf("event: %s\n", newEvent.Type))
_, err := fmt.Fprintf(buf, "event: %s\n", newEvent.Type)
if err != nil {
return err
}
+4 -4
View File
@@ -193,10 +193,10 @@ func TestOrganizationParam(t *testing.T) {
assert.Equal(t, user.AvatarURL, orgMem.AvatarURL)
assert.NotEmpty(t, orgMem.Roles)
assert.NotZero(t, orgMem.OrganizationMember)
assert.NotEmpty(t, orgMem.OrganizationMember.CreatedAt)
assert.NotEmpty(t, orgMem.OrganizationMember.UpdatedAt)
assert.NotEmpty(t, orgMem.OrganizationMember.UserID)
assert.NotEmpty(t, orgMem.OrganizationMember.Roles)
assert.NotEmpty(t, orgMem.CreatedAt)
assert.NotEmpty(t, orgMem.UpdatedAt)
assert.NotEmpty(t, orgMem.UserID)
assert.NotEmpty(t, orgMem.Roles)
orgMems := httpmw.OrganizationMembersParam(r)
assert.NotZero(t, orgMems)
+3 -3
View File
@@ -32,7 +32,7 @@ func (AGPLIDPSync) GroupSyncEntitled() bool {
func (s AGPLIDPSync) UpdateGroupSyncSettings(ctx context.Context, orgID uuid.UUID, db database.Store, settings GroupSyncSettings) error {
orgResolver := s.Manager.OrganizationResolver(db, orgID)
err := s.SyncSettings.Group.SetRuntimeValue(ctx, orgResolver, &settings)
err := s.Group.SetRuntimeValue(ctx, orgResolver, &settings)
if err != nil {
return xerrors.Errorf("update group sync settings: %w", err)
}
@@ -42,7 +42,7 @@ func (s AGPLIDPSync) UpdateGroupSyncSettings(ctx context.Context, orgID uuid.UUI
func (s AGPLIDPSync) GroupSyncSettings(ctx context.Context, orgID uuid.UUID, db database.Store) (*GroupSyncSettings, error) {
orgResolver := s.Manager.OrganizationResolver(db, orgID)
settings, err := s.SyncSettings.Group.Resolve(ctx, orgResolver)
settings, err := s.Group.Resolve(ctx, orgResolver)
if err != nil {
if !xerrors.Is(err, runtimeconfig.ErrEntryNotFound) {
return nil, xerrors.Errorf("resolve group sync settings: %w", err)
@@ -52,7 +52,7 @@ func (s AGPLIDPSync) GroupSyncSettings(ctx context.Context, orgID uuid.UUID, db
settings = &GroupSyncSettings{}
// Check for legacy settings if the default org.
if s.DeploymentSyncSettings.Legacy.GroupField != "" {
if s.Legacy.GroupField != "" {
defaultOrganization, err := db.GetDefaultOrganization(ctx)
if err != nil {
return nil, xerrors.Errorf("get default organization: %w", err)
+5 -5
View File
@@ -35,7 +35,7 @@ func (AGPLIDPSync) OrganizationSyncEnabled(_ context.Context, _ database.Store)
func (s AGPLIDPSync) UpdateOrganizationSyncSettings(ctx context.Context, db database.Store, settings OrganizationSyncSettings) error {
rlv := s.Manager.Resolver(db)
err := s.SyncSettings.Organization.SetRuntimeValue(ctx, rlv, &settings)
err := s.Organization.SetRuntimeValue(ctx, rlv, &settings)
if err != nil {
return xerrors.Errorf("update organization sync settings: %w", err)
}
@@ -47,7 +47,7 @@ func (s AGPLIDPSync) OrganizationSyncSettings(ctx context.Context, db database.S
// If this logic is ever updated, make sure to update the corresponding
// checkIDPOrgSync in coderd/telemetry/telemetry.go.
rlv := s.Manager.Resolver(db)
orgSettings, err := s.SyncSettings.Organization.Resolve(ctx, rlv)
orgSettings, err := s.Organization.Resolve(ctx, rlv)
if err != nil {
if !xerrors.Is(err, runtimeconfig.ErrEntryNotFound) {
return nil, xerrors.Errorf("resolve org sync settings: %w", err)
@@ -55,9 +55,9 @@ func (s AGPLIDPSync) OrganizationSyncSettings(ctx context.Context, db database.S
// Default to the statically assigned settings if they exist.
orgSettings = &OrganizationSyncSettings{
Field: s.DeploymentSyncSettings.OrganizationField,
Mapping: s.DeploymentSyncSettings.OrganizationMapping,
AssignDefault: s.DeploymentSyncSettings.OrganizationAssignDefault,
Field: s.OrganizationField,
Mapping: s.OrganizationMapping,
AssignDefault: s.OrganizationAssignDefault,
}
}
return orgSettings, nil
+1 -1
View File
@@ -44,7 +44,7 @@ func (AGPLIDPSync) SiteRoleSyncEnabled() bool {
func (s AGPLIDPSync) UpdateRoleSyncSettings(ctx context.Context, orgID uuid.UUID, db database.Store, settings RoleSyncSettings) error {
orgResolver := s.Manager.OrganizationResolver(db, orgID)
err := s.SyncSettings.Role.SetRuntimeValue(ctx, orgResolver, &settings)
err := s.Role.SetRuntimeValue(ctx, orgResolver, &settings)
if err != nil {
return xerrors.Errorf("update role sync settings: %w", err)
}
+1 -1
View File
@@ -222,7 +222,7 @@ func (d *Detector) run(t time.Time) Stats {
err := reapJob(ctx, log, d.db, d.pubsub, job)
if err != nil {
if !(xerrors.As(err, &acquireLockError{}) || xerrors.As(err, &jobIneligibleError{})) {
if (!xerrors.As(err, &acquireLockError{}) && !xerrors.As(err, &jobIneligibleError{})) {
log.Error(ctx, "error forcefully terminating provisioner job", slog.F("type", job.Type), slog.Error(err))
}
continue
+1 -1
View File
@@ -1010,7 +1010,7 @@ type mcpServerConfigDeleteRaceStore struct {
func (s *mcpServerConfigDeleteRaceStore) GetMCPServerConfigByID(ctx context.Context, id uuid.UUID) (database.MCPServerConfig, error) {
config, err := s.Store.GetMCPServerConfigByID(ctx, id)
if err == nil && s.armed.CompareAndSwap(true, false) {
if err := s.Store.DeleteMCPServerConfigByID(ctx, id); err != nil {
if err := s.DeleteMCPServerConfigByID(ctx, id); err != nil {
return database.MCPServerConfig{}, err
}
}
+3 -3
View File
@@ -113,7 +113,7 @@ func (api *API) deleteOrganizationMember(rw http.ResponseWriter, r *http.Request
Action: database.AuditActionDelete,
})
)
aReq.Old = member.OrganizationMember.Auditable(member.Username)
aReq.Old = member.Auditable(member.Username)
defer commitAudit()
// Note: we disallow adding OIDC users if organization sync is enabled.
@@ -421,7 +421,7 @@ func (api *API) putMemberRoles(rw http.ResponseWriter, r *http.Request) {
Action: database.AuditActionWrite,
})
)
aReq.Old = member.OrganizationMember.Auditable(member.Username)
aReq.Old = member.Auditable(member.Username)
defer commitAudit()
// Check if changing roles is allowed
@@ -429,7 +429,7 @@ func (api *API) putMemberRoles(rw http.ResponseWriter, r *http.Request) {
return
}
if apiKey.UserID == member.OrganizationMember.UserID {
if apiKey.UserID == member.UserID {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
Message: "You cannot change your own organization roles.",
Detail: "Another user with the appropriate permissions must change your roles.",
@@ -64,7 +64,7 @@ func TestWebhook(t *testing.T) {
assert.Equal(t, bodyMarkdown, payload.BodyMarkdown)
w.WriteHeader(http.StatusOK)
_, err = w.Write([]byte(fmt.Sprintf("received %s", payload.MsgID)))
_, err = fmt.Fprintf(w, "received %s", payload.MsgID)
assert.NoError(t, err)
},
expectSuccess: true,
+2 -2
View File
@@ -250,7 +250,7 @@ func (a *labelAggregator) aggregate(am annotatedMetric, labels []string) error {
}
// Memoize based on the metric name & the unique combination of labels.
key := fmt.Sprintf("%s:%v", am.Stats_Metric.Name, labelSet.FastFingerprint())
key := fmt.Sprintf("%s:%v", am.Name, labelSet.FastFingerprint())
// Aggregate the value based on the key.
a.aggregations[key] += am.Value
@@ -297,7 +297,7 @@ func (ma *MetricsAggregator) Run(ctx context.Context) func() {
key := hashKey(&req, m)
if val, ok := ma.store[key]; ok {
val.Stats_Metric.Value = m.Value
val.Value = m.Value
val.expiryDate = req.timestamp.Add(ma.metricsCleanupInterval)
ma.store[key] = val
} else {
@@ -5485,7 +5485,7 @@ func (s *fakeStream) Send(j *proto.AcquiredJob) error {
func (s *fakeStream) Recv() (*proto.CancelAcquire, error) {
s.c.L.Lock()
defer s.c.L.Unlock()
for !(s.canceled || s.closed) {
for !s.canceled && !s.closed {
s.c.Wait()
}
if s.canceled {
@@ -5528,7 +5528,7 @@ func (s *fakeStream) Close() error {
func (s *fakeStream) waitForJob() (*proto.AcquiredJob, error) {
s.c.L.Lock()
defer s.c.L.Unlock()
for !(s.sendCalled || s.closed) {
for !s.sendCalled && !s.closed {
s.c.Wait()
}
if s.sendCalled {
+1 -1
View File
@@ -478,7 +478,7 @@ func (a RegoAuthorizer) authorize(ctx context.Context, subject Subject, action p
// The caller should use either 1 or the other (or none).
// Using "AnyOrgOwner" and an OrgID is a contradiction.
// An empty uuid or a nil uuid means "no org owner".
if object.AnyOrgOwner && !(object.OrgID == "" || object.OrgID == "00000000-0000-0000-0000-000000000000") {
if object.AnyOrgOwner && object.OrgID != "" && object.OrgID != "00000000-0000-0000-0000-000000000000" {
return xerrors.Errorf("object cannot have 'any_org' and an 'org_id' specified, values are mutually exclusive")
}
+1 -4
View File
@@ -146,10 +146,7 @@ func InnerTextFromMarkdown(markdown string) (out string, err error) {
// after the start tag. Skip just that token (not a running depth) so a stray
// </script> or unterminated tag can't swallow the rest of the document.
skipNextText := false
for {
if z.Next() == xhtml.ErrorToken {
break // includes io.EOF
}
for z.Next() != xhtml.ErrorToken {
switch tok := z.Token(); tok.Type {
case xhtml.StartTagToken:
skipNextText = tok.Data == "script" || tok.Data == "style"
+1 -1
View File
@@ -396,7 +396,7 @@ type MultiAgentController struct {
}
func (m *MultiAgentController) New(client tailnet.CoordinatorClient) tailnet.CloserWaiter {
b := m.BasicCoordinationController.NewCoordination(client)
b := m.NewCoordination(client)
// resync all destinations
m.mu.Lock()
defer m.mu.Unlock()
+2 -2
View File
@@ -1104,11 +1104,11 @@ func buildTaskEvent(
// Below only relevant for "resumed" tasks, not when initially created.
if isResumed {
event.LastResumedAt = &row.StartBuildCreatedAt.Time
switch {
switch row.StartBuildReason.BuildReason {
// TODO(Cian): will this exist? Future readers may know better than I.
// case row.StartBuildReason == database.BuildReasonTaskAutoResume:
// event.ResumeReason = ptr.Ref("auto")
case row.StartBuildReason.BuildReason == database.BuildReasonTaskResume:
case database.BuildReasonTaskResume:
event.ResumeReason = ptr.Ref("manual")
default: // Task resumed by starting workspace?
event.ResumeReason = ptr.Ref("other")
+1 -1
View File
@@ -1144,7 +1144,7 @@ func TestPatchTemplateMeta(t *testing.T) {
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
require.Equal(t, codersdk.WorkspaceAgentPortShareLevelPublic, template.MaxPortShareLevel)
var level codersdk.WorkspaceAgentPortShareLevel = codersdk.WorkspaceAgentPortShareLevelAuthenticated
level := codersdk.WorkspaceAgentPortShareLevelAuthenticated
req := codersdk.UpdateTemplateMeta{
MaxPortShareLevel: &level,
}
+1 -1
View File
@@ -1887,7 +1887,7 @@ func (api *API) dynamicTemplateVersionTags(ctx context.Context, rw http.Response
func (api *API) classicTemplateVersionTags(ctx context.Context, rw http.ResponseWriter, file database.File) (map[string]string, bool) {
// Try to parse template tags from the given file.
tempDir, err := os.MkdirTemp(api.Options.CacheDir, "tfparse-*")
tempDir, err := os.MkdirTemp(api.CacheDir, "tfparse-*")
if err != nil {
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
Message: "Internal error checking workspace tags",
+1 -1
View File
@@ -156,7 +156,7 @@ func mapToSlogFields(m map[string]interface{}) slog.Map {
func mapToBasicMap(m map[string]interface{}) map[string]interface{} {
basic := make(map[string]interface{}, len(m))
for k, v := range m {
var val interface{} = v
val := v
switch v := v.(type) {
case float32:
val = float64(v)
+1 -5
View File
@@ -3246,11 +3246,7 @@ func assertPagination(ctx context.Context, t *testing.T, client *codersdk.Client
require.Equalf(t, onlyUsernames(page.Users), onlyUsernames(allUsers[:limit]), "first page, limit=%d", limit)
count += len(page.Users)
for {
if len(page.Users) == 0 {
break
}
for len(page.Users) != 0 {
afterCursor := page.Users[len(page.Users)-1].ID
// Assert each page is the next expected page
// This is using a cursor, and only works if all users created_at
+2 -2
View File
@@ -872,10 +872,10 @@ func requireSecretAPIError(t *testing.T, err error, status int, detailContains s
var sdkErr *codersdk.Error
require.ErrorAs(t, err, &sdkErr)
assert.Equal(t, status, sdkErr.StatusCode())
combined := sdkErr.Message + " " + sdkErr.Response.Detail
combined := sdkErr.Message + " " + sdkErr.Detail
assert.Containsf(t, combined, detailContains,
"expected response to contain %q; got Message=%q Detail=%q",
detailContains, sdkErr.Message, sdkErr.Response.Detail)
detailContains, sdkErr.Message, sdkErr.Detail)
}
func TestDeleteUserSecret(t *testing.T) {
+4 -4
View File
@@ -1267,7 +1267,7 @@ func (api *API) derpMapUpdates(rw http.ResponseWriter, r *http.Request) {
}
}(ctx)
ticker := time.NewTicker(api.Options.DERPMapUpdateFrequency)
ticker := time.NewTicker(api.DERPMapUpdateFrequency)
defer ticker.Stop()
var lastDERPMap *tailcfg.DERPMap
@@ -1281,7 +1281,7 @@ func (api *API) derpMapUpdates(rw http.ResponseWriter, r *http.Request) {
lastDERPMap = derpMap
}
ticker.Reset(api.Options.DERPMapUpdateFrequency)
ticker.Reset(api.DERPMapUpdateFrequency)
select {
case <-ctx.Done():
return
@@ -1456,7 +1456,7 @@ func (api *API) logTunnelConnection(agentID uuid.UUID, statusCode int32, userID
return
}
staleInterval := api.Options.WorkspaceAppAuditSessionTimeout
staleInterval := api.WorkspaceAppAuditSessionTimeout
if staleInterval == 0 {
staleInterval = time.Hour
}
@@ -1527,7 +1527,7 @@ func (api *API) handleResumeToken(ctx context.Context, rw http.ResponseWriter, r
peerID = uuid.New()
resumeToken := r.URL.Query().Get("resume_token")
if resumeToken != "" {
peerID, err = api.Options.CoordinatorResumeTokenProvider.VerifyResumeToken(ctx, resumeToken)
peerID, err = api.CoordinatorResumeTokenProvider.VerifyResumeToken(ctx, resumeToken)
// If the token is missing the key ID, it's probably an old token in which
// case we just want to generate a new peer ID.
switch {
+1 -1
View File
@@ -184,7 +184,7 @@ func (api *API) workspaceAgentRPC(rw http.ResponseWriter, r *http.Request) {
AgentStatsRefreshInterval: api.AgentStatsRefreshInterval,
DisableDirectConnections: api.DeploymentValues.DERP.Config.BlockDirect.Value(),
DerpForceWebSockets: api.DeploymentValues.DERP.Config.ForceWebSockets.Value(),
DerpMapUpdateFrequency: api.Options.DERPMapUpdateFrequency,
DerpMapUpdateFrequency: api.DERPMapUpdateFrequency,
ExternalAuthConfigs: api.ExternalAuthConfigs,
Experiments: api.Experiments,
LifecycleMetrics: api.lifecycleMetrics,
+1 -1
View File
@@ -1094,7 +1094,7 @@ func Run(t *testing.T, appHostIsPrimary bool, factory DeploymentFactory) {
require.NoError(t, err)
// Verify the prefix is in the token.
require.Equal(t, prefixedOwnerApp.Prefix, tok.Request.Prefix)
require.Equal(t, prefixedOwnerApp.Prefix, tok.Prefix)
// Ensure the signed app token cookie is valid by making a request with
// it with no session token.
+4 -4
View File
@@ -322,8 +322,8 @@ func (p *DBTokenProvider) authorizeRequest(ctx context.Context, roles *rbac.Subj
// Figure out which RBAC resource to check. For terminals we use execution
// instead of application connect.
var (
rbacAction policy.Action = policy.ActionApplicationConnect
rbacResource rbac.Object = dbReq.Workspace.RBACObject()
rbacAction = policy.ActionApplicationConnect
rbacResource = dbReq.Workspace.RBACObject()
// rbacResourceOwned is for the level "authenticated". We still need to
// make sure the API key has permissions to connect to the actor's own
// workspace. Scopes would prevent this.
@@ -336,7 +336,7 @@ func (p *DBTokenProvider) authorizeRequest(ctx context.Context, roles *rbac.Subj
// the object to check the proper permissions. AnyOrg is almost the same,
// but technically excludes users who are not in any organization. This is
// the closest we can get though without more significant refactoring.
rbacResourceOwned rbac.Object = rbac.ResourceWorkspace.WithOwner(roles.ID).AnyOrganization()
rbacResourceOwned = rbac.ResourceWorkspace.WithOwner(roles.ID).AnyOrganization()
)
if dbReq.AccessMethod == AccessMethodTerminal {
rbacAction = policy.ActionSSH
@@ -446,7 +446,7 @@ func (p *DBTokenProvider) connLogInitRequest(w http.ResponseWriter, r *http.Requ
// Approximation of the status code.
// #nosec G115 - Safe conversion as HTTP status code is expected to be within int32 range (typically 100-599)
var statusCode int32 = int32(sw.Status)
statusCode := int32(sw.Status)
if statusCode == 0 {
statusCode = http.StatusOK
}
+1 -1
View File
@@ -835,7 +835,7 @@ func Test_ResolveRequest(t *testing.T) {
require.Equal(t, req.BasePath, token.BasePath)
require.Empty(t, token.UsernameOrID)
require.Empty(t, token.WorkspaceNameOrID)
require.Equal(t, req.AgentNameOrID, token.Request.AgentNameOrID)
require.Equal(t, req.AgentNameOrID, token.AgentNameOrID)
require.Empty(t, token.AppSlugOrPort)
require.Empty(t, token.AppURL)
assertConnLogContains(t, rw, r, connLogger, workspace, agentName, "terminal", database.ConnectionTypeWorkspaceApp, me.ID)
+2 -2
View File
@@ -32,7 +32,7 @@ type SignedToken struct {
// MatchesRequest returns true if the token matches the request. Any token that
// does not match the request should be considered invalid.
func (t SignedToken) MatchesRequest(req Request) bool {
tokenBasePath := t.Request.BasePath
tokenBasePath := t.BasePath
if !strings.HasSuffix(tokenBasePath, "/") {
tokenBasePath += "/"
}
@@ -111,7 +111,7 @@ func FromRequest(r *http.Request, mgr cryptokeys.SigningKeycache) (*SignedToken,
Time: time.Now(),
}))
if err == nil {
req := token.Request.Normalize()
req := token.Normalize()
if hasQueryParam && req.AccessMethod != AccessMethodTerminal {
// The request must be a terminal request if we're using a
// query parameter.
+1 -1
View File
@@ -316,7 +316,7 @@ func Test_FromRequest(t *testing.T) {
// Add an expired cookie
expired := token
expired.RegisteredClaims.Expiry = jwt.NewNumericDate(time.Now().Add(time.Hour * -1))
expired.Expiry = jwt.NewNumericDate(time.Now().Add(time.Hour * -1))
expiredStr, err := jwtutils.Sign(ctx, signer, expired)
require.NoError(t, err)
r.AddCookie(&http.Cookie{
+1 -1
View File
@@ -347,7 +347,7 @@ func TestPostWorkspaceBuildsOnSuccessPinnedChildVersionRequiresTemplateUpdate(t
var apiErr *codersdk.Error
require.ErrorAs(t, err, &apiErr)
require.Equal(t, http.StatusForbidden, apiErr.StatusCode())
require.Contains(t, apiErr.Response.Detail, "template update permission")
require.Contains(t, apiErr.Detail, "template update permission")
// THEN: no new workspace build is created.
builds, err := userClient.WorkspaceBuilds(ctx, codersdk.WorkspaceBuildsRequest{WorkspaceID: workspace.ID})
+7 -7
View File
@@ -122,7 +122,7 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) {
workspace,
data.builds[0],
data.templates[0],
api.Options.AllowWorkspaceRenames,
api.AllowWorkspaceRenames,
appStatus,
)
if err != nil {
@@ -339,7 +339,7 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request)
workspace,
data.builds[0],
data.templates[0],
api.Options.AllowWorkspaceRenames,
api.AllowWorkspaceRenames,
appStatus,
)
if err != nil {
@@ -851,7 +851,7 @@ func createWorkspace(
workspace,
apiBuild,
template,
api.Options.AllowWorkspaceRenames,
api.AllowWorkspaceRenames,
codersdk.WorkspaceAppStatus{},
)
if err != nil {
@@ -1154,7 +1154,7 @@ func (api *API) patchWorkspace(rw http.ResponseWriter, r *http.Request) {
// patched in the future, it's enough if one changes.
name := workspace.Name
if req.Name != "" || req.Name != workspace.Name {
if !api.Options.AllowWorkspaceRenames {
if !api.AllowWorkspaceRenames {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
Message: "Workspace renames are not allowed.",
})
@@ -1593,7 +1593,7 @@ func (api *API) putWorkspaceDormant(rw http.ResponseWriter, r *http.Request) {
workspace,
data.builds[0],
data.templates[0],
api.Options.AllowWorkspaceRenames,
api.AllowWorkspaceRenames,
appStatus,
)
if err != nil {
@@ -2172,7 +2172,7 @@ func (api *API) watchWorkspace(
workspace,
data.builds[0],
data.templates[0],
api.Options.AllowWorkspaceRenames,
api.AllowWorkspaceRenames,
appStatus,
)
if err != nil {
@@ -2760,7 +2760,7 @@ func (api *API) workspaceData(ctx context.Context, workspaces []database.Workspa
templates: templates,
appStatuses: db2sdk.WorkspaceAppStatuses(appStatuses),
builds: apiBuilds,
allowRenames: api.Options.AllowWorkspaceRenames,
allowRenames: api.AllowWorkspaceRenames,
}, nil
}
+3 -2
View File
@@ -5796,9 +5796,10 @@ func TestWorkspaceListTasks(t *testing.T) {
// Then: verify TaskID is only set for task workspaces
for _, workspace := range workspaces.Workspaces {
if workspace.ID == workspaceWithoutTask.ID {
switch workspace.ID {
case workspaceWithoutTask.ID:
assert.False(t, workspace.TaskID.Valid)
} else if workspace.ID == workspaceWithTask.ID {
case workspaceWithTask.ID:
assert.True(t, workspace.TaskID.Valid)
assert.Equal(t, task.ID, workspace.TaskID.UUID)
}
+2
View File
@@ -1924,6 +1924,8 @@ var ErrArchiveRequiresRootChat = xerrors.New(
// Child chats must not be archived independently. ArchiveChat
// rejects them with [ErrArchiveRequiresRootChat] so callers cannot
// silently break the parent-implies-child archive invariant.
//
//nolint:staticcheck // Receiver name matches the other Server methods in this file.
func (p *Server) ArchiveChat(ctx context.Context, chat database.Chat) error {
if chat.ID == uuid.Nil {
return xerrors.New("chat_id is required")
+1 -1
View File
@@ -161,7 +161,7 @@ func recordOpenAIRequest(req *chattest.OpenAIRequest) recordedOpenAIRequest {
var contentLength int64
if req.Request != nil {
contentLength = req.Request.ContentLength
contentLength = req.ContentLength
}
return recordedOpenAIRequest{
+1 -1
View File
@@ -927,7 +927,7 @@ func ModelFromConfig(
apiKey := providerKeys.APIKey(provider)
if apiKey == "" &&
!(ProviderAllowsAmbientCredentials(provider) && providerKeys.HasProvider(provider)) {
(!ProviderAllowsAmbientCredentials(provider) || !providerKeys.HasProvider(provider)) {
return Model{}, missingProviderAPIKeyError(provider)
}
baseURL := providerKeys.BaseURL(provider)
@@ -47,7 +47,7 @@ func TestModelFromConfig_OpenAIResponsesAPIOverride(t *testing.T) {
var gotPath string
serverURL := chattest.NewOpenAI(t, func(req *chattest.OpenAIRequest) chattest.OpenAIResponse {
mu.Lock()
gotPath = req.Request.URL.Path
gotPath = req.URL.Path
mu.Unlock()
return chattest.OpenAINonStreamingResponse("ok")
})
@@ -135,7 +135,7 @@ func TestModelTransportConsumersAgree(t *testing.T) {
var gotPath string
serverURL := chattest.NewOpenAI(t, func(req *chattest.OpenAIRequest) chattest.OpenAIResponse {
mu.Lock()
gotPath = req.Request.URL.Path
gotPath = req.URL.Path
mu.Unlock()
return chattest.OpenAINonStreamingResponse("ok")
})