summaryrefslogtreecommitdiff
path: root/contrib/tlsauth/gemini_test.go
blob: bc87958405273347a276340ebe8a718ce9ade576 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package tlsauth_test

import (
	"bytes"
	"context"
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"

	"tildegit.org/tjp/gus"
	"tildegit.org/tjp/gus/contrib/tlsauth"
	"tildegit.org/tjp/gus/gemini"
)

func TestGeminiAuth(t *testing.T) {
	handler1 := func(_ context.Context, request *gus.Request) *gus.Response {
		if !strings.HasPrefix(request.Path, "/one") {
			return nil
		}

		return gemini.Success("", &bytes.Buffer{})
	}
	handler2 := func(_ context.Context, request *gus.Request) *gus.Response {
		if !strings.HasPrefix(request.Path, "/two") {
			return nil
		}

		return gemini.Success("", &bytes.Buffer{})
	}
	handler3 := func(_ context.Context, request *gus.Request) *gus.Response {
		if !strings.HasPrefix(request.Path, "/three") {
			return nil
		}

		return gemini.Success("", &bytes.Buffer{})
	}
	handler4 := func(_ context.Context, request *gus.Request) *gus.Response {
		return gemini.Success("", &bytes.Buffer{})
	}

	handler := gus.FallthroughHandler(
		tlsauth.GeminiAuth(tlsauth.Allow)(handler1),
		tlsauth.GeminiAuth(tlsauth.Allow)(handler2),
		tlsauth.GeminiAuth(tlsauth.Reject)(handler3),
		tlsauth.GeminiAuth(tlsauth.Reject)(handler4),
	)

	server, authClient, _ := setup(t,
		"testdata/server.crt", "testdata/server.key",
		"testdata/client1.crt", "testdata/client1.key",
		handler,
	)

	authlessClient, _ := clientFor(t, server, "", "")

	go server.Serve()
	defer server.Close()

	resp := requestPath(t, authClient, server, "/one")
	assert.Equal(t, gemini.StatusSuccess, resp.Status)

	resp = requestPath(t, authlessClient, server, "/two")
	assert.Equal(t, gemini.StatusClientCertificateRequired, resp.Status)

	resp = requestPath(t, authClient, server, "/three")
	assert.Equal(t, gemini.StatusCertificateNotAuthorized, resp.Status)

	resp = requestPath(t, authlessClient, server, "/four")
	assert.Equal(t, gemini.StatusClientCertificateRequired, resp.Status)
}

func TestGeminiOptionalAuth(t *testing.T) {
	pathHandler := func(path string) gus.Handler {
		return func(_ context.Context, request *gus.Request) *gus.Response {
			if !strings.HasPrefix(request.Path, path) {
				return nil
			}
			return gemini.Success("", &bytes.Buffer{})
		}
	}

	handler := gus.FallthroughHandler(
		tlsauth.GeminiOptionalAuth(tlsauth.Allow)(pathHandler("/one")),
		tlsauth.GeminiOptionalAuth(tlsauth.Allow)(pathHandler("/two")),
		tlsauth.GeminiOptionalAuth(tlsauth.Reject)(pathHandler("/three")),
		tlsauth.GeminiOptionalAuth(tlsauth.Reject)(pathHandler("/four")),
	)

	server, authClient, _ := setup(t,
		"testdata/server.crt", "testdata/server.key",
		"testdata/client1.crt", "testdata/client1.key",
		handler,
	)
	authlessClient, _ := clientFor(t, server, "", "")

	go server.Serve()
	defer server.Close()

	resp := requestPath(t, authClient, server, "/one")
	assert.Equal(t, gemini.StatusSuccess, resp.Status)

	resp = requestPath(t, authlessClient, server, "/two")
	assert.Equal(t, gemini.StatusSuccess, resp.Status)

	resp = requestPath(t, authClient, server, "/three")
	assert.Equal(t, gemini.StatusCertificateNotAuthorized, resp.Status)

	resp = requestPath(t, authlessClient, server, "/four")
	assert.Equal(t, gemini.StatusSuccess, resp.Status)
}