blob: fc5e08399c5ea88b434fc23dbdf5832a3e5d1af7 [file] [log] [blame]
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package gitauth writes gitcookies files so git will authenticate
// to Gerrit as gopherbot for quota purposes.
package gitauth
import (
"bytes"
"context"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
"time"
"cloud.google.com/go/compute/metadata"
"golang.org/x/build/internal/secret"
)
func Init() error {
cookieFile := filepath.Join(homeDir(), ".gitcookies")
if err := exec.Command("git", "config", "--global", "http.cookiefile", cookieFile).Run(); err != nil {
return fmt.Errorf("running git config to set cookiefile: %v", err)
}
if !metadata.OnGCE() {
// Do nothing for now.
return nil
}
sc := mustCreateSecretClient()
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
slurp, err := sc.Retrieve(ctx, secret.NameGobotPassword)
if err != nil {
proj, _ := metadata.ProjectID()
if proj != "symbolic-datum-552" { // TODO: don't hard-code this; use buildenv package
log.Printf("gitauth: ignoring %q secret manager lookup on non-prod project: %v", secret.NameGobotPassword, err)
return nil
}
return fmt.Errorf("gitauth: getting %s secret manager: %v", secret.NameGobotPassword, err)
}
slurp = strings.TrimSpace(slurp)
var buf bytes.Buffer
fmt.Fprintf(&buf, "go.googlesource.com\tFALSE\t/\tTRUE\t2147483647\to\tgit-gobot.gmail.com=%s\n", slurp)
fmt.Fprintf(&buf, "go-review.googlesource.com\tFALSE\t/\tTRUE\t2147483647\to\tgit-gobot.gmail.com=%s\n", slurp)
return ioutil.WriteFile(cookieFile, buf.Bytes(), 0644)
}
func homeDir() string {
if h := os.Getenv("HOME"); h != "" {
return h
}
log.Fatalf("No HOME set in environment.")
panic("unreachable")
}
func mustCreateSecretClient() *secret.Client {
client, err := secret.NewClient()
if err != nil {
log.Fatalf("unable to create secret client %v", err)
}
return client
}