package cli import ( "context" "github.com/pkg/errors" "github.com/kopia/kopia/internal/user" "github.com/kopia/kopia/repo" ) type commandServerUserHashPassword struct { password string out textOutput } func (c *commandServerUserHashPassword) setup(svc appServices, parent commandParent) { cmd := parent.Command("hash-password", "Hash a user password that can be passed to the 'server user add/set' command").Alias("hash") cmd.Flag("user-password", "Password").StringVar(&c.password) cmd.Action(svc.repositoryWriterAction(c.runServerUserHashPassword)) c.out.setup(svc) } // The current implementation does not require a connected repository, thus the // RepositoryWriter parameter is not used. Future implementations will need a // connected repository. To avoid a future incompatible change where the // 'hash-password' command stops working without a connected repository, // a connected repository is required now. func (c *commandServerUserHashPassword) runServerUserHashPassword(_ context.Context, _ repo.RepositoryWriter) error { if c.password == "" { // when password hash is empty, ask for password pwd, err := askConfirmPass(c.out.stdout(), "Enter password to hash: ") if err != nil { return errors.Wrap(err, "error getting password") } c.password = pwd } h, err := user.HashPassword(c.password) if err != nil { return errors.Wrap(err, "hashing password") } c.out.printStdout("%s\n", h) return nil }