2023-09-12 01:22:48 +02:00
|
|
|
//go:build linux || freebsd
|
|
|
|
|
2023-08-03 00:42:31 +02:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
2024-03-15 15:38:41 +01:00
|
|
|
_ "embed"
|
2023-08-03 00:42:31 +02:00
|
|
|
"fmt"
|
2024-02-09 18:05:15 +01:00
|
|
|
"log"
|
2023-08-03 00:42:31 +02:00
|
|
|
"os"
|
|
|
|
"os/exec"
|
2024-02-09 18:05:15 +01:00
|
|
|
"os/user"
|
2023-08-03 00:42:31 +02:00
|
|
|
"strings"
|
|
|
|
|
2023-09-12 01:22:48 +02:00
|
|
|
"github.com/quexten/goldwarden/agent/systemauth/biometrics"
|
2023-08-03 00:42:31 +02:00
|
|
|
"github.com/quexten/goldwarden/browserbiometrics"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
)
|
|
|
|
|
2024-02-09 18:05:15 +01:00
|
|
|
func isRoot() bool {
|
|
|
|
currentUser, err := user.Current()
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("[isRoot] Unable to get current user: %s", err)
|
|
|
|
}
|
|
|
|
return currentUser.Username == "root"
|
|
|
|
}
|
|
|
|
|
2023-08-03 00:42:31 +02:00
|
|
|
func setupPolkit() {
|
2024-02-09 18:05:15 +01:00
|
|
|
if isRoot() {
|
|
|
|
fmt.Println("Do not run this command as root!")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-08-04 00:44:15 +02:00
|
|
|
file, err := os.Create("/tmp/goldwarden-policy")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2023-09-12 01:22:48 +02:00
|
|
|
_, err = file.WriteString(biometrics.POLICY)
|
2023-08-04 00:44:15 +02:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
err = file.Close()
|
2023-08-03 00:42:31 +02:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
command := exec.Command("pkexec", "mv", "/tmp/goldwarden-policy", "/usr/share/polkit-1/actions/com.quexten.goldwarden.policy")
|
|
|
|
err = command.Run()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2023-09-19 15:12:42 +02:00
|
|
|
command2 := exec.Command("pkexec", "chown", "root:root", "/usr/share/polkit-1/actions/com.quexten.goldwarden.policy")
|
|
|
|
err = command2.Run()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2023-12-21 12:56:48 +01:00
|
|
|
command3 := exec.Command("sudo", "chcon", "system_u:object_r:usr_t:s0", "/usr/share/polkit-1/actions/com.quexten.goldwarden.policy")
|
|
|
|
err = command3.Run()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("failed setting selinux context")
|
|
|
|
fmt.Println(err.Error())
|
|
|
|
} else {
|
|
|
|
fmt.Println("Set selinux context successfully")
|
|
|
|
fmt.Println("Might require a reboot to take effect!")
|
|
|
|
}
|
|
|
|
|
2023-08-04 00:44:15 +02:00
|
|
|
fmt.Println("Polkit setup successfully")
|
|
|
|
}
|
|
|
|
|
|
|
|
func IsPolkitSetup() bool {
|
|
|
|
_, err := os.Stat("/usr/share/polkit-1/actions/com.quexten.goldwarden.policy")
|
|
|
|
return !os.IsNotExist(err)
|
2023-08-03 00:42:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var polkitCmd = &cobra.Command{
|
|
|
|
Use: "polkit",
|
|
|
|
Short: "Sets up polkit",
|
|
|
|
Long: "Sets up polkit",
|
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
|
setupPolkit()
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2024-03-15 15:38:41 +01:00
|
|
|
//go:embed goldwarden.service
|
|
|
|
var systemdService string
|
2023-08-03 00:42:31 +02:00
|
|
|
|
|
|
|
func setupSystemd() {
|
2024-02-09 18:05:15 +01:00
|
|
|
if isRoot() {
|
|
|
|
fmt.Println("Do not run this command as root!")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-08-04 00:45:13 +02:00
|
|
|
file, err := os.Create("/tmp/goldwarden.service")
|
2023-08-03 00:42:31 +02:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
path, err := os.Executable()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2024-03-17 14:46:28 +01:00
|
|
|
_, err = file.WriteString(strings.ReplaceAll(systemdService, "@BINARY_PATH@", path))
|
2024-03-15 16:22:45 +01:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2023-08-03 00:42:31 +02:00
|
|
|
file.Close()
|
|
|
|
|
2023-09-11 22:47:37 +02:00
|
|
|
userDirectory := os.Getenv("HOME")
|
2023-12-16 06:40:00 +01:00
|
|
|
//ensure user systemd dir exists
|
|
|
|
command0 := exec.Command("mkdir", "-p", userDirectory+"/.config/systemd/user/")
|
|
|
|
err = command0.Run()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("failed creating systemd user dir")
|
|
|
|
fmt.Println(err.Error())
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2023-09-19 15:12:42 +02:00
|
|
|
command := exec.Command("mv", "/tmp/goldwarden.service", userDirectory+"/.config/systemd/user/goldwarden.service")
|
2023-08-03 00:42:31 +02:00
|
|
|
err = command.Run()
|
|
|
|
if err != nil {
|
2023-12-16 06:40:00 +01:00
|
|
|
fmt.Println("failed moving goldwarden service file to systemd dir")
|
|
|
|
fmt.Println(err.Error())
|
2023-08-03 00:42:31 +02:00
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2023-08-04 00:44:15 +02:00
|
|
|
command2 := exec.Command("systemctl", "--now", "--user", "enable", "goldwarden.service")
|
2023-09-19 15:12:42 +02:00
|
|
|
command2.Stdout = os.Stdout
|
|
|
|
command2.Stderr = os.Stderr
|
2023-08-04 00:44:15 +02:00
|
|
|
err = command2.Run()
|
|
|
|
if err != nil {
|
2023-12-16 06:40:00 +01:00
|
|
|
fmt.Println("failed enabling systemd service")
|
2023-08-04 00:44:15 +02:00
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println("Systemd setup successfully")
|
2023-08-03 00:42:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var systemdCmd = &cobra.Command{
|
|
|
|
Use: "systemd",
|
|
|
|
Short: "Sets up systemd autostart",
|
|
|
|
Long: "Sets up systemd autostart",
|
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
2024-02-09 18:05:15 +01:00
|
|
|
if isRoot() {
|
|
|
|
fmt.Println("Do not run this command as root!")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-08-03 00:42:31 +02:00
|
|
|
setupSystemd()
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
var browserbiometricsCmd = &cobra.Command{
|
|
|
|
Use: "browserbiometrics",
|
|
|
|
Short: "Sets up browser biometrics",
|
|
|
|
Long: "Sets up browser biometrics",
|
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
2024-02-09 18:05:15 +01:00
|
|
|
if isRoot() {
|
|
|
|
fmt.Println("Do not run this command as root!")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-08-03 00:42:31 +02:00
|
|
|
err := browserbiometrics.DetectAndInstallBrowsers()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Error: " + err.Error())
|
|
|
|
} else {
|
|
|
|
fmt.Println("Done.")
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
var setupCmd = &cobra.Command{
|
|
|
|
Use: "setup",
|
|
|
|
Short: "Sets up Goldwarden integrations",
|
|
|
|
Long: "Sets up Goldwarden integrations",
|
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
2024-03-15 16:23:11 +01:00
|
|
|
_ = cmd.Help()
|
2023-08-03 00:42:31 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
rootCmd.AddCommand(setupCmd)
|
|
|
|
setupCmd.AddCommand(polkitCmd)
|
|
|
|
setupCmd.AddCommand(systemdCmd)
|
|
|
|
setupCmd.AddCommand(browserbiometricsCmd)
|
|
|
|
}
|