package auth

import (
	"net"
	"os/exec"
	"strconv"
	"strings"

	"github.com/apernet/hysteria/core/v2/server"
)

var _ server.Authenticator = &CommandAuthenticator{}

type CommandAuthenticator struct {
	Cmd string
}

func (a *CommandAuthenticator) Authenticate(addr net.Addr, auth string, tx uint64) (ok bool, id string) {
	cmd := exec.Command(a.Cmd, addr.String(), auth, strconv.Itoa(int(tx)))
	out, err := cmd.Output()
	if err != nil {
		// This includes failing to execute the command,
		// or the command exiting with a non-zero exit code.
		return false, ""
	} else {
		return true, strings.TrimSpace(string(out))
	}
}