Skip to content

Commit 13e39ad

Browse files
authored
Allow 'Z' in sign URLs. (#317)
Fixes breakage from #313 (9c34d5e). Also, when "fetch/sign URLs do not match config", log the underlying reason(s). Finally, improve the logging in gateway_server slightly + `go fmt`.
1 parent f2758fe commit 13e39ad

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

cmd/gateway_server/server.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ var (
3434
"Publisher server port.")
3535
)
3636

37-
type gatewayServer struct{
37+
type gatewayServer struct {
3838
rtvCache *rtv.RTVCache
3939
}
4040

@@ -56,15 +56,17 @@ func createOCSPResponse(cert *x509.Certificate, key crypto.Signer) ([]byte, erro
5656
// Construct args to ocsp.CreateResponse.
5757
template := ocsp.Response{
5858
SerialNumber: cert.SerialNumber,
59-
Status: ocsp.Good,
60-
ThisUpdate: thisUpdate,
61-
NextUpdate: thisUpdate.Add(time.Hour*24*7),
62-
IssuerHash: crypto.SHA256,
59+
Status: ocsp.Good,
60+
ThisUpdate: thisUpdate,
61+
NextUpdate: thisUpdate.Add(time.Hour * 24 * 7),
62+
IssuerHash: crypto.SHA256,
6363
}
6464
return ocsp.CreateResponse(cert /*issuer*/, cert /*responderCert*/, template, key)
6565
}
6666

6767
func (s *gatewayServer) GenerateSXG(ctx context.Context, request *pb.SXGRequest) (*pb.SXGResponse, error) {
68+
log.Println("Handling request with fetchUrl =", request.FetchUrl, "; signUrl =", request.SignUrl)
69+
6870
certs, err := signedexchange.ParseCertificates(request.PublicCert)
6971
if err != nil {
7072
return errorToSXGResponse(err), nil
@@ -206,6 +208,6 @@ func main() {
206208
var opts []grpc.ServerOption
207209
grpcServer := grpc.NewServer(opts...)
208210
pb.RegisterGatewayServiceServer(grpcServer, &gatewayServer{rtvCache: rtvCache})
209-
fmt.Println("Starting server on port: ", *port)
211+
log.Println("Starting server on port: ", *port)
210212
grpcServer.Serve(listener)
211213
}

packager/signer/validation.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func isFallbackURLCodePoint(b byte) bool {
138138

139139
// Vaguely ordered most to least common, to aid short-circuiting:
140140
return (b >= 'a' && b <= 'z') || b == '_' || b == '~' ||
141-
(b >= '!' && b < 'Z' && b != '"' /*x22*/ && b != '#' /*x23*/ && b != '<' /*x3C*/ && b != '>' /*x3E*/)
141+
(b >= '!' && b <= 'Z' && b != '"' /*x22*/ && b != '#' /*x23*/ && b != '<' /*x3C*/ && b != '>' /*x3E*/)
142142
}
143143

144144
// True iff url matches pattern, as defined by an [URLSet.Sign] block in the
@@ -205,6 +205,8 @@ func parseURLs(fetch string, sign string, urlSets []util.URLSet) (*url.URL, *url
205205
// TODO(twifkak): Use errors.Wrap() after changing return types to error.
206206
return nil, nil, false, err
207207
}
208+
209+
errs := []string{}
208210
for _, set := range urlSets {
209211
err := urlsMatch(fetchURL, signURL, set)
210212
if err == nil {
@@ -213,8 +215,9 @@ func parseURLs(fetch string, sign string, urlSets []util.URLSet) (*url.URL, *url
213215
}
214216
return fetchURL, signURL, set.Sign.ErrorOnStatefulHeaders, nil
215217
}
218+
errs = append(errs, err.Error())
216219
}
217-
return nil, nil, false, util.NewHTTPError(http.StatusBadRequest, "fetch/sign URLs do not match config")
220+
return nil, nil, false, util.NewHTTPError(http.StatusBadRequest, "fetch/sign URLs do not match config; caused by: ", strings.Join(errs, ", "))
218221
}
219222

220223
// Given a request/response pair for the fetch from the packager to the backend

packager/signer/validation_test.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"net/http"
55
"net/http/httptest"
66
"net/url"
7+
"strings"
78
"testing"
89

910
"github.com/ampproject/amppackager/packager/util"
@@ -76,6 +77,15 @@ func TestFetchURLMatches(t *testing.T) {
7677
"URL too long")
7778
}
7879

80+
func TestIsFallbackURLCodePoint(t *testing.T) {
81+
// https://url.spec.whatwg.org/#url-code-points + "%", in codepoint order:
82+
validURLCodepoints := `!$%&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~`
83+
for b := 0; b < 0x100; b++ {
84+
expected := strings.ContainsRune(validURLCodepoints, rune(b))
85+
assert.Equal(t, expected, isFallbackURLCodePoint(byte(b)), "char: %#v", string(rune(b)))
86+
}
87+
}
88+
7989
func TestSignURLMatches(t *testing.T) {
8090
assert.NoError(t, signURLMatches(urlOrDie("https://example.com/"),
8191
&util.URLPattern{Domain: "example.com", PathRE: stringPtr(".*"), QueryRE: stringPtr(".*"), MaxLength: 2000}))
@@ -138,7 +148,9 @@ func TestParseURLs(t *testing.T) {
138148
{Sign: &util.URLPattern{Domain: "badexample.com", PathRE: stringPtr(".*"), QueryRE: stringPtr(".*"), MaxLength: 2000}},
139149
})
140150
if assert.NotNil(t, err) {
141-
assert.EqualError(t, err, "fetch/sign URLs do not match config")
151+
if assert.Error(t, err) {
152+
assert.Contains(t, err.Error(), "fetch/sign URLs do not match config")
153+
}
142154
}
143155
}
144156

0 commit comments

Comments
 (0)