Skip to content

Commit 22acbfd

Browse files
committed
chore: extract user resolution helpers, cover the id parsing
1 parent b716257 commit 22acbfd

2 files changed

Lines changed: 40 additions & 11 deletions

File tree

plugin.go

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,32 @@ type Plugin struct {
3333
factory pool.Factory
3434
}
3535

36+
// resolveUser looks the user up in the user database and returns its uid/gid.
37+
func resolveUser(name string) (int, int, error) {
38+
usr, err := user.Lookup(name)
39+
if err != nil {
40+
return 0, 0, err
41+
}
42+
43+
return parseIDs(usr)
44+
}
45+
46+
// parseIDs converts the user database's textual ids to ints; non-numeric ids
47+
// are rejected.
48+
func parseIDs(usr *user.User) (int, int, error) {
49+
uid, err := strconv.Atoi(usr.Uid)
50+
if err != nil {
51+
return 0, 0, errors.Errorf("failed to parse the user id %q: %v", usr.Uid, err)
52+
}
53+
54+
gid, err := strconv.Atoi(usr.Gid)
55+
if err != nil {
56+
return 0, 0, errors.Errorf("failed to parse the group id %q: %v", usr.Gid, err)
57+
}
58+
59+
return uid, gid, nil
60+
}
61+
3662
// Init application provider.
3763
func (p *Plugin) Init(cfg Configurer, log NamedLogger) error {
3864
const op = errors.Op("server_plugin_init")
@@ -67,17 +93,7 @@ func (p *Plugin) Init(cfg Configurer, log NamedLogger) error {
6793
return errors.E(op, errors.Init, errors.Str("server.user is not supported on windows"))
6894
}
6995

70-
usr, err := user.Lookup(p.cfg.User)
71-
if err != nil {
72-
return errors.E(op, errors.Init, err)
73-
}
74-
75-
p.uid, err = strconv.Atoi(usr.Uid)
76-
if err != nil {
77-
return errors.E(op, errors.Init, err)
78-
}
79-
80-
p.gid, err = strconv.Atoi(usr.Gid)
96+
p.uid, p.gid, err = resolveUser(p.cfg.User)
8197
if err != nil {
8298
return errors.E(op, errors.Init, err)
8399
}

plugin_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,19 @@ func TestInitResolvesUser(t *testing.T) {
112112
require.Equal(t, gid, p.GID())
113113
}
114114

115+
func TestParseIDs(t *testing.T) {
116+
uid, gid, err := parseIDs(&user.User{Uid: "1000", Gid: "1000"})
117+
require.NoError(t, err)
118+
require.Equal(t, 1000, uid)
119+
require.Equal(t, 1000, gid)
120+
121+
_, _, err = parseIDs(&user.User{Uid: "S-1-5-21", Gid: "1000"})
122+
require.ErrorContains(t, err, "failed to parse the user id")
123+
124+
_, _, err = parseIDs(&user.User{Uid: "1000", Gid: "S-1-5-21"})
125+
require.ErrorContains(t, err, "failed to parse the group id")
126+
}
127+
115128
func TestInitUnknownUser(t *testing.T) {
116129
log := slog.New(slog.NewTextHandler(os.Stderr, nil))
117130
p := &Plugin{

0 commit comments

Comments
 (0)