summaryrefslogtreecommitdiff
path: root/go/internal/command/commandargs/command_args.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/internal/command/commandargs/command_args.go')
-rw-r--r--go/internal/command/commandargs/command_args.go39
1 files changed, 28 insertions, 11 deletions
diff --git a/go/internal/command/commandargs/command_args.go b/go/internal/command/commandargs/command_args.go
index d8fe32d..d68f5d2 100644
--- a/go/internal/command/commandargs/command_args.go
+++ b/go/internal/command/commandargs/command_args.go
@@ -3,12 +3,14 @@ package commandargs
import (
"errors"
"os"
+ "path/filepath"
"regexp"
"github.com/mattn/go-shellwords"
)
type CommandType string
+type Executable string
const (
Discover CommandType = "discover"
@@ -17,6 +19,7 @@ const (
ReceivePack CommandType = "git-receive-pack"
UploadPack CommandType = "git-upload-pack"
UploadArchive CommandType = "git-upload-archive"
+ GitlabShell Executable = "gitlab-shell"
)
var (
@@ -25,6 +28,7 @@ var (
)
type CommandArgs struct {
+ arguments []string
GitlabUsername string
GitlabKeyId string
SshArgs []string
@@ -32,23 +36,36 @@ type CommandArgs struct {
}
func Parse(arguments []string) (*CommandArgs, error) {
- if sshConnection := os.Getenv("SSH_CONNECTION"); sshConnection == "" {
- return nil, errors.New("Only ssh allowed")
- }
+ args := &CommandArgs{arguments: arguments}
+
+ if args.Executable() == GitlabShell {
+ if sshConnection := os.Getenv("SSH_CONNECTION"); sshConnection == "" {
+ return nil, errors.New("Only ssh allowed")
+ }
- args := &CommandArgs{}
- args.parseWho(arguments)
+ args.parseWho()
+
+ if err := args.parseCommand(os.Getenv("SSH_ORIGINAL_COMMAND")); err != nil {
+ return nil, errors.New("Invalid ssh command")
+ }
+ args.defineCommandType()
- if err := args.parseCommand(os.Getenv("SSH_ORIGINAL_COMMAND")); err != nil {
- return nil, errors.New("Invalid ssh command")
+ return args, nil
+ } else {
+ return args, nil
}
- args.defineCommandType()
+}
+
+func (c *CommandArgs) Executable() Executable {
+ return Executable(filepath.Base(c.arguments[0]))
+}
- return args, nil
+func (c *CommandArgs) Arguments() []string {
+ return c.arguments[1:]
}
-func (c *CommandArgs) parseWho(arguments []string) {
- for _, argument := range arguments {
+func (c *CommandArgs) parseWho() {
+ for _, argument := range c.arguments {
if keyId := tryParseKeyId(argument); keyId != "" {
c.GitlabKeyId = keyId
break