mirror of
https://github.com/juanfont/headscale.git
synced 2026-05-23 18:48:42 +09:00
policy/v2: add sshtester compat runner
Replays recorded policy responses for the sshTests block. 200 captures must evaluate; non-200 captures must reject with the recorded body as a substring of the headscale error. Divergences are listed in knownSSHTesterDivergences.
This commit is contained in:
88
hscontrol/policy/v2/sshtester_compat_test.go
Normal file
88
hscontrol/policy/v2/sshtester_compat_test.go
Normal file
@@ -0,0 +1,88 @@
|
||||
// Replay golden HuJSON captures under testdata/sshtest_results/*.hujson:
|
||||
// the 200 path requires headscale's evaluateSSHTests to pass; the
|
||||
// non-200 path requires headscale to reject the same input with the
|
||||
// captured error body as a substring. Divergences are listed in
|
||||
// knownSSHTesterDivergences with the engine gap each represents.
|
||||
|
||||
package v2
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/juanfont/headscale/hscontrol/types/testcapture"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// knownSSHTesterDivergences names the engine gap for each capture where
|
||||
// headscale and upstream disagree.
|
||||
var knownSSHTesterDivergences = map[string]string{
|
||||
"sshtest-malformed-dst-bare-ipv6": "bare-IPv6 sshTests dst: upstream parse-accepts then engine-rejects; headscale accepts (IPv4 mirror passes both sides)",
|
||||
}
|
||||
|
||||
func TestSSHTesterCompat(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
files, err := filepath.Glob(filepath.Join("testdata", "sshtest_results", "*.hujson"))
|
||||
require.NoError(t, err, "failed to glob test files")
|
||||
|
||||
if len(files) == 0 {
|
||||
t.Skip("no sshtest captures yet")
|
||||
}
|
||||
|
||||
users := setupSSHDataCompatUsers()
|
||||
|
||||
for _, file := range files {
|
||||
c, err := testcapture.Read(file)
|
||||
require.NoError(t, err, "reading %s", file)
|
||||
|
||||
t.Run(c.TestID, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
if reason, skip := knownSSHTesterDivergences[c.TestID]; skip {
|
||||
t.Skip(reason)
|
||||
}
|
||||
|
||||
// Each capture pins its own topology IPs; build nodes
|
||||
// from the capture so host-alias dsts resolve.
|
||||
nodes := buildGrantsNodesFromCapture(users, c)
|
||||
|
||||
policyJSON := []byte(c.Input.FullPolicy)
|
||||
|
||||
pm, parseErr := NewPolicyManager(policyJSON, users, nodes.ViewSlice())
|
||||
|
||||
if c.Input.APIResponseCode == 200 {
|
||||
require.NoError(t, parseErr,
|
||||
"tailscale accepted this policy; headscale must parse it")
|
||||
|
||||
_, setErr := pm.SetPolicy(policyJSON)
|
||||
require.NoError(t, setErr,
|
||||
"tailscale accepted this policy; headscale sshTests must pass")
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
var got error
|
||||
|
||||
switch {
|
||||
case parseErr != nil:
|
||||
got = parseErr
|
||||
default:
|
||||
_, setErr := pm.SetPolicy(policyJSON)
|
||||
got = setErr
|
||||
}
|
||||
|
||||
require.Error(t, got, "tailscale rejected; headscale must reject too")
|
||||
|
||||
if c.Input.APIResponseBody == nil || c.Input.APIResponseBody.Message == "" {
|
||||
return
|
||||
}
|
||||
|
||||
want := c.Input.APIResponseBody.Message
|
||||
if !strings.Contains(got.Error(), want) {
|
||||
t.Errorf("error body mismatch\n tailscale wants: %q\n headscale got: %q", want, got.Error())
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
21887
hscontrol/policy/v2/testdata/sshtest_results/sshtest-accept-and-deny-same-user.hujson
vendored
Normal file
21887
hscontrol/policy/v2/testdata/sshtest_results/sshtest-accept-and-deny-same-user.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20077
hscontrol/policy/v2/testdata/sshtest_results/sshtest-accept-fail-no-ssh-rule.hujson
vendored
Normal file
20077
hscontrol/policy/v2/testdata/sshtest_results/sshtest-accept-fail-no-ssh-rule.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20084
hscontrol/policy/v2/testdata/sshtest_results/sshtest-accept-fail-wrong-login-user.hujson
vendored
Normal file
20084
hscontrol/policy/v2/testdata/sshtest_results/sshtest-accept-fail-wrong-login-user.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20102
hscontrol/policy/v2/testdata/sshtest_results/sshtest-acceptenv-no-effect.hujson
vendored
Normal file
20102
hscontrol/policy/v2/testdata/sshtest_results/sshtest-acceptenv-no-effect.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20094
hscontrol/policy/v2/testdata/sshtest_results/sshtest-action-check-treated-as-allowed.hujson
vendored
Normal file
20094
hscontrol/policy/v2/testdata/sshtest_results/sshtest-action-check-treated-as-allowed.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20036
hscontrol/policy/v2/testdata/sshtest_results/sshtest-allpass-autogroup-self-same-user.hujson
vendored
Normal file
20036
hscontrol/policy/v2/testdata/sshtest_results/sshtest-allpass-autogroup-self-same-user.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20099
hscontrol/policy/v2/testdata/sshtest_results/sshtest-allpass-basic-user-to-tag.hujson
vendored
Normal file
20099
hscontrol/policy/v2/testdata/sshtest_results/sshtest-allpass-basic-user-to-tag.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
13577
hscontrol/policy/v2/testdata/sshtest_results/sshtest-both-tests-and-sshTests-both-pass.hujson
vendored
Normal file
13577
hscontrol/policy/v2/testdata/sshtest_results/sshtest-both-tests-and-sshTests-both-pass.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20090
hscontrol/policy/v2/testdata/sshtest_results/sshtest-both-tests-pass-sshTests-fail.hujson
vendored
Normal file
20090
hscontrol/policy/v2/testdata/sshtest_results/sshtest-both-tests-pass-sshTests-fail.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20094
hscontrol/policy/v2/testdata/sshtest_results/sshtest-checkperiod-no-effect.hujson
vendored
Normal file
20094
hscontrol/policy/v2/testdata/sshtest_results/sshtest-checkperiod-no-effect.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20082
hscontrol/policy/v2/testdata/sshtest_results/sshtest-deny-fail-policy-allows.hujson
vendored
Normal file
20082
hscontrol/policy/v2/testdata/sshtest_results/sshtest-deny-fail-policy-allows.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20139
hscontrol/policy/v2/testdata/sshtest_results/sshtest-deny-pass-cross-user-blocked.hujson
vendored
Normal file
20139
hscontrol/policy/v2/testdata/sshtest_results/sshtest-deny-pass-cross-user-blocked.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20099
hscontrol/policy/v2/testdata/sshtest_results/sshtest-deny-pass-no-rule.hujson
vendored
Normal file
20099
hscontrol/policy/v2/testdata/sshtest_results/sshtest-deny-pass-no-rule.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
21903
hscontrol/policy/v2/testdata/sshtest_results/sshtest-dst-duplicate-tags.hujson
vendored
Normal file
21903
hscontrol/policy/v2/testdata/sshtest_results/sshtest-dst-duplicate-tags.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20105
hscontrol/policy/v2/testdata/sshtest_results/sshtest-group-as-src.hujson
vendored
Normal file
20105
hscontrol/policy/v2/testdata/sshtest_results/sshtest-group-as-src.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20100
hscontrol/policy/v2/testdata/sshtest_results/sshtest-host-alias-as-dst.hujson
vendored
Normal file
20100
hscontrol/policy/v2/testdata/sshtest_results/sshtest-host-alias-as-dst.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20099
hscontrol/policy/v2/testdata/sshtest_results/sshtest-ip-literal-src.hujson
vendored
Normal file
20099
hscontrol/policy/v2/testdata/sshtest_results/sshtest-ip-literal-src.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20088
hscontrol/policy/v2/testdata/sshtest_results/sshtest-malformed-dst-autogroup-internet.hujson
vendored
Normal file
20088
hscontrol/policy/v2/testdata/sshtest_results/sshtest-malformed-dst-autogroup-internet.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20084
hscontrol/policy/v2/testdata/sshtest_results/sshtest-malformed-dst-cidr.hujson
vendored
Normal file
20084
hscontrol/policy/v2/testdata/sshtest_results/sshtest-malformed-dst-cidr.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20084
hscontrol/policy/v2/testdata/sshtest_results/sshtest-malformed-dst-with-port.hujson
vendored
Normal file
20084
hscontrol/policy/v2/testdata/sshtest_results/sshtest-malformed-dst-with-port.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20082
hscontrol/policy/v2/testdata/sshtest_results/sshtest-malformed-empty-accept-and-deny.hujson
vendored
Normal file
20082
hscontrol/policy/v2/testdata/sshtest_results/sshtest-malformed-empty-accept-and-deny.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20082
hscontrol/policy/v2/testdata/sshtest_results/sshtest-malformed-empty-user.hujson
vendored
Normal file
20082
hscontrol/policy/v2/testdata/sshtest_results/sshtest-malformed-empty-user.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
20082
hscontrol/policy/v2/testdata/sshtest_results/sshtest-mixed-acls-tcp22-allow-no-ssh-rule.hujson
vendored
Normal file
20082
hscontrol/policy/v2/testdata/sshtest_results/sshtest-mixed-acls-tcp22-allow-no-ssh-rule.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
13556
hscontrol/policy/v2/testdata/sshtest_results/sshtest-mixed-acls-tcp22-deny-ssh-rule-allow.hujson
vendored
Normal file
13556
hscontrol/policy/v2/testdata/sshtest_results/sshtest-mixed-acls-tcp22-deny-ssh-rule-allow.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
13472
hscontrol/policy/v2/testdata/sshtest_results/sshtest-mixed-grants-app-cap-with-ssh.hujson
vendored
Normal file
13472
hscontrol/policy/v2/testdata/sshtest_results/sshtest-mixed-grants-app-cap-with-ssh.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
21904
hscontrol/policy/v2/testdata/sshtest_results/sshtest-multi-rule-disjoint-srcs.hujson
vendored
Normal file
21904
hscontrol/policy/v2/testdata/sshtest_results/sshtest-multi-rule-disjoint-srcs.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18749
hscontrol/policy/v2/testdata/sshtest_results/sshtest-tag-as-dst.hujson
vendored
Normal file
18749
hscontrol/policy/v2/testdata/sshtest_results/sshtest-tag-as-dst.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18749
hscontrol/policy/v2/testdata/sshtest_results/sshtest-tag-as-src.hujson
vendored
Normal file
18749
hscontrol/policy/v2/testdata/sshtest_results/sshtest-tag-as-src.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18776
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-literal-multi-rule.hujson
vendored
Normal file
18776
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-literal-multi-rule.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18804
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-localpart-domain-match.hujson
vendored
Normal file
18804
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-localpart-domain-match.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18732
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-localpart-domain-mismatch.hujson
vendored
Normal file
18732
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-localpart-domain-mismatch.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18751
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-nonroot-allows-alice.hujson
vendored
Normal file
18751
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-nonroot-allows-alice.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18732
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-nonroot-blocks-root.hujson
vendored
Normal file
18732
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-nonroot-blocks-root.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18749
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-root-only.hujson
vendored
Normal file
18749
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-root-only.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
18734
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-wildcard.hujson
vendored
Normal file
18734
hscontrol/policy/v2/testdata/sshtest_results/sshtest-user-wildcard.hujson
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user