1/*2Maddy Mail Server - Composable all-in-one email server.3Copyright © 2019-2020 Max Mazurov <fox.cpp@disroot.org>, Maddy Mail Server contributors45This program is free software: you can redistribute it and/or modify6it under the terms of the GNU General Public License as published by7the Free Software Foundation, either version 3 of the License, or8(at your option) any later version.910This program is distributed in the hope that it will be useful,11but WITHOUT ANY WARRANTY; without even the implied warranty of12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13GNU General Public License for more details.1415You should have received a copy of the GNU General Public License16along with this program. If not, see <https://www.gnu.org/licenses/>.17*/1819package external2021import (22 "fmt"23 "io"24 "os/exec"2526 "github.com/foxcpp/maddy/framework/module"27)2829func 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.ErrUnknownCredentials51 }52 return fmt.Errorf("helperauth: process wait: %w", err)53 }54 return nil55}