Select Git revision
userSetCaps.go
userSetCaps.go 3.53 KiB
package cmdUser
import (
"encoding/csv"
"io"
u "nexus-client/utils"
"nexus-common/caps"
"nexus-common/params"
g "nexus-libclient/globals"
libclient "nexus-libclient/user"
"nexus-libclient/utils"
"os"
"strings"
)
type SetCaps struct {
Name string
}
func (cmd *SetCaps) GetName() string {
return cmd.Name
}
func (cmd *SetCaps) GetDesc() []string {
return []string{
"Sets a user's capabilities.",
"Requires USER_SET_CAPS user capability."}
}
func (cmd *SetCaps) PrintUsage() {
for _, desc := range cmd.GetDesc() {
u.PrintlnErr(desc)
}
u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――")
u.PrintlnErr("USAGE: " + cmd.GetName() + " email [capability ...]")
u.PrintlnErr(" " + cmd.GetName() + " file.csv")
u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――")
usage := `file.csv 2-column CSV file specifying each user's capabilities:
column1 email
column2 capabilities (space separated)
List of user capabilities:
`
caps := caps.GetUserCapsNames()
i := 0
count := 0
for _, v := range caps {
if i == 0 {
usage += " "
}
usage += v + " "
i += 1
count += 1
if i >= 5 && count < len(caps) {
usage = utils.AppendNewLine(usage)
i = 0
}
}
u.PrintlnErr(usage)
}
func (cmd *SetCaps) Run(args []string) int {
argc := len(args)
if argc < 1 {
cmd.PrintUsage()
return 1
}
statusCode := 0
if argc == 1 && !utils.IsEmail(args[0]) {
// Single argument and it's a CSV file
csvFile := args[0]
if utils.IsEmail(csvFile) {
cmd.PrintUsage()
return 1
}
file, err := os.Open(csvFile)
if err != nil {
u.PrintlnErr("Error: " + err.Error())
return 1
}
defer file.Close()
reader := csv.NewReader(file)
reader.Comma = g.CsvFieldSeparator // specify the column separator
reader.Comment = '#' // lines starting with this symbol are to be ignored
line := 0
for {
line += 1
columns, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
u.PrintlnErr("Failed reading " + err.Error())
statusCode = 1
continue
}
columnCount := len(columns)
if columnCount != 2 {
u.PrintlnErr("Failed reading record on line ", line, ": expecting 2 columns")
statusCode = 1
continue
}
userCaps := ¶ms.UserSetCaps{make(map[string]int)}
capsStr := strings.TrimSpace(columns[1])
if len(capsStr) > 0 {
caps := strings.Split(capsStr, " ")
for _, cap := range caps {
userCaps.Caps[cap] = 1
}
}
email := columns[0]
if !utils.IsEmail(email) {
u.PrintlnErr("Failed reading record on line ", line, ": ", email, " is not a valid email")
statusCode = 1
continue
}
if err := libclient.UserSetCaps(email, userCaps); err != nil {
u.PrintlnErr(err)
statusCode = 1
} else {
u.Println("Successfully set capabilities for " + email)
}
}
} else {
// Argument is an email address
email := args[0]
userCaps := ¶ms.UserSetCaps{make(map[string]int)}
for _, cap := range args[1:] {
userCaps.Caps[cap] = 1
}
if err := libclient.UserSetCaps(email, userCaps); err != nil {
u.PrintlnErr(err)
statusCode = 1
} else {
u.Println("Successfully set capabilities for " + email)
}
}
return statusCode
}