Skip to content

Commit 20d3471

Browse files
committed
feat: add option to not inject Gitlab tokens
1 parent 46bbfe5 commit 20d3471

File tree

6 files changed

+101
-6
lines changed

6 files changed

+101
-6
lines changed

internal/config/config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ sessions:
2525
revproxy:
2626
renkuBaseUrl: "https://renkulab.io"
2727
externalGitlabUrl:
28+
enableV1Services: true
2829
k8sNamespace:
2930
renkuServices:
3031
noteboooks:

internal/config/revproxy.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type RenkuServicesConfig struct {
1818
type RevproxyConfig struct {
1919
RenkuBaseURL *url.URL
2020
ExternalGitlabURL *url.URL
21+
EnableV1Services bool
2122
K8sNamespace string
2223
RenkuServices RenkuServicesConfig
2324
}

internal/config/revproxy_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ func getValidRevproxyConfig(t *testing.T) RevproxyConfig {
1414
externalGitlabURL, err := url.Parse("https://gitlab.example.org")
1515
require.NoError(t, err)
1616
renkuServicesConfig := getValidRenkuServicesConfig(t)
17+
enableV1Services := false
1718
return RevproxyConfig{
1819
RenkuBaseURL: renkuBaseURL,
1920
ExternalGitlabURL: externalGitlabURL,
2021
RenkuServices: renkuServicesConfig,
22+
EnableV1Services: enableV1Services,
2123
}
2224
}
2325

internal/revproxy/auth.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,25 @@ import (
1818

1919
type AuthOption func(*Auth)
2020

21+
type AuthMiddlewareProvider interface {
22+
Middleware() echo.MiddlewareFunc
23+
}
24+
25+
func NewAuthMiddlewareProvider(forceNoOp bool, options ...AuthOption) (AuthMiddlewareProvider, error) {
26+
if forceNoOp {
27+
auth, err := NewNoOpAuth()
28+
if err != nil {
29+
return nil, err
30+
}
31+
return &auth, nil
32+
}
33+
auth, err := NewAuth(options...)
34+
if err != nil {
35+
return nil, err
36+
}
37+
return &auth, nil
38+
}
39+
2140
type TokenInjector func(c echo.Context, token models.AuthToken) error
2241

2342
func InjectInHeader(headerKey string) AuthOption {
@@ -410,3 +429,31 @@ var dataServiceGitlabAccessTokenInjector TokenInjector = func(c echo.Context, ac
410429
)
411430
return nil
412431
}
432+
433+
type NoOpAuth struct {
434+
tokenInjector TokenInjector
435+
}
436+
437+
func NewNoOpAuth() (NoOpAuth, error) {
438+
auth := NoOpAuth{tokenInjector: noOpTokenInjector}
439+
return auth, nil
440+
}
441+
442+
func (a *NoOpAuth) Middleware() echo.MiddlewareFunc {
443+
return func(next echo.HandlerFunc) echo.HandlerFunc {
444+
return func(c echo.Context) error {
445+
return next(c)
446+
}
447+
}
448+
}
449+
450+
// A token injector that does nothing, it is used when no token injection is needed.
451+
var noOpTokenInjector TokenInjector = func(_ echo.Context, _ models.AuthToken) error {
452+
453+
slog.Debug(
454+
"PROXY AUTH MIDDLEWARE",
455+
"message",
456+
"no-op token injector, skipping",
457+
)
458+
return nil
459+
}

internal/revproxy/main.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ type Revproxy struct {
2121
// Auth instances
2222

2323
coreSvcIdTokenAuth Auth
24-
dataGitlabAccessTokenAuth Auth
25-
gitlabTokenAuth Auth
26-
gitlabCliTokenAuth Auth
24+
dataGitlabAccessTokenAuth AuthMiddlewareProvider
25+
gitlabTokenAuth AuthMiddlewareProvider
26+
gitlabCliTokenAuth AuthMiddlewareProvider
2727
notebooksRenkuAccessTokenAuth Auth
2828
notebooksRenkuRefreshTokenAuth Auth
2929
notebooksRenkuIDTokenAuth Auth
@@ -120,15 +120,16 @@ func (r *Revproxy) initializeAuth() error {
120120
if err != nil {
121121
return err
122122
}
123-
r.dataGitlabAccessTokenAuth, err = NewAuth(AuthWithSessionStore(r.sessions), WithTokenType(models.AccessTokenType), WithProviderID("gitlab"), WithTokenInjector(dataServiceGitlabAccessTokenInjector))
123+
124+
r.dataGitlabAccessTokenAuth, err = NewAuthMiddlewareProvider(!r.config.EnableV1Services, AuthWithSessionStore(r.sessions), WithTokenType(models.AccessTokenType), WithProviderID("gitlab"), WithTokenInjector(dataServiceGitlabAccessTokenInjector))
124125
if err != nil {
125126
return err
126127
}
127-
r.gitlabTokenAuth, err = NewAuth(AuthWithSessionStore(r.sessions), WithTokenType(models.AccessTokenType), WithProviderID("gitlab"), InjectBearerToken())
128+
r.gitlabTokenAuth, err = NewAuthMiddlewareProvider(!r.config.EnableV1Services, AuthWithSessionStore(r.sessions), WithTokenType(models.AccessTokenType), WithProviderID("gitlab"), InjectBearerToken())
128129
if err != nil {
129130
return err
130131
}
131-
r.gitlabCliTokenAuth, err = NewAuth(AuthWithSessionStore(r.sessions), WithTokenType(models.AccessTokenType), WithProviderID("gitlab"), WithTokenInjector(gitlabCliTokenInjector))
132+
r.gitlabCliTokenAuth, err = NewAuthMiddlewareProvider(!r.config.EnableV1Services, AuthWithSessionStore(r.sessions), WithTokenType(models.AccessTokenType), WithProviderID("gitlab"), WithTokenInjector(gitlabCliTokenInjector))
132133
if err != nil {
133134
return err
134135
}

internal/revproxy/main_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ type TestCase struct {
218218
Expected TestResults
219219
RequestHeader map[string]string
220220
RequestCookie *http.Cookie
221+
222+
DisableV1Services bool
221223
}
222224

223225
func ParametrizedRouteTest(scenario TestCase) func(*testing.T) {
@@ -298,6 +300,7 @@ func ParametrizedRouteTest(scenario TestCase) func(*testing.T) {
298300
defer gitlab.Close()
299301
rpConfig.ExternalGitlabURL = gitlabURL
300302
}
303+
rpConfig.EnableV1Services = !scenario.DisableV1Services
301304
proxy, proxyURL := setupTestRevproxy(&rpConfig, sessionStore)
302305
defer upstream.Close()
303306
defer upstream2.Close()
@@ -440,6 +443,46 @@ func TestInternalSvcRoutes(t *testing.T) {
440443
},
441444
RequestCookie: &http.Cookie{Name: sessions.SessionCookieName, Value: "sessionID"},
442445
},
446+
{
447+
Path: "/api/notebooks/test/acceptedAuth",
448+
Expected: TestResults{
449+
Path: "/api/data/notebooks/test/acceptedAuth",
450+
VisitedServerIDs: []string{"upstream"},
451+
UpstreamRequestHeaders: []map[string]string{{
452+
echo.HeaderAuthorization: "Bearer accessTokenValue",
453+
"Gitlab-Access-Token": "",
454+
"Gitlab-Access-Token-Expires-At": "",
455+
"Renku-Auth-Refresh-Token": "refreshTokenValue",
456+
"Renku-Auth-Anon-Id": "",
457+
}},
458+
},
459+
Tokens: []models.AuthToken{
460+
newTestToken(
461+
models.AccessTokenType,
462+
tokenID("renku:myToken"),
463+
tokenPlainValue("accessTokenValue"),
464+
tokenProviderID("renku"),
465+
),
466+
newTestToken(
467+
models.RefreshTokenType,
468+
tokenID("renku:myToken"),
469+
tokenPlainValue("refreshTokenValue"),
470+
tokenProviderID("renku"),
471+
),
472+
newTestToken(
473+
models.AccessTokenType,
474+
tokenID("gitlab:otherToken"),
475+
tokenPlainValue("gitlabAccessTokenValue"),
476+
tokenProviderID("gitlab"),
477+
tokenExpiresAt(time.Unix(16746525971, 0)),
478+
),
479+
},
480+
Sessions: []models.Session{
481+
newTestSesssion(sessionID("sessionID"), withTokenIDs(map[string]string{"renku": "renku:myToken", "gitlab": "gitlab:otherToken"})),
482+
},
483+
RequestCookie: &http.Cookie{Name: sessions.SessionCookieName, Value: "sessionID"},
484+
DisableV1Services: true,
485+
},
443486
{
444487
Path: "/api/notebooks",
445488
Expected: TestResults{Path: "/api/data/notebooks", VisitedServerIDs: []string{"upstream"}},

0 commit comments

Comments
 (0)