package ssh import ( "errors" "farga/db" "farga/db/types" "fmt" "strings" "golang.org/x/crypto/ssh" ) func sendExitStatus(channel ssh.Channel, code int) { type exitStatusMsg struct{ Status uint32 } channel.SendRequest("exit-status", false, ssh.Marshal(&exitStatusMsg{Status: uint32(code)})) } func closeChannel(channel ssh.Channel, req *ssh.Request, err string) { req.Reply(false, nil) fmt.Fprintln(channel.Stderr(), err) channel.CloseWrite() sendExitStatus(channel, 1) } // parses the git command's raw arguments and returns the user, the repo's name, and an error if anything goes south. func getUserAndRepo(d *db.DB, raw string) (*types.User, string, error) { if strings.Contains(raw, "..") { return nil, "", fmt.Errorf("invalid repo name") } clean := strings.TrimPrefix(raw, "/") clean = strings.TrimPrefix(clean, "~") what := strings.Split(clean, "/") userHandle := what[0] repoName := what[1] user, err := d.GetUserByHandle(userHandle) if err != nil { return nil, "", errors.New("No such user found") } return user, repoName, nil }