mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Add authentification to all registry call
This commit is contained in:
parent
c72ff318d3
commit
4307b7dd8e
2 changed files with 52 additions and 22 deletions
|
@ -440,7 +440,7 @@ func (srv *Server) CmdPush(stdin io.ReadCloser, stdout io.Writer, args ...string
|
|||
}
|
||||
// If it fails, try to get the repository
|
||||
if repo, exists := srv.runtime.repositories.Repositories[cmd.Arg(0)]; exists {
|
||||
if err := srv.runtime.graph.PushRepository(*user, cmd.Arg(0), repo); err != nil {
|
||||
if err := srv.runtime.graph.PushRepository(*user, cmd.Arg(0), repo, srv.runtime.authConfig); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
|
@ -448,7 +448,7 @@ func (srv *Server) CmdPush(stdin io.ReadCloser, stdout io.Writer, args ...string
|
|||
}
|
||||
return nil
|
||||
}
|
||||
return srv.runtime.graph.PushImage(img)
|
||||
return srv.runtime.graph.PushImage(img, srv.runtime.authConfig)
|
||||
}
|
||||
|
||||
func (srv *Server) CmdPull(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
|
||||
|
@ -462,8 +462,8 @@ func (srv *Server) CmdPull(stdin io.ReadCloser, stdout io.Writer, args ...string
|
|||
return nil
|
||||
}
|
||||
|
||||
if srv.runtime.graph.LookupRemoteImage(cmd.Arg(0)) {
|
||||
return srv.runtime.graph.PullImage(cmd.Arg(0))
|
||||
if srv.runtime.graph.LookupRemoteImage(cmd.Arg(0), srv.runtime.authConfig) {
|
||||
return srv.runtime.graph.PullImage(cmd.Arg(0), srv.runtime.authConfig)
|
||||
}
|
||||
if *user == "" {
|
||||
return fmt.Errorf("Not loggin and no user specified\n")
|
||||
|
|
66
registry.go
66
registry.go
|
@ -49,10 +49,17 @@ func NewMultipleImgJson(src []byte) ([]*Image, error) {
|
|||
|
||||
// Retrieve the history of a given image from the Registry.
|
||||
// Return a list of the parent's json (requested image included)
|
||||
func (graph *Graph) getRemoteHistory(imgId string) ([]*Image, error) {
|
||||
res, err := http.Get(REGISTRY_ENDPOINT + "/images/" + imgId + "/history")
|
||||
func (graph *Graph) getRemoteHistory(imgId string, authConfig *auth.AuthConfig) ([]*Image, error) {
|
||||
client := &http.Client{}
|
||||
|
||||
req, err := http.NewRequest("GET", REGISTRY_ENDPOINT+"/images/"+imgId+"/history", nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Error while getting from the server: %s\n", err)
|
||||
return nil, err
|
||||
}
|
||||
req.SetBasicAuth(authConfig.Username, authConfig.Password)
|
||||
res, err := client.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
|
||||
|
@ -69,8 +76,15 @@ func (graph *Graph) getRemoteHistory(imgId string) ([]*Image, error) {
|
|||
}
|
||||
|
||||
// Check if an image exists in the Registry
|
||||
func (graph *Graph) LookupRemoteImage(imgId string) bool {
|
||||
res, err := http.Get(REGISTRY_ENDPOINT + "/images/" + imgId + "/json")
|
||||
func (graph *Graph) LookupRemoteImage(imgId string, authConfig *auth.AuthConfig) bool {
|
||||
client := &http.Client{}
|
||||
|
||||
req, err := http.NewRequest("GET", REGISTRY_ENDPOINT+"/images/"+imgId+"/json", nil)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
req.SetBasicAuth(authConfig.Username, authConfig.Password)
|
||||
res, err := client.Do(req)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
@ -79,12 +93,19 @@ func (graph *Graph) LookupRemoteImage(imgId string) bool {
|
|||
|
||||
// Retrieve an image from the Registry.
|
||||
// Returns the Image object as well as the layer as an Archive (io.Reader)
|
||||
func (graph *Graph) getRemoteImage(imgId string) (*Image, Archive, error) {
|
||||
func (graph *Graph) getRemoteImage(imgId string, authConfig *auth.AuthConfig) (*Image, Archive, error) {
|
||||
client := &http.Client{}
|
||||
|
||||
// Get the Json
|
||||
res, err := http.Get(REGISTRY_ENDPOINT + "/images/" + imgId + "/json")
|
||||
req, err := http.NewRequest("GET", REGISTRY_ENDPOINT+"/images/"+imgId+"/json", nil)
|
||||
if err != nil {
|
||||
return nil, nil, fmt.Errorf("Error while getting from the server: %s\n", err)
|
||||
}
|
||||
req.SetBasicAuth(authConfig.Username, authConfig.Password)
|
||||
res, err := client.Do(req)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
|
||||
jsonString, err := ioutil.ReadAll(res.Body)
|
||||
|
@ -106,8 +127,8 @@ func (graph *Graph) getRemoteImage(imgId string) (*Image, Archive, error) {
|
|||
return img, res.Body, nil
|
||||
}
|
||||
|
||||
func (graph *Graph) PullImage(imgId string) error {
|
||||
history, err := graph.getRemoteHistory(imgId)
|
||||
func (graph *Graph) PullImage(imgId string, authConfig *auth.AuthConfig) error {
|
||||
history, err := graph.getRemoteHistory(imgId, authConfig)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -115,7 +136,7 @@ func (graph *Graph) PullImage(imgId string) error {
|
|||
// FIXME: Lunch the getRemoteImage() in goroutines
|
||||
for _, j := range history {
|
||||
if !graph.Exists(j.Id) {
|
||||
img, layer, err := graph.getRemoteImage(j.Id)
|
||||
img, layer, err := graph.getRemoteImage(j.Id, authConfig)
|
||||
if err != nil {
|
||||
// FIXME: Keep goging in case of error?
|
||||
return err
|
||||
|
@ -136,12 +157,12 @@ func (graph *Graph) PullRepository(user, repoName, askedTag string, repositories
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
req.SetBasicAuth(authConfig.Username, authConfig.Password)
|
||||
res, err := client.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
rawJson, err := ioutil.ReadAll(res.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -151,7 +172,7 @@ func (graph *Graph) PullRepository(user, repoName, askedTag string, repositories
|
|||
return err
|
||||
}
|
||||
for tag, rev := range t {
|
||||
if err = graph.PullImage(rev); err != nil {
|
||||
if err = graph.PullImage(rev, authConfig); err != nil {
|
||||
return err
|
||||
}
|
||||
if err = repositories.Set(repoName, tag, rev); err != nil {
|
||||
|
@ -165,7 +186,7 @@ func (graph *Graph) PullRepository(user, repoName, askedTag string, repositories
|
|||
}
|
||||
|
||||
// Push a local image to the registry with its history if needed
|
||||
func (graph *Graph) PushImage(imgOrig *Image) error {
|
||||
func (graph *Graph) PushImage(imgOrig *Image, authConfig *auth.AuthConfig) error {
|
||||
client := &http.Client{}
|
||||
|
||||
// FIXME: Factorize the code
|
||||
|
@ -182,6 +203,7 @@ func (graph *Graph) PushImage(imgOrig *Image) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.SetBasicAuth(authConfig.Username, authConfig.Password)
|
||||
res, err := client.Do(req)
|
||||
if err != nil || res.StatusCode != 200 {
|
||||
if res == nil {
|
||||
|
@ -204,6 +226,7 @@ func (graph *Graph) PushImage(imgOrig *Image) error {
|
|||
}
|
||||
|
||||
req2, err := http.NewRequest("PUT", REGISTRY_ENDPOINT+"/images/"+img.Id+"/layer", nil)
|
||||
req2.SetBasicAuth(authConfig.Username, authConfig.Password)
|
||||
res2, err := client.Do(req2)
|
||||
if err != nil || res2.StatusCode != 307 {
|
||||
return fmt.Errorf(
|
||||
|
@ -226,7 +249,13 @@ func (graph *Graph) PushImage(imgOrig *Image) error {
|
|||
img.Id, err)
|
||||
}
|
||||
req3, err := http.NewRequest("PUT", url.String(), layerData)
|
||||
tmp, _ := ioutil.ReadAll(layerData2)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
tmp, err := ioutil.ReadAll(layerData2)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req3.ContentLength = int64(len(tmp))
|
||||
|
||||
req3.TransferEncoding = []string{"none"}
|
||||
|
@ -249,7 +278,7 @@ func (graph *Graph) PushImage(imgOrig *Image) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (graph *Graph) pushTag(user, repo, revision, tag string) error {
|
||||
func (graph *Graph) pushTag(user, repo, revision, tag string, authConfig *auth.AuthConfig) error {
|
||||
|
||||
if tag == "" {
|
||||
tag = "lastest"
|
||||
|
@ -260,6 +289,7 @@ func (graph *Graph) pushTag(user, repo, revision, tag string) error {
|
|||
client := &http.Client{}
|
||||
req, err := http.NewRequest("PUT", REGISTRY_ENDPOINT+"/users/"+user+"/"+repo+"/"+tag, strings.NewReader(revision))
|
||||
req.Header.Add("Content-type", "application/json")
|
||||
req.SetBasicAuth(authConfig.Username, authConfig.Password)
|
||||
res, err := client.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -274,17 +304,17 @@ func (graph *Graph) pushTag(user, repo, revision, tag string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (graph *Graph) PushRepository(user, repoName string, repo Repository) error {
|
||||
func (graph *Graph) PushRepository(user, repoName string, repo Repository, authConfig *auth.AuthConfig) error {
|
||||
for tag, imgId := range repo {
|
||||
fmt.Printf("tag: %s, imgId: %s\n", tag, imgId)
|
||||
img, err := graph.Get(imgId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err = graph.PushImage(img); err != nil {
|
||||
if err = graph.PushImage(img, authConfig); err != nil {
|
||||
return err
|
||||
}
|
||||
if err = graph.pushTag(user, repoName, imgId, tag); err != nil {
|
||||
if err = graph.pushTag(user, repoName, imgId, tag, authConfig); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue