diff options
Diffstat (limited to 'hst/grp_pwd.go')
| -rw-r--r-- | hst/grp_pwd.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/hst/grp_pwd.go b/hst/grp_pwd.go new file mode 100644 index 00000000..1a5c962e --- /dev/null +++ b/hst/grp_pwd.go @@ -0,0 +1,61 @@ +package hst + +import ( + "fmt" + "strconv" +) + +const ( + // UserOffset is the offset for UID and GID ranges for each user. + UserOffset = 100000 + // RangeSize is the size of each UID and GID range. + RangeSize = UserOffset / 10 + + // IdentityStart is the first [Config.Identity] value. This is enforced in cmd/hsu. + IdentityStart = 0 + // IdentityEnd is the last [Config.Identity] value. This is enforced in cmd/hsu. + IdentityEnd = AppEnd - AppStart + + // AppStart is the first app user UID and GID. + AppStart = RangeSize * 1 + // AppEnd is the last app user UID and GID. + AppEnd = AppStart + RangeSize - 1 + + /* these are for Rosa OS: use the ranges below to determine whether a process is isolated */ + + // IsolatedStart is the start of UID and GID for fully isolated sandboxed processes. + IsolatedStart = RangeSize * 9 + // IsolatedEnd is the end of UID and GID for fully isolated sandboxed processes. + IsolatedEnd = IsolatedStart + RangeSize - 1 +) + +// A UID represents a kernel uid in the init namespace. +type UID uint32 + +// String returns the username corresponding to this uid. +// +// Not safe against untrusted input. +func (uid UID) String() string { + appid := uid % UserOffset + userid := uid / UserOffset + if appid >= IsolatedStart && appid <= IsolatedEnd { + return fmt.Sprintf("u%d_i%d", userid, appid-IsolatedStart) + } else if appid >= AppStart && appid <= AppEnd { + return fmt.Sprintf("u%d_a%d", userid, appid-AppStart) + } else { + return strconv.Itoa(int(uid)) + } +} + +// A GID represents a kernel gid in the init namespace. +type GID uint32 + +// String returns the group name corresponding to this gid. +// +// Not safe against untrusted input. +func (gid GID) String() string { return UID(gid).String() } + +// ToUser returns a [hst.UID] value from userid and appid. +// +// Not safe against untrusted input. +func ToUser[U int | uint32](userid, appid U) U { return userid*UserOffset + AppStart + appid } |
