[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-commits] [pluggable-transports/snowflake] 04/31: Add Domain Name Matcher



This is an automated email from the git hooks/post-receive script.

shelikhoo pushed a commit to branch main
in repository pluggable-transports/snowflake.

commit 38f0e00e5d576bbb6ee78cc14ba07003c40d6091
Author: Shelikhoo <xiaokangwang@xxxxxxxxxxx>
AuthorDate: Wed Mar 30 16:42:59 2022 +0100

    Add Domain Name Matcher
    
    Design difference from original vision: Skipped FQDN step to make it more generalized
    https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/issues/28651#note_2787394
---
 common/namematcher/matcher.go      | 26 ++++++++++++++++++
 common/namematcher/matcher_test.go | 55 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+)

diff --git a/common/namematcher/matcher.go b/common/namematcher/matcher.go
new file mode 100644
index 0000000..57f9c56
--- /dev/null
+++ b/common/namematcher/matcher.go
@@ -0,0 +1,26 @@
+package namematcher
+
+import "strings"
+
+func NewNameMatcher(rule string) NameMatcher {
+	return NameMatcher{suffix: strings.TrimPrefix(rule, "^"), exact: strings.HasPrefix(rule, "^")}
+}
+
+type NameMatcher struct {
+	exact  bool
+	suffix string
+}
+
+func (m *NameMatcher) IsSupersetOf(matcher NameMatcher) bool {
+	if m.exact {
+		return matcher.exact && m.suffix == matcher.suffix
+	}
+	return strings.HasSuffix(matcher.suffix, m.suffix)
+}
+
+func (m *NameMatcher) IsMember(s string) bool {
+	if m.exact {
+		return s == m.suffix
+	}
+	return strings.HasSuffix(s, m.suffix)
+}
diff --git a/common/namematcher/matcher_test.go b/common/namematcher/matcher_test.go
new file mode 100644
index 0000000..8d92614
--- /dev/null
+++ b/common/namematcher/matcher_test.go
@@ -0,0 +1,55 @@
+package namematcher
+
+import "testing"
+
+import . "github.com/smartystreets/goconvey/convey"
+
+func TestMatchMember(t *testing.T) {
+	testingVector := []struct {
+		matcher string
+		target  string
+		expects bool
+	}{
+		{matcher: "", target: "", expects: true},
+		{matcher: "^snowflake.torproject.net", target: "snowflake.torproject.net", expects: true},
+		{matcher: "^snowflake.torproject.net", target: "faketorproject.net", expects: false},
+		{matcher: "snowflake.torproject.net", target: "faketorproject.net", expects: false},
+		{matcher: "snowflake.torproject.net", target: "snowflake.torproject.net", expects: true},
+		{matcher: "snowflake.torproject.net", target: "imaginary-01-snowflake.torproject.net", expects: true},
+		{matcher: "snowflake.torproject.net", target: "imaginary-aaa-snowflake.torproject.net", expects: true},
+		{matcher: "snowflake.torproject.net", target: "imaginary-aaa-snowflake.faketorproject.net", expects: false},
+	}
+	for _, v := range testingVector {
+		t.Run(v.matcher+"<>"+v.target, func(t *testing.T) {
+			Convey("test", t, func() {
+				matcher := NewNameMatcher(v.matcher)
+				So(matcher.IsMember(v.target), ShouldEqual, v.expects)
+			})
+		})
+	}
+}
+
+func TestMatchSubset(t *testing.T) {
+	testingVector := []struct {
+		matcher string
+		target  string
+		expects bool
+	}{
+		{matcher: "", target: "", expects: true},
+		{matcher: "^snowflake.torproject.net", target: "^snowflake.torproject.net", expects: true},
+		{matcher: "snowflake.torproject.net", target: "^snowflake.torproject.net", expects: true},
+		{matcher: "snowflake.torproject.net", target: "snowflake.torproject.net", expects: true},
+		{matcher: "snowflake.torproject.net", target: "testing-snowflake.torproject.net", expects: true},
+		{matcher: "snowflake.torproject.net", target: "^testing-snowflake.torproject.net", expects: true},
+		{matcher: "snowflake.torproject.net", target: "", expects: false},
+	}
+	for _, v := range testingVector {
+		t.Run(v.matcher+"<>"+v.target, func(t *testing.T) {
+			Convey("test", t, func() {
+				matcher := NewNameMatcher(v.matcher)
+				target := NewNameMatcher(v.target)
+				So(matcher.IsSupersetOf(target), ShouldEqual, v.expects)
+			})
+		})
+	}
+}

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits