blob: bb60c498797dee56ea69b0522df4d3a048f50e1b [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
//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)
}