feat(check,serve): Startvalidierung, HTTPS-Server, Signal-Handling und Versionscheck
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBHF4R9EAejDJUMdwr6C68
This commit is contained in:
parent
7e23df9fec
commit
2d223c5823
9 changed files with 1158 additions and 6 deletions
82
cmd/vpnportal/serve_test.go
Normal file
82
cmd/vpnportal/serve_test.go
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestServeRejectsMissingConfig(t *testing.T) {
|
||||
var out, errOut bytes.Buffer
|
||||
code := runServe([]string{"--config", "/gibt/es/nicht.yaml"}, &out, &errOut)
|
||||
if code == 0 {
|
||||
t.Fatal("fehlende Config muss zum Abbruch führen")
|
||||
}
|
||||
if !strings.Contains(errOut.String(), "nicht.yaml") {
|
||||
t.Errorf("Fehlermeldung muss den Pfad nennen: %q", errOut.String())
|
||||
}
|
||||
}
|
||||
|
||||
func TestServeRejectsLooseConfigPermissions(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
p := filepath.Join(dir, "config.yaml")
|
||||
os.WriteFile(p, []byte("portal:\n listen: \"127.0.0.1:0\"\n"), 0o644)
|
||||
os.Chmod(p, 0o644)
|
||||
|
||||
var out, errOut bytes.Buffer
|
||||
if code := runServe([]string{"--config", p}, &out, &errOut); code == 0 {
|
||||
t.Fatal("zu offene Dateirechte müssen den Start verhindern")
|
||||
}
|
||||
if !strings.Contains(errOut.String(), "chmod") {
|
||||
t.Errorf("Fehlermeldung sollte den Reparaturbefehl nennen: %q", errOut.String())
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckRejectsUnknownConfigField(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
p := filepath.Join(dir, "config.yaml")
|
||||
os.WriteFile(p, []byte("portal:\n tls_cert_typo: \"x\"\n"), 0o600)
|
||||
os.Chmod(p, 0o600)
|
||||
|
||||
var out, errOut bytes.Buffer
|
||||
code := runCheck([]string{"--config", p}, &out, &errOut)
|
||||
if code == 0 {
|
||||
t.Fatal("Tippfehler in der Config muss zum Abbruch führen")
|
||||
}
|
||||
combined := out.String() + errOut.String()
|
||||
if !strings.Contains(combined, "tls_cert_typo") {
|
||||
t.Errorf("das unbekannte Feld muss genannt werden: %q", combined)
|
||||
}
|
||||
}
|
||||
|
||||
func TestConfigChecksumIsStable(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
p := filepath.Join(dir, "config.yaml")
|
||||
os.WriteFile(p, []byte("inhalt"), 0o600)
|
||||
os.Chmod(p, 0o600)
|
||||
|
||||
a, err := configChecksum(p)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
b, _ := configChecksum(p)
|
||||
if a != b || a == "" {
|
||||
t.Fatalf("Prüfsumme instabil: %q vs %q", a, b)
|
||||
}
|
||||
if len(a) != 12 {
|
||||
t.Errorf("Prüfsumme sollte gekürzt sein (12 Zeichen), ist %d", len(a))
|
||||
}
|
||||
|
||||
os.WriteFile(p, []byte("anderer inhalt"), 0o600)
|
||||
if c, _ := configChecksum(p); c == a {
|
||||
t.Error("geänderte Datei muss eine andere Prüfsumme ergeben")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewTLSConfigRejectsMissingFiles(t *testing.T) {
|
||||
if _, err := newTLSConfig("/nix.crt", "/nix.key"); err == nil {
|
||||
t.Fatal("fehlende Zertifikatsdateien müssen abgelehnt werden")
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue