WIP redirect_uri verification

This commit is contained in:
Niko Abeler 2022-11-06 14:17:14 +01:00
parent f3f72d8111
commit 3975f08441
17 changed files with 143 additions and 89 deletions

View File

@ -3,7 +3,7 @@ package web_test
import ( import (
"h4kor/owl-blogs" "h4kor/owl-blogs"
main "h4kor/owl-blogs/cmd/owl/web" main "h4kor/owl-blogs/cmd/owl/web"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"os" "os"

View File

@ -3,7 +3,7 @@ package web_test
import ( import (
"encoding/json" "encoding/json"
main "h4kor/owl-blogs/cmd/owl/web" main "h4kor/owl-blogs/cmd/owl/web"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"net/url" "net/url"

View File

@ -3,7 +3,7 @@ package web_test
import ( import (
"h4kor/owl-blogs" "h4kor/owl-blogs"
main "h4kor/owl-blogs/cmd/owl/web" main "h4kor/owl-blogs/cmd/owl/web"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"math/rand" "math/rand"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"

View File

@ -3,7 +3,7 @@ package web_test
import ( import (
"h4kor/owl-blogs" "h4kor/owl-blogs"
main "h4kor/owl-blogs/cmd/owl/web" main "h4kor/owl-blogs/cmd/owl/web"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"os" "os"

View File

@ -3,7 +3,7 @@ package web_test
import ( import (
"h4kor/owl-blogs" "h4kor/owl-blogs"
main "h4kor/owl-blogs/cmd/owl/web" main "h4kor/owl-blogs/cmd/owl/web"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"testing" "testing"

View File

@ -3,7 +3,7 @@ package web_test
import ( import (
owl "h4kor/owl-blogs" owl "h4kor/owl-blogs"
main "h4kor/owl-blogs/cmd/owl/web" main "h4kor/owl-blogs/cmd/owl/web"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"os" "os"

View File

@ -3,7 +3,7 @@ package web_test
import ( import (
"h4kor/owl-blogs" "h4kor/owl-blogs"
main "h4kor/owl-blogs/cmd/owl/web" main "h4kor/owl-blogs/cmd/owl/web"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"net/url" "net/url"

View File

@ -2,67 +2,10 @@ package owl_test
import ( import (
"h4kor/owl-blogs" "h4kor/owl-blogs"
"io"
"math/rand" "math/rand"
"net/http"
"net/url"
"time" "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 { func randomName() string {
rand.Seed(time.Now().UnixNano()) rand.Seed(time.Now().UnixNano())
var letters = []rune("abcdefghijklmnopqrstuvwxyz") var letters = []rune("abcdefghijklmnopqrstuvwxyz")

View File

@ -2,7 +2,8 @@ package owl_test
import ( import (
"h4kor/owl-blogs" "h4kor/owl-blogs"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"h4kor/owl-blogs/test/mocks"
"os" "os"
"path" "path"
"strconv" "strconv"
@ -146,8 +147,8 @@ func TestPersistIncomingWebmention(t *testing.T) {
func TestAddIncomingWebmentionCreatesFile(t *testing.T) { func TestAddIncomingWebmentionCreatesFile(t *testing.T) {
repo := getTestRepo(owl.RepoConfig{}) repo := getTestRepo(owl.RepoConfig{})
repo.HttpClient = &MockHttpClient{} repo.HttpClient = &mocks.MockHttpClient{}
repo.Parser = &MockHtmlParser{} repo.Parser = &mocks.MockHtmlParser{}
user, _ := repo.CreateUser("testuser") user, _ := repo.CreateUser("testuser")
post, _ := user.CreateNewPost("testpost", false) post, _ := user.CreateNewPost("testpost", false)
@ -160,8 +161,8 @@ func TestAddIncomingWebmentionCreatesFile(t *testing.T) {
func TestAddIncomingWebmentionNotOverwritingWebmention(t *testing.T) { func TestAddIncomingWebmentionNotOverwritingWebmention(t *testing.T) {
repo := getTestRepo(owl.RepoConfig{}) repo := getTestRepo(owl.RepoConfig{})
repo.HttpClient = &MockHttpClient{} repo.HttpClient = &mocks.MockHttpClient{}
repo.Parser = &MockHtmlParser{} repo.Parser = &mocks.MockHtmlParser{}
user, _ := repo.CreateUser("testuser") user, _ := repo.CreateUser("testuser")
post, _ := user.CreateNewPost("testpost", false) post, _ := user.CreateNewPost("testpost", false)
@ -180,8 +181,8 @@ func TestAddIncomingWebmentionNotOverwritingWebmention(t *testing.T) {
func TestEnrichAddsTitle(t *testing.T) { func TestEnrichAddsTitle(t *testing.T) {
repo := getTestRepo(owl.RepoConfig{}) repo := getTestRepo(owl.RepoConfig{})
repo.HttpClient = &MockHttpClient{} repo.HttpClient = &mocks.MockHttpClient{}
repo.Parser = &MockHtmlParser{} repo.Parser = &mocks.MockHtmlParser{}
user, _ := repo.CreateUser("testuser") user, _ := repo.CreateUser("testuser")
post, _ := user.CreateNewPost("testpost", false) post, _ := user.CreateNewPost("testpost", false)
@ -294,8 +295,8 @@ func TestScanningForLinksDoesAddReplyUrl(t *testing.T) {
func TestCanSendWebmention(t *testing.T) { func TestCanSendWebmention(t *testing.T) {
repo := getTestRepo(owl.RepoConfig{}) repo := getTestRepo(owl.RepoConfig{})
repo.HttpClient = &MockHttpClient{} repo.HttpClient = &mocks.MockHttpClient{}
repo.Parser = &MockHtmlParser{} repo.Parser = &mocks.MockHtmlParser{}
user, _ := repo.CreateUser("testuser") user, _ := repo.CreateUser("testuser")
post, _ := user.CreateNewPost("testpost", false) post, _ := user.CreateNewPost("testpost", false)
@ -315,8 +316,8 @@ func TestCanSendWebmention(t *testing.T) {
func TestSendWebmentionOnlyScansOncePerWeek(t *testing.T) { func TestSendWebmentionOnlyScansOncePerWeek(t *testing.T) {
repo := getTestRepo(owl.RepoConfig{}) repo := getTestRepo(owl.RepoConfig{})
repo.HttpClient = &MockHttpClient{} repo.HttpClient = &mocks.MockHttpClient{}
repo.Parser = &MockHtmlParser{} repo.Parser = &mocks.MockHtmlParser{}
user, _ := repo.CreateUser("testuser") user, _ := repo.CreateUser("testuser")
post, _ := user.CreateNewPost("testpost", false) post, _ := user.CreateNewPost("testpost", false)
@ -340,8 +341,8 @@ func TestSendWebmentionOnlyScansOncePerWeek(t *testing.T) {
func TestSendingMultipleWebmentions(t *testing.T) { func TestSendingMultipleWebmentions(t *testing.T) {
repo := getTestRepo(owl.RepoConfig{}) repo := getTestRepo(owl.RepoConfig{})
repo.HttpClient = &MockHttpClient{} repo.HttpClient = &mocks.MockHttpClient{}
repo.Parser = &MockHtmlParser{} repo.Parser = &mocks.MockHtmlParser{}
user, _ := repo.CreateUser("testuser") user, _ := repo.CreateUser("testuser")
post, _ := user.CreateNewPost("testpost", false) post, _ := user.CreateNewPost("testpost", false)
@ -367,8 +368,8 @@ func TestSendingMultipleWebmentions(t *testing.T) {
func TestReceivingMultipleWebmentions(t *testing.T) { func TestReceivingMultipleWebmentions(t *testing.T) {
repo := getTestRepo(owl.RepoConfig{}) repo := getTestRepo(owl.RepoConfig{})
repo.HttpClient = &MockHttpClient{} repo.HttpClient = &mocks.MockHttpClient{}
repo.Parser = &MockHtmlParser{} repo.Parser = &mocks.MockHtmlParser{}
user, _ := repo.CreateUser("testuser") user, _ := repo.CreateUser("testuser")
post, _ := user.CreateNewPost("testpost", false) post, _ := user.CreateNewPost("testpost", false)
@ -392,8 +393,8 @@ func TestReceivingMultipleWebmentions(t *testing.T) {
func TestSendingAndReceivingMultipleWebmentions(t *testing.T) { func TestSendingAndReceivingMultipleWebmentions(t *testing.T) {
repo := getTestRepo(owl.RepoConfig{}) repo := getTestRepo(owl.RepoConfig{})
repo.HttpClient = &MockHttpClient{} repo.HttpClient = &mocks.MockHttpClient{}
repo.Parser = &MockHtmlParser{} repo.Parser = &mocks.MockHtmlParser{}
user, _ := repo.CreateUser("testuser") user, _ := repo.CreateUser("testuser")
post, _ := user.CreateNewPost("testpost", false) post, _ := user.CreateNewPost("testpost", false)
@ -425,8 +426,8 @@ func TestSendingAndReceivingMultipleWebmentions(t *testing.T) {
func TestComplexParallelWebmentions(t *testing.T) { func TestComplexParallelWebmentions(t *testing.T) {
repo := getTestRepo(owl.RepoConfig{}) repo := getTestRepo(owl.RepoConfig{})
repo.HttpClient = &MockHttpClient{} repo.HttpClient = &mocks.MockHttpClient{}
repo.Parser = &MockParseLinksHtmlParser{ repo.Parser = &mocks.MockParseLinksHtmlParser{
Links: []string{ Links: []string{
"http://example.com/1", "http://example.com/1",
"http://example.com/2", "http://example.com/2",
@ -469,7 +470,7 @@ func TestComplexParallelWebmentions(t *testing.T) {
// func TestComplexParallelSimulatedProcessesWebmentions(t *testing.T) { // func TestComplexParallelSimulatedProcessesWebmentions(t *testing.T) {
// repoName := testRepoName() // repoName := testRepoName()
// repo, _ := owl.CreateRepository(repoName, owl.RepoConfig{}) // repo, _ := owl.CreateRepository(repoName, owl.RepoConfig{})
// repo.HttpClient = &MockHttpClient{} // repo.HttpClient = &mocks.MockHttpClient{}
// repo.Parser = &MockParseLinksHtmlParser{ // repo.Parser = &MockParseLinksHtmlParser{
// Links: []string{ // Links: []string{
// "http://example.com/1", // "http://example.com/1",

View File

@ -2,7 +2,7 @@ package owl_test
import ( import (
"h4kor/owl-blogs" "h4kor/owl-blogs"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"os" "os"
"path" "path"
"testing" "testing"

View File

@ -2,7 +2,7 @@ package owl_test
import ( import (
"h4kor/owl-blogs" "h4kor/owl-blogs"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"os" "os"
"path" "path"
"testing" "testing"

View File

@ -2,7 +2,7 @@ package owl_test
import ( import (
"h4kor/owl-blogs" "h4kor/owl-blogs"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"os" "os"
"testing" "testing"
) )

64
test/mocks/mocks.go Normal file
View File

@ -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
}

View File

@ -3,7 +3,7 @@ package owl_test
import ( import (
"fmt" "fmt"
"h4kor/owl-blogs" "h4kor/owl-blogs"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"os" "os"
"path" "path"
"testing" "testing"

View File

@ -61,6 +61,7 @@ type HtmlParser interface {
ParseLinks(resp *http.Response) ([]string, error) ParseLinks(resp *http.Response) ([]string, error)
ParseLinksFromString(string) ([]string, error) ParseLinksFromString(string) ([]string, error)
GetWebmentionEndpoint(resp *http.Response) (string, error) GetWebmentionEndpoint(resp *http.Response) (string, error)
GetRedirctUris(resp *http.Response) ([]string, error)
} }
type OwlHttpClient = http.Client type OwlHttpClient = http.Client
@ -243,3 +244,48 @@ func (OwlHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error)
} }
return requestUrl.ResolveReference(linkUrl).String(), nil 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)
}

View File

@ -3,7 +3,7 @@ package owl_test
import ( import (
"bytes" "bytes"
"h4kor/owl-blogs" "h4kor/owl-blogs"
"h4kor/owl-blogs/priv/assertions" "h4kor/owl-blogs/test/assertions"
"io" "io"
"net/http" "net/http"
"net/url" "net/url"