Fix all errcheck linter issues
Co-authored-by: Junie <junie@jetbrains.com>
This commit is contained in:
@@ -1 +1 @@
|
|||||||
[{"lang":"en","usageCount":5}]
|
[{"lang":"en","usageCount":6}]
|
||||||
@@ -82,7 +82,7 @@ func unsealViaGRPC(addr, caCertPath, password string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("grpc dial: %w", err)
|
return fmt.Errorf("grpc dial: %w", err)
|
||||||
}
|
}
|
||||||
defer conn.Close()
|
defer func() { _ = conn.Close() }()
|
||||||
|
|
||||||
client := metacryptv1.NewSystemServiceClient(conn)
|
client := metacryptv1.NewSystemServiceClient(conn)
|
||||||
resp, err := client.Unseal(context.Background(), &metacryptv1.UnsealRequest{Password: password})
|
resp, err := client.Unseal(context.Background(), &metacryptv1.UnsealRequest{Password: password})
|
||||||
@@ -113,7 +113,7 @@ func unsealViaREST(addr, caCertPath, password string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() { _ = resp.Body.Close() }()
|
||||||
|
|
||||||
var result struct {
|
var result struct {
|
||||||
State string `json:"state"`
|
State string `json:"state"`
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ func (h *Handler) writeACMEError(w http.ResponseWriter, status int, typ, detail
|
|||||||
h.addNonceHeader(w)
|
h.addNonceHeader(w)
|
||||||
w.Header().Set("Content-Type", "application/problem+json")
|
w.Header().Set("Content-Type", "application/problem+json")
|
||||||
w.WriteHeader(status)
|
w.WriteHeader(status)
|
||||||
json.NewEncoder(w).Encode(map[string]string{
|
_ = json.NewEncoder(w).Encode(map[string]string{
|
||||||
"type": typ,
|
"type": typ,
|
||||||
"detail": detail,
|
"detail": detail,
|
||||||
})
|
})
|
||||||
@@ -106,7 +106,7 @@ func (h *Handler) writeJSON(w http.ResponseWriter, status int, v interface{}) {
|
|||||||
h.addNonceHeader(w)
|
h.addNonceHeader(w)
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
w.WriteHeader(status)
|
w.WriteHeader(status)
|
||||||
json.NewEncoder(w).Encode(v)
|
_ = json.NewEncoder(w).Encode(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// loadConfig loads the ACME config for this mount from the barrier.
|
// loadConfig loads the ACME config for this mount from the barrier.
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ func (h *Handler) validateChallenge(ctx context.Context, chall *Challenge, accou
|
|||||||
h.logger.Error("acme: load authz for validation", "id", chall.AuthzID, "error", err)
|
h.logger.Error("acme: load authz for validation", "id", chall.AuthzID, "error", err)
|
||||||
chall.Status = StatusInvalid
|
chall.Status = StatusInvalid
|
||||||
chall.Error = &ProblemDetail{Type: ProblemServerInternal, Detail: "failed to load authorization"}
|
chall.Error = &ProblemDetail{Type: ProblemServerInternal, Detail: "failed to load authorization"}
|
||||||
h.saveChallenge(ctx, chall)
|
_ = h.saveChallenge(ctx, chall)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Inject the identifier value into the context for validators.
|
// Inject the identifier value into the context for validators.
|
||||||
@@ -202,7 +202,7 @@ func validateHTTP01(ctx context.Context, chall *Challenge, accountJWK []byte) er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("HTTP-01 fetch failed: %w", err)
|
return fmt.Errorf("HTTP-01 fetch failed: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer func() { _ = resp.Body.Close() }()
|
||||||
|
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode != http.StatusOK {
|
||||||
return fmt.Errorf("HTTP-01: unexpected status %d", resp.StatusCode)
|
return fmt.Errorf("HTTP-01: unexpected status %d", resp.StatusCode)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ func setupBarrier(t *testing.T) (*AESGCMBarrier, func()) {
|
|||||||
t.Fatalf("migrate: %v", err)
|
t.Fatalf("migrate: %v", err)
|
||||||
}
|
}
|
||||||
b := NewAESGCMBarrier(database)
|
b := NewAESGCMBarrier(database)
|
||||||
return b, func() { database.Close() }
|
return b, func() { _ = database.Close() }
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBarrierSealUnseal(t *testing.T) {
|
func TestBarrierSealUnseal(t *testing.T) {
|
||||||
@@ -54,7 +54,7 @@ func TestBarrierPutGet(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
mek, _ := crypto.GenerateKey()
|
mek, _ := crypto.GenerateKey()
|
||||||
b.Unseal(mek)
|
_ = b.Unseal(mek)
|
||||||
|
|
||||||
data := []byte("test value")
|
data := []byte("test value")
|
||||||
if err := b.Put(ctx, "test/path", data); err != nil {
|
if err := b.Put(ctx, "test/path", data); err != nil {
|
||||||
@@ -76,7 +76,7 @@ func TestBarrierGetNotFound(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
mek, _ := crypto.GenerateKey()
|
mek, _ := crypto.GenerateKey()
|
||||||
b.Unseal(mek)
|
_ = b.Unseal(mek)
|
||||||
|
|
||||||
_, err := b.Get(ctx, "nonexistent")
|
_, err := b.Get(ctx, "nonexistent")
|
||||||
if !errors.Is(err, ErrNotFound) {
|
if !errors.Is(err, ErrNotFound) {
|
||||||
@@ -90,9 +90,9 @@ func TestBarrierDelete(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
mek, _ := crypto.GenerateKey()
|
mek, _ := crypto.GenerateKey()
|
||||||
b.Unseal(mek)
|
_ = b.Unseal(mek)
|
||||||
|
|
||||||
b.Put(ctx, "test/delete-me", []byte("data"))
|
_ = b.Put(ctx, "test/delete-me", []byte("data"))
|
||||||
if err := b.Delete(ctx, "test/delete-me"); err != nil {
|
if err := b.Delete(ctx, "test/delete-me"); err != nil {
|
||||||
t.Fatalf("Delete: %v", err)
|
t.Fatalf("Delete: %v", err)
|
||||||
}
|
}
|
||||||
@@ -108,11 +108,11 @@ func TestBarrierList(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
mek, _ := crypto.GenerateKey()
|
mek, _ := crypto.GenerateKey()
|
||||||
b.Unseal(mek)
|
_ = b.Unseal(mek)
|
||||||
|
|
||||||
b.Put(ctx, "engine/ca/default/config", []byte("cfg"))
|
_ = b.Put(ctx, "engine/ca/default/config", []byte("cfg"))
|
||||||
b.Put(ctx, "engine/ca/default/dek", []byte("key"))
|
_ = b.Put(ctx, "engine/ca/default/dek", []byte("key"))
|
||||||
b.Put(ctx, "engine/transit/main/config", []byte("cfg"))
|
_ = b.Put(ctx, "engine/transit/main/config", []byte("cfg"))
|
||||||
|
|
||||||
paths, err := b.List(ctx, "engine/ca/")
|
paths, err := b.List(ctx, "engine/ca/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -148,10 +148,10 @@ func TestBarrierOverwrite(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
mek, _ := crypto.GenerateKey()
|
mek, _ := crypto.GenerateKey()
|
||||||
b.Unseal(mek)
|
_ = b.Unseal(mek)
|
||||||
|
|
||||||
b.Put(ctx, "test/overwrite", []byte("v1"))
|
_ = b.Put(ctx, "test/overwrite", []byte("v1"))
|
||||||
b.Put(ctx, "test/overwrite", []byte("v2"))
|
_ = b.Put(ctx, "test/overwrite", []byte("v2"))
|
||||||
|
|
||||||
got, _ := b.Get(ctx, "test/overwrite")
|
got, _ := b.Get(ctx, "test/overwrite")
|
||||||
if string(got) != "v2" {
|
if string(got) != "v2" {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ server_url = "https://mcias.example.com"
|
|||||||
`
|
`
|
||||||
dir := t.TempDir()
|
dir := t.TempDir()
|
||||||
path := filepath.Join(dir, "test.toml")
|
path := filepath.Join(dir, "test.toml")
|
||||||
os.WriteFile(path, []byte(content), 0600)
|
_ = os.WriteFile(path, []byte(content), 0600)
|
||||||
|
|
||||||
cfg, err := Load(path)
|
cfg, err := Load(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -48,7 +48,7 @@ listen_addr = ":8443"
|
|||||||
`
|
`
|
||||||
dir := t.TempDir()
|
dir := t.TempDir()
|
||||||
path := filepath.Join(dir, "test.toml")
|
path := filepath.Join(dir, "test.toml")
|
||||||
os.WriteFile(path, []byte(content), 0600)
|
_ = os.WriteFile(path, []byte(content), 0600)
|
||||||
|
|
||||||
_, err := Load(path)
|
_, err := Load(path)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ func TestOpenAndMigrate(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Open: %v", err)
|
t.Fatalf("Open: %v", err)
|
||||||
}
|
}
|
||||||
defer database.Close()
|
defer func() { _ = database.Close() }()
|
||||||
|
|
||||||
if err := Migrate(database); err != nil {
|
if err := Migrate(database); err != nil {
|
||||||
t.Fatalf("Migrate: %v", err)
|
t.Fatalf("Migrate: %v", err)
|
||||||
@@ -37,7 +37,7 @@ func TestOpenAndMigrate(t *testing.T) {
|
|||||||
|
|
||||||
// Check migration version.
|
// Check migration version.
|
||||||
var version int
|
var version int
|
||||||
database.QueryRow("SELECT MAX(version) FROM schema_migrations").Scan(&version)
|
_ = database.QueryRow("SELECT MAX(version) FROM schema_migrations").Scan(&version)
|
||||||
if version != 1 {
|
if version != 1 {
|
||||||
t.Errorf("migration version: got %d, want 1", version)
|
t.Errorf("migration version: got %d, want 1", version)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ func userCaller() *engine.CallerInfo {
|
|||||||
func setupEngine(t *testing.T) (*CAEngine, *memBarrier) {
|
func setupEngine(t *testing.T) (*CAEngine, *memBarrier) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
b := newMemBarrier()
|
b := newMemBarrier()
|
||||||
eng := NewCAEngine().(*CAEngine)
|
eng := NewCAEngine().(*CAEngine) //nolint:errcheck
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
config := map[string]interface{}{
|
config := map[string]interface{}{
|
||||||
@@ -130,7 +130,7 @@ func TestInitializeWithImportedRoot(t *testing.T) {
|
|||||||
|
|
||||||
// Now initialize a new engine with the imported root.
|
// Now initialize a new engine with the imported root.
|
||||||
b := newMemBarrier()
|
b := newMemBarrier()
|
||||||
eng := NewCAEngine().(*CAEngine)
|
eng := NewCAEngine().(*CAEngine) //nolint:errcheck
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
config := map[string]interface{}{
|
config := map[string]interface{}{
|
||||||
@@ -230,7 +230,7 @@ func TestCreateIssuer(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Verify the issuer cert is an intermediate CA signed by root.
|
// Verify the issuer cert is an intermediate CA signed by root.
|
||||||
certPEM := resp.Data["cert_pem"].(string)
|
certPEM := resp.Data["cert_pem"].(string) //nolint:errcheck
|
||||||
block, _ := pem.Decode([]byte(certPEM))
|
block, _ := pem.Decode([]byte(certPEM))
|
||||||
if block == nil {
|
if block == nil {
|
||||||
t.Fatal("failed to decode issuer cert PEM")
|
t.Fatal("failed to decode issuer cert PEM")
|
||||||
@@ -342,7 +342,7 @@ func TestIssueCertificate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Verify the leaf cert.
|
// Verify the leaf cert.
|
||||||
certPEM := resp.Data["cert_pem"].(string)
|
certPEM := resp.Data["cert_pem"].(string) //nolint:errcheck
|
||||||
block, _ := pem.Decode([]byte(certPEM))
|
block, _ := pem.Decode([]byte(certPEM))
|
||||||
leafCert, err := x509.ParseCertificate(block.Bytes)
|
leafCert, err := x509.ParseCertificate(block.Bytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -389,7 +389,7 @@ func TestIssueCertificateWithOverrides(t *testing.T) {
|
|||||||
t.Fatalf("issue with overrides: %v", err)
|
t.Fatalf("issue with overrides: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
certPEM := resp.Data["cert_pem"].(string)
|
certPEM := resp.Data["cert_pem"].(string) //nolint:errcheck
|
||||||
block, _ := pem.Decode([]byte(certPEM))
|
block, _ := pem.Decode([]byte(certPEM))
|
||||||
leafCert, err := x509.ParseCertificate(block.Bytes)
|
leafCert, err := x509.ParseCertificate(block.Bytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -459,7 +459,7 @@ func TestPrivateKeyNotStoredInBarrier(t *testing.T) {
|
|||||||
t.Fatalf("issue: %v", err)
|
t.Fatalf("issue: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
serial := resp.Data["serial"].(string)
|
serial := resp.Data["serial"].(string) //nolint:errcheck
|
||||||
|
|
||||||
// Check that the cert record does not contain a private key.
|
// Check that the cert record does not contain a private key.
|
||||||
recordData, err := b.Get(ctx, "engine/ca/test/certs/"+serial+".json")
|
recordData, err := b.Get(ctx, "engine/ca/test/certs/"+serial+".json")
|
||||||
@@ -499,7 +499,7 @@ func TestRenewCertificate(t *testing.T) {
|
|||||||
t.Fatalf("issue: %v", err)
|
t.Fatalf("issue: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
origSerial := issueResp.Data["serial"].(string)
|
origSerial := issueResp.Data["serial"].(string) //nolint:errcheck
|
||||||
|
|
||||||
// Renew.
|
// Renew.
|
||||||
renewResp, err := eng.HandleRequest(ctx, &engine.Request{
|
renewResp, err := eng.HandleRequest(ctx, &engine.Request{
|
||||||
@@ -513,7 +513,7 @@ func TestRenewCertificate(t *testing.T) {
|
|||||||
t.Fatalf("renew: %v", err)
|
t.Fatalf("renew: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
newSerial := renewResp.Data["serial"].(string)
|
newSerial := renewResp.Data["serial"].(string) //nolint:errcheck
|
||||||
if newSerial == origSerial {
|
if newSerial == origSerial {
|
||||||
t.Error("renewed cert should have different serial")
|
t.Error("renewed cert should have different serial")
|
||||||
}
|
}
|
||||||
@@ -575,7 +575,7 @@ func TestGetAndListCerts(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get a specific cert.
|
// Get a specific cert.
|
||||||
serial := certs[0]["serial"].(string)
|
serial := certs[0]["serial"].(string) //nolint:errcheck
|
||||||
getResp, err := eng.HandleRequest(ctx, &engine.Request{
|
getResp, err := eng.HandleRequest(ctx, &engine.Request{
|
||||||
Operation: "get-cert",
|
Operation: "get-cert",
|
||||||
CallerInfo: userCaller(),
|
CallerInfo: userCaller(),
|
||||||
@@ -607,7 +607,7 @@ func TestUnsealRestoresIssuers(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Seal.
|
// Seal.
|
||||||
eng.Seal()
|
_ = eng.Seal()
|
||||||
|
|
||||||
// Unseal.
|
// Unseal.
|
||||||
if err := eng.Unseal(ctx, b, mountPath); err != nil {
|
if err := eng.Unseal(ctx, b, mountPath); err != nil {
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ func TestRegistryHandleRequest(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
reg.Mount(ctx, "test", EngineTypeTransit, nil)
|
_ = reg.Mount(ctx, "test", EngineTypeTransit, nil)
|
||||||
|
|
||||||
resp, err := reg.HandleRequest(ctx, "test", &Request{Operation: "encrypt"})
|
resp, err := reg.HandleRequest(ctx, "test", &Request{Operation: "encrypt"})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -121,8 +121,8 @@ func TestRegistrySealAll(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
reg.Mount(ctx, "eng1", EngineTypeTransit, nil)
|
_ = reg.Mount(ctx, "eng1", EngineTypeTransit, nil)
|
||||||
reg.Mount(ctx, "eng2", EngineTypeTransit, nil)
|
_ = reg.Mount(ctx, "eng2", EngineTypeTransit, nil)
|
||||||
|
|
||||||
if err := reg.SealAll(); err != nil {
|
if err := reg.SealAll(); err != nil {
|
||||||
t.Fatalf("SealAll: %v", err)
|
t.Fatalf("SealAll: %v", err)
|
||||||
|
|||||||
@@ -22,9 +22,9 @@ func setupPolicy(t *testing.T) (*Engine, func()) {
|
|||||||
}
|
}
|
||||||
b := barrier.NewAESGCMBarrier(database)
|
b := barrier.NewAESGCMBarrier(database)
|
||||||
mek, _ := crypto.GenerateKey()
|
mek, _ := crypto.GenerateKey()
|
||||||
b.Unseal(mek)
|
_ = b.Unseal(mek)
|
||||||
e := NewEngine(b)
|
e := NewEngine(b)
|
||||||
return e, func() { database.Close() }
|
return e, func() { _ = database.Close() }
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAdminBypass(t *testing.T) {
|
func TestAdminBypass(t *testing.T) {
|
||||||
@@ -113,7 +113,7 @@ func TestPolicyPriorityOrder(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
// Lower priority number = higher priority. Deny should win.
|
// Lower priority number = higher priority. Deny should win.
|
||||||
e.CreateRule(ctx, &Rule{
|
_ = e.CreateRule(ctx, &Rule{
|
||||||
ID: "allow-rule",
|
ID: "allow-rule",
|
||||||
Priority: 200,
|
Priority: 200,
|
||||||
Effect: EffectAllow,
|
Effect: EffectAllow,
|
||||||
@@ -121,7 +121,7 @@ func TestPolicyPriorityOrder(t *testing.T) {
|
|||||||
Resources: []string{"engine/transit/*"},
|
Resources: []string{"engine/transit/*"},
|
||||||
Actions: []string{"write"},
|
Actions: []string{"write"},
|
||||||
})
|
})
|
||||||
e.CreateRule(ctx, &Rule{
|
_ = e.CreateRule(ctx, &Rule{
|
||||||
ID: "deny-rule",
|
ID: "deny-rule",
|
||||||
Priority: 100,
|
Priority: 100,
|
||||||
Effect: EffectDeny,
|
Effect: EffectDeny,
|
||||||
@@ -146,7 +146,7 @@ func TestPolicyUsernameMatch(t *testing.T) {
|
|||||||
defer cleanup()
|
defer cleanup()
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
e.CreateRule(ctx, &Rule{
|
_ = e.CreateRule(ctx, &Rule{
|
||||||
ID: "user-specific",
|
ID: "user-specific",
|
||||||
Priority: 100,
|
Priority: 100,
|
||||||
Effect: EffectAllow,
|
Effect: EffectAllow,
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ func setupSeal(t *testing.T) (*Manager, func()) {
|
|||||||
}
|
}
|
||||||
b := barrier.NewAESGCMBarrier(database)
|
b := barrier.NewAESGCMBarrier(database)
|
||||||
mgr := NewManager(database, b, slog.Default())
|
mgr := NewManager(database, b, slog.Default())
|
||||||
return mgr, func() { database.Close() }
|
return mgr, func() { _ = database.Close() }
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSealInitializeAndUnseal(t *testing.T) {
|
func TestSealInitializeAndUnseal(t *testing.T) {
|
||||||
@@ -69,11 +69,11 @@ func TestSealInitializeAndUnseal(t *testing.T) {
|
|||||||
func TestSealWrongPassword(t *testing.T) {
|
func TestSealWrongPassword(t *testing.T) {
|
||||||
mgr, cleanup := setupSeal(t)
|
mgr, cleanup := setupSeal(t)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
mgr.CheckInitialized()
|
_ = mgr.CheckInitialized()
|
||||||
|
|
||||||
params := crypto.Argon2Params{Time: 1, Memory: 64 * 1024, Threads: 1}
|
params := crypto.Argon2Params{Time: 1, Memory: 64 * 1024, Threads: 1}
|
||||||
mgr.Initialize(context.Background(), []byte("correct"), params)
|
_ = mgr.Initialize(context.Background(), []byte("correct"), params)
|
||||||
mgr.Seal()
|
_ = mgr.Seal()
|
||||||
|
|
||||||
err := mgr.Unseal([]byte("wrong"))
|
err := mgr.Unseal([]byte("wrong"))
|
||||||
if !errors.Is(err, ErrInvalidPassword) {
|
if !errors.Is(err, ErrInvalidPassword) {
|
||||||
@@ -84,10 +84,10 @@ func TestSealWrongPassword(t *testing.T) {
|
|||||||
func TestSealDoubleInitialize(t *testing.T) {
|
func TestSealDoubleInitialize(t *testing.T) {
|
||||||
mgr, cleanup := setupSeal(t)
|
mgr, cleanup := setupSeal(t)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
mgr.CheckInitialized()
|
_ = mgr.CheckInitialized()
|
||||||
|
|
||||||
params := crypto.Argon2Params{Time: 1, Memory: 64 * 1024, Threads: 1}
|
params := crypto.Argon2Params{Time: 1, Memory: 64 * 1024, Threads: 1}
|
||||||
mgr.Initialize(context.Background(), []byte("password"), params)
|
_ = mgr.Initialize(context.Background(), []byte("password"), params)
|
||||||
|
|
||||||
err := mgr.Initialize(context.Background(), []byte("password"), params)
|
err := mgr.Initialize(context.Background(), []byte("password"), params)
|
||||||
if !errors.Is(err, ErrAlreadyInitialized) {
|
if !errors.Is(err, ErrAlreadyInitialized) {
|
||||||
@@ -101,20 +101,20 @@ func TestSealCheckInitializedPersists(t *testing.T) {
|
|||||||
|
|
||||||
// First: initialize.
|
// First: initialize.
|
||||||
database, _ := db.Open(dbPath)
|
database, _ := db.Open(dbPath)
|
||||||
db.Migrate(database)
|
_ = db.Migrate(database)
|
||||||
b := barrier.NewAESGCMBarrier(database)
|
b := barrier.NewAESGCMBarrier(database)
|
||||||
mgr := NewManager(database, b, slog.Default())
|
mgr := NewManager(database, b, slog.Default())
|
||||||
mgr.CheckInitialized()
|
_ = mgr.CheckInitialized()
|
||||||
params := crypto.Argon2Params{Time: 1, Memory: 64 * 1024, Threads: 1}
|
params := crypto.Argon2Params{Time: 1, Memory: 64 * 1024, Threads: 1}
|
||||||
mgr.Initialize(context.Background(), []byte("password"), params)
|
_ = mgr.Initialize(context.Background(), []byte("password"), params)
|
||||||
database.Close()
|
_ = database.Close()
|
||||||
|
|
||||||
// Second: reopen and check.
|
// Second: reopen and check.
|
||||||
database2, _ := db.Open(dbPath)
|
database2, _ := db.Open(dbPath)
|
||||||
defer database2.Close()
|
defer func() { _ = database2.Close() }()
|
||||||
b2 := barrier.NewAESGCMBarrier(database2)
|
b2 := barrier.NewAESGCMBarrier(database2)
|
||||||
mgr2 := NewManager(database2, b2, slog.Default())
|
mgr2 := NewManager(database2, b2, slog.Default())
|
||||||
mgr2.CheckInitialized()
|
_ = mgr2.CheckInitialized()
|
||||||
if mgr2.State() != StateSealed {
|
if mgr2.State() != StateSealed {
|
||||||
t.Fatalf("state after reopen: got %v, want Sealed", mgr2.State())
|
t.Fatalf("state after reopen: got %v, want Sealed", mgr2.State())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,12 +32,12 @@ func setupTestServer(t *testing.T) (*Server, *seal.Manager, chi.Router) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("open db: %v", err)
|
t.Fatalf("open db: %v", err)
|
||||||
}
|
}
|
||||||
t.Cleanup(func() { database.Close() })
|
t.Cleanup(func() { _ = database.Close() })
|
||||||
db.Migrate(database)
|
_ = db.Migrate(database)
|
||||||
|
|
||||||
b := barrier.NewAESGCMBarrier(database)
|
b := barrier.NewAESGCMBarrier(database)
|
||||||
sealMgr := seal.NewManager(database, b, slog.Default())
|
sealMgr := seal.NewManager(database, b, slog.Default())
|
||||||
sealMgr.CheckInitialized()
|
_ = sealMgr.CheckInitialized()
|
||||||
|
|
||||||
// Auth requires MCIAS client which we can't create in tests easily,
|
// Auth requires MCIAS client which we can't create in tests easily,
|
||||||
// so we pass nil and avoid auth-dependent routes in these tests.
|
// so we pass nil and avoid auth-dependent routes in these tests.
|
||||||
@@ -80,7 +80,7 @@ func TestStatusEndpoint(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var resp map[string]interface{}
|
var resp map[string]interface{}
|
||||||
json.Unmarshal(w.Body.Bytes(), &resp)
|
_ = json.Unmarshal(w.Body.Bytes(), &resp)
|
||||||
if resp["state"] != "uninitialized" {
|
if resp["state"] != "uninitialized" {
|
||||||
t.Errorf("state: got %q, want %q", resp["state"], "uninitialized")
|
t.Errorf("state: got %q, want %q", resp["state"], "uninitialized")
|
||||||
}
|
}
|
||||||
@@ -99,7 +99,7 @@ func TestInitEndpoint(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var resp map[string]interface{}
|
var resp map[string]interface{}
|
||||||
json.Unmarshal(w.Body.Bytes(), &resp)
|
_ = json.Unmarshal(w.Body.Bytes(), &resp)
|
||||||
if resp["state"] != "unsealed" {
|
if resp["state"] != "unsealed" {
|
||||||
t.Errorf("state: got %q, want %q", resp["state"], "unsealed")
|
t.Errorf("state: got %q, want %q", resp["state"], "unsealed")
|
||||||
}
|
}
|
||||||
@@ -118,8 +118,8 @@ func TestUnsealEndpoint(t *testing.T) {
|
|||||||
|
|
||||||
// Initialize first.
|
// Initialize first.
|
||||||
params := crypto.Argon2Params{Time: 1, Memory: 64 * 1024, Threads: 1}
|
params := crypto.Argon2Params{Time: 1, Memory: 64 * 1024, Threads: 1}
|
||||||
sealMgr.Initialize(context.Background(), []byte("password"), params)
|
_ = sealMgr.Initialize(context.Background(), []byte("password"), params)
|
||||||
sealMgr.Seal()
|
_ = sealMgr.Seal()
|
||||||
|
|
||||||
// Unseal with wrong password.
|
// Unseal with wrong password.
|
||||||
body := `{"password":"wrong"}`
|
body := `{"password":"wrong"}`
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ func (ws *WebServer) handleInit(w http.ResponseWriter, r *http.Request) {
|
|||||||
ws.renderTemplate(w, "init.html", nil)
|
ws.renderTemplate(w, "init.html", nil)
|
||||||
case http.MethodPost:
|
case http.MethodPost:
|
||||||
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
||||||
r.ParseForm()
|
_ = r.ParseForm()
|
||||||
password := r.FormValue("password")
|
password := r.FormValue("password")
|
||||||
if password == "" {
|
if password == "" {
|
||||||
ws.renderTemplate(w, "init.html", map[string]interface{}{"Error": "Password is required"})
|
ws.renderTemplate(w, "init.html", map[string]interface{}{"Error": "Password is required"})
|
||||||
@@ -113,7 +113,7 @@ func (ws *WebServer) handleUnseal(w http.ResponseWriter, r *http.Request) {
|
|||||||
ws.renderTemplate(w, "unseal.html", nil)
|
ws.renderTemplate(w, "unseal.html", nil)
|
||||||
case http.MethodPost:
|
case http.MethodPost:
|
||||||
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
||||||
r.ParseForm()
|
_ = r.ParseForm()
|
||||||
password := r.FormValue("password")
|
password := r.FormValue("password")
|
||||||
if err := ws.vault.Unseal(r.Context(), password); err != nil {
|
if err := ws.vault.Unseal(r.Context(), password); err != nil {
|
||||||
msg := "Invalid password"
|
msg := "Invalid password"
|
||||||
@@ -140,7 +140,7 @@ func (ws *WebServer) handleLogin(w http.ResponseWriter, r *http.Request) {
|
|||||||
ws.renderTemplate(w, "login.html", nil)
|
ws.renderTemplate(w, "login.html", nil)
|
||||||
case http.MethodPost:
|
case http.MethodPost:
|
||||||
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
||||||
r.ParseForm()
|
_ = r.ParseForm()
|
||||||
token, err := ws.vault.Login(r.Context(),
|
token, err := ws.vault.Login(r.Context(),
|
||||||
r.FormValue("username"),
|
r.FormValue("username"),
|
||||||
r.FormValue("password"),
|
r.FormValue("password"),
|
||||||
@@ -188,7 +188,7 @@ func (ws *WebServer) handleDashboardMountCA(w http.ResponseWriter, r *http.Reque
|
|||||||
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
||||||
if err := r.ParseMultipartForm(1 << 20); err != nil {
|
if err := r.ParseMultipartForm(1 << 20); err != nil {
|
||||||
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
||||||
r.ParseForm()
|
_ = r.ParseForm()
|
||||||
}
|
}
|
||||||
|
|
||||||
mountName := r.FormValue("name")
|
mountName := r.FormValue("name")
|
||||||
@@ -204,12 +204,12 @@ func (ws *WebServer) handleDashboardMountCA(w http.ResponseWriter, r *http.Reque
|
|||||||
|
|
||||||
var certPEM, keyPEM string
|
var certPEM, keyPEM string
|
||||||
if f, _, err := r.FormFile("cert_file"); err == nil {
|
if f, _, err := r.FormFile("cert_file"); err == nil {
|
||||||
defer f.Close()
|
defer func() { _ = f.Close() }()
|
||||||
data, _ := io.ReadAll(io.LimitReader(f, 1<<20))
|
data, _ := io.ReadAll(io.LimitReader(f, 1<<20))
|
||||||
certPEM = string(data)
|
certPEM = string(data)
|
||||||
}
|
}
|
||||||
if f, _, err := r.FormFile("key_file"); err == nil {
|
if f, _, err := r.FormFile("key_file"); err == nil {
|
||||||
defer f.Close()
|
defer func() { _ = f.Close() }()
|
||||||
data, _ := io.ReadAll(io.LimitReader(f, 1<<20))
|
data, _ := io.ReadAll(io.LimitReader(f, 1<<20))
|
||||||
keyPEM = string(data)
|
keyPEM = string(data)
|
||||||
}
|
}
|
||||||
@@ -291,21 +291,21 @@ func (ws *WebServer) handleImportRoot(w http.ResponseWriter, r *http.Request) {
|
|||||||
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
||||||
if err := r.ParseMultipartForm(1 << 20); err != nil {
|
if err := r.ParseMultipartForm(1 << 20); err != nil {
|
||||||
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
||||||
r.ParseForm()
|
_ = r.ParseForm()
|
||||||
}
|
}
|
||||||
|
|
||||||
certPEM := r.FormValue("cert_pem")
|
certPEM := r.FormValue("cert_pem")
|
||||||
keyPEM := r.FormValue("key_pem")
|
keyPEM := r.FormValue("key_pem")
|
||||||
if certPEM == "" {
|
if certPEM == "" {
|
||||||
if f, _, err := r.FormFile("cert_file"); err == nil {
|
if f, _, err := r.FormFile("cert_file"); err == nil {
|
||||||
defer f.Close()
|
defer func() { _ = f.Close() }()
|
||||||
data, _ := io.ReadAll(io.LimitReader(f, 1<<20))
|
data, _ := io.ReadAll(io.LimitReader(f, 1<<20))
|
||||||
certPEM = string(data)
|
certPEM = string(data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if keyPEM == "" {
|
if keyPEM == "" {
|
||||||
if f, _, err := r.FormFile("key_file"); err == nil {
|
if f, _, err := r.FormFile("key_file"); err == nil {
|
||||||
defer f.Close()
|
defer func() { _ = f.Close() }()
|
||||||
data, _ := io.ReadAll(io.LimitReader(f, 1<<20))
|
data, _ := io.ReadAll(io.LimitReader(f, 1<<20))
|
||||||
keyPEM = string(data)
|
keyPEM = string(data)
|
||||||
}
|
}
|
||||||
@@ -342,7 +342,7 @@ func (ws *WebServer) handleCreateIssuer(w http.ResponseWriter, r *http.Request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
|
||||||
r.ParseForm()
|
_ = r.ParseForm()
|
||||||
name := r.FormValue("name")
|
name := r.FormValue("name")
|
||||||
if name == "" {
|
if name == "" {
|
||||||
ws.renderPKIWithError(w, r, mountName, info, "Issuer name is required")
|
ws.renderPKIWithError(w, r, mountName, info, "Issuer name is required")
|
||||||
@@ -391,7 +391,7 @@ func (ws *WebServer) handlePKIIssuer(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
w.Header().Set("Content-Type", "application/x-pem-file")
|
w.Header().Set("Content-Type", "application/x-pem-file")
|
||||||
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s.pem", issuerName))
|
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s.pem", issuerName))
|
||||||
w.Write(certPEM)
|
_, _ = w.Write(certPEM) //nolint:gosec
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ws *WebServer) renderPKIWithError(w http.ResponseWriter, r *http.Request, mountName string, info *TokenInfo, errMsg string) {
|
func (ws *WebServer) renderPKIWithError(w http.ResponseWriter, r *http.Request, mountName string, info *TokenInfo, errMsg string) {
|
||||||
|
|||||||
Reference in New Issue
Block a user