Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb78e7cb

Browse files
committed
chore: Merge branch 'main' of github.com:coder/coder into bq/return-only-active-users
2 parents18297ea +1661588 commitb78e7cb

File tree

13 files changed

+936
-336
lines changed

13 files changed

+936
-336
lines changed

‎.goreleaser.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ builds:
2929
-id:coder-slim
3030
dir:cmd/coder
3131
ldflags:
32-
["-s -w -X github.com/coder/coder/cli/buildinfo.tag={{ .Version }}"]
32+
["-s -w -X github.com/coder/coder/buildinfo.tag={{ .Version }}"]
3333
env:[CGO_ENABLED=0]
3434
goos:[darwin, linux, windows]
3535
goarch:[amd64]
@@ -42,7 +42,7 @@ builds:
4242
dir:cmd/coder
4343
flags:[-tags=embed]
4444
ldflags:
45-
["-s -w -X github.com/coder/coder/cli/buildinfo.tag={{ .Version }}"]
45+
["-s -w -X github.com/coder/coder/buildinfo.tag={{ .Version }}"]
4646
env:[CGO_ENABLED=0]
4747
goos:[linux]
4848
goarch:[amd64, arm64]
@@ -51,7 +51,7 @@ builds:
5151
dir:cmd/coder
5252
flags:[-tags=embed]
5353
ldflags:
54-
["-s -w -X github.com/coder/coder/cli/buildinfo.tag={{ .Version }}"]
54+
["-s -w -X github.com/coder/coder/buildinfo.tag={{ .Version }}"]
5555
env:[CGO_ENABLED=0]
5656
goos:[windows]
5757
goarch:[amd64, arm64]
@@ -60,7 +60,7 @@ builds:
6060
dir:cmd/coder
6161
flags:[-tags=embed]
6262
ldflags:
63-
["-s -w -X github.com/coder/coder/cli/buildinfo.tag={{ .Version }}"]
63+
["-s -w -X github.com/coder/coder/buildinfo.tag={{ .Version }}"]
6464
env:[CGO_ENABLED=0]
6565
goos:[darwin]
6666
goarch:[amd64, arm64]

‎cli/server.go

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,27 +41,23 @@ import (
4141
"github.com/coder/coder/coderd/gitsshkey"
4242
"github.com/coder/coder/coderd/turnconn"
4343
"github.com/coder/coder/codersdk"
44+
"github.com/coder/coder/cryptorand"
4445
"github.com/coder/coder/provisioner/terraform"
4546
"github.com/coder/coder/provisionerd"
4647
"github.com/coder/coder/provisionersdk"
4748
"github.com/coder/coder/provisionersdk/proto"
4849
)
4950

