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:
parent
013dea4f40
commit
26eebcea5a
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
Loading…
x
Reference in New Issue
Block a user