ff65f14966a733b97a43831e6099a3b2ce2c6271

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
Ayman Bagabas <ayman.bagabas@gmail.com>
Date

Message

Add git MiddlewareWithKeys and MiddlewareWithKeyPath

Diff

This diff is truncated to protect this page.

  1diff --git a/server/middleware/git/git.go b/server/middleware/git/git.go
  2index e136528131d5cab68e533f7b2d977b02082cb27d..36bf065b177b4d13d3fe600ca8da86f1aaf574ca 100644
  3--- a/server/middleware/git/git.go
  4+++ b/server/middleware/git/git.go
  5@@ -13,46 +13,14 @@ import (
  6 	"github.com/gliderlabs/ssh"
  7 )
  8 
  9-func Middleware(repoDir, authorizedKeys, authorizedKeysFile string) middleware.Middleware {
 10-	authedKeys := make([]ssh.PublicKey, 0)
 11-	hasAuth, err := fileExists(authorizedKeysFile)
 12-	if err != nil {
 13-		log.Fatal(err)
 14-	}
 15-	if hasAuth || authorizedKeys != "" {
 16-		var scanner *bufio.Scanner
 17-		if authorizedKeys == "" {
 18-			log.Printf("Importing authorized keys from file: %s", authorizedKeysFile)
 19-			f, err := os.Open(authorizedKeysFile)
 20-			if err != nil {
 21-				log.Fatal(err)
 22-			}
 23-			defer f.Close()
 24-			scanner = bufio.NewScanner(f)
 25-		} else {
 26-			log.Printf("Importing authorized keys from environment")
 27-			scanner = bufio.NewScanner(strings.NewReader(authorizedKeys))
 28-		}
 29-		for scanner.Scan() {
 30-			pt := scanner.Text()
 31-			log.Printf("Adding authorized key: %s", pt)
 32-			pk, _, _, _, err := ssh.ParseAuthorizedKey([]byte(pt))
 33-			if err != nil {
 34-				log.Fatal(err)
 35-			}
 36-			authedKeys = append(authedKeys, pk)
 37-		}
 38-		if err := scanner.Err(); err != nil {
 39-			log.Fatal(err)
 40-		}
 41-	}
 42+func gitMiddleware(repoDir string, authedKeys []ssh.PublicKey) middleware.Middleware {
 43 	return func(sh ssh.Handler) ssh.Handler {
 44 		return func(s ssh.Session) {
 45 			cmd := s.Command()
 46 			if len(cmd) == 2 {
 47 				switch cmd[0] {
 48 				case "git-upload-pack", "git-upload-archive", "git-receive-pack":
 49-					if hasAuth && cmd[0] == "git-receive-pack" {
 50+					if len(authedKeys) > 0 && cmd[0] == "git-receive-pack" {
 51 						authed := false
 52 						for _, pk := range authedKeys {
 53 							if ssh.KeysEqual(pk, s.PublicKey()) {
 54@@ -88,6 +56,74 @@ func Middleware(repoDir, authorizedKeys, authorizedKeysFile string) middleware.M
 55 	}
 56 }
 57 
 58+func Middleware(repoDir, authorizedKeys, authorizedKeysFile string) middleware.Middleware {
 59+	ak1, err := parseKeysFromString(authorizedKeys)
 60+	if err != nil {
 61+		log.Fatal(err)
 62+	}
 63+	ak2, err := parseKeysFromFile(authorizedKeysFile)
 64+	if err != nil {
 65+		log.Fatal(err)
 66+	}
 67+	authedKeys := append(ak1, ak2...)
 68+	return gitMiddleware(repoDir, authedKeys)
 69+}
 70+
 71+func MiddlewareWithKeys(repoDir, authorizedKeys string) middleware.Middleware {
 72+	return Middleware(repoDir, authorizedKeys, "")
 73+}
 74+
 75+func MiddlewareWithKeyPath(repoDir, authorizedKeysFile string) middleware.Middleware {
 76+	return Middleware(repoDir, "", authorizedKeysFile)
 77+}
 78+
 79+func parseKeysFromFile(path string) ([]ssh.PublicKey, error) {
 80+	authedKeys := make([]ssh.PublicKey, 0)
 81+	hasAuth, err := fileExists(path)
 82+	if err != nil {
 83+		return nil, err
 84+	}
 85+	if hasAuth {
 86+		f, err := os.Open(path)
 87+		if err != nil {
 88+			log.Fatal(err)
 89+		}
 90+		defer f.Close()
 91+		scanner := bufio.NewScanner(f)
 92+		err = addKeys(scanner, &authedKeys)
 93+		if err != nil {
 94+			return nil, err
 95+		}
 96+	}
 97+	return authedKeys, nil
 98+}
 99+
100+func parseKeysFromString(keys string) ([]ssh.PublicKey, error) {
101+	authedKeys := make([]ssh.PublicKey, 0)
102+	scanner := bufio.NewScanner(strings.NewReader(keys))
103+	err := addKeys(scanner, &authedKeys)
104+	if err != nil {