]> granicus.if.org Git - sudo/commitdiff
Fix visiblepw sudoers option; the plugin API portion still needs documenting
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 10 Jun 2010 19:02:32 +0000 (15:02 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 10 Jun 2010 19:02:32 +0000 (15:02 -0400)
include/sudo_plugin.h
plugins/sudoers/auth/sudo_auth.c
src/conversation.c
src/sudo.h
src/tgetpass.c

index 246f628224be4a0a4ce3bafb486535377c7f69c1..ef7ccf2eb787a815fb557d63dfb28e4783389e60 100644 (file)
 
 /* Conversation function types and defines */
 struct sudo_conv_message {
-#define SUDO_CONV_PROMPT_ECHO_OFF      1       /* do not echo user input */
-#define SUDO_CONV_PROMPT_ECHO_ON       2       /* echo user input */
-#define SUDO_CONV_ERROR_MSG            3       /* error message */
-#define SUDO_CONV_INFO_MSG             4       /* informational message */
-#define SUDO_CONV_PROMPT_MASK          5       /* mask user input */
+#define SUDO_CONV_PROMPT_ECHO_OFF   0x0001  /* do not echo user input */
+#define SUDO_CONV_PROMPT_ECHO_ON    0x0002  /* echo user input */
+#define SUDO_CONV_ERROR_MSG        0x0003  /* error message */
+#define SUDO_CONV_INFO_MSG         0x0004  /* informational message */
+#define SUDO_CONV_PROMPT_MASK      0x0005  /* mask user input */
+#define SUDO_CONV_PROMPT_ECHO_OK    0x1000  /* flag: allow echo if no tty */
     int msg_type;
     int timeout;
     const char *msg;
index cf64cdd73964bde78d48909b3051eeb45f96bad8..2c676e3f80ca316505c7443f89b0fa6bba9ab12a 100644 (file)
@@ -312,6 +312,10 @@ auth_getpass(const char *prompt, int timeout, int type)
     if (type == SUDO_CONV_PROMPT_ECHO_OFF && def_pwfeedback)
        type = SUDO_CONV_PROMPT_MASK;
 
+    /* If visiblepw set, do not error out if there is no tty. */
+    if (def_visiblepw)
+       type |= SUDO_CONV_PROMPT_ECHO_OK;
+
     /* Call conversation function */
     memset(&msg, 0, sizeof(msg));
     msg.msg_type = type;
index af3f609feb250dd17965dce60fdbf8f0a89ceed8..db55fe9a07ca04be38458260e2870c974e3fb1f0 100644 (file)
@@ -66,7 +66,7 @@ sudo_conversation(int num_msgs, const struct sudo_conv_message msgs[],
     for (n = 0; n < num_msgs; n++) {
        msg = &msgs[n];
        repl = &replies[n];
-       switch (msg->msg_type) {
+       switch (msg->msg_type & 0xff) {
            case SUDO_CONV_PROMPT_ECHO_ON:
            case SUDO_CONV_PROMPT_MASK:
                if (msg->msg_type == SUDO_CONV_PROMPT_ECHO_ON)
@@ -75,6 +75,8 @@ sudo_conversation(int num_msgs, const struct sudo_conv_message msgs[],
                    SET(flags, TGP_MASK);
                /* FALLTHROUGH */
            case SUDO_CONV_PROMPT_ECHO_OFF:
+               if (ISSET(msg->msg_type, SUDO_CONV_PROMPT_ECHO_OK))
+                   SET(flags, TGP_NOECHO_TRY);
                /* Read the password unless interrupted. */
                pass = tgetpass(msg->msg, msg->timeout, flags);
                if (pass == NULL)
index 33f119e586c2db5e86157ea750ba748015d735ba..01c5138c4b2afb08ebe7404b16bac78fbbe3b32f 100644 (file)
 /*
  * Flags for tgetpass()
  */
+#define TGP_NOECHO     0x00            /* turn echo off reading pw (default) */
 #define TGP_ECHO       0x01            /* leave echo on when reading passwd */
 #define TGP_STDIN      0x02            /* read from stdin, not /dev/tty */
 #define TGP_ASKPASS    0x04            /* read from askpass helper program */
 #define TGP_MASK       0x08            /* mask user input when reading */
+#define TGP_NOECHO_TRY 0x10            /* turn off echo if possible */
 
 struct user_details {
     uid_t uid;
index 81caa29ebfd8fc7ffe90588da0429198d1603f93..7c690de2f6a8da5dc6d574edef7ce8c311c9efe4 100644 (file)
@@ -92,7 +92,8 @@ tgetpass(const char *prompt, int timeout, int flags)
     }
 
     /* If no tty present and we need to disable echo, try askpass. */
-    if (!ISSET(flags, TGP_STDIN|TGP_ECHO|TGP_ASKPASS) && !tty_present()) {
+    if (!ISSET(flags, TGP_STDIN|TGP_ECHO|TGP_ASKPASS|TGP_NOECHO_TRY) &&
+       !tty_present()) {
        if (askpass == NULL || getenv("DISPLAY") == NULL) {
            warningx("no tty present and no askpass program specified");
            return(NULL);