50-
vardefaultDevUser= codersdk.CreateFirstUserRequest{
51-
Email:"admin@coder.com",
52-
Username:"developer",
53-
Password:"password",
54-
OrganizationName:"acme-corp",
55-
}
56-
5751
// nolint:gocyclo
5852
funcserver()*cobra.Command {
5953
var (
60-
accessURLstring
61-
addressstring
62-
cacheDirstring
63-
devbool
64-
postgresURLstring
54+
accessURLstring
55+
addressstring
56+
cacheDirstring
57+
devbool
58+
devUserEmailstring
59+
devUserPasswordstring
60+
postgresURLstring
6561
// provisionerDaemonCount is a uint8 to ensure a number > 0.
6662
provisionerDaemonCountuint8
6763
oauth2GithubClientIDstring
@@ -278,12 +274,18 @@ func server() *cobra.Command {
278274
config:=createConfig(cmd)
279275

280276
ifdev {
281-
err=createFirstUser(cmd,client,config)
277+
ifdevUserPassword=="" {
278+
devUserPassword,err=cryptorand.String(10)
279+
iferr!=nil {
280+
returnxerrors.Errorf("generate random admin password for dev: %w",err)
281+
}
282+
}
283+
err=createFirstUser(cmd,client,config,devUserEmail,devUserPassword)
282284
iferr!=nil {
283285
returnxerrors.Errorf("create first user: %w",err)
284286
}
285-
_,_=fmt.Fprintf(cmd.ErrOrStderr(),"email: %s\n",defaultDevUser.Email)
286-
_,_=fmt.Fprintf(cmd.ErrOrStderr(),"password: %s\n",defaultDevUser.Password)
287+
_,_=fmt.Fprintf(cmd.ErrOrStderr(),"email: %s\n",devUserEmail)
288+
_,_=fmt.Fprintf(cmd.ErrOrStderr(),"password: %s\n",devUserPassword)
287289
_,_=fmt.Fprintln(cmd.ErrOrStderr())
288290

289291
_,_=fmt.Fprintf(cmd.ErrOrStderr(),cliui.Styles.Wrap.Render(`Started in dev mode. All data is in-memory! `+cliui.Styles.Bold.Render("Do not use in production")+`. Press `+
@@ -409,6 +411,8 @@ func server() *cobra.Command {
409411
// systemd uses the CACHE_DIRECTORY environment variable!
410412
cliflag.StringVarP(root.Flags(),&cacheDir,"cache-dir","","CACHE_DIRECTORY",filepath.Join(os.TempDir(),"coder-cache"),"Specifies a directory to cache binaries for provision operations.")
411413
cliflag.BoolVarP(root.Flags(),&dev,"dev","","CODER_DEV_MODE",false,"Serve Coder in dev mode for tinkering")
414+
cliflag.StringVarP(root.Flags(),&devUserEmail,"dev-admin-email","","CODER_DEV_ADMIN_EMAIL","admin@coder.com","Specifies the admin email to be used in dev mode (--dev)")
415+
cliflag.StringVarP(root.Flags(),&devUserPassword,"dev-admin-password","","CODER_DEV_ADMIN_PASSWORD","","Specifies the admin password to be used in dev mode (--dev) instead of a randomly generated one")
412416
cliflag.StringVarP(root.Flags(),&postgresURL,"postgres-url","","CODER_PG_CONNECTION_URL","","URL of a PostgreSQL database to connect to")
413417
cliflag.Uint8VarP(root.Flags(),&provisionerDaemonCount,"provisioner-daemons","","CODER_PROVISIONER_DAEMONS",3,"The amount of provisioner daemons to create on start.")
414418
cliflag.StringVarP(root.Flags(),&oauth2GithubClientID,"oauth2-github-client-id","","CODER_OAUTH2_GITHUB_CLIENT_ID","",
@@ -450,14 +454,25 @@ func server() *cobra.Command {
450454
returnroot
451455
}
452456

453-
funccreateFirstUser(cmd*cobra.Command,client*codersdk.Client,cfg config.Root)error {
454-
_,err:=client.CreateFirstUser(cmd.Context(),defaultDevUser)
457+
funccreateFirstUser(cmd*cobra.Command,client*codersdk.Client,cfg config.Root,email,passwordstring)error {
458+
ifemail=="" {
459+
returnxerrors.New("email is empty")
460+
}
461+
ifpassword=="" {
462+
returnxerrors.New("password is empty")
463+
}
464+
_,err:=client.CreateFirstUser(cmd.Context(), codersdk.CreateFirstUserRequest{
465+
Email:email,
466+
Username:"developer",
467+
Password:password,
468+
OrganizationName:"acme-corp",
469+
})
455470
iferr!=nil {
456471
returnxerrors.Errorf("create first user: %w",err)
457472
}
458473
token,err:=client.LoginWithPassword(cmd.Context(), codersdk.LoginWithPasswordRequest{
459-
Email:defaultDevUser.Email,
460-
Password:defaultDevUser.Password,
474+
Email:email,
475+
Password:password,
461476
})
462477
iferr!=nil {
463478
returnxerrors.Errorf("login with first user: %w",err)

‎cli/server_test.go

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package cli_test
22

33
import (
4-
"bytes"
54
"context"
65
"crypto/ecdsa"
76
"crypto/elliptic"
@@ -10,12 +9,15 @@ import (
109
"crypto/x509"
1110
"crypto/x509/pkix"
1211
"encoding/pem"
12+
"fmt"
1313
"math/big"
1414
"net"
1515
"net/http"
1616
"net/url"
1717
"os"
1818
"runtime"
19+
"strings"
20+
"sync"
1921
"testing"
2022
"time"
2123

@@ -74,18 +76,30 @@ func TestServer(t *testing.T) {
7476
t.Parallel()
7577
ctx,cancelFunc:=context.WithCancel(context.Background())
7678
defercancelFunc()
79+
80+
wantEmail:="admin@coder.com"
81+
7782
root,cfg:=clitest.New(t,"server","--dev","--skip-tunnel","--address",":0")
78-
varstdoutBuf bytes.Buffer
79-
root.SetOutput(&stdoutBuf)
83+
varbuf strings.Builder
84+
root.SetOutput(&buf)
85+
varwg sync.WaitGroup
86+
wg.Add(1)
8087
gofunc() {
88+
deferwg.Done()
89+
8190
err:=root.ExecuteContext(ctx)
8291
require.ErrorIs(t,err,context.Canceled)
8392

8493
// Verify that credentials were output to the terminal.
85-
wantEmail:="email: admin@coder.com"
86-
wantPassword:="password: password"
87-
assert.Contains(t,stdoutBuf.String(),wantEmail,"expected output %q; got no match",wantEmail)
88-
assert.Contains(t,stdoutBuf.String(),wantPassword,"expected output %q; got no match",wantPassword)
94+
assert.Contains(t,buf.String(),fmt.Sprintf("email: %s",wantEmail),"expected output %q; got no match",wantEmail)
95+
// Check that the password line is output and that it's non-empty.
96+
if_,after,found:=strings.Cut(buf.String(),"password: ");found {
97+
before,_,_:=strings.Cut(after,"\n")
98+
before=strings.Trim(before,"\r")// Ensure no control character is left.
99+
assert.NotEmpty(t,before,"expected non-empty password; got empty")
100+
}else {
101+
t.Error("expected password line output; got no match")
102+
}
89103
}()
90104
vartokenstring
91105
require.Eventually(t,func()bool {
@@ -102,6 +116,55 @@ func TestServer(t *testing.T) {
102116
client.SessionToken=token
103117
_,err=client.User(ctx,codersdk.Me)
104118
require.NoError(t,err)
119+
120+
cancelFunc()
121+
wg.Wait()
122+
})
123+
// Duplicated test from "Development" above to test setting email/password via env.
124+
// Cannot run parallel due to os.Setenv.
125+
//nolint:paralleltest
126+
t.Run("Development with email and password from env",func(t*testing.T) {
127+
ctx,cancelFunc:=context.WithCancel(context.Background())
128+
defercancelFunc()
129+
130+
wantEmail:="myadmin@coder.com"
131+
wantPassword:="testpass42"
132+
t.Setenv("CODER_DEV_ADMIN_EMAIL",wantEmail)
133+
t.Setenv("CODER_DEV_ADMIN_PASSWORD",wantPassword)
134+
135+
root,cfg:=clitest.New(t,"server","--dev","--skip-tunnel","--address",":0")
136+
varbuf strings.Builder
137+
root.SetOutput(&buf)
138+
varwg sync.WaitGroup
139+
wg.Add(1)
140+
gofunc() {
141+
deferwg.Done()
142+
143+
err:=root.ExecuteContext(ctx)
144+
require.ErrorIs(t,err,context.Canceled)
145+
146+
// Verify that credentials were output to the terminal.
147+
assert.Contains(t,buf.String(),fmt.Sprintf("email: %s",wantEmail),"expected output %q; got no match",wantEmail)
148+
assert.Contains(t,buf.String(),fmt.Sprintf("password: %s",wantPassword),"expected output %q; got no match",wantPassword)
149+
}()
150+
vartokenstring
151+
require.Eventually(t,func()bool {
152+
varerrerror
153+
token,err=cfg.Session().Read()
154+
returnerr==nil
155+
},15*time.Second,25*time.Millisecond)
156+
// Verify that authentication was properly set in dev-mode.
157+
accessURL,err:=cfg.URL().Read()
158+
require.NoError(t,err)
159+
parsed,err:=url.Parse(accessURL)
160+
require.NoError(t,err)
161+
client:=codersdk.New(parsed)
162+
client.SessionToken=token
163+
_,err=client.User(ctx,codersdk.Me)
164+
require.NoError(t,err)
165+
166+
cancelFunc()
167+
wg.Wait()
105168
})
106169
t.Run("TLSBadVersion",func(t*testing.T) {
107170
t.Parallel()
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package userpassword_test
2+
3+
import (
4+
"crypto/sha256"
5+
"testing"
6+
7+
"github.com/coder/coder/cryptorand"
8+
"golang.org/x/crypto/bcrypt"
9+
"golang.org/x/crypto/pbkdf2"
10+
)
11+
12+
var (
13+
salt= []byte(must(cryptorand.String(16)))
14+
secret= []byte(must(cryptorand.String(24)))
15+
16+
resBcrypt []byte
17+
resPbkdf2 []byte
18+
)
19+
20+
funcBenchmarkBcryptMinCost(b*testing.B) {
21+
varr []byte
22+
b.ReportAllocs()
23+
24+
fori:=0;i<b.N;i++ {
25+
r,_=bcrypt.GenerateFromPassword(secret,bcrypt.MinCost)
26+
}
27+
28+
resBcrypt=r
29+
}
30+
31+
funcBenchmarkPbkdf2MinCost(b*testing.B) {
32+
varr []byte
33+
b.ReportAllocs()
34+
35+
fori:=0;i<b.N;i++ {
36+
r=pbkdf2.Key(secret,salt,1024,64,sha256.New)
37+
}
38+
39+
resPbkdf2=r
40+
}
41+
42+
funcBenchmarkBcryptDefaultCost(b*testing.B) {
43+
varr []byte
44+
b.ReportAllocs()
45+
46+
fori:=0;i<b.N;i++ {
47+
r,_=bcrypt.GenerateFromPassword(secret,bcrypt.DefaultCost)
48+
}
49+
50+
resBcrypt=r
51+
}
52+
53+
funcBenchmarkPbkdf2(b*testing.B) {
54+
varr []byte
55+
b.ReportAllocs()
56+
57+
fori:=0;i<b.N;i++ {
58+
r=pbkdf2.Key(secret,salt,65536,64,sha256.New)
59+
}
60+
61+
resPbkdf2=r
62+
}
63+
64+
funcmust(sstring,errerror)string {
65+
iferr!=nil {
66+
panic(err)
67+
}
68+
69+
returns
70+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp