Skip to content

Commit fecd2b8

Browse files
committed
Merge remote-tracking branch 'origin/dk/prebuilds' into jjs/prebuilds-metrics
2 parents 633df53 + 97d314e commit fecd2b8

File tree

132 files changed

+1338
-722
lines changed

Some content is hidden

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

132 files changed

+1338
-722
lines changed

.vscode/markdown.code-snippets

+8-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
22
// For info about snippets, visit https://code.visualstudio.com/docs/editor/userdefinedsnippets
3+
// https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts
34

4-
"admonition": {
5-
"prefix": "#callout",
5+
"alert": {
6+
"prefix": "#alert",
67
"body": [
7-
"<blockquote class=\"admonition ${1|caution,important,note,tip,warning|}\">\n",
8-
"${TM_SELECTED_TEXT:${2:add info here}}\n",
9-
"</blockquote>\n"
8+
"> [!${1|CAUTION,IMPORTANT,NOTE,TIP,WARNING|}]",
9+
"> ${TM_SELECTED_TEXT:${2:add info here}}\n"
1010
],
11-
"description": "callout admonition caution info note tip warning"
11+
"description": "callout admonition caution important note tip warning"
1212
},
1313
"fenced code block": {
1414
"prefix": "#codeblock",
@@ -23,9 +23,8 @@
2323
"premium-feature": {
2424
"prefix": "#premium-feature",
2525
"body": [
26-
"<blockquote class=\"info\">\n",
27-
"${1:feature} ${2|is,are|} an Enterprise and Premium feature. [Learn more](https://coder.com/pricing#compare-plans).\n",
28-
"</blockquote>"
26+
"> [!NOTE]\n",
27+
"> ${1:feature} ${2|is,are|} an Enterprise and Premium feature. [Learn more](https://coder.com/pricing#compare-plans).\n"
2928
]
3029
},
3130
"tabs": {

agent/agent_test.go

+48
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151
"github.com/coder/coder/v2/agent/agentssh"
5252
"github.com/coder/coder/v2/agent/agenttest"
5353
"github.com/coder/coder/v2/agent/proto"
54+
"github.com/coder/coder/v2/agent/usershell"
5455
"github.com/coder/coder/v2/codersdk"
5556
"github.com/coder/coder/v2/codersdk/agentsdk"
5657
"github.com/coder/coder/v2/codersdk/workspacesdk"
@@ -1193,6 +1194,53 @@ func TestAgent_SSHConnectionEnvVars(t *testing.T) {
11931194
}
11941195
}
11951196

1197+
func TestAgent_SSHConnectionLoginVars(t *testing.T) {
1198+
t.Parallel()
1199+
1200+
envInfo := usershell.SystemEnvInfo{}
1201+
u, err := envInfo.User()
1202+
require.NoError(t, err, "get current user")
1203+
shell, err := envInfo.Shell(u.Username)
1204+
require.NoError(t, err, "get current shell")
1205+
1206+
tests := []struct {
1207+
key string
1208+
want string
1209+
}{
1210+
{
1211+
key: "USER",
1212+
want: u.Username,
1213+
},
1214+
{
1215+
key: "LOGNAME",
1216+
want: u.Username,
1217+
},
1218+
{
1219+
key: "HOME",
1220+
want: u.HomeDir,
1221+
},
1222+
{
1223+
key: "SHELL",
1224+
want: shell,
1225+
},
1226+
}
1227+
for _, tt := range tests {
1228+
tt := tt
1229+
t.Run(tt.key, func(t *testing.T) {
1230+
t.Parallel()
1231+
1232+
session := setupSSHSession(t, agentsdk.Manifest{}, codersdk.ServiceBannerConfig{}, nil)
1233+
command := "sh -c 'echo $" + tt.key + "'"
1234+
if runtime.GOOS == "windows" {
1235+
command = "cmd.exe /c echo %" + tt.key + "%"
1236+
}
1237+
output, err := session.Output(command)
1238+
require.NoError(t, err)
1239+
require.Equal(t, tt.want, strings.TrimSpace(string(output)))
1240+
})
1241+
}
1242+
}
1243+
11961244
func TestAgent_Metadata(t *testing.T) {
11971245
t.Parallel()
11981246

agent/agentssh/agentssh.go

+3
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,10 @@ func (s *Server) CreateCommand(ctx context.Context, script string, env []string,
900900
cmd.Dir = homedir
901901
}
902902
cmd.Env = append(ei.Environ(), env...)
903+
// Set login variables (see `man login`).
903904
cmd.Env = append(cmd.Env, fmt.Sprintf("USER=%s", username))
905+
cmd.Env = append(cmd.Env, fmt.Sprintf("LOGNAME=%s", username))
906+
cmd.Env = append(cmd.Env, fmt.Sprintf("SHELL=%s", shell))
904907

905908
// Set SSH connection environment variables (these are also set by OpenSSH
906909
// and thus expected to be present by SSH clients). Since the agent does

coderd/apidoc/docs.go

+64
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

+60
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/coderd.go

+1
Original file line numberDiff line numberDiff line change
@@ -1005,6 +1005,7 @@ func New(options *Options) *API {
10051005
})
10061006
})
10071007
})
1008+
r.Get("/paginated-members", api.paginatedMembers)
10081009
r.Route("/members", func(r chi.Router) {
10091010
r.Get("/", api.listMembers)
10101011
r.Route("/roles", func(r chi.Router) {

coderd/database/dbauthz/dbauthz.go

+8
Original file line numberDiff line numberDiff line change
@@ -3632,6 +3632,14 @@ func (q *querier) OrganizationMembers(ctx context.Context, arg database.Organiza
36323632
return fetchWithPostFilter(q.auth, policy.ActionRead, q.db.OrganizationMembers)(ctx, arg)
36333633
}
36343634

3635+
func (q *querier) PaginatedOrganizationMembers(ctx context.Context, arg database.PaginatedOrganizationMembersParams) ([]database.PaginatedOrganizationMembersRow, error) {
3636+
// Required to have permission to read all members in the organization
3637+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceOrganizationMember.InOrg(arg.OrganizationID)); err != nil {
3638+
return nil, err
3639+
}
3640+
return q.db.PaginatedOrganizationMembers(ctx, arg)
3641+
}
3642+
36353643
func (q *querier) ReduceWorkspaceAgentShareLevelToAuthenticatedByTemplate(ctx context.Context, templateID uuid.UUID) error {
36363644
template, err := q.db.GetTemplateByID(ctx, templateID)
36373645
if err != nil {

coderd/database/dbauthz/dbauthz_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,32 @@ func (s *MethodTestSuite) TestOrganization() {
985985
mem, policy.ActionRead,
986986
)
987987
}))
988+
s.Run("PaginatedOrganizationMembers", s.Subtest(func(db database.Store, check *expects) {
989+
o := dbgen.Organization(s.T(), db, database.Organization{})
990+
u := dbgen.User(s.T(), db, database.User{})
991+
mem := dbgen.OrganizationMember(s.T(), db, database.OrganizationMember{
992+
OrganizationID: o.ID,
993+
UserID: u.ID,
994+
Roles: []string{rbac.RoleOrgAdmin()},
995+
})
996+
997+
check.Args(database.PaginatedOrganizationMembersParams{
998+
OrganizationID: o.ID,
999+
LimitOpt: 0,
1000+
}).Asserts(
1001+
rbac.ResourceOrganizationMember.InOrg(o.ID), policy.ActionRead,
1002+
).Returns([]database.PaginatedOrganizationMembersRow{
1003+
{
1004+
OrganizationMember: mem,
1005+
Username: u.Username,
1006+
AvatarURL: u.AvatarURL,
1007+
Name: u.Name,
1008+
Email: u.Email,
1009+
GlobalRoles: u.RBACRoles,
1010+
Count: 1,
1011+
},
1012+
})
1013+
}))
9881014
s.Run("UpdateMemberRoles", s.Subtest(func(db database.Store, check *expects) {
9891015
o := dbgen.Organization(s.T(), db, database.Organization{})
9901016
u := dbgen.User(s.T(), db, database.User{})

coderd/database/dbauthz/setup_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ func asserts(inputs ...any) []AssertRBAC {
503503
// Could be the string type.
504504
actionAsString, ok := inputs[i+1].(string)
505505
if !ok {
506-
panic(fmt.Sprintf("action '%q' not a supported action", actionAsString))
506+
panic(fmt.Sprintf("action '%T' not a supported action", inputs[i+1]))
507507
}
508508
action = policy.Action(actionAsString)
509509
}

coderd/database/dbmem/dbmem.go

+47
Original file line numberDiff line numberDiff line change
@@ -9617,6 +9617,53 @@ func (q *FakeQuerier) OrganizationMembers(_ context.Context, arg database.Organi
96179617
return tmp, nil
96189618
}
96199619

9620+
func (q *FakeQuerier) PaginatedOrganizationMembers(_ context.Context, arg database.PaginatedOrganizationMembersParams) ([]database.PaginatedOrganizationMembersRow, error) {
9621+
err := validateDatabaseType(arg)
9622+
if err != nil {
9623+
return nil, err
9624+
}
9625+
9626+
q.mutex.RLock()
9627+
defer q.mutex.RUnlock()
9628+
9629+
// All of the members in the organization
9630+
orgMembers := make([]database.OrganizationMember, 0)
9631+
for _, mem := range q.organizationMembers {
9632+
if arg.OrganizationID != uuid.Nil && mem.OrganizationID != arg.OrganizationID {
9633+
continue
9634+
}
9635+
9636+
orgMembers = append(orgMembers, mem)
9637+
}
9638+
9639+
selectedMembers := make([]database.PaginatedOrganizationMembersRow, 0)
9640+
9641+
skippedMembers := 0
9642+
for _, organizationMember := range q.organizationMembers {
9643+
if skippedMembers < int(arg.OffsetOpt) {
9644+
skippedMembers++
9645+
continue
9646+
}
9647+
9648+
// if the limit is set to 0 we treat that as returning all of the org members
9649+
if int(arg.LimitOpt) != 0 && len(selectedMembers) >= int(arg.LimitOpt) {
9650+
break
9651+
}
9652+
9653+
user, _ := q.getUserByIDNoLock(organizationMember.UserID)
9654+
selectedMembers = append(selectedMembers, database.PaginatedOrganizationMembersRow{
9655+
OrganizationMember: organizationMember,
9656+
Username: user.Username,
9657+
AvatarURL: user.AvatarURL,
9658+
Name: user.Name,
9659+
Email: user.Email,
9660+
GlobalRoles: user.RBACRoles,
9661+
Count: int64(len(orgMembers)),
9662+
})
9663+
}
9664+
return selectedMembers, nil
9665+
}
9666+
96209667
func (q *FakeQuerier) ReduceWorkspaceAgentShareLevelToAuthenticatedByTemplate(_ context.Context, templateID uuid.UUID) error {
96219668
err := validateDatabaseType(templateID)
96229669
if err != nil {

0 commit comments

Comments
 (0)