maddy

Fork https://github.com/foxcpp/maddy

git clone git://git.lin.moe/go/maddy.git

 1/*
 2Maddy Mail Server - Composable all-in-one email server.
 3Copyright © 2019-2020 Max Mazurov <fox.cpp@disroot.org>, Maddy Mail Server contributors
 4
 5This program is free software: you can redistribute it and/or modify
 6it under the terms of the GNU General Public License as published by
 7the Free Software Foundation, either version 3 of the License, or
 8(at your option) any later version.
 9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program.  If not, see <https://www.gnu.org/licenses/>.
17*/
18
19package external
20
21import (
22	"fmt"
23	"io"
24	"os/exec"
25
26	"github.com/foxcpp/maddy/framework/module"
27)
28
29func AuthUsingHelper(binaryPath, accountName, password string) error {
30	cmd := exec.Command(binaryPath)
31	stdin, err := cmd.StdinPipe()
32	if err != nil {
33		return fmt.Errorf("helperauth: stdin init: %w", err)
34	}
35	if err := cmd.Start(); err != nil {
36		return fmt.Errorf("helperauth: process start: %w", err)
37	}
38	if _, err := io.WriteString(stdin, accountName+"\n"); err != nil {
39		return fmt.Errorf("helperauth: stdin write: %w", err)
40	}
41	if _, err := io.WriteString(stdin, password+"\n"); err != nil {
42		return fmt.Errorf("helperauth: stdin write: %w", err)
43	}
44	if err := cmd.Wait(); err != nil {
45		if exitErr, ok := err.(*exec.ExitError); ok {
46			// Exit code 1 is for authentication failure.
47			if exitErr.ExitCode() != 1 {
48				return fmt.Errorf("helperauth: %w: %v", err, string(exitErr.Stderr))
49			}
50			return module.ErrUnknownCredentials
51		}
52		return fmt.Errorf("helperauth: process wait: %w", err)
53	}
54	return nil
55}