mirror of https://github.com/containers/podman.git
94 lines
3.0 KiB
Go
94 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/containers/image/v5/docker"
|
|
"github.com/containers/image/v5/pkg/docker/config"
|
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
|
"github.com/containers/libpod/cmd/podman/shared"
|
|
"github.com/containers/libpod/libpod/image"
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
logoutCommand cliconfig.LogoutValues
|
|
logoutDescription = "Remove the cached username and password for the registry."
|
|
_logoutCommand = &cobra.Command{
|
|
Use: "logout [flags] REGISTRY",
|
|
Short: "Logout of a container registry",
|
|
Long: logoutDescription,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
logoutCommand.InputArgs = args
|
|
logoutCommand.GlobalFlags = MainGlobalOpts
|
|
logoutCommand.Remote = remoteclient
|
|
return logoutCmd(&logoutCommand)
|
|
},
|
|
Example: `podman logout quay.io
|
|
podman logout --all`,
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
if !remote {
|
|
_logoutCommand.Example = fmt.Sprintf("%s\n podman logout --authfile authdir/myauths.json quay.io", _logoutCommand.Example)
|
|
|
|
}
|
|
logoutCommand.Command = _logoutCommand
|
|
logoutCommand.SetHelpTemplate(HelpTemplate())
|
|
logoutCommand.SetUsageTemplate(UsageTemplate())
|
|
flags := logoutCommand.Flags()
|
|
flags.BoolVarP(&logoutCommand.All, "all", "a", false, "Remove the cached credentials for all registries in the auth file")
|
|
flags.StringVar(&logoutCommand.Authfile, "authfile", shared.GetAuthFile(""), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
|
|
markFlagHiddenForRemoteClient("authfile", flags)
|
|
}
|
|
|
|
// logoutCmd uses the authentication package to remove the authenticated of a registry
|
|
// stored in the auth.json file
|
|
func logoutCmd(c *cliconfig.LogoutValues) error {
|
|
args := c.InputArgs
|
|
if len(args) > 1 {
|
|
return errors.Errorf("too many arguments, logout takes at most 1 argument")
|
|
}
|
|
if len(args) == 0 && !c.All {
|
|
return errors.Errorf("registry must be given")
|
|
}
|
|
var server string
|
|
if len(args) == 1 {
|
|
server = scrubServer(args[0])
|
|
}
|
|
|
|
sc := image.GetSystemContext("", c.Authfile, false)
|
|
|
|
if c.All {
|
|
if err := config.RemoveAllAuthentication(sc); err != nil {
|
|
return err
|
|
}
|
|
fmt.Println("Removed login credentials for all registries")
|
|
return nil
|
|
}
|
|
|
|
err := config.RemoveAuthentication(sc, server)
|
|
switch errors.Cause(err) {
|
|
case nil:
|
|
fmt.Printf("Removed login credentials for %s\n", server)
|
|
return nil
|
|
case config.ErrNotLoggedIn:
|
|
// username of user logged in to server (if one exists)
|
|
userFromAuthFile, passFromAuthFile, err := config.GetAuthentication(sc, server)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "error reading auth file")
|
|
}
|
|
islogin := docker.CheckAuth(getContext(), sc, userFromAuthFile, passFromAuthFile, server)
|
|
if userFromAuthFile != "" && passFromAuthFile != "" && islogin == nil {
|
|
fmt.Printf("Not logged into %s with podman. Existing credentials were established via docker login. Please use docker logout instead.\n", server)
|
|
return nil
|
|
}
|
|
fmt.Printf("Not logged into %s\n", server)
|
|
return nil
|
|
default:
|
|
return errors.Wrapf(err, "error logging out of %q", server)
|
|
}
|
|
}
|