59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
//go:build !windows
|
|
|
|
package osutil
|
|
|
|
import (
|
|
"fmt"
|
|
"io/fs"
|
|
"os/user"
|
|
"strconv"
|
|
"syscall"
|
|
)
|
|
|
|
func FileUIDEqual(info fs.FileInfo, uid int) bool {
|
|
if stat, ok := info.Sys().(*syscall.Stat_t); ok {
|
|
path_uid := int(stat.Uid)
|
|
if path_uid == uid {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func FileGIDEqual(info fs.FileInfo, gid int) bool {
|
|
if stat, ok := info.Sys().(*syscall.Stat_t); ok {
|
|
path_gid := int(stat.Gid)
|
|
if path_gid == gid {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func FileUidMatch(info fs.FileInfo, path string, uid int) (err error) {
|
|
currentUser, err := user.Current()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get details of current process owner. The error is: %w", err)
|
|
}
|
|
switch uid {
|
|
case 0:
|
|
currentUserUid, err := strconv.Atoi(currentUser.Uid)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to convert uid %q to int. The error is: %w", currentUser.Uid, err)
|
|
}
|
|
if !FileUIDEqual(info, currentUserUid) {
|
|
return fmt.Errorf("path %q is not owned by my uid %s", path, currentUser.Uid)
|
|
}
|
|
default:
|
|
if !FileUIDEqual(info, uid) {
|
|
return fmt.Errorf("path %q is not owned by uid %d", path, uid)
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
// Sets new umask and returns old umask
|
|
func Umask(newmask int) int {
|
|
return syscall.Umask(newmask)
|
|
}
|