diff options
author | Nick Thomas <nick@gitlab.com> | 2019-10-17 12:04:52 +0100 |
---|---|---|
committer | Nick Thomas <nick@gitlab.com> | 2019-10-18 11:47:25 +0100 |
commit | 83d11f4deeb20b852a0af3433190a0f7250a0027 (patch) | |
tree | 1a9df18d6f9f59712c6f5c98e995a4918eb94a11 /go/internal/command/commandargs/shell.go | |
parent | 7d5229db263a62661653431881bef8b46984d0de (diff) | |
download | gitlab-shell-83d11f4deeb20b852a0af3433190a0f7250a0027.tar.gz |
Move go code up one level
Diffstat (limited to 'go/internal/command/commandargs/shell.go')
-rw-r--r-- | go/internal/command/commandargs/shell.go | 131 |
1 files changed, 0 insertions, 131 deletions
diff --git a/go/internal/command/commandargs/shell.go b/go/internal/command/commandargs/shell.go deleted file mode 100644 index 7e2b72e..0000000 --- a/go/internal/command/commandargs/shell.go +++ /dev/null @@ -1,131 +0,0 @@ -package commandargs - -import ( - "errors" - "os" - "regexp" - - "github.com/mattn/go-shellwords" -) - -const ( - Discover CommandType = "discover" - TwoFactorRecover CommandType = "2fa_recovery_codes" - LfsAuthenticate CommandType = "git-lfs-authenticate" - ReceivePack CommandType = "git-receive-pack" - UploadPack CommandType = "git-upload-pack" - UploadArchive CommandType = "git-upload-archive" -) - -var ( - whoKeyRegex = regexp.MustCompile(`\bkey-(?P<keyid>\d+)\b`) - whoUsernameRegex = regexp.MustCompile(`\busername-(?P<username>\S+)\b`) -) - -type Shell struct { - Arguments []string - GitlabUsername string - GitlabKeyId string - SshArgs []string - CommandType CommandType -} - -func (s *Shell) Parse() error { - if err := s.validate(); err != nil { - return err - } - - s.parseWho() - s.defineCommandType() - - return nil -} - -func (s *Shell) GetArguments() []string { - return s.Arguments -} - -func (s *Shell) validate() error { - if !s.isSshConnection() { - return errors.New("Only SSH allowed") - } - - if !s.isValidSshCommand() { - return errors.New("Invalid SSH command") - } - - return nil -} - -func (s *Shell) isSshConnection() bool { - ok := os.Getenv("SSH_CONNECTION") - return ok != "" -} - -func (s *Shell) isValidSshCommand() bool { - err := s.parseCommand(os.Getenv("SSH_ORIGINAL_COMMAND")) - return err == nil -} - -func (s *Shell) parseWho() { - for _, argument := range s.Arguments { - if keyId := tryParseKeyId(argument); keyId != "" { - s.GitlabKeyId = keyId - break - } - - if username := tryParseUsername(argument); username != "" { - s.GitlabUsername = username - break - } - } -} - -func tryParseKeyId(argument string) string { - matchInfo := whoKeyRegex.FindStringSubmatch(argument) - if len(matchInfo) == 2 { - // The first element is the full matched string - // The second element is the named `keyid` - return matchInfo[1] - } - - return "" -} - -func tryParseUsername(argument string) string { - matchInfo := whoUsernameRegex.FindStringSubmatch(argument) - if len(matchInfo) == 2 { - // The first element is the full matched string - // The second element is the named `username` - return matchInfo[1] - } - - return "" -} - -func (s *Shell) parseCommand(commandString string) error { - args, err := shellwords.Parse(commandString) - if err != nil { - return err - } - - // Handle Git for Windows 2.14 using "git upload-pack" instead of git-upload-pack - if len(args) > 1 && args[0] == "git" { - command := args[0] + "-" + args[1] - commandArgs := args[2:] - - args = append([]string{command}, commandArgs...) - } - - s.SshArgs = args - - return nil -} - -func (s *Shell) defineCommandType() { - if len(s.SshArgs) == 0 { - s.CommandType = Discover - } else { - s.CommandType = CommandType(s.SshArgs[0]) - } -} |