...
Tawesoft Logo

Source file src/tawesoft.co.uk/go/drop/util.go

Documentation: src/tawesoft.co.uk/go/drop/util.go

     1  package drop
     2  
     3  import (
     4      "fmt"
     5      "os"
     6      "os/user"
     7      "strconv"
     8      "syscall"
     9  )
    10  
    11  // IsSuperuser returns true iff the current user is root
    12  func IsSuperuser() bool {
    13      return os.Getuid() == 0
    14  }
    15  
    16  // UserLookup returns UID, GID, and Supplementary Group IDs
    17  func UserLookup(username string) (uid int, gid int, gids []int, err error) {
    18      var i int
    19      var groups []string
    20  
    21      usr, err := user.Lookup(username)
    22      if err != nil { goto fail }
    23  
    24      i, err = strconv.Atoi(usr.Uid)
    25      if (err != nil) || (i == -1) { goto fail }
    26      uid = i
    27  
    28      i, err = strconv.Atoi(usr.Gid)
    29      if (err != nil) || (i == -1) { goto fail }
    30      gid = i
    31  
    32      groups, err = usr.GroupIds()
    33      if err != nil { goto fail }
    34  
    35      gids = make([]int, 0, len(groups))
    36      for _, g := range groups {
    37          i, err = strconv.Atoi(g)
    38          if (err != nil) || (i == -1) { goto fail }
    39          gids = append(gids, i)
    40      }
    41  
    42      return
    43  
    44      fail:
    45          return 0, 0, nil, fmt.Errorf("user lookup failure: %v", err)
    46  }
    47  
    48  // rootSetMode
    49  func rootSetMode(path string, uid int, gid int, mode os.FileMode) (err error) {
    50      if !IsSuperuser() { err = fmt.Errorf("not superuser"); goto Err }
    51  
    52      // restrict all permissions first before changing owner so that there is
    53      // no race condition of enhanced permissions for anyone.
    54  
    55      if int(mode.Perm()) != 0 {
    56          err = syscall.Chmod(path, 0000)
    57          if err != nil { goto Err }
    58      }
    59  
    60      if (uid != -1) || (gid != -1) {
    61          err = syscall.Chown(path, uid, gid)
    62          if err != nil { goto Err }
    63      }
    64  
    65      if mode.Perm() != 0 {
    66          err = syscall.Chmod(path, uint32(mode.Perm()))
    67          if err != nil { goto Err }
    68      }
    69  
    70      return nil
    71  
    72      Err:
    73          return fmt.Errorf("error setting mode of %q: %v", path, err)
    74  }
    75  

View as plain text