cmd/ctrld: check elevated privilege for service mode

This commit is contained in:
Cuong Manh Le
2023-01-21 01:00:39 +07:00
committed by Cuong Manh Le
parent d830706692
commit 065a391ff4
4 changed files with 71 additions and 16 deletions
+22 -16
View File
@@ -176,9 +176,10 @@ func initCLI() {
rootCmd.AddCommand(runCmd) rootCmd.AddCommand(runCmd)
startCmd := &cobra.Command{ startCmd := &cobra.Command{
Use: "start", PreRun: checkHasElevatedPrivilege,
Short: "Start the ctrld service", Use: "start",
Args: cobra.NoArgs, Short: "Start the ctrld service",
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
sc := &service.Config{} sc := &service.Config{}
*sc = *svcConfig *sc = *svcConfig
@@ -239,9 +240,10 @@ func initCLI() {
startCmd.Flags().StringVarP(&iface, "iface", "", "", `Update DNS setting for iface, "auto" means the default interface gateway`) startCmd.Flags().StringVarP(&iface, "iface", "", "", `Update DNS setting for iface, "auto" means the default interface gateway`)
stopCmd := &cobra.Command{ stopCmd := &cobra.Command{
Use: "stop", PreRun: checkHasElevatedPrivilege,
Short: "Stop the ctrld service", Use: "stop",
Args: cobra.NoArgs, Short: "Stop the ctrld service",
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
s, err := service.New(&prog{}, svcConfig) s, err := service.New(&prog{}, svcConfig)
if err != nil { if err != nil {
@@ -256,9 +258,10 @@ func initCLI() {
stopCmd.Flags().StringVarP(&iface, "iface", "", "", `Reset DNS setting for iface, "auto" means the default interface gateway`) stopCmd.Flags().StringVarP(&iface, "iface", "", "", `Reset DNS setting for iface, "auto" means the default interface gateway`)
restartCmd := &cobra.Command{ restartCmd := &cobra.Command{
Use: "restart", PreRun: checkHasElevatedPrivilege,
Short: "Restart the ctrld service", Use: "restart",
Args: cobra.NoArgs, Short: "Restart the ctrld service",
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
s, err := service.New(&prog{}, svcConfig) s, err := service.New(&prog{}, svcConfig)
if err != nil { if err != nil {
@@ -298,9 +301,10 @@ func initCLI() {
} }
uninstallCmd := &cobra.Command{ uninstallCmd := &cobra.Command{
Use: "uninstall", PreRun: checkHasElevatedPrivilege,
Short: "Uninstall the ctrld service", Use: "uninstall",
Args: cobra.NoArgs, Short: "Uninstall the ctrld service",
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
s, err := service.New(&prog{}, svcConfig) s, err := service.New(&prog{}, svcConfig)
if err != nil { if err != nil {
@@ -379,8 +383,9 @@ func initCLI() {
serviceCmd.AddCommand(interfacesCmd) serviceCmd.AddCommand(interfacesCmd)
rootCmd.AddCommand(serviceCmd) rootCmd.AddCommand(serviceCmd)
startCmdAlias := &cobra.Command{ startCmdAlias := &cobra.Command{
Use: "start", PreRun: checkHasElevatedPrivilege,
Short: "Quick start service and configure DNS on interface", Use: "start",
Short: "Quick start service and configure DNS on interface",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
if !cmd.Flags().Changed("iface") { if !cmd.Flags().Changed("iface") {
os.Args = append(os.Args, "--iface="+ifaceStartStop) os.Args = append(os.Args, "--iface="+ifaceStartStop)
@@ -392,8 +397,9 @@ func initCLI() {
startCmdAlias.Flags().AddFlagSet(startCmd.Flags()) startCmdAlias.Flags().AddFlagSet(startCmd.Flags())
rootCmd.AddCommand(startCmdAlias) rootCmd.AddCommand(startCmdAlias)
stopCmdAlias := &cobra.Command{ stopCmdAlias := &cobra.Command{
Use: "stop", PreRun: checkHasElevatedPrivilege,
Short: "Quick stop service and remove DNS from interface", Use: "stop",
Short: "Quick stop service and remove DNS from interface",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
if !cmd.Flags().Changed("iface") { if !cmd.Flags().Changed("iface") {
os.Args = append(os.Args, "--iface="+ifaceStartStop) os.Args = append(os.Args, "--iface="+ifaceStartStop)
+14
View File
@@ -3,6 +3,8 @@ package main
import ( import (
"fmt" "fmt"
"os" "os"
"github.com/spf13/cobra"
) )
func stderrMsg(msg string) { func stderrMsg(msg string) {
@@ -29,3 +31,15 @@ func doTasks(tasks []task) bool {
} }
return true return true
} }
func checkHasElevatedPrivilege(cmd *cobra.Command, args []string) {
ok, err := hasElevatedPrivilege()
if err != nil {
fmt.Printf("could not detect user privilege: %v", err)
return
}
if !ok {
fmt.Println("Please relaunch process with admin/root privilege.")
os.Exit(1)
}
}
+11
View File
@@ -0,0 +1,11 @@
//go:build !windows
package main
import (
"os"
)
func hasElevatedPrivilege() (bool, error) {
return os.Geteuid() == 0, nil
}
+24
View File
@@ -0,0 +1,24 @@
package main
import "golang.org/x/sys/windows"
func hasElevatedPrivilege() (bool, error) {
var sid *windows.SID
if err := windows.AllocateAndInitializeSid(
&windows.SECURITY_NT_AUTHORITY,
2,
windows.SECURITY_BUILTIN_DOMAIN_RID,
windows.DOMAIN_ALIAS_RID_ADMINS,
0,
0,
0,
0,
0,
0,
&sid,
); err != nil {
return false, err
}
token := windows.Token(0)
return token.IsMember(sid)
}