Skip to content
This repository has been archived by the owner on Mar 11, 2021. It is now read-only.

Commit

Permalink
rh-che traefik#532 Adding workaround with extra query parameters proc…
Browse files Browse the repository at this point in the history
…essing (#26)

Signed-off-by: Ilya Buziuk <ibuziuk@redhat.com>
  • Loading branch information
ibuziuk authored and aslakknutsen committed Jun 6, 2018
1 parent 2785b3c commit 90e72b8
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 14 deletions.
11 changes: 1 addition & 10 deletions middlewares/osio/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,19 +268,16 @@ func removeUserID(req *http.Request) {
}
userID := req.URL.Query().Get(UserIDParam)
if userID != "" {
// case when userID query parameter contains path e.g.
if strings.Contains(userID, "/") {

// Processing query params
rawQuery := req.URL.RawQuery;
extraPath := ""
if strings.Contains(rawQuery, "?") {
queryIndex := strings.LastIndex(rawQuery, "?")
rawQuery = rawQuery[queryIndex+1:]
} else if strings.Contains(rawQuery, "&") {
ampersandIndex := strings.Index(rawQuery, "&")
extraPath = rawQuery[ampersandIndex:]
rawQuery = ""
rawQuery = rawQuery[ampersandIndex+1:]
} else {
rawQuery = ""
}
Expand All @@ -297,13 +294,7 @@ func removeUserID(req *http.Request) {
indexOfFirstSlash := strings.Index(userID, "/")
path := userID[indexOfFirstSlash:]

if extraPath != "" {
path += extraPath
}

req.URL.Path = path

// setting requestURI
req.RequestURI = req.URL.RequestURI()
} else {
q := req.URL.Query()
Expand Down
78 changes: 74 additions & 4 deletions middlewares/osio/auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,16 +168,19 @@ func TestRemoveUserID(t *testing.T) {
})

t.Run("UserID as part of url produced by rh-che via kubernetes client for 'event' calls", func(t *testing.T) {
pathWithParams := "/api/v1/anamespaces/namespace-che/events\u0026watch=true"
pathWithParams := "/api/v1/namespaces/namespace-che/events\u0026watch=true"
adhocURL := fmt.Sprintf("http://f8osoproxy.com?%s=%s%s", UserIDParam, userID, pathWithParams)
req, _ := http.NewRequest(http.MethodGet, adhocURL, nil)
removeUserID(req)

actualUserID := req.URL.Query().Get(UserIDParam)
assert.Empty(t, actualUserID)

assert.Equal(t, pathWithParams, req.RequestURI)
assert.Equal(t, "http://f8osoproxy.com/api/v1/anamespaces/namespace-che/events\u0026watch=true", req.URL.String())
watchParam := req.URL.Query().Get("watch")
assert.Equal(t, watchParam, "true")

assert.Equal(t, "/api/v1/namespaces/namespace-che/events?watch=true", req.RequestURI)
assert.Equal(t, "http://f8osoproxy.com/api/v1/namespaces/namespace-che/events?watch=true", req.URL.String())
})

t.Run("UserID as part of url produced by rh-che via kubernetes client for 'exec' calls", func(t *testing.T) {
Expand All @@ -203,7 +206,14 @@ func TestRemoveUserID(t *testing.T) {
actualUserID := req.URL.Query().Get(UserIDParam)
assert.Empty(t, actualUserID)

assert.Equal(t, pathWithParams, req.URL.Path)
watchParam := req.URL.Query().Get("watch")
assert.Equal(t, watchParam, "true")

fieldSelector := req.URL.Query().Get("fieldSelector")
assert.Equal(t, "metadata.name=rm-workspace41v9261pdzqs84c4", fieldSelector)

assert.Equal(t, "/api/v1/namespaces/osio-ci-ee1-preview-che/pods?fieldSelector=metadata.name%3Drm-workspace41v9261pdzqs84c4\u0026watch=true", req.RequestURI)
assert.Equal(t, "fieldSelector=metadata.name%3Drm-workspace41v9261pdzqs84c4\u0026watch=true", req.URL.RawQuery)
})

t.Run("UserID as part of url produced by rh-che via kubernetes client for pod 'watch' calls", func(t *testing.T) {
Expand All @@ -214,6 +224,15 @@ func TestRemoveUserID(t *testing.T) {

actualUserID := req.URL.Query().Get(UserIDParam)
assert.Empty(t, actualUserID)

watchParam := req.URL.Query().Get("watch")
assert.Equal(t, watchParam, "true")

fieldSelector := req.URL.Query().Get("fieldSelector")
assert.Equal(t, "metadata.name=workspacertz5iv86ez29v6bp.dockerimage", fieldSelector)

assert.Equal(t, "/api/v1/namespaces/osio-ci-ee1-preview-che/pods?fieldSelector=metadata.name%3Dworkspacertz5iv86ez29v6bp.dockerimage\u0026watch=true", req.RequestURI)
assert.Equal(t, "fieldSelector=metadata.name%3Dworkspacertz5iv86ez29v6bp.dockerimage\u0026watch=true", req.URL.RawQuery)
})

t.Run("UserID as part of url produced by rh-che via kubernetes client for pod removal calls", func(t *testing.T) {
Expand All @@ -224,6 +243,16 @@ func TestRemoveUserID(t *testing.T) {

actualUserID := req.URL.Query().Get(UserIDParam)
assert.Empty(t, actualUserID)

watchParam := req.URL.Query().Get("watch")
assert.Equal(t, watchParam, "true")

fieldSelector := req.URL.Query().Get("fieldSelector")
assert.Equal(t, "metadata.name=rm-workspace41v9261pdzqs84c4", fieldSelector)

assert.Equal(t, "/api/v1/namespaces/osio-ci-ee1-preview-che/pods?fieldSelector=metadata.name%3Drm-workspace41v9261pdzqs84c4\u0026watch=true", req.RequestURI)
assert.Equal(t, "fieldSelector=metadata.name%3Drm-workspace41v9261pdzqs84c4\u0026watch=true", req.URL.RawQuery)
assert.Equal(t, "http://f8osoproxy.com/api/v1/namespaces/osio-ci-ee1-preview-che/pods?fieldSelector=metadata.name%3Drm-workspace41v9261pdzqs84c4\u0026watch=true", req.URL.String())
})

t.Run("UserID as part of url produced by rh-che via kubernetes client for routes calls", func(t *testing.T) {
Expand All @@ -234,6 +263,13 @@ func TestRemoveUserID(t *testing.T) {

actualUserID := req.URL.Query().Get(UserIDParam)
assert.Empty(t, actualUserID)

labelSelector := req.URL.Query().Get("labelSelector")
assert.Equal(t, "che.workspace_id=workspacertz5iv86ez29v6b", labelSelector)

assert.Equal(t, "/apis/route.openshift.io/v1/namespaces/osio-ci-ee1-preview-che/routes?labelSelector=che.workspace_id%3Dworkspacertz5iv86ez29v6b", req.RequestURI)
assert.Equal(t, "labelSelector=che.workspace_id%3Dworkspacertz5iv86ez29v6b", req.URL.RawQuery)
assert.Equal(t, "http://f8osoproxy.com/apis/route.openshift.io/v1/namespaces/osio-ci-ee1-preview-che/routes?labelSelector=che.workspace_id%3Dworkspacertz5iv86ez29v6b", req.URL.String())
})

t.Run("UserID as part of url produced by rh-che via kubernetes client for services calls", func(t *testing.T) {
Expand All @@ -244,6 +280,13 @@ func TestRemoveUserID(t *testing.T) {

actualUserID := req.URL.Query().Get(UserIDParam)
assert.Empty(t, actualUserID)

labelSelector := req.URL.Query().Get("labelSelector")
assert.Equal(t, "che.workspace_id=workspacertz5iv86ez29v6bp", labelSelector)

assert.Equal(t, "/api/v1/namespaces/osio-ci-ee1-preview-che/services?labelSelector=che.workspace_id%3Dworkspacertz5iv86ez29v6bp", req.RequestURI)
assert.Equal(t, "labelSelector=che.workspace_id%3Dworkspacertz5iv86ez29v6bp", req.URL.RawQuery)
assert.Equal(t, "http://f8osoproxy.com/api/v1/namespaces/osio-ci-ee1-preview-che/services?labelSelector=che.workspace_id%3Dworkspacertz5iv86ez29v6bp", req.URL.String())
})

t.Run("UserID as part of url produced by rh-che via kubernetes client for pod 'watch' calls", func(t *testing.T) {
Expand All @@ -254,5 +297,32 @@ func TestRemoveUserID(t *testing.T) {

actualUserID := req.URL.Query().Get(UserIDParam)
assert.Empty(t, actualUserID)

watchParam := req.URL.Query().Get("watch")
assert.Equal(t, watchParam, "true")

fieldSelector := req.URL.Query().Get("fieldSelector")
assert.Equal(t, "metadata.name=rm-workspace41v9261pdzqs84c4", fieldSelector)

assert.Equal(t, "/api/v1/namespaces/osio-ci-ee1-preview-che/pods?fieldSelector=metadata.name%3Drm-workspace41v9261pdzqs84c4\u0026watch=true", req.RequestURI)
assert.Equal(t, "fieldSelector=metadata.name%3Drm-workspace41v9261pdzqs84c4\u0026watch=true", req.URL.RawQuery)
assert.Equal(t, "http://f8osoproxy.com/api/v1/namespaces/osio-ci-ee1-preview-che/pods?fieldSelector=metadata.name%3Drm-workspace41v9261pdzqs84c4\u0026watch=true", req.URL.String())
})

t.Run("UserID as part of url produced by rh-che via kubernetes client for pod with lablel selector", func(t *testing.T) {
pathWithParams := "/api/v1/namespaces/osio-ci-ee1-preview-che/pods\u0026labelSelector=che.workspace_id%3Dworkspacew9zk6m4xggf0pbtk"
adhocURL := fmt.Sprintf("http://f8osoproxy.com/?%s=%s%s", UserIDParam, userID, pathWithParams)
req, _ := http.NewRequest(http.MethodGet, adhocURL, nil)
removeUserID(req)

actualUserID := req.URL.Query().Get(UserIDParam)
assert.Empty(t, actualUserID)

labelSelector := req.URL.Query().Get("labelSelector")
assert.Equal(t, "che.workspace_id=workspacew9zk6m4xggf0pbtk", labelSelector)

assert.Equal(t, "/api/v1/namespaces/osio-ci-ee1-preview-che/pods?labelSelector=che.workspace_id%3Dworkspacew9zk6m4xggf0pbtk", req.RequestURI)
assert.Equal(t, "labelSelector=che.workspace_id%3Dworkspacew9zk6m4xggf0pbtk", req.URL.RawQuery)
assert.Equal(t, "http://f8osoproxy.com/api/v1/namespaces/osio-ci-ee1-preview-che/pods?labelSelector=che.workspace_id%3Dworkspacew9zk6m4xggf0pbtk", req.URL.String())
})
}

0 comments on commit 90e72b8

Please sign in to comment.