diff options
-rw-r--r-- | internal/command/receivepack/receivepack.go | 4 | ||||
-rw-r--r-- | internal/command/receivepack/receivepack_test.go | 22 | ||||
-rw-r--r-- | internal/command/shared/customaction/customaction.go (renamed from internal/command/receivepack/customaction.go) | 11 | ||||
-rw-r--r-- | internal/command/shared/customaction/customaction_test.go (renamed from internal/command/receivepack/customaction_test.go) | 58 | ||||
-rw-r--r-- | internal/testhelper/requesthandlers/requesthandlers.go | 40 |
5 files changed, 90 insertions, 45 deletions
diff --git a/internal/command/receivepack/receivepack.go b/internal/command/receivepack/receivepack.go index aaaf7b0..3af3941 100644 --- a/internal/command/receivepack/receivepack.go +++ b/internal/command/receivepack/receivepack.go @@ -4,6 +4,7 @@ import ( "gitlab.com/gitlab-org/gitlab-shell/internal/command/commandargs" "gitlab.com/gitlab-org/gitlab-shell/internal/command/readwriter" "gitlab.com/gitlab-org/gitlab-shell/internal/command/shared/accessverifier" + "gitlab.com/gitlab-org/gitlab-shell/internal/command/shared/customaction" "gitlab.com/gitlab-org/gitlab-shell/internal/command/shared/disallowedcommand" "gitlab.com/gitlab-org/gitlab-shell/internal/config" ) @@ -27,7 +28,8 @@ func (c *Command) Execute() error { } if response.IsCustomAction() { - return c.processCustomAction(response) + customAction := customaction.Command{c.Config, c.ReadWriter} + return customAction.Execute(response) } return c.performGitalyCall(response) diff --git a/internal/command/receivepack/receivepack_test.go b/internal/command/receivepack/receivepack_test.go index 1d7bd21..d464e35 100644 --- a/internal/command/receivepack/receivepack_test.go +++ b/internal/command/receivepack/receivepack_test.go @@ -15,18 +15,32 @@ import ( func TestForbiddenAccess(t *testing.T) { requests := requesthandlers.BuildDisallowedByApiHandlers(t) - url, cleanup := testserver.StartHttpServer(t, requests) + cmd, _, cleanup := setup(t, "disallowed", requests) defer cleanup() + err := cmd.Execute() + require.Equal(t, "Disallowed by API call", err.Error()) +} + +func TestCustomReceivePack(t *testing.T) { + cmd, output, cleanup := setup(t, "1", requesthandlers.BuildAllowedWithCustomActionsHandlers(t)) + defer cleanup() + + require.NoError(t, cmd.Execute()) + require.Equal(t, "customoutput", output.String()) +} + +func setup(t *testing.T, keyId string, requests []testserver.TestRequestHandler) (*Command, *bytes.Buffer, func()) { + url, cleanup := testserver.StartSocketHttpServer(t, requests) + output := &bytes.Buffer{} input := bytes.NewBufferString("input") cmd := &Command{ Config: &config.Config{GitlabUrl: url}, - Args: &commandargs.Shell{GitlabKeyId: "disallowed", SshArgs: []string{"git-receive-pack", "group/repo"}}, + Args: &commandargs.Shell{GitlabKeyId: keyId, SshArgs: []string{"git-receive-pack", "group/repo"}}, ReadWriter: &readwriter.ReadWriter{ErrOut: output, Out: output, In: input}, } - err := cmd.Execute() - require.Equal(t, "Disallowed by API call", err.Error()) + return cmd, output, cleanup } diff --git a/internal/command/receivepack/customaction.go b/internal/command/shared/customaction/customaction.go index 6693d23..c4b6647 100644 --- a/internal/command/receivepack/customaction.go +++ b/internal/command/shared/customaction/customaction.go @@ -1,4 +1,4 @@ -package receivepack +package customaction import ( "bytes" @@ -8,6 +8,8 @@ import ( "io/ioutil" "net/http" + "gitlab.com/gitlab-org/gitlab-shell/internal/command/readwriter" + "gitlab.com/gitlab-org/gitlab-shell/internal/config" "gitlab.com/gitlab-org/gitlab-shell/internal/gitlabnet" "gitlab.com/gitlab-org/gitlab-shell/internal/gitlabnet/accessverifier" ) @@ -23,7 +25,12 @@ type Response struct { Message string `json:"message"` } -func (c *Command) processCustomAction(response *accessverifier.Response) error { +type Command struct { + Config *config.Config + ReadWriter *readwriter.ReadWriter +} + +func (c *Command) Execute(response *accessverifier.Response) error { data := response.Payload.Data apiEndpoints := data.ApiEndpoints diff --git a/internal/command/receivepack/customaction_test.go b/internal/command/shared/customaction/customaction_test.go index c55a8f3..3dfe288 100644 --- a/internal/command/receivepack/customaction_test.go +++ b/internal/command/shared/customaction/customaction_test.go @@ -1,4 +1,4 @@ -package receivepack +package customaction import ( "bytes" @@ -9,47 +9,18 @@ import ( "github.com/stretchr/testify/require" - "gitlab.com/gitlab-org/gitlab-shell/internal/command/commandargs" "gitlab.com/gitlab-org/gitlab-shell/internal/command/readwriter" "gitlab.com/gitlab-org/gitlab-shell/internal/config" "gitlab.com/gitlab-org/gitlab-shell/internal/gitlabnet/accessverifier" "gitlab.com/gitlab-org/gitlab-shell/internal/gitlabnet/testserver" ) -func TestCustomReceivePack(t *testing.T) { - repo := "group/repo" - keyId := "1" +func TestExecute(t *testing.T) { + who := "key-1" requests := []testserver.TestRequestHandler{ { - Path: "/api/v4/internal/allowed", - Handler: func(w http.ResponseWriter, r *http.Request) { - b, err := ioutil.ReadAll(r.Body) - require.NoError(t, err) - - var request *accessverifier.Request - require.NoError(t, json.Unmarshal(b, &request)) - - require.Equal(t, "1", request.KeyId) - - body := map[string]interface{}{ - "status": true, - "gl_id": "1", - "payload": map[string]interface{}{ - "action": "geo_proxy_to_primary", - "data": map[string]interface{}{ - "api_endpoints": []string{"/geo/proxy_git_push_ssh/info_refs", "/geo/proxy_git_push_ssh/push"}, - "gl_username": "custom", - "primary_repo": "https://repo/path", - }, - }, - } - w.WriteHeader(http.StatusMultipleChoices) - require.NoError(t, json.NewEncoder(w).Encode(body)) - }, - }, - { - Path: "/geo/proxy_git_push_ssh/info_refs", + Path: "/geo/proxy/info_refs", Handler: func(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) require.NoError(t, err) @@ -57,7 +28,7 @@ func TestCustomReceivePack(t *testing.T) { var request *Request require.NoError(t, json.Unmarshal(b, &request)) - require.Equal(t, request.Data.UserId, "key-"+keyId) + require.Equal(t, request.Data.UserId, who) require.Empty(t, request.Output) err = json.NewEncoder(w).Encode(Response{Result: []byte("custom")}) @@ -65,7 +36,7 @@ func TestCustomReceivePack(t *testing.T) { }, }, { - Path: "/geo/proxy_git_push_ssh/push", + Path: "/geo/proxy/push", Handler: func(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) require.NoError(t, err) @@ -73,7 +44,7 @@ func TestCustomReceivePack(t *testing.T) { var request *Request require.NoError(t, json.Unmarshal(b, &request)) - require.Equal(t, request.Data.UserId, "key-"+keyId) + require.Equal(t, request.Data.UserId, who) require.Equal(t, "input", string(request.Output)) err = json.NewEncoder(w).Encode(Response{Result: []byte("output")}) @@ -89,13 +60,24 @@ func TestCustomReceivePack(t *testing.T) { errBuf := &bytes.Buffer{} input := bytes.NewBufferString("input") + response := &accessverifier.Response{ + Who: who, + Payload: accessverifier.CustomPayload{ + Action: "geo_proxy_to_primary", + Data: accessverifier.CustomPayloadData{ + ApiEndpoints: []string{"/geo/proxy/info_refs", "/geo/proxy/push"}, + Username: "custom", + PrimaryRepo: "https://repo/path", + }, + }, + } + cmd := &Command{ Config: &config.Config{GitlabUrl: url}, - Args: &commandargs.Shell{GitlabKeyId: keyId, CommandType: commandargs.ReceivePack, SshArgs: []string{"git-receive-pack", repo}}, ReadWriter: &readwriter.ReadWriter{ErrOut: errBuf, Out: outBuf, In: input}, } - require.NoError(t, cmd.Execute()) + require.NoError(t, cmd.Execute(response)) // expect printing of info message, "custom" string from the first request // and "output" string from the second request diff --git a/internal/testhelper/requesthandlers/requesthandlers.go b/internal/testhelper/requesthandlers/requesthandlers.go index fef53b6..75827fa 100644 --- a/internal/testhelper/requesthandlers/requesthandlers.go +++ b/internal/testhelper/requesthandlers/requesthandlers.go @@ -61,3 +61,43 @@ func BuildAllowedWithGitalyHandlers(t *testing.T, gitalyAddress string) []testse return requests } + +func BuildAllowedWithCustomActionsHandlers(t *testing.T) []testserver.TestRequestHandler { + requests := []testserver.TestRequestHandler{ + { + Path: "/api/v4/internal/allowed", + Handler: func(w http.ResponseWriter, r *http.Request) { + body := map[string]interface{}{ + "status": true, + "gl_id": "1", + "payload": map[string]interface{}{ + "action": "geo_proxy_to_primary", + "data": map[string]interface{}{ + "api_endpoints": []string{"/geo/proxy/info_refs", "/geo/proxy/push"}, + "gl_username": "custom", + "primary_repo": "https://repo/path", + }, + }, + } + w.WriteHeader(http.StatusMultipleChoices) + require.NoError(t, json.NewEncoder(w).Encode(body)) + }, + }, + { + Path: "/geo/proxy/info_refs", + Handler: func(w http.ResponseWriter, r *http.Request) { + body := map[string]interface{}{"result": []byte("custom")} + require.NoError(t, json.NewEncoder(w).Encode(body)) + }, + }, + { + Path: "/geo/proxy/push", + Handler: func(w http.ResponseWriter, r *http.Request) { + body := map[string]interface{}{"result": []byte("output")} + require.NoError(t, json.NewEncoder(w).Encode(body)) + }, + }, + } + + return requests +} |