approve the credentials if the request succeeds, or reject them
This commit is contained in:
parent
0074d2ffeb
commit
e8de7a3b82
@ -23,7 +23,7 @@ func Put(filename string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
req, _, err := clientRequest("PUT", oid)
|
||||
req, creds, err := clientRequest("PUT", oid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -31,7 +31,7 @@ func Put(filename string) error {
|
||||
req.Body = file
|
||||
req.ContentLength = stat.Size()
|
||||
|
||||
res, err := doRequest(req)
|
||||
res, err := doRequest(req, creds)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -43,13 +43,13 @@ func Put(filename string) error {
|
||||
func Get(filename string) (io.ReadCloser, error) {
|
||||
oid := filepath.Base(filename)
|
||||
if stat, err := os.Stat(filename); err != nil || stat == nil {
|
||||
req, _, err := clientRequest("GET", oid)
|
||||
req, creds, err := clientRequest("GET", oid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req.Header.Set("Accept", "application/vnd.git-media")
|
||||
res, err := doRequest(req)
|
||||
res, err := doRequest(req, creds)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -60,13 +60,15 @@ func Get(filename string) (io.ReadCloser, error) {
|
||||
return os.Open(filename)
|
||||
}
|
||||
|
||||
func doRequest(req *http.Request) (*http.Response, error) {
|
||||
func doRequest(req *http.Request, creds Creds) (*http.Response, error) {
|
||||
res, err := http.DefaultClient.Do(req)
|
||||
|
||||
if err == nil {
|
||||
defer res.Body.Close()
|
||||
|
||||
if res.StatusCode > 299 {
|
||||
execCreds(creds, "reject")
|
||||
|
||||
apierr := &Error{}
|
||||
dec := json.NewDecoder(res.Body)
|
||||
if err := dec.Decode(apierr); err != nil {
|
||||
@ -75,12 +77,14 @@ func doRequest(req *http.Request) (*http.Response, error) {
|
||||
|
||||
return res, apierr
|
||||
}
|
||||
} else {
|
||||
execCreds(creds, "approve")
|
||||
}
|
||||
|
||||
return res, err
|
||||
}
|
||||
|
||||
func clientRequest(method, oid string) (*http.Request, map[string]string, error) {
|
||||
func clientRequest(method, oid string) (*http.Request, Creds, error) {
|
||||
u := objectUrl(oid)
|
||||
req, err := http.NewRequest(method, u.String(), nil)
|
||||
if err == nil {
|
||||
|
@ -8,16 +8,16 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
func credentials(u *url.URL) (map[string]string, error) {
|
||||
credInput := fmt.Sprintf("protocol=%s\nhost=%s\n", u.Scheme, u.Host)
|
||||
cmd, err := execCreds(credInput, "fill")
|
||||
func credentials(u *url.URL) (Creds, error) {
|
||||
creds := Creds{"protocol": u.Scheme, "host": u.Host}
|
||||
cmd, err := execCreds(creds, "fill")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return cmd.Credentials(), nil
|
||||
}
|
||||
|
||||
func execCreds(input, subCommand string) (*CredentialCmd, error) {
|
||||
func execCreds(input Creds, subCommand string) (*CredentialCmd, error) {
|
||||
cmd := NewCommand(input, subCommand)
|
||||
err := cmd.Start()
|
||||
if err == nil {
|
||||
@ -38,11 +38,11 @@ type CredentialCmd struct {
|
||||
*exec.Cmd
|
||||
}
|
||||
|
||||
func NewCommand(input, subCommand string) *CredentialCmd {
|
||||
func NewCommand(input Creds, subCommand string) *CredentialCmd {
|
||||
buf1 := new(bytes.Buffer)
|
||||
buf2 := new(bytes.Buffer)
|
||||
cmd := exec.Command("git", "credential", subCommand)
|
||||
cmd.Stdin = bytes.NewBufferString(input)
|
||||
cmd.Stdin = input.Buffer()
|
||||
cmd.Stdout = buf1
|
||||
cmd.Stderr = buf2
|
||||
return &CredentialCmd{buf1, buf2, subCommand, cmd}
|
||||
@ -56,8 +56,8 @@ func (c *CredentialCmd) StdoutString() string {
|
||||
return c.output.String()
|
||||
}
|
||||
|
||||
func (c *CredentialCmd) Credentials() map[string]string {
|
||||
creds := make(map[string]string)
|
||||
func (c *CredentialCmd) Credentials() Creds {
|
||||
creds := make(Creds)
|
||||
|
||||
for _, line := range strings.Split(c.StdoutString(), "\n") {
|
||||
pieces := strings.SplitN(line, "=", 2)
|
||||
@ -69,3 +69,18 @@ func (c *CredentialCmd) Credentials() map[string]string {
|
||||
|
||||
return creds
|
||||
}
|
||||
|
||||
type Creds map[string]string
|
||||
|
||||
func (c Creds) Buffer() *bytes.Buffer {
|
||||
buf := new(bytes.Buffer)
|
||||
|
||||
for k, v := range c {
|
||||
buf.Write([]byte(k))
|
||||
buf.Write([]byte("="))
|
||||
buf.Write([]byte(v))
|
||||
buf.Write([]byte("\n"))
|
||||
}
|
||||
|
||||
return buf
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user