1package config
2
3import (
4 "github.com/bnema/neferafk/internal/ports"
5 "strings"
6 "testing"
7 "time"
8)
9
10func TestDefaultsAndIndependentOff(t *testing.T) {
11 c, err := Parse(strings.NewReader("# defaults\n"))
12 if err != nil || c != ports.Defaults() {
13 t.Fatal(c, err)
14 }
15 c, err = Parse(strings.NewReader("lock.after = off\nfade.after = 1s\nfade.duration = 0s\nscreens.off-after = off\nsleep.after = 24h\nauth.mode = pin\nauth.pin-source = env\nauth.pin-env = NEFERAFK_PIN\n"))
16 if err != nil || c.LockAfter != 0 || c.FadeAfter != time.Second || c.FadeDuration != 0 || c.SleepAfter != 24*time.Hour || c.Auth.PINEnv != "NEFERAFK_PIN" {
17 t.Fatal(c, err)
18 }
19}
20func TestRejectTransactionalBoundsUnknownDuplicateAndSecrets(t *testing.T) {
21 for _, text := range []string{"unknown = x", "lock.after=1s\nlock.after=2s", "lock.after=0s", "lock.after=-1s", "sleep.after=25h", "fade.duration=-1s", "fade.duration=off", "auth.password=false", "auth.pin-reference=x", "auth.mode=unknown", "auth.mode=pin", "auth.pin-source=pass\nauth.pin-entry=-option", "auth.pin-source=pass\nauth.pin-entry=a\x00b", "auth.pin=1234", "auth.pin-source=env\nauth.pin-env=SECRET=123", "auth.pin-source=pass\nauth.pin-entry=../secret", "auth.pin-source=pass\nauth.pin-entry=/secret", strings.Repeat("#", MaxLine+1), strings.Repeat("#\n", MaxBytes)} {
22 c, err := Parse(strings.NewReader(text))
23 if err == nil || c != (ports.Config{}) {
24 t.Fatalf("accepted/partial invalid input length %d", len(text))
25 }
26 }
27}
28func TestPassReferenceMetadataOnly(t *testing.T) {
29 c, err := Parse(strings.NewReader("auth.pin-source=pass\nauth.pin-entry=desktop/neferafk\n"))
30 if err != nil || c.Auth.PINEntry != "desktop/neferafk" {
31 t.Fatal(c, err)
32 }
33}
34func TestDefaultPath(t *testing.T) {
35 t.Setenv("XDG_CONFIG_HOME", "/config")
36 if got := DefaultPath(); got != "/config/neferafk/config" {
37 t.Fatal(got)
38 }
39}
40
41func TestUnknownKeyDiagnosticCannotEchoSecret(t *testing.T) {
42 secret := "accidental-password-should-never-appear"
43 _, err := Parse(strings.NewReader(secret + " = " + secret))
44 if err == nil || strings.Contains(err.Error(), secret) {
45 t.Fatalf("unsafe diagnostic %v", err)
46 }
47}
48func TestRejectInvalidUTF8BeforeParsingAndDirectMetadata(t *testing.T) {
49 for _, text := range []string{"# \xff", "auth.pin-source=pass\nauth.pin-entry=a\xff"} {
50 if _, err := Parse(strings.NewReader(text)); err == nil {
51 t.Fatal("invalid UTF-8 parsed")
52 }
53 }
54 cfg := ports.Defaults()
55 cfg.Auth.PINSource = ports.PINSourcePass
56 cfg.Auth.PINEntry = "entry\xff"
57 if err := cfg.Validate(); err == nil {
58 t.Fatal("direct invalid UTF-8 metadata admitted")
59 }
60}