X-Git-Url: https://git.armaanb.net/?p=opendoas.git;a=blobdiff_plain;f=doas.c;h=d348d2554b6f23a5c364ccccc8c8ce64cc09bf58;hp=d312b2471a6332a833829cd9148532a52a49e33f;hb=HEAD;hpb=d5acd52e2a15c36a8e06f9103d35622933aa422d diff --git a/doas.c b/doas.c index d312b24..d348d25 100644 --- a/doas.c +++ b/doas.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "openbsd.h" #include "doas.h" @@ -139,7 +140,7 @@ static int permit(uid_t uid, gid_t *groups, int ngroups, const struct rule **lastr, uid_t target, const char *cmd, const char **cmdargs) { - int i; + size_t i; *lastr = NULL; for (i = 0; i < nrules; i++) { @@ -235,6 +236,18 @@ mygetpwuid_r(uid_t uid, struct passwd *pwd, struct passwd **result) return rv; } +void +authfail(int opt) +{ + +#ifdef DOAS_INSULTS + if (opt) + printf("%s\n", getinsult()); +#endif + + errx(1, "Authentication failed"); +} + int main(int argc, char **argv) { @@ -260,6 +273,11 @@ main(int argc, char **argv) const char *cwd; char **envp; + if (argc <= 0 || argv == NULL || argv[0] == NULL) { + fprintf(stderr, "doas: executed without argv\n"); + exit(1); + } + setprogname("doas"); closefrom(STDERR_FILENO + 1); @@ -349,19 +367,14 @@ main(int argc, char **argv) errc(1, EPERM, NULL); } -#if defined(USE_SHADOW) if (!(rule->options & NOPASS)) { if (nflag) - errx(1, "Authorization required"); + errx(1, "Authentication required"); - shadowauth(mypw->pw_name, rule->options & PERSIST); + int ret = shadowauth(mypw->pw_name, rule->options & PERSIST); + if (ret == 5) + authfail(rule->options & INSULT); } -#elif !defined(USE_PAM) - /* no authentication provider, only allow NOPASS rules */ - (void) nflag; - if (!(rule->options & NOPASS)) - errx(1, "Authorization required"); -#endif if ((p = getenv("PATH")) != NULL) formerpath = strdup(p); @@ -379,11 +392,6 @@ main(int argc, char **argv) if (targpw == NULL) errx(1, "no passwd entry for target"); -#if defined(USE_PAM) - pamauth(targpw->pw_name, mypw->pw_name, !nflag, rule->options & NOPASS, - rule->options & PERSIST); -#endif - #ifdef HAVE_LOGIN_CAP_H if (setusercontext(NULL, targpw, target, LOGIN_SETGROUP | LOGIN_SETPATH |