Skip to content
Snippets Groups Projects
Select Git revision
  • 5aa5c2303b2a132a17de81dddf6d2da087eab946
  • live_exam_os_ubuntu default protected
2 results

userSetCaps.go

Blame
  • 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 := &params.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 := &params.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
    }