github.com/stffabi/git-lfs@v2.3.5-0.20180214015214-8eeaa8d88902+incompatible/test/cmd/git-credential-lfstest.go (about)

     1  // +build testtools
     2  
     3  package main
     4  
     5  import (
     6  	"bufio"
     7  	"fmt"
     8  	"io/ioutil"
     9  	"os"
    10  	"path/filepath"
    11  	"strings"
    12  )
    13  
    14  var (
    15  	commands = map[string]func(){
    16  		"get":   fill,
    17  		"store": noop,
    18  		"erase": noop,
    19  	}
    20  
    21  	delim    = '\n'
    22  	credsDir = ""
    23  )
    24  
    25  func init() {
    26  	if len(credsDir) == 0 {
    27  		credsDir = os.Getenv("CREDSDIR")
    28  	}
    29  }
    30  
    31  func main() {
    32  	if argsize := len(os.Args); argsize != 2 {
    33  		fmt.Fprintf(os.Stderr, "wrong number of args: %d\n", argsize)
    34  		os.Exit(1)
    35  	}
    36  
    37  	arg := os.Args[1]
    38  	cmd := commands[arg]
    39  
    40  	if cmd == nil {
    41  		fmt.Fprintf(os.Stderr, "bad cmd: %s\n", arg)
    42  		os.Exit(1)
    43  	}
    44  
    45  	cmd()
    46  }
    47  
    48  func fill() {
    49  	scanner := bufio.NewScanner(os.Stdin)
    50  	creds := map[string]string{}
    51  	for scanner.Scan() {
    52  		line := scanner.Text()
    53  		parts := strings.SplitN(line, "=", 2)
    54  		if len(parts) != 2 {
    55  			fmt.Fprintf(os.Stderr, "bad line: %s\n", line)
    56  			os.Exit(1)
    57  		}
    58  
    59  		fmt.Fprintf(os.Stderr, "CREDS RECV: %s\n", line)
    60  		creds[parts[0]] = strings.TrimSpace(parts[1])
    61  	}
    62  
    63  	if err := scanner.Err(); err != nil {
    64  		fmt.Fprintf(os.Stderr, "reading standard input: %v", err)
    65  		os.Exit(1)
    66  	}
    67  
    68  	hostPieces := strings.SplitN(creds["host"], ":", 2)
    69  	user, pass, err := credsForHostAndPath(hostPieces[0], creds["path"])
    70  	if err != nil {
    71  		fmt.Fprintln(os.Stderr, err.Error())
    72  		os.Exit(1)
    73  	}
    74  
    75  	if user != "skip" {
    76  		if _, ok := creds["username"]; !ok {
    77  			creds["username"] = user
    78  		}
    79  
    80  		if _, ok := creds["password"]; !ok {
    81  			creds["password"] = pass
    82  		}
    83  	}
    84  
    85  	for key, value := range creds {
    86  		fmt.Fprintf(os.Stderr, "CREDS SEND: %s=%s\n", key, value)
    87  		fmt.Fprintf(os.Stdout, "%s=%s\n", key, value)
    88  	}
    89  }
    90  
    91  func credsForHostAndPath(host, path string) (string, string, error) {
    92  	hostFilename := filepath.Join(credsDir, host)
    93  
    94  	if len(path) > 0 {
    95  		pathFilename := fmt.Sprintf("%s--%s", hostFilename, strings.Replace(path, "/", "-", -1))
    96  		u, p, err := credsFromFilename(pathFilename)
    97  		if err == nil {
    98  			return u, p, err
    99  		}
   100  	}
   101  
   102  	return credsFromFilename(hostFilename)
   103  }
   104  
   105  func credsFromFilename(file string) (string, string, error) {
   106  	userPass, err := ioutil.ReadFile(file)
   107  	if err != nil {
   108  		return "", "", fmt.Errorf("Error opening %q: %s", file, err)
   109  	}
   110  	credsPieces := strings.SplitN(strings.TrimSpace(string(userPass)), ":", 2)
   111  	return credsPieces[0], credsPieces[1], nil
   112  }
   113  
   114  func noop() {}