From e0c93cc4a5fceb372a18e440cb3341a8e57c66c3 Mon Sep 17 00:00:00 2001 From: Martin Geno Date: Thu, 24 Nov 2016 23:58:03 +0100 Subject: [PATCH] add dovecot auth --- cmd/warehost-auth-dovecot/config.go | 24 +++++++++ cmd/warehost-auth-dovecot/config.yml.example | 2 + cmd/warehost-auth-dovecot/main.go | 56 ++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 cmd/warehost-auth-dovecot/config.go create mode 100644 cmd/warehost-auth-dovecot/config.yml.example create mode 100644 cmd/warehost-auth-dovecot/main.go diff --git a/cmd/warehost-auth-dovecot/config.go b/cmd/warehost-auth-dovecot/config.go new file mode 100644 index 0000000..b86aa53 --- /dev/null +++ b/cmd/warehost-auth-dovecot/config.go @@ -0,0 +1,24 @@ +package main + +import ( + "io/ioutil" + "log" + + "gopkg.in/yaml.v2" +) + +// Config of warehost webserver +type Config struct { + Database string `yaml:"database"` +} + +// ReadConfigFile reads a config models by path to a yml file +func ReadConfigFile(path string) *Config { + config := &Config{} + file, _ := ioutil.ReadFile(path) + err := yaml.Unmarshal(file, &config) + if err != nil { + log.Fatal(err) + } + return config +} diff --git a/cmd/warehost-auth-dovecot/config.yml.example b/cmd/warehost-auth-dovecot/config.yml.example new file mode 100644 index 0000000..5accca3 --- /dev/null +++ b/cmd/warehost-auth-dovecot/config.yml.example @@ -0,0 +1,2 @@ +--- +database: "host=localhost user=warehost dbname=warehost password=hallo sslmode=disable" diff --git a/cmd/warehost-auth-dovecot/main.go b/cmd/warehost-auth-dovecot/main.go new file mode 100644 index 0000000..3e74995 --- /dev/null +++ b/cmd/warehost-auth-dovecot/main.go @@ -0,0 +1,56 @@ +package main + +import ( + "bufio" + "os" + "os/exec" + + "database/sql" + _ "github.com/lib/pq" + + libpassword "dev.sum7.eu/sum7/warehost/lib/password" +) + +var ( + configFile string + username string + password string + execCmd string + config *Config + db *sql.DB + err error +) + +func main() { + configFile = os.Args[1] + execCmd = os.Args[2] + + pipe := os.NewFile(uintptr(3), "/dev/fd/3") + defer pipe.Close() + in := bufio.NewReader(pipe) + data, _ := in.ReadBytes(0) + username = string(data[:len(data)-1]) + data, _ = in.ReadBytes(0) + password = string(data[:len(data)-1]) + + config = ReadConfigFile(configFile) + + db, err = sql.Open("postgres", config.Database) + if err != nil { + os.Exit(1) + } + defer db.Close() + + var realPassword string + err = db.QueryRow("select password from login where mail = $1", username).Scan(&realPassword) + if err != nil { + os.Exit(1) + } + + output, _ := libpassword.Validate(realPassword, password) + if output { + exec.Command("bash", "-c", execCmd).Run() + } else { + os.Exit(1) + } +}