Skip to content

Commit 76896ac

Browse files
geroplcorneliusludmann
authored andcommitted
[public-api-server] Forward Origin header where provided
1 parent 1295698 commit 76896ac

File tree

6 files changed

+15
-23
lines changed

6 files changed

+15
-23
lines changed

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

+3-17
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,11 @@ import (
1010
"context"
1111
"encoding/json"
1212
"errors"
13-
"fmt"
1413
"io"
1514
"net/http"
16-
"net/url"
1715
"sync"
1816

1917
"github.com/sourcegraph/jsonrpc2"
20-
"golang.org/x/xerrors"
2118

2219
"github.com/sirupsen/logrus"
2320
)
@@ -261,6 +258,7 @@ type ConnectToServerOpts struct {
261258
Context context.Context
262259
Token string
263260
Cookie string
261+
Origin string
264262
Log *logrus.Entry
265263
ReconnectionHandler func()
266264
CloseHandler func(error)
@@ -273,21 +271,9 @@ func ConnectToServer(endpoint string, opts ConnectToServerOpts) (*APIoverJSONRPC
273271
opts.Context = context.Background()
274272
}
275273

276-
epURL, err := url.Parse(endpoint)
277-
if err != nil {
278-
return nil, xerrors.Errorf("invalid endpoint URL: %w", err)
279-
}
280-
281-
var protocol string
282-
if epURL.Scheme == "wss:" {
283-
protocol = "https"
284-
} else {
285-
protocol = "http"
286-
}
287-
origin := fmt.Sprintf("%s://%s/", protocol, epURL.Hostname())
288-
289274
reqHeader := http.Header{}
290-
reqHeader.Set("Origin", origin)
275+
reqHeader.Set("Origin", opts.Origin)
276+
291277
for k, v := range opts.ExtraHeaders {
292278
reqHeader.Set(k, v)
293279
}

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

+6-3
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

+1-1
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

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,9 @@ func tokenFromRequest(ctx context.Context, req connect.AnyRequest) (Token, error
4141
}
4242

4343
cookie := req.Header().Get("Cookie")
44+
origin := req.Header().Get("Origin")
4445
if cookie != "" {
45-
return NewCookieToken(cookie), nil
46+
return NewCookieToken(cookie, origin), nil
4647
}
4748

4849
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

+2
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
}
@@ -98,6 +99,7 @@ func NewConnectionPool(address *url.URL, poolSize int) (*ConnectionPool, error)
9899
opts.Token = token.Value
99100
case auth.CookieTokenType:
100101
opts.Cookie = token.Value
102+
opts.Origin = token.OriginHeader
101103
default:
102104
return nil, errors.New("unknown token type")
103105
}

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

+1-1
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://gitpod.io/api/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://gitpod.io/api/gitpod", endpointForCookie)
6363
}

0 commit comments

Comments
 (0)