Skip to content

Commit f70eeed

Browse files
committed
[public-api-server] Forward Origin header where provided
1 parent 2c4390a commit f70eeed

File tree

6 files changed

+18
-21
lines changed

6 files changed

+18
-21
lines changed

components/gitpod-protocol/go/gitpod-service.go

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ type ConnectToServerOpts struct {
262262
Context context.Context
263263
Token string
264264
Cookie string
265-
NoOrigin bool
265+
Origin string
266266
Log *logrus.Entry
267267
ReconnectionHandler func()
268268
CloseHandler func(error)
@@ -281,16 +281,7 @@ func ConnectToServer(endpoint string, opts ConnectToServerOpts) (*APIoverJSONRPC
281281
}
282282

283283
reqHeader := http.Header{}
284-
if !opts.NoOrigin {
285-
var protocol string
286-
if epURL.Scheme == "wss:" {
287-
protocol = "https"
288-
} else {
289-
protocol = "http"
290-
}
291-
origin := fmt.Sprintf("%s://%s/", protocol, epURL.Hostname())
292-
reqHeader.Set("Origin", origin)
293-
}
284+
reqHeader.Set("Origin", opts.Origin)
294285

295286
for k, v := range opts.ExtraHeaders {
296287
reqHeader.Set(k, v)

components/public-api-server/pkg/auth/context.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ const (
2525
type Token struct {
2626
Type TokenType
2727
Value string
28+
// Only relevant for CookieTokenType
29+
OriginHeader string
2830
}
2931

3032
func NewAccessToken(token string) Token {
@@ -34,10 +36,11 @@ func NewAccessToken(token string) Token {
3436
}
3537
}
3638

37-
func NewCookieToken(cookie string) Token {
39+
func NewCookieToken(cookie string, origin string) Token {
3840
return Token{
39-
Type: CookieTokenType,
40-
Value: cookie,
41+
Type: CookieTokenType,
42+
Value: cookie,
43+
OriginHeader: origin,
4144
}
4245
}
4346

components/public-api-server/pkg/auth/context_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func TestTokenToAndFromContext_AccessToken(t *testing.T) {
2020
}
2121

2222
func TestTokenToAndFromContext_CookieToken(t *testing.T) {
23-
token := NewCookieToken("my_token")
23+
token := NewCookieToken("my_token", "gitpod.io")
2424

2525
extracted, err := TokenFromContext(TokenToContext(context.Background(), token))
2626
require.NoError(t, err)

components/public-api-server/pkg/auth/middleware.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ func tokenFromRequest(ctx context.Context, req connect.AnyRequest) (Token, error
6666
}
6767

6868
cookie := req.Header().Get("Cookie")
69+
origin := req.Header().Get("Origin")
6970
if cookie != "" {
70-
return NewCookieToken(cookie), nil
71+
return NewCookieToken(cookie, origin), nil
7172
}
7273

7374
return Token{}, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No access token or cookie credentials available on request."))
@@ -82,8 +83,9 @@ func tokenFromConn(ctx context.Context, conn connect.StreamingHandlerConn) (Toke
8283
}
8384

8485
cookie := conn.RequestHeader().Get("Cookie")
86+
origin := conn.RequestHeader().Get("Origin")
8587
if cookie != "" {
86-
return NewCookieToken(cookie), nil
88+
return NewCookieToken(cookie, origin), nil
8789
}
8890

8991
return Token{}, connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("No access token or cookie credentials available on request."))

components/public-api-server/pkg/proxy/conn.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func (p *NoConnectionPool) Get(ctx context.Context, token auth.Token) (gitpod.AP
4848
opts.Token = token.Value
4949
case auth.CookieTokenType:
5050
opts.Cookie = token.Value
51+
opts.Origin = token.OriginHeader
5152
default:
5253
return nil, errors.New("unknown token type")
5354
}
@@ -85,9 +86,8 @@ func NewConnectionPool(address *url.URL, poolSize int) (*ConnectionPool, error)
8586
connConstructor: func(token auth.Token) (gitpod.APIInterface, error) {
8687
opts := gitpod.ConnectToServerOpts{
8788
// We're using Background context as we want the connection to persist beyond the lifecycle of a single request
88-
Context: context.Background(),
89-
Log: log.Log,
90-
NoOrigin: true,
89+
Context: context.Background(),
90+
Log: log.Log,
9191
CloseHandler: func(_ error) {
9292
cache.Remove(token)
9393
connectionPoolSize.Dec()
@@ -99,6 +99,7 @@ func NewConnectionPool(address *url.URL, poolSize int) (*ConnectionPool, error)
9999
opts.Token = token.Value
100100
case auth.CookieTokenType:
101101
opts.Cookie = token.Value
102+
opts.Origin = token.OriginHeader
102103
default:
103104
return nil, errors.New("unknown token type")
104105
}

components/public-api-server/pkg/proxy/conn_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func TestEndpointBasedOnToken(t *testing.T) {
5757
require.NoError(t, err)
5858
require.Equal(t, "wss://server:3000/v1", endpointForAccessToken)
5959

60-
endpointForCookie, err := getEndpointBasedOnToken(auth.NewCookieToken("foo"), u)
60+
endpointForCookie, err := getEndpointBasedOnToken(auth.NewCookieToken("foo", "server"), u)
6161
require.NoError(t, err)
6262
require.Equal(t, "wss://server:3000/gitpod", endpointForCookie)
6363
}

0 commit comments

Comments
 (0)