From 850ba2a3e3837c8090842ad989112d15c7f987f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D7=A0=CF=85=CE=B1=CE=B7=20=D7=A0=CF=85=CE=B1=CE=B7=D1=95?= =?UTF-8?q?=CF=83=CE=B7?= Date: Fri, 2 Oct 2026 10:02:41 -0700 Subject: [PATCH] fix(service,user): errors read as the convention says The last two providers from osapi-io/osapi#565. service used : , a colon away from the convention, so every operation reported "service: " and the verb read as part of the message rather than as the operation. user named commands rather than operations: chpasswd failed, useradd failed, groupadd failed. Those stop being true the day the implementation changes, and a CLI user has no reason to know which binary runs underneath. They now read "user create: useradd: ..." and "user set-password: chpasswd: ...", keeping the command as detail rather than as the subject. Three things the tests caught, all the same shape. Prefixing an error that a caller already wraps doubles the domain, which happened to the password hash and name validations and to chpasswd. And a sed over test files hit a mock's command argument, rewriting the systemctl argument "daemon-reload" rather than the message about it. validate.go keeps its shared "invalid %s name %q" wording. It is used by both user and group and changing it means changing a signature, so it is left for a change that can be about that alone. Refs #565 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01FuKUsHFG1EqZXamffh9M2c --- internal/provider/node/service/debian.go | 4 +-- .../provider/node/service/debian_action.go | 20 ++++++------- .../node/service/debian_action_public_test.go | 20 ++++++------- internal/provider/node/service/debian_get.go | 4 +-- .../node/service/debian_get_public_test.go | 6 ++-- internal/provider/node/service/debian_list.go | 4 +-- .../node/service/debian_list_public_test.go | 4 +-- internal/provider/node/service/debian_unit.go | 16 +++++------ .../node/service/debian_unit_public_test.go | 18 ++++++------ internal/provider/node/user/debian_group.go | 6 ++-- .../provider/node/user/debian_public_test.go | 28 +++++++++---------- internal/provider/node/user/debian_user.go | 16 +++++------ .../node/user/validate_public_test.go | 4 +-- 13 files changed, 75 insertions(+), 75 deletions(-) diff --git a/internal/provider/node/service/debian.go b/internal/provider/node/service/debian.go index fdc76a0dd..17bdabfb9 100644 --- a/internal/provider/node/service/debian.go +++ b/internal/provider/node/service/debian.go @@ -78,11 +78,11 @@ func validateName( name string, ) error { if name == "" { - return fmt.Errorf("invalid service name: empty") + return fmt.Errorf("service: name must not be empty") } if !validName.MatchString(name) { return fmt.Errorf( - "invalid service name %q: must match %s", + "service: name %q must match %s", name, validName.String(), ) diff --git a/internal/provider/node/service/debian_action.go b/internal/provider/node/service/debian_action.go index 4f0ddf316..15a42514c 100644 --- a/internal/provider/node/service/debian_action.go +++ b/internal/provider/node/service/debian_action.go @@ -34,7 +34,7 @@ func (d *Debian) Start( name string, ) (*ActionResult, error) { if err := validateName(name); err != nil { - return nil, fmt.Errorf("service: start: %w", err) + return nil, fmt.Errorf("service start: %w", err) } unitName := managedPrefix + name + ".service" @@ -47,7 +47,7 @@ func (d *Debian) Start( } if _, err := d.execManager.RunPrivilegedCmd(ctx, "systemctl", []string{"start", unitName}); err != nil { - return nil, fmt.Errorf("service: start: %w", err) + return nil, fmt.Errorf("service start: %w", err) } return &ActionResult{Name: name, Changed: true}, nil @@ -60,7 +60,7 @@ func (d *Debian) Stop( name string, ) (*ActionResult, error) { if err := validateName(name); err != nil { - return nil, fmt.Errorf("service: stop: %w", err) + return nil, fmt.Errorf("service stop: %w", err) } unitName := managedPrefix + name + ".service" @@ -73,7 +73,7 @@ func (d *Debian) Stop( } if _, err := d.execManager.RunPrivilegedCmd(ctx, "systemctl", []string{"stop", unitName}); err != nil { - return nil, fmt.Errorf("service: stop: %w", err) + return nil, fmt.Errorf("service stop: %w", err) } return &ActionResult{Name: name, Changed: true}, nil @@ -85,7 +85,7 @@ func (d *Debian) Restart( name string, ) (*ActionResult, error) { if err := validateName(name); err != nil { - return nil, fmt.Errorf("service: restart: %w", err) + return nil, fmt.Errorf("service restart: %w", err) } unitName := managedPrefix + name + ".service" @@ -93,7 +93,7 @@ func (d *Debian) Restart( d.logger.Debug("executing service.Restart", slog.String("name", unitName)) if _, err := d.execManager.RunPrivilegedCmd(ctx, "systemctl", []string{"restart", unitName}); err != nil { - return nil, fmt.Errorf("service: restart: %w", err) + return nil, fmt.Errorf("service restart: %w", err) } return &ActionResult{Name: name, Changed: true}, nil @@ -106,7 +106,7 @@ func (d *Debian) Enable( name string, ) (*ActionResult, error) { if err := validateName(name); err != nil { - return nil, fmt.Errorf("service: enable: %w", err) + return nil, fmt.Errorf("service enable: %w", err) } unitName := managedPrefix + name + ".service" @@ -119,7 +119,7 @@ func (d *Debian) Enable( } if _, err := d.execManager.RunPrivilegedCmd(ctx, "systemctl", []string{"enable", unitName}); err != nil { - return nil, fmt.Errorf("service: enable: %w", err) + return nil, fmt.Errorf("service enable: %w", err) } return &ActionResult{Name: name, Changed: true}, nil @@ -132,7 +132,7 @@ func (d *Debian) Disable( name string, ) (*ActionResult, error) { if err := validateName(name); err != nil { - return nil, fmt.Errorf("service: disable: %w", err) + return nil, fmt.Errorf("service disable: %w", err) } unitName := managedPrefix + name + ".service" @@ -145,7 +145,7 @@ func (d *Debian) Disable( } if _, err := d.execManager.RunPrivilegedCmd(ctx, "systemctl", []string{"disable", unitName}); err != nil { - return nil, fmt.Errorf("service: disable: %w", err) + return nil, fmt.Errorf("service disable: %w", err) } return &ActionResult{Name: name, Changed: true}, nil diff --git a/internal/provider/node/service/debian_action_public_test.go b/internal/provider/node/service/debian_action_public_test.go index 5e057fc67..d41f1f4a7 100644 --- a/internal/provider/node/service/debian_action_public_test.go +++ b/internal/provider/node/service/debian_action_public_test.go @@ -130,7 +130,7 @@ func (suite *DebianActionPublicTestSuite) TestStart() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "service: start:") + suite.Contains(err.Error(), "service start:") }, }, { @@ -143,7 +143,7 @@ func (suite *DebianActionPublicTestSuite) TestStart() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid service name") + suite.Contains(err.Error(), "service: name") }, }, } @@ -222,7 +222,7 @@ func (suite *DebianActionPublicTestSuite) TestStop() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "service: stop:") + suite.Contains(err.Error(), "service stop:") }, }, { @@ -235,7 +235,7 @@ func (suite *DebianActionPublicTestSuite) TestStop() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid service name") + suite.Contains(err.Error(), "service: name") }, }, } @@ -290,7 +290,7 @@ func (suite *DebianActionPublicTestSuite) TestRestart() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "service: restart:") + suite.Contains(err.Error(), "service restart:") }, }, { @@ -303,7 +303,7 @@ func (suite *DebianActionPublicTestSuite) TestRestart() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid service name") + suite.Contains(err.Error(), "service: name") }, }, } @@ -382,7 +382,7 @@ func (suite *DebianActionPublicTestSuite) TestEnable() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "service: enable:") + suite.Contains(err.Error(), "service enable:") }, }, { @@ -395,7 +395,7 @@ func (suite *DebianActionPublicTestSuite) TestEnable() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid service name") + suite.Contains(err.Error(), "service: name") }, }, } @@ -474,7 +474,7 @@ func (suite *DebianActionPublicTestSuite) TestDisable() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "service: disable:") + suite.Contains(err.Error(), "service disable:") }, }, { @@ -487,7 +487,7 @@ func (suite *DebianActionPublicTestSuite) TestDisable() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid service name") + suite.Contains(err.Error(), "service: name") }, }, } diff --git a/internal/provider/node/service/debian_get.go b/internal/provider/node/service/debian_get.go index 3809b1952..d84a0b436 100644 --- a/internal/provider/node/service/debian_get.go +++ b/internal/provider/node/service/debian_get.go @@ -49,12 +49,12 @@ func (d *Debian) Get( "--no-pager", }) if err != nil { - return nil, fmt.Errorf("service: get: %w", err) + return nil, fmt.Errorf("service get: %w", err) } props, err := parseProperties(output) if err != nil { - return nil, fmt.Errorf("service: get: %w", err) + return nil, fmt.Errorf("service get: %w", err) } pid, _ := strconv.Atoi(props["MainPID"]) diff --git a/internal/provider/node/service/debian_get_public_test.go b/internal/provider/node/service/debian_get_public_test.go index 9a0feec5f..1cfd9ec7d 100644 --- a/internal/provider/node/service/debian_get_public_test.go +++ b/internal/provider/node/service/debian_get_public_test.go @@ -147,7 +147,7 @@ func (suite *DebianGetPublicTestSuite) TestGet() { ) { suite.Error(err) suite.Nil(info) - suite.Contains(err.Error(), "service: get:") + suite.Contains(err.Error(), "service get:") }, }, { @@ -208,7 +208,7 @@ func (suite *DebianGetPublicTestSuite) TestGet() { ) { suite.Error(err) suite.Nil(info) - suite.Contains(err.Error(), "invalid service name") + suite.Contains(err.Error(), "service: name") }, }, { @@ -221,7 +221,7 @@ func (suite *DebianGetPublicTestSuite) TestGet() { ) { suite.Error(err) suite.Nil(info) - suite.Contains(err.Error(), "invalid service name: empty") + suite.Contains(err.Error(), "service: name must not be empty") }, }, } diff --git a/internal/provider/node/service/debian_list.go b/internal/provider/node/service/debian_list.go index 09f414c2c..714624f26 100644 --- a/internal/provider/node/service/debian_list.go +++ b/internal/provider/node/service/debian_list.go @@ -57,12 +57,12 @@ func (d *Debian) List( "--output=json", }) if err != nil { - return nil, fmt.Errorf("service: list: %w", err) + return nil, fmt.Errorf("service list: %w", err) } var units []systemctlUnit if err := json.Unmarshal([]byte(unitsJSON), &units); err != nil { - return nil, fmt.Errorf("service: list: parse units: %w", err) + return nil, fmt.Errorf("service list: parse units: %w", err) } enabledMap := d.buildEnabledMap(ctx) diff --git a/internal/provider/node/service/debian_list_public_test.go b/internal/provider/node/service/debian_list_public_test.go index e0352ee4c..0a2f274bc 100644 --- a/internal/provider/node/service/debian_list_public_test.go +++ b/internal/provider/node/service/debian_list_public_test.go @@ -142,7 +142,7 @@ func (suite *DebianListPublicTestSuite) TestList() { ) { suite.Error(err) suite.Nil(infos) - suite.Contains(err.Error(), "service: list:") + suite.Contains(err.Error(), "service list:") }, }, { @@ -229,7 +229,7 @@ func (suite *DebianListPublicTestSuite) TestList() { ) { suite.Error(err) suite.Nil(infos) - suite.Contains(err.Error(), "service: list: parse units:") + suite.Contains(err.Error(), "service list: parse units:") }, }, { diff --git a/internal/provider/node/service/debian_unit.go b/internal/provider/node/service/debian_unit.go index d6a9f3c19..99cc5f73e 100644 --- a/internal/provider/node/service/debian_unit.go +++ b/internal/provider/node/service/debian_unit.go @@ -62,12 +62,12 @@ func (d *Debian) Create( Metadata: map[string]string{"source": "custom"}, }) if err != nil { - return nil, fmt.Errorf("service: create: %w", err) + return nil, fmt.Errorf("service create: %w", err) } if result.Changed { if err := d.daemonReload(ctx); err != nil { - return nil, fmt.Errorf("service: create: %w", err) + return nil, fmt.Errorf("service create: %w", err) } } @@ -97,7 +97,7 @@ func (d *Debian) Update( existing := d.buildEntryFromState(ctx, entry.Name, filePath) if existing == nil { return nil, fmt.Errorf( - "service: update: failed to read existing state for %q", + "service update: failed to read existing state for %q", entry.Name, ) } @@ -116,12 +116,12 @@ func (d *Debian) Update( Metadata: map[string]string{"source": "custom"}, }) if err != nil { - return nil, fmt.Errorf("service: update: %w", err) + return nil, fmt.Errorf("service update: %w", err) } if result.Changed { if err := d.daemonReload(ctx); err != nil { - return nil, fmt.Errorf("service: update: %w", err) + return nil, fmt.Errorf("service update: %w", err) } } @@ -177,12 +177,12 @@ func (d *Debian) Delete( Path: filePath, }) if err != nil { - return nil, fmt.Errorf("service: delete: %w", err) + return nil, fmt.Errorf("service delete: %w", err) } if result.Changed { if err := d.daemonReload(ctx); err != nil { - return nil, fmt.Errorf("service: delete: %w", err) + return nil, fmt.Errorf("service delete: %w", err) } } @@ -205,7 +205,7 @@ func (d *Debian) daemonReload( ) error { _, err := d.execManager.RunPrivilegedCmd(ctx, "systemctl", []string{"daemon-reload"}) if err != nil { - return fmt.Errorf("daemon-reload: %w", err) + return fmt.Errorf("service reload: daemon-reload: %w", err) } return nil diff --git a/internal/provider/node/service/debian_unit_public_test.go b/internal/provider/node/service/debian_unit_public_test.go index 0daafbfc8..f1a69081d 100644 --- a/internal/provider/node/service/debian_unit_public_test.go +++ b/internal/provider/node/service/debian_unit_public_test.go @@ -183,7 +183,7 @@ func (suite *DebianUnitPublicTestSuite) TestCreate() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "service: create") + suite.Contains(err.Error(), "service create") }, }, { @@ -206,7 +206,7 @@ func (suite *DebianUnitPublicTestSuite) TestCreate() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "daemon-reload") + suite.Contains(err.Error(), "service reload: daemon-reload") }, }, { @@ -222,7 +222,7 @@ func (suite *DebianUnitPublicTestSuite) TestCreate() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid service name") + suite.Contains(err.Error(), "service: name") }, }, { @@ -335,7 +335,7 @@ func (suite *DebianUnitPublicTestSuite) TestUpdate() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "service: update") + suite.Contains(err.Error(), "service update") }, }, { @@ -389,7 +389,7 @@ func (suite *DebianUnitPublicTestSuite) TestUpdate() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "daemon-reload") + suite.Contains(err.Error(), "service reload: daemon-reload") }, }, { @@ -405,7 +405,7 @@ func (suite *DebianUnitPublicTestSuite) TestUpdate() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid service name") + suite.Contains(err.Error(), "service: name") }, }, { @@ -593,7 +593,7 @@ func (suite *DebianUnitPublicTestSuite) TestDelete() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "service: delete") + suite.Contains(err.Error(), "service delete") }, }, { @@ -624,7 +624,7 @@ func (suite *DebianUnitPublicTestSuite) TestDelete() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "daemon-reload") + suite.Contains(err.Error(), "service reload: daemon-reload") }, }, { @@ -673,7 +673,7 @@ func (suite *DebianUnitPublicTestSuite) TestDelete() { ) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid service name") + suite.Contains(err.Error(), "service: name") }, }, } diff --git a/internal/provider/node/user/debian_group.go b/internal/provider/node/user/debian_group.go index e8b15e018..3aec2b499 100644 --- a/internal/provider/node/user/debian_group.go +++ b/internal/provider/node/user/debian_group.go @@ -90,7 +90,7 @@ func (d *Debian) CreateGroup( _, err := d.execManager.RunPrivilegedCmd(ctx, "groupadd", args) if err != nil { - return nil, fmt.Errorf("group: groupadd failed: %w", err) + return nil, fmt.Errorf("group create: groupadd: %w", err) } d.logger.Info( @@ -120,7 +120,7 @@ func (d *Debian) UpdateGroup( _, err := d.execManager.RunPrivilegedCmd(ctx, "gpasswd", []string{"-M", members, "--", name}) if err != nil { - return nil, fmt.Errorf("group: gpasswd failed: %w", err) + return nil, fmt.Errorf("group update: gpasswd: %w", err) } d.logger.Info( @@ -147,7 +147,7 @@ func (d *Debian) DeleteGroup( _, err := d.execManager.RunPrivilegedCmd(ctx, "groupdel", []string{"--", name}) if err != nil { - return nil, fmt.Errorf("group: groupdel failed: %w", err) + return nil, fmt.Errorf("group delete: groupdel: %w", err) } d.logger.Info( diff --git a/internal/provider/node/user/debian_public_test.go b/internal/provider/node/user/debian_public_test.go index 60d8c81b9..83b914cb9 100644 --- a/internal/provider/node/user/debian_public_test.go +++ b/internal/provider/node/user/debian_public_test.go @@ -481,7 +481,7 @@ func (suite *DebianPublicTestSuite) TestCreateUser() { validateFunc: func(result *user.Result, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "useradd failed") + suite.Contains(err.Error(), "user create: useradd") }, }, { @@ -496,12 +496,12 @@ func (suite *DebianPublicTestSuite) TestCreateUser() { Return("", nil) suite.mockExec.EXPECT(). RunPrivilegedCmdWithStdin(gomock.Any(), "chpasswd", []string{"-e"}, "newuser:$6$abcd$deadbeef\n"). - Return("", errors.New("chpasswd failed")) + Return("", errors.New("chpasswd")) }, validateFunc: func(result *user.Result, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "set password failed") + suite.Contains(err.Error(), "user set-password") }, }, { @@ -514,7 +514,7 @@ func (suite *DebianPublicTestSuite) TestCreateUser() { validateFunc: func(result *user.Result, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid password hash") + suite.Contains(err.Error(), "password hash must") suite.NotContains(err.Error(), "pwned") }, }, @@ -528,7 +528,7 @@ func (suite *DebianPublicTestSuite) TestCreateUser() { validateFunc: func(result *user.Result, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid password hash: must be a crypt hash") + suite.Contains(err.Error(), "password hash must be a crypt hash") }, }, { @@ -678,7 +678,7 @@ func (suite *DebianPublicTestSuite) TestUpdateUser() { validateFunc: func(result *user.Result, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "usermod failed") + suite.Contains(err.Error(), "user update: usermod") }, }, { @@ -739,7 +739,7 @@ func (suite *DebianPublicTestSuite) TestDeleteUser() { validateFunc: func(result *user.Result, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "userdel failed") + suite.Contains(err.Error(), "user delete: userdel") }, }, { @@ -800,7 +800,7 @@ func (suite *DebianPublicTestSuite) TestChangePassword() { validateFunc: func(result *user.Result, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "chpasswd failed") + suite.Contains(err.Error(), "chpasswd") }, }, { @@ -826,7 +826,7 @@ func (suite *DebianPublicTestSuite) TestChangePassword() { validateFunc: func(result *user.Result, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid password hash") + suite.Contains(err.Error(), "password hash must") suite.NotContains(err.Error(), "pwned") }, }, @@ -838,7 +838,7 @@ func (suite *DebianPublicTestSuite) TestChangePassword() { validateFunc: func(result *user.Result, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid password hash") + suite.Contains(err.Error(), "password hash must") }, }, { @@ -849,7 +849,7 @@ func (suite *DebianPublicTestSuite) TestChangePassword() { validateFunc: func(result *user.Result, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "invalid password hash: must be a crypt hash") + suite.Contains(err.Error(), "password hash must be a crypt hash") }, }, { @@ -1114,7 +1114,7 @@ func (suite *DebianPublicTestSuite) TestCreateGroup() { validateFunc: func(result *user.GroupResult, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "groupadd failed") + suite.Contains(err.Error(), "group create: groupadd") }, }, { @@ -1181,7 +1181,7 @@ func (suite *DebianPublicTestSuite) TestUpdateGroup() { validateFunc: func(result *user.GroupResult, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "gpasswd failed") + suite.Contains(err.Error(), "group update: gpasswd") }, }, { @@ -1242,7 +1242,7 @@ func (suite *DebianPublicTestSuite) TestDeleteGroup() { validateFunc: func(result *user.GroupResult, err error) { suite.Error(err) suite.Nil(result) - suite.Contains(err.Error(), "groupdel failed") + suite.Contains(err.Error(), "group delete: groupdel") }, }, { diff --git a/internal/provider/node/user/debian_user.go b/internal/provider/node/user/debian_user.go index 35e5e399f..f211966a8 100644 --- a/internal/provider/node/user/debian_user.go +++ b/internal/provider/node/user/debian_user.go @@ -128,12 +128,12 @@ func (d *Debian) CreateUser( _, err := d.execManager.RunPrivilegedCmd(ctx, "useradd", args) if err != nil { - return nil, fmt.Errorf("user: useradd failed: %w", err) + return nil, fmt.Errorf("user create: useradd: %w", err) } if opts.PasswordHash != "" { if err := d.setPassword(ctx, opts.Name, opts.PasswordHash); err != nil { - return nil, fmt.Errorf("user: set password failed: %w", err) + return nil, fmt.Errorf("user set-password: %w", err) } } @@ -170,7 +170,7 @@ func (d *Debian) UpdateUser( _, err := d.execManager.RunPrivilegedCmd(ctx, "usermod", args) if err != nil { - return nil, fmt.Errorf("user: usermod failed: %w", err) + return nil, fmt.Errorf("user update: usermod: %w", err) } d.logger.Info( @@ -197,7 +197,7 @@ func (d *Debian) DeleteUser( _, err := d.execManager.RunPrivilegedCmd(ctx, "userdel", []string{"-r", "--", name}) if err != nil { - return nil, fmt.Errorf("user: userdel failed: %w", err) + return nil, fmt.Errorf("user delete: userdel: %w", err) } d.logger.Info( @@ -411,7 +411,7 @@ func (d *Debian) setPassword( name+":"+passwordHash+"\n", ) if err != nil { - return fmt.Errorf("chpasswd failed: %w", err) + return fmt.Errorf("chpasswd: %w", err) } return nil @@ -431,15 +431,15 @@ func validatePasswordInput( passwordHash string, ) error { if strings.ContainsAny(name, ":\r\n") { - return fmt.Errorf("invalid user name: must not contain a colon or line break") + return fmt.Errorf("name must not contain a colon or line break") } if strings.ContainsAny(passwordHash, ":\r\n") { - return fmt.Errorf("invalid password hash: must not contain a colon or line break") + return fmt.Errorf("password hash must not contain a colon or line break") } if !strings.HasPrefix(passwordHash, "$") { - return fmt.Errorf("invalid password hash: must be a crypt hash") + return fmt.Errorf("password hash must be a crypt hash") } return nil diff --git a/internal/provider/node/user/validate_public_test.go b/internal/provider/node/user/validate_public_test.go index b4baa6ed5..e30a63f72 100644 --- a/internal/provider/node/user/validate_public_test.go +++ b/internal/provider/node/user/validate_public_test.go @@ -50,7 +50,7 @@ func (s *ValidatePasswordInputPublicTestSuite) TestValidatePasswordInput() { passwordHash: "$6$abcd$deadbeef", validateFunc: func(err error) { s.Error(err) - s.Contains(err.Error(), "invalid user name: must not contain a colon or line break") + s.Contains(err.Error(), "name must not contain a colon or line break") }, }, { @@ -59,7 +59,7 @@ func (s *ValidatePasswordInputPublicTestSuite) TestValidatePasswordInput() { passwordHash: "$6$abcd$deadbeef", validateFunc: func(err error) { s.Error(err) - s.Contains(err.Error(), "invalid user name: must not contain a colon or line break") + s.Contains(err.Error(), "name must not contain a colon or line break") }, }, {