Après un test rapide, le binaire setuid ça va pas vraiment le faire tel que, puisque ça change pas le uid (User ID) mais le euid (Effective User ID), donc ça demanderait d’ajouter un support explicite de cette fonctionnalité dans newsletter.
EDIT: ah quoi que en fait peut-être que justement en définissant $USER à la bonne valeur dans le wrapper setuid ça devrait pouvoir le faire justement, sans avoir à toucher à newsletter.
Puisque le euid va être utilisé in fine pour créer le fichier de mail qui va ensuite être « picked up » par Postfix, donc le owner sera bien celui du wrapper, et le From sera set à partir de $USER. Je suis pas absolument certain mais ça devrait le faire.
EDIT2: toujours pas complètement testé, mais wrapper setup fonctionne déjà correctement, reste à tester wrapper send:
package main
import (
"os"
"os/exec"
"os/user"
"strconv"
)
func main() {
euid := os.Geteuid()
u, err := user.LookupId(strconv.Itoa(euid))
if err != nil {
panic(err)
}
os.Setenv("USER", u.Username)
os.Setenv("HOME", u.HomeDir)
cmd := exec.Command("newsletter", os.Args[1:]...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Run()
}
J’ai mis une version de ce wrapper avec les bonnes permissions dans /usr/local/sbin/wrapper si tu veux tester @vincent