summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Drozdov <idrozdov@gitlab.com>2020-04-07 07:00:04 +0300
committerAsh McKenzie <amckenzie@gitlab.com>2020-04-14 23:38:52 +1000
commit40b3ddc142b906a79f22c726a0a61dd113c39485 (patch)
treee0b6d0a37d049dbd01e164a95dc0f8728d51d7e2
parent74bef786d44b270167c7f9dbb029d197fe32ac4f (diff)
downloadgitlab-shell-id-extract-custom-action-in-separate-module.tar.gz
Extract customaction into a separate moduleid-extract-custom-action-in-separate-module
We'll reuse this module for uploadpack in the future
-rw-r--r--internal/command/receivepack/receivepack.go4
-rw-r--r--internal/command/receivepack/receivepack_test.go22
-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.go40
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
+}