From 3975f084412f518c9ac8a3558bff4c49422dc4ca Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Sun, 6 Nov 2022 14:17:14 +0100 Subject: [PATCH] WIP redirect_uri verification --- cmd/owl/web/aliases_test.go | 2 +- cmd/owl/web/auth_test.go | 2 +- cmd/owl/web/multi_user_test.go | 2 +- cmd/owl/web/post_test.go | 2 +- cmd/owl/web/rss_test.go | 2 +- cmd/owl/web/single_user_test.go | 2 +- cmd/owl/web/webmention_test.go | 2 +- owl_test.go | 57 ------------------------- post_test.go | 41 +++++++++--------- renderer_test.go | 2 +- repository_test.go | 2 +- rss_test.go | 2 +- {priv => test}/assertions/asserts.go | 0 test/mocks/mocks.go | 64 ++++++++++++++++++++++++++++ user_test.go | 2 +- webmention.go | 46 ++++++++++++++++++++ webmention_test.go | 2 +- 17 files changed, 143 insertions(+), 89 deletions(-) rename {priv => test}/assertions/asserts.go (100%) create mode 100644 test/mocks/mocks.go diff --git a/cmd/owl/web/aliases_test.go b/cmd/owl/web/aliases_test.go index 58ca579..2c6977b 100644 --- a/cmd/owl/web/aliases_test.go +++ b/cmd/owl/web/aliases_test.go @@ -3,7 +3,7 @@ package web_test import ( "h4kor/owl-blogs" main "h4kor/owl-blogs/cmd/owl/web" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "net/http" "net/http/httptest" "os" diff --git a/cmd/owl/web/auth_test.go b/cmd/owl/web/auth_test.go index fa8ed54..65ca9d6 100644 --- a/cmd/owl/web/auth_test.go +++ b/cmd/owl/web/auth_test.go @@ -3,7 +3,7 @@ package web_test import ( "encoding/json" main "h4kor/owl-blogs/cmd/owl/web" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "net/http" "net/http/httptest" "net/url" diff --git a/cmd/owl/web/multi_user_test.go b/cmd/owl/web/multi_user_test.go index 62382ed..1772596 100644 --- a/cmd/owl/web/multi_user_test.go +++ b/cmd/owl/web/multi_user_test.go @@ -3,7 +3,7 @@ package web_test import ( "h4kor/owl-blogs" main "h4kor/owl-blogs/cmd/owl/web" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "math/rand" "net/http" "net/http/httptest" diff --git a/cmd/owl/web/post_test.go b/cmd/owl/web/post_test.go index 2d7a6c9..f593588 100644 --- a/cmd/owl/web/post_test.go +++ b/cmd/owl/web/post_test.go @@ -3,7 +3,7 @@ package web_test import ( "h4kor/owl-blogs" main "h4kor/owl-blogs/cmd/owl/web" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "net/http" "net/http/httptest" "os" diff --git a/cmd/owl/web/rss_test.go b/cmd/owl/web/rss_test.go index 2877100..20b5fa4 100644 --- a/cmd/owl/web/rss_test.go +++ b/cmd/owl/web/rss_test.go @@ -3,7 +3,7 @@ package web_test import ( "h4kor/owl-blogs" main "h4kor/owl-blogs/cmd/owl/web" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "net/http" "net/http/httptest" "testing" diff --git a/cmd/owl/web/single_user_test.go b/cmd/owl/web/single_user_test.go index 069b3ec..2ffbc9e 100644 --- a/cmd/owl/web/single_user_test.go +++ b/cmd/owl/web/single_user_test.go @@ -3,7 +3,7 @@ package web_test import ( owl "h4kor/owl-blogs" main "h4kor/owl-blogs/cmd/owl/web" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "net/http" "net/http/httptest" "os" diff --git a/cmd/owl/web/webmention_test.go b/cmd/owl/web/webmention_test.go index e2c3105..6806149 100644 --- a/cmd/owl/web/webmention_test.go +++ b/cmd/owl/web/webmention_test.go @@ -3,7 +3,7 @@ package web_test import ( "h4kor/owl-blogs" main "h4kor/owl-blogs/cmd/owl/web" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "net/http" "net/http/httptest" "net/url" diff --git a/owl_test.go b/owl_test.go index 67946bc..01c112a 100644 --- a/owl_test.go +++ b/owl_test.go @@ -2,67 +2,10 @@ package owl_test import ( "h4kor/owl-blogs" - "io" "math/rand" - "net/http" - "net/url" "time" ) -type MockHtmlParser struct{} - -func (*MockHtmlParser) ParseHEntry(resp *http.Response) (owl.ParsedHEntry, error) { - return owl.ParsedHEntry{Title: "Mock Title"}, nil - -} -func (*MockHtmlParser) ParseLinks(resp *http.Response) ([]string, error) { - return []string{"http://example.com"}, nil - -} -func (*MockHtmlParser) ParseLinksFromString(string) ([]string, error) { - return []string{"http://example.com"}, nil - -} -func (*MockHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error) { - return "http://example.com/webmention", nil - -} - -type MockParseLinksHtmlParser struct { - Links []string -} - -func (*MockParseLinksHtmlParser) ParseHEntry(resp *http.Response) (owl.ParsedHEntry, error) { - return owl.ParsedHEntry{Title: "Mock Title"}, nil - -} -func (parser *MockParseLinksHtmlParser) ParseLinks(resp *http.Response) ([]string, error) { - return parser.Links, nil - -} -func (parser *MockParseLinksHtmlParser) ParseLinksFromString(string) ([]string, error) { - return parser.Links, nil - -} -func (*MockParseLinksHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error) { - return "http://example.com/webmention", nil - -} - -type MockHttpClient struct{} - -func (*MockHttpClient) Get(url string) (resp *http.Response, err error) { - return &http.Response{}, nil -} -func (*MockHttpClient) Post(url, contentType string, body io.Reader) (resp *http.Response, err error) { - - return &http.Response{}, nil -} -func (*MockHttpClient) PostForm(url string, data url.Values) (resp *http.Response, err error) { - - return &http.Response{}, nil -} - func randomName() string { rand.Seed(time.Now().UnixNano()) var letters = []rune("abcdefghijklmnopqrstuvwxyz") diff --git a/post_test.go b/post_test.go index 749fc93..4d83654 100644 --- a/post_test.go +++ b/post_test.go @@ -2,7 +2,8 @@ package owl_test import ( "h4kor/owl-blogs" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" + "h4kor/owl-blogs/test/mocks" "os" "path" "strconv" @@ -146,8 +147,8 @@ func TestPersistIncomingWebmention(t *testing.T) { func TestAddIncomingWebmentionCreatesFile(t *testing.T) { repo := getTestRepo(owl.RepoConfig{}) - repo.HttpClient = &MockHttpClient{} - repo.Parser = &MockHtmlParser{} + repo.HttpClient = &mocks.MockHttpClient{} + repo.Parser = &mocks.MockHtmlParser{} user, _ := repo.CreateUser("testuser") post, _ := user.CreateNewPost("testpost", false) @@ -160,8 +161,8 @@ func TestAddIncomingWebmentionCreatesFile(t *testing.T) { func TestAddIncomingWebmentionNotOverwritingWebmention(t *testing.T) { repo := getTestRepo(owl.RepoConfig{}) - repo.HttpClient = &MockHttpClient{} - repo.Parser = &MockHtmlParser{} + repo.HttpClient = &mocks.MockHttpClient{} + repo.Parser = &mocks.MockHtmlParser{} user, _ := repo.CreateUser("testuser") post, _ := user.CreateNewPost("testpost", false) @@ -180,8 +181,8 @@ func TestAddIncomingWebmentionNotOverwritingWebmention(t *testing.T) { func TestEnrichAddsTitle(t *testing.T) { repo := getTestRepo(owl.RepoConfig{}) - repo.HttpClient = &MockHttpClient{} - repo.Parser = &MockHtmlParser{} + repo.HttpClient = &mocks.MockHttpClient{} + repo.Parser = &mocks.MockHtmlParser{} user, _ := repo.CreateUser("testuser") post, _ := user.CreateNewPost("testpost", false) @@ -294,8 +295,8 @@ func TestScanningForLinksDoesAddReplyUrl(t *testing.T) { func TestCanSendWebmention(t *testing.T) { repo := getTestRepo(owl.RepoConfig{}) - repo.HttpClient = &MockHttpClient{} - repo.Parser = &MockHtmlParser{} + repo.HttpClient = &mocks.MockHttpClient{} + repo.Parser = &mocks.MockHtmlParser{} user, _ := repo.CreateUser("testuser") post, _ := user.CreateNewPost("testpost", false) @@ -315,8 +316,8 @@ func TestCanSendWebmention(t *testing.T) { func TestSendWebmentionOnlyScansOncePerWeek(t *testing.T) { repo := getTestRepo(owl.RepoConfig{}) - repo.HttpClient = &MockHttpClient{} - repo.Parser = &MockHtmlParser{} + repo.HttpClient = &mocks.MockHttpClient{} + repo.Parser = &mocks.MockHtmlParser{} user, _ := repo.CreateUser("testuser") post, _ := user.CreateNewPost("testpost", false) @@ -340,8 +341,8 @@ func TestSendWebmentionOnlyScansOncePerWeek(t *testing.T) { func TestSendingMultipleWebmentions(t *testing.T) { repo := getTestRepo(owl.RepoConfig{}) - repo.HttpClient = &MockHttpClient{} - repo.Parser = &MockHtmlParser{} + repo.HttpClient = &mocks.MockHttpClient{} + repo.Parser = &mocks.MockHtmlParser{} user, _ := repo.CreateUser("testuser") post, _ := user.CreateNewPost("testpost", false) @@ -367,8 +368,8 @@ func TestSendingMultipleWebmentions(t *testing.T) { func TestReceivingMultipleWebmentions(t *testing.T) { repo := getTestRepo(owl.RepoConfig{}) - repo.HttpClient = &MockHttpClient{} - repo.Parser = &MockHtmlParser{} + repo.HttpClient = &mocks.MockHttpClient{} + repo.Parser = &mocks.MockHtmlParser{} user, _ := repo.CreateUser("testuser") post, _ := user.CreateNewPost("testpost", false) @@ -392,8 +393,8 @@ func TestReceivingMultipleWebmentions(t *testing.T) { func TestSendingAndReceivingMultipleWebmentions(t *testing.T) { repo := getTestRepo(owl.RepoConfig{}) - repo.HttpClient = &MockHttpClient{} - repo.Parser = &MockHtmlParser{} + repo.HttpClient = &mocks.MockHttpClient{} + repo.Parser = &mocks.MockHtmlParser{} user, _ := repo.CreateUser("testuser") post, _ := user.CreateNewPost("testpost", false) @@ -425,8 +426,8 @@ func TestSendingAndReceivingMultipleWebmentions(t *testing.T) { func TestComplexParallelWebmentions(t *testing.T) { repo := getTestRepo(owl.RepoConfig{}) - repo.HttpClient = &MockHttpClient{} - repo.Parser = &MockParseLinksHtmlParser{ + repo.HttpClient = &mocks.MockHttpClient{} + repo.Parser = &mocks.MockParseLinksHtmlParser{ Links: []string{ "http://example.com/1", "http://example.com/2", @@ -469,7 +470,7 @@ func TestComplexParallelWebmentions(t *testing.T) { // func TestComplexParallelSimulatedProcessesWebmentions(t *testing.T) { // repoName := testRepoName() // repo, _ := owl.CreateRepository(repoName, owl.RepoConfig{}) -// repo.HttpClient = &MockHttpClient{} +// repo.HttpClient = &mocks.MockHttpClient{} // repo.Parser = &MockParseLinksHtmlParser{ // Links: []string{ // "http://example.com/1", diff --git a/renderer_test.go b/renderer_test.go index d67cc08..fd2272b 100644 --- a/renderer_test.go +++ b/renderer_test.go @@ -2,7 +2,7 @@ package owl_test import ( "h4kor/owl-blogs" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "os" "path" "testing" diff --git a/repository_test.go b/repository_test.go index 8fafbc1..00ae31a 100644 --- a/repository_test.go +++ b/repository_test.go @@ -2,7 +2,7 @@ package owl_test import ( "h4kor/owl-blogs" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "os" "path" "testing" diff --git a/rss_test.go b/rss_test.go index 92584cf..b521345 100644 --- a/rss_test.go +++ b/rss_test.go @@ -2,7 +2,7 @@ package owl_test import ( "h4kor/owl-blogs" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "os" "testing" ) diff --git a/priv/assertions/asserts.go b/test/assertions/asserts.go similarity index 100% rename from priv/assertions/asserts.go rename to test/assertions/asserts.go diff --git a/test/mocks/mocks.go b/test/mocks/mocks.go new file mode 100644 index 0000000..07ac8e6 --- /dev/null +++ b/test/mocks/mocks.go @@ -0,0 +1,64 @@ +package mocks + +import ( + "h4kor/owl-blogs" + "io" + "net/http" + "net/url" +) + +type MockHtmlParser struct{} + +func (*MockHtmlParser) ParseHEntry(resp *http.Response) (owl.ParsedHEntry, error) { + return owl.ParsedHEntry{Title: "Mock Title"}, nil + +} +func (*MockHtmlParser) ParseLinks(resp *http.Response) ([]string, error) { + return []string{"http://example.com"}, nil + +} +func (*MockHtmlParser) ParseLinksFromString(string) ([]string, error) { + return []string{"http://example.com"}, nil + +} +func (*MockHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error) { + return "http://example.com/webmention", nil + +} +func (*MockHtmlParser) GetRedirctUris(resp *http.Response) ([]string, error) { + return []string{"http://example.com/redirect"}, nil +} + +type MockParseLinksHtmlParser struct { + Links []string +} + +func (*MockParseLinksHtmlParser) ParseHEntry(resp *http.Response) (owl.ParsedHEntry, error) { + return owl.ParsedHEntry{Title: "Mock Title"}, nil +} +func (parser *MockParseLinksHtmlParser) ParseLinks(resp *http.Response) ([]string, error) { + return parser.Links, nil +} +func (parser *MockParseLinksHtmlParser) ParseLinksFromString(string) ([]string, error) { + return parser.Links, nil +} +func (*MockParseLinksHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error) { + return "http://example.com/webmention", nil +} +func (parser *MockParseLinksHtmlParser) GetRedirctUris(resp *http.Response) ([]string, error) { + return parser.Links, nil +} + +type MockHttpClient struct{} + +func (*MockHttpClient) Get(url string) (resp *http.Response, err error) { + return &http.Response{}, nil +} +func (*MockHttpClient) Post(url, contentType string, body io.Reader) (resp *http.Response, err error) { + + return &http.Response{}, nil +} +func (*MockHttpClient) PostForm(url string, data url.Values) (resp *http.Response, err error) { + + return &http.Response{}, nil +} diff --git a/user_test.go b/user_test.go index 1292acc..2698996 100644 --- a/user_test.go +++ b/user_test.go @@ -3,7 +3,7 @@ package owl_test import ( "fmt" "h4kor/owl-blogs" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "os" "path" "testing" diff --git a/webmention.go b/webmention.go index 07cd1dd..67ac2d6 100644 --- a/webmention.go +++ b/webmention.go @@ -61,6 +61,7 @@ type HtmlParser interface { ParseLinks(resp *http.Response) ([]string, error) ParseLinksFromString(string) ([]string, error) GetWebmentionEndpoint(resp *http.Response) (string, error) + GetRedirctUris(resp *http.Response) ([]string, error) } type OwlHttpClient = http.Client @@ -243,3 +244,48 @@ func (OwlHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error) } return requestUrl.ResolveReference(linkUrl).String(), nil } + +func (OwlHtmlParser) GetRedirctUris(resp *http.Response) ([]string, error) { + //request url + requestUrl := resp.Request.URL + + htmlStr, err := readResponseBody(resp) + if err != nil { + return make([]string, 0), err + } + doc, err := html.Parse(strings.NewReader(htmlStr)) + if err != nil { + return make([]string, 0), err + } + + var findLinks func(*html.Node) ([]string, error) + findLinks = func(n *html.Node) ([]string, error) { + links := make([]string, 0) + if n.Type == html.ElementNode && n.Data == "link" { + // check for rel="redirect_uri" + rel := "" + href := "" + + for _, attr := range n.Attr { + if attr.Key == "href" { + href = attr.Val + } + if attr.Key == "rel" { + rel = attr.Val + } + } + if rel == "redirect_uri" { + linkUrl, err := url.Parse(href) + if err == nil { + links = append(links, requestUrl.ResolveReference(linkUrl).String()) + } + } + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + childLinks, _ := findLinks(c) + links = append(links, childLinks...) + } + return links, nil + } + return findLinks(doc) +} diff --git a/webmention_test.go b/webmention_test.go index ab2fe6b..8de1420 100644 --- a/webmention_test.go +++ b/webmention_test.go @@ -3,7 +3,7 @@ package owl_test import ( "bytes" "h4kor/owl-blogs" - "h4kor/owl-blogs/priv/assertions" + "h4kor/owl-blogs/test/assertions" "io" "net/http" "net/url"