about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorReto Brunner <reto@labrat.space>2019-05-16 14:26:08 -0700
committerDrew DeVault <sir@cmpwn.com>2019-05-16 17:26:35 -0400
commitb275a394e2e1d7836fae7519f3f13d3eacc151f5 (patch)
tree1a4760f7eb7d98f5625f1bd594d7379ecd53d411
parentfb3826cee5a4c23cc1135523e267fc3801e8533a (diff)
downloadaerc-b275a394e2e1d7836fae7519f3f13d3eacc151f5.tar.gz
Abort if accounts.conf is world readable
Fixes #32
-rw-r--r--aerc.go8
-rw-r--r--config/config.go27
2 files changed, 31 insertions, 4 deletions
diff --git a/aerc.go b/aerc.go
index f3607bb..3566895 100644
--- a/aerc.go
+++ b/aerc.go
@@ -1,6 +1,7 @@
 package main
 
 import (
+	"fmt"
 	"io"
 	"io/ioutil"
 	"log"
@@ -9,12 +10,12 @@ import (
 
 	"github.com/mattn/go-isatty"
 
-	"git.sr.ht/~sircmpwn/aerc2/config"
 	"git.sr.ht/~sircmpwn/aerc2/commands"
 	"git.sr.ht/~sircmpwn/aerc2/commands/account"
 	"git.sr.ht/~sircmpwn/aerc2/commands/compose"
 	"git.sr.ht/~sircmpwn/aerc2/commands/msgview"
 	"git.sr.ht/~sircmpwn/aerc2/commands/terminal"
+	"git.sr.ht/~sircmpwn/aerc2/config"
 	libui "git.sr.ht/~sircmpwn/aerc2/lib/ui"
 	"git.sr.ht/~sircmpwn/aerc2/widgets"
 )
@@ -61,7 +62,8 @@ func main() {
 
 	conf, err := config.LoadConfig(nil)
 	if err != nil {
-		panic(err)
+		fmt.Printf("Failed to load config: %v\n", err)
+		os.Exit(1)
 	}
 
 	var (
@@ -73,7 +75,7 @@ func main() {
 		for i, set := range cmds {
 			err := set.ExecuteCommand(aerc, cmd)
 			if _, ok := err.(commands.NoSuchCommand); ok {
-				if i == len(cmds) - 1 {
+				if i == len(cmds)-1 {
 					return err
 				} else {
 					continue
diff --git a/config/config.go b/config/config.go
index 736acbf..aee326f 100644
--- a/config/config.go
+++ b/config/config.go
@@ -3,6 +3,7 @@ package config
 import (
 	"errors"
 	"fmt"
+	"os"
 	"path"
 	"regexp"
 	"strings"
@@ -142,7 +143,12 @@ func LoadConfig(root *string) (*AercConfig, error) {
 		_root := path.Join(xdg.ConfigHome(), "aerc")
 		root = &_root
 	}
-	file, err := ini.Load(path.Join(*root, "aerc.conf"))
+	filename := path.Join(*root, "accounts.conf")
+	if err := checkConfigPerms(filename); err != nil {
+		return nil, err
+	}
+	filename = path.Join(*root, "aerc.conf")
+	file, err := ini.Load(filename)
 	if err != nil {
 		return nil, err
 	}
@@ -289,3 +295,22 @@ func LoadConfig(root *string) (*AercConfig, error) {
 	config.Bindings.Global.Globals = false
 	return config, nil
 }
+
+// checkConfigPerms checks for too open permissions
+// printing the fix on stdout and returning an error
+func checkConfigPerms(filename string) error {
+	info, err := os.Stat(filename)
+	if err != nil {
+		return err
+	}
+	perms := info.Mode().Perm()
+	goPerms := perms >> 3
+	// group or others have read access
+	if goPerms&0x44 != 0 {
+		fmt.Printf("The file %v has too open permissions.\n", filename)
+		fmt.Println("This is a security issue (it contains passwords).")
+		fmt.Printf("To fix it, run `chmod 600 %v`\n", filename)
+		return errors.New("account.conf permissions too lax")
+	}
+	return nil
+}