Skip to content

Commit 4ef5263

Browse files
committed
fix: resolve relative discovery URLs in Link header
parseLinkHeader now resolves relative URLs against the request's base URL. Previously /discovery resolved to http://localhost/discovery which broke clients behind a reverse proxy. The server can now use relative Link headers and the client resolves them correctly. Also fix sample config to use client-id instead of audience, create log file in pre-install script so the epithet user can write to it.
1 parent c90607b commit 4ef5263

3 files changed

Lines changed: 23 additions & 28 deletions

File tree

contrib/freebsd/+MANIFEST

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,7 @@ EOD
1818
scripts: {
1919
pre-install: <<EOD
2020
pw usershow epithet >/dev/null 2>&1 || pw useradd epithet -d /nonexistent -s /usr/sbin/nologin -c "epithet CA"
21+
touch /var/log/epithet_server.log
22+
chown epithet /var/log/epithet_server.log
2123
EOD
2224
}

contrib/freebsd/server.yaml.sample

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,5 @@ server:
1414
policy:
1515
oidc:
1616
issuer: "https://accounts.google.com"
17-
audience: "YOUR_CLIENT_ID"
17+
client-id: "YOUR_CLIENT_ID"
1818
default-expiration: "5m"
19-
20-
# Map users (by email) to tags
21-
users:
22-
admin@example.com: [admin, deploy]
23-
dev@example.com: [deploy]
24-
25-
# Default principals granted by tag
26-
defaults:
27-
allow:
28-
wheel: [admin]
29-
deploy: [deploy]
30-
extensions:
31-
permit-pty: ""
32-
permit-agent-forwarding: ""
33-
34-
# Per-host overrides
35-
# hosts:
36-
# "*.prod.example.com":
37-
# expiration: "2m"
38-
# allow:
39-
# root: [admin]

pkg/caclient/caclient.go

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"io"
1010
"log/slog"
1111
"net/http"
12+
"net/url"
1213
"strings"
1314
"sync"
1415
"time"
@@ -380,7 +381,7 @@ func (c *Client) doHello(ctx context.Context, caURL string, token string, body [
380381
}
381382

382383
// Extract and cache discovery URL from Link header
383-
discoveryURL := parseLinkHeader(res.Header.Get("Link"), "discovery")
384+
discoveryURL := parseLinkHeader(res.Header.Get("Link"), "discovery", caURL)
384385
if discoveryURL != "" {
385386
c.discoveryMu.Lock()
386387
c.discoveryURL = discoveryURL
@@ -463,7 +464,7 @@ func (c *Client) doGetPublicKey(ctx context.Context, caURL string) (string, erro
463464
}
464465

465466
// Extract and cache discovery URL from Link header.
466-
discoveryURL := parseLinkHeader(res.Header.Get("Link"), "discovery")
467+
discoveryURL := parseLinkHeader(res.Header.Get("Link"), "discovery", caURL)
467468
if discoveryURL != "" {
468469
c.discoveryMu.Lock()
469470
c.discoveryURL = discoveryURL
@@ -591,7 +592,7 @@ func (c *Client) doRequest(ctx context.Context, caURL string, token string, body
591592
}
592593

593594
// Extract and cache discovery URL from Link header
594-
discoveryURL := parseLinkHeader(res.Header.Get("Link"), "discovery")
595+
discoveryURL := parseLinkHeader(res.Header.Get("Link"), "discovery", caURL)
595596
if discoveryURL != "" {
596597
c.discoveryMu.Lock()
597598
c.discoveryURL = discoveryURL
@@ -650,8 +651,9 @@ func isSuccessfulForCircuitBreaker(err error) bool {
650651

651652
// parseLinkHeader extracts the URL for a given rel from a Link header.
652653
// Link header format: <url>; rel="name"
654+
// Relative URLs are resolved against baseURL.
653655
// Returns empty string if not found or malformed.
654-
func parseLinkHeader(header, rel string) string {
656+
func parseLinkHeader(header, rel string, baseURL string) string {
655657
if header == "" {
656658
return ""
657659
}
@@ -663,13 +665,25 @@ func parseLinkHeader(header, rel string) string {
663665
return ""
664666
}
665667

666-
url := header[start+1 : end]
668+
linkURL := header[start+1 : end]
667669

668670
// Check for the rel parameter
669671
relParam := `rel="` + rel + `"`
670672
if !strings.Contains(header, relParam) {
671673
return ""
672674
}
673675

674-
return url
676+
// Resolve relative URLs against the base URL.
677+
parsed, err := url.Parse(linkURL)
678+
if err != nil {
679+
return linkURL
680+
}
681+
if !parsed.IsAbs() && baseURL != "" {
682+
base, err := url.Parse(baseURL)
683+
if err == nil {
684+
return base.ResolveReference(parsed).String()
685+
}
686+
}
687+
688+
return linkURL
675689
}

0 commit comments

Comments
 (0)