Skip to content

Commit c3786a5

Browse files
committed
Merge branch 'main' into replica
2 parents d6ce216 + ccc008e commit c3786a5

File tree

114 files changed

+1841
-674
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+1841
-674
lines changed

.vscode/settings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"drpcserver",
2727
"Dsts",
2828
"enablements",
29+
"eventsourcemock",
2930
"fatih",
3031
"Formik",
3132
"gitsshkey",

cli/templatecreate.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"unicode/utf8"
1111

1212
"github.com/briandowns/spinner"
13+
"github.com/google/uuid"
1314
"github.com/spf13/cobra"
1415
"golang.org/x/xerrors"
1516

@@ -91,7 +92,7 @@ func templateCreate() *cobra.Command {
9192
Client: client,
9293
Organization: organization,
9394
Provisioner: database.ProvisionerType(provisioner),
94-
FileHash: resp.Hash,
95+
FileID: resp.ID,
9596
ParameterFile: parameterFile,
9697
})
9798
if err != nil {
@@ -148,7 +149,7 @@ type createValidTemplateVersionArgs struct {
148149
Client *codersdk.Client
149150
Organization codersdk.Organization
150151
Provisioner database.ProvisionerType
151-
FileHash string
152+
FileID uuid.UUID
152153
ParameterFile string
153154
// Template is only required if updating a template's active version.
154155
Template *codersdk.Template
@@ -165,7 +166,7 @@ func createValidTemplateVersion(cmd *cobra.Command, args createValidTemplateVers
165166
req := codersdk.CreateTemplateVersionRequest{
166167
Name: args.Name,
167168
StorageMethod: codersdk.ProvisionerStorageMethodFile,
168-
StorageSource: args.FileHash,
169+
FileID: args.FileID,
169170
Provisioner: codersdk.ProvisionerType(args.Provisioner),
170171
ParameterValues: parameters,
171172
}

cli/templatepull.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func templatePull() *cobra.Command {
6666
latest := versions[0]
6767

6868
// Download the tar archive.
69-
raw, ctype, err := client.Download(ctx, latest.Job.StorageSource)
69+
raw, ctype, err := client.Download(ctx, latest.Job.FileID)
7070
if err != nil {
7171
return xerrors.Errorf("download template: %w", err)
7272
}

cli/templatepush.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func templatePush() *cobra.Command {
8080
Client: client,
8181
Organization: organization,
8282
Provisioner: database.ProvisionerType(provisioner),
83-
FileHash: resp.Hash,
83+
FileID: resp.ID,
8484
ParameterFile: parameterFile,
8585
Template: &template,
8686
ReuseParameters: !alwaysPrompt,

cli/tokens.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func createToken() *cobra.Command {
5555
return xerrors.Errorf("create codersdk client: %w", err)
5656
}
5757

58-
res, err := client.CreateToken(cmd.Context(), codersdk.Me)
58+
res, err := client.CreateToken(cmd.Context(), codersdk.Me, codersdk.CreateTokenRequest{})
5959
if err != nil {
6060
return xerrors.Errorf("create tokens: %w", err)
6161
}

coderd/apikey.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,23 @@ func (api *API) postToken(rw http.ResponseWriter, r *http.Request) {
3434
return
3535
}
3636

37+
var createToken codersdk.CreateTokenRequest
38+
if !httpapi.Read(ctx, rw, r, &createToken) {
39+
return
40+
}
41+
42+
scope := database.APIKeyScopeAll
43+
if scope != "" {
44+
scope = database.APIKeyScope(createToken.Scope)
45+
}
46+
3747
// tokens last 100 years
3848
lifeTime := time.Hour * 876000
3949
cookie, err := api.createAPIKey(ctx, createAPIKeyParams{
4050
UserID: user.ID,
4151
LoginType: database.LoginTypeToken,
4252
ExpiresAt: database.Now().Add(lifeTime),
53+
Scope: scope,
4354
LifetimeSeconds: int64(lifeTime.Seconds()),
4455
})
4556
if err != nil {
@@ -54,6 +65,7 @@ func (api *API) postToken(rw http.ResponseWriter, r *http.Request) {
5465
}
5566

5667
// Creates a new session key, used for logging in via the CLI.
68+
// DEPRECATED: use postToken instead.
5769
func (api *API) postAPIKey(rw http.ResponseWriter, r *http.Request) {
5870
ctx := r.Context()
5971
user := httpmw.UserParam(r)
@@ -229,6 +241,11 @@ func (api *API) createAPIKey(ctx context.Context, params createAPIKeyParams) (*h
229241
if params.Scope != "" {
230242
scope = params.Scope
231243
}
244+
switch scope {
245+
case database.APIKeyScopeAll, database.APIKeyScopeApplicationConnect:
246+
default:
247+
return nil, xerrors.Errorf("invalid API key scope: %q", scope)
248+
}
232249

233250
key, err := api.Database.InsertAPIKey(ctx, database.InsertAPIKeyParams{
234251
ID: keyID,

coderd/apikey_test.go

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,61 @@ import (
1414

1515
func TestTokens(t *testing.T) {
1616
t.Parallel()
17-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
18-
defer cancel()
19-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
20-
_ = coderdtest.CreateFirstUser(t, client)
21-
keys, err := client.GetTokens(ctx, codersdk.Me)
22-
require.NoError(t, err)
23-
require.Empty(t, keys)
2417

25-
res, err := client.CreateToken(ctx, codersdk.Me)
26-
require.NoError(t, err)
27-
require.Greater(t, len(res.Key), 2)
18+
t.Run("CRUD", func(t *testing.T) {
19+
t.Parallel()
2820

29-
keys, err = client.GetTokens(ctx, codersdk.Me)
30-
require.NoError(t, err)
31-
require.EqualValues(t, len(keys), 1)
32-
require.Contains(t, res.Key, keys[0].ID)
33-
// expires_at must be greater than 50 years
34-
require.Greater(t, keys[0].ExpiresAt, time.Now().Add(time.Hour*438300))
21+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
22+
defer cancel()
23+
client := coderdtest.New(t, nil)
24+
_ = coderdtest.CreateFirstUser(t, client)
25+
keys, err := client.GetTokens(ctx, codersdk.Me)
26+
require.NoError(t, err)
27+
require.Empty(t, keys)
3528

36-
err = client.DeleteAPIKey(ctx, codersdk.Me, keys[0].ID)
37-
require.NoError(t, err)
38-
keys, err = client.GetTokens(ctx, codersdk.Me)
39-
require.NoError(t, err)
40-
require.Empty(t, keys)
29+
res, err := client.CreateToken(ctx, codersdk.Me, codersdk.CreateTokenRequest{})
30+
require.NoError(t, err)
31+
require.Greater(t, len(res.Key), 2)
32+
33+
keys, err = client.GetTokens(ctx, codersdk.Me)
34+
require.NoError(t, err)
35+
require.EqualValues(t, len(keys), 1)
36+
require.Contains(t, res.Key, keys[0].ID)
37+
// expires_at must be greater than 50 years
38+
require.Greater(t, keys[0].ExpiresAt, time.Now().Add(time.Hour*438300))
39+
require.Equal(t, codersdk.APIKeyScopeAll, keys[0].Scope)
40+
41+
// no update
42+
43+
err = client.DeleteAPIKey(ctx, codersdk.Me, keys[0].ID)
44+
require.NoError(t, err)
45+
keys, err = client.GetTokens(ctx, codersdk.Me)
46+
require.NoError(t, err)
47+
require.Empty(t, keys)
48+
})
49+
50+
t.Run("Scoped", func(t *testing.T) {
51+
t.Parallel()
52+
53+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
54+
defer cancel()
55+
client := coderdtest.New(t, nil)
56+
_ = coderdtest.CreateFirstUser(t, client)
57+
58+
res, err := client.CreateToken(ctx, codersdk.Me, codersdk.CreateTokenRequest{
59+
Scope: codersdk.APIKeyScopeApplicationConnect,
60+
})
61+
require.NoError(t, err)
62+
require.Greater(t, len(res.Key), 2)
63+
64+
keys, err := client.GetTokens(ctx, codersdk.Me)
65+
require.NoError(t, err)
66+
require.EqualValues(t, len(keys), 1)
67+
require.Contains(t, res.Key, keys[0].ID)
68+
// expires_at must be greater than 50 years
69+
require.Greater(t, keys[0].ExpiresAt, time.Now().Add(time.Hour*438300))
70+
require.Equal(t, keys[0].Scope, codersdk.APIKeyScopeApplicationConnect)
71+
})
4172
}
4273

4374
func TestAPIKey(t *testing.T) {

coderd/autobuild/executor/lifecycle_executor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ func build(ctx context.Context, store database.Store, workspace database.Workspa
276276
Provisioner: template.Provisioner,
277277
Type: database.ProvisionerJobTypeWorkspaceBuild,
278278
StorageMethod: priorJob.StorageMethod,
279-
StorageSource: priorJob.StorageSource,
279+
FileID: priorJob.FileID,
280280
Input: input,
281281
})
282282
if err != nil {

coderd/coderd.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ func New(options *Options) *API {
202202
RedirectToLogin: false,
203203
Optional: true,
204204
}),
205-
httpmw.ExtractUserParam(api.Database),
205+
httpmw.ExtractUserParam(api.Database, false),
206206
httpmw.ExtractWorkspaceAndAgentParam(api.Database),
207207
),
208208
// Build-Version is helpful for debugging.
@@ -219,8 +219,18 @@ func New(options *Options) *API {
219219
r.Use(
220220
tracing.Middleware(api.TracerProvider),
221221
httpmw.RateLimitPerMinute(options.APIRateLimit),
222-
apiKeyMiddlewareRedirect,
223-
httpmw.ExtractUserParam(api.Database),
222+
httpmw.ExtractAPIKey(httpmw.ExtractAPIKeyConfig{
223+
DB: options.Database,
224+
OAuth2Configs: oauthConfigs,
225+
// Optional is true to allow for public apps. If an
226+
// authorization check fails and the user is not authenticated,
227+
// they will be redirected to the login page by the app handler.
228+
RedirectToLogin: false,
229+
Optional: true,
230+
}),
231+
// Redirect to the login page if the user tries to open an app with
232+
// "me" as the username and they are not logged in.
233+
httpmw.ExtractUserParam(api.Database, true),
224234
// Extracts the <workspace.agent> from the url
225235
httpmw.ExtractWorkspaceAndAgentParam(api.Database),
226236
)
@@ -285,7 +295,7 @@ func New(options *Options) *API {
285295
// file content is expensive so it should be small.
286296
httpmw.RateLimitPerMinute(12),
287297
)
288-
r.Get("/{hash}", api.fileByHash)
298+
r.Get("/{fileID}", api.fileByID)
289299
r.Post("/", api.postFile)
290300
})
291301

@@ -315,7 +325,7 @@ func New(options *Options) *API {
315325
r.Get("/roles", api.assignableOrgRoles)
316326
r.Route("/{user}", func(r chi.Router) {
317327
r.Use(
318-
httpmw.ExtractUserParam(options.Database),
328+
httpmw.ExtractUserParam(options.Database, false),
319329
httpmw.ExtractOrganizationMemberParam(options.Database),
320330
)
321331
r.Put("/roles", api.putMemberRoles)
@@ -394,7 +404,7 @@ func New(options *Options) *API {
394404
r.Get("/", api.assignableSiteRoles)
395405
})
396406
r.Route("/{user}", func(r chi.Router) {
397-
r.Use(httpmw.ExtractUserParam(options.Database))
407+
r.Use(httpmw.ExtractUserParam(options.Database, false))
398408
r.Delete("/", api.deleteUser)
399409
r.Get("/", api.userByName)
400410
r.Put("/profile", api.putUserProfile)

coderd/coderdtest/authorize.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ func AGPLRoutes(a *AuthTester) (map[string]string, map[string]RouteCheck) {
142142
AssertObject: rbac.ResourceTemplate.InOrg(a.Template.OrganizationID),
143143
},
144144
"POST:/api/v2/files": {AssertAction: rbac.ActionCreate, AssertObject: rbac.ResourceFile},
145-
"GET:/api/v2/files/{hash}": {
145+
"GET:/api/v2/files/{fileID}": {
146146
AssertAction: rbac.ActionRead,
147147
AssertObject: rbac.ResourceFile.WithOwner(a.Admin.UserID.String()),
148148
},
@@ -369,7 +369,7 @@ func NewAuthTester(ctx context.Context, t *testing.T, client *codersdk.Client, a
369369
"{workspaceagent}": workspace.LatestBuild.Resources[0].Agents[0].ID.String(),
370370
"{buildnumber}": strconv.FormatInt(int64(workspace.LatestBuild.BuildNumber), 10),
371371
"{template}": template.ID.String(),
372-
"{hash}": file.Hash,
372+
"{fileID}": file.ID.String(),
373373
"{workspaceresource}": workspace.LatestBuild.Resources[0].ID.String(),
374374
"{workspaceapp}": workspace.LatestBuild.Resources[0].Agents[0].Apps[0].Name,
375375
"{templateversion}": version.ID.String(),

coderd/coderdtest/coderdtest.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ func CreateTemplateVersion(t *testing.T, client *codersdk.Client, organizationID
390390
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, data)
391391
require.NoError(t, err)
392392
templateVersion, err := client.CreateTemplateVersion(context.Background(), organizationID, codersdk.CreateTemplateVersionRequest{
393-
StorageSource: file.Hash,
393+
FileID: file.ID,
394394
StorageMethod: codersdk.ProvisionerStorageMethodFile,
395395
Provisioner: codersdk.ProvisionerTypeEcho,
396396
})
@@ -438,7 +438,7 @@ func UpdateTemplateVersion(t *testing.T, client *codersdk.Client, organizationID
438438
require.NoError(t, err)
439439
templateVersion, err := client.CreateTemplateVersion(context.Background(), organizationID, codersdk.CreateTemplateVersionRequest{
440440
TemplateID: templateID,
441-
StorageSource: file.Hash,
441+
FileID: file.ID,
442442
StorageMethod: codersdk.ProvisionerStorageMethodFile,
443443
Provisioner: codersdk.ProvisionerTypeEcho,
444444
})

0 commit comments

Comments
 (0)