mirror of https://github.com/portainer/portainer
60 lines
1.7 KiB
Go
60 lines
1.7 KiB
Go
package docker
|
|
|
|
import (
|
|
portainer "github.com/portainer/portainer/api"
|
|
"github.com/portainer/portainer/api/dataservices"
|
|
"github.com/portainer/portainer/api/http/security"
|
|
"github.com/portainer/portainer/api/internal/registryutils"
|
|
)
|
|
|
|
type (
|
|
registryAccessContext struct {
|
|
isAdmin bool
|
|
user *portainer.User
|
|
endpointID portainer.EndpointID
|
|
teamMemberships []portainer.TeamMembership
|
|
registries []portainer.Registry
|
|
}
|
|
|
|
registryAuthenticationHeader struct {
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
Serveraddress string `json:"serveraddress"`
|
|
}
|
|
|
|
portainerRegistryAuthenticationHeader struct {
|
|
RegistryId *portainer.RegistryID `json:"registryId"`
|
|
}
|
|
)
|
|
|
|
func createRegistryAuthenticationHeader(
|
|
dataStore dataservices.DataStore,
|
|
registryId portainer.RegistryID,
|
|
accessContext *registryAccessContext,
|
|
) (authenticationHeader registryAuthenticationHeader, err error) {
|
|
if registryId == 0 { // dockerhub (anonymous)
|
|
authenticationHeader.Serveraddress = "docker.io"
|
|
} else { // any "custom" registry
|
|
var matchingRegistry *portainer.Registry
|
|
for _, registry := range accessContext.registries {
|
|
if registry.ID == registryId &&
|
|
(accessContext.isAdmin ||
|
|
security.AuthorizedRegistryAccess(®istry, accessContext.user, accessContext.teamMemberships, accessContext.endpointID)) {
|
|
matchingRegistry = ®istry
|
|
break
|
|
}
|
|
}
|
|
|
|
if matchingRegistry != nil {
|
|
err = registryutils.EnsureRegTokenValid(dataStore, matchingRegistry)
|
|
if err != nil {
|
|
return
|
|
}
|
|
authenticationHeader.Serveraddress = matchingRegistry.URL
|
|
authenticationHeader.Username, authenticationHeader.Password, err = registryutils.GetRegEffectiveCredential(matchingRegistry)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|