Annotation of embedaddon/sudo/doc/sudo_plugin.cat, revision 1.1.1.5

1.1.1.3   misho       1: SUDO_PLUGIN(4)                Programmer's Manual               SUDO_PLUGIN(4)
1.1       misho       2: 
                      3: NNAAMMEE
1.1.1.3   misho       4:      ssuuddoo__pplluuggiinn - Sudo Plugin API
1.1       misho       5: 
                      6: DDEESSCCRRIIPPTTIIOONN
1.1.1.3   misho       7:      Starting with version 1.8, ssuuddoo supports a plugin API for policy and
1.1.1.4   misho       8:      session logging.  By default, the ssuuddooeerrss policy plugin and an associated
1.1.1.3   misho       9:      I/O logging plugin are used.  Via the plugin API, ssuuddoo can be configured
                     10:      to use alternate policy and/or I/O logging plugins provided by third
1.1.1.4   misho      11:      parties.  The plugins to be used are specified in the sudo.conf(4) file.
1.1.1.3   misho      12: 
                     13:      The API is versioned with a major and minor number.  The minor version
                     14:      number is incremented when additions are made.  The major number is
                     15:      incremented when incompatible changes are made.  A plugin should be check
                     16:      the version passed to it and make sure that the major version matches.
                     17: 
                     18:      The plugin API is defined by the sudo_plugin.h header file.
                     19: 
                     20:    PPoolliiccyy pplluuggiinn AAPPII
                     21:      A policy plugin must declare and populate a policy_plugin struct in the
                     22:      global scope.  This structure contains pointers to the functions that
                     23:      implement the ssuuddoo policy checks.  The name of the symbol should be
1.1.1.4   misho      24:      specified in sudo.conf(4) along with a path to the plugin so that ssuuddoo
1.1.1.3   misho      25:      can load it.
                     26: 
                     27:      struct policy_plugin {
                     28:      #define SUDO_POLICY_PLUGIN     1
                     29:          unsigned int type; /* always SUDO_POLICY_PLUGIN */
                     30:          unsigned int version; /* always SUDO_API_VERSION */
                     31:          int (*open)(unsigned int version, sudo_conv_t conversation,
                     32:                      sudo_printf_t plugin_printf, char * const settings[],
                     33:                      char * const user_info[], char * const user_env[],
                     34:                      char * const plugin_options[]);
                     35:          void (*close)(int exit_status, int error);
                     36:          int (*show_version)(int verbose);
                     37:          int (*check_policy)(int argc, char * const argv[],
                     38:                              char *env_add[], char **command_info[],
                     39:                              char **argv_out[], char **user_env_out[]);
                     40:          int (*list)(int argc, char * const argv[], int verbose,
                     41:                      const char *list_user);
                     42:          int (*validate)(void);
                     43:          void (*invalidate)(int remove);
                     44:          int (*init_session)(struct passwd *pwd, char **user_env[]);
                     45:          void (*register_hooks)(int version,
                     46:             int (*register_hook)(struct sudo_hook *hook));
                     47:          void (*deregister_hooks)(int version,
                     48:             int (*deregister_hook)(struct sudo_hook *hook));
                     49:      };
1.1       misho      50: 
1.1.1.3   misho      51:      The policy_plugin struct has the following fields:
1.1       misho      52: 
1.1.1.3   misho      53:      type  The type field should always be set to SUDO_POLICY_PLUGIN.
1.1       misho      54: 
1.1.1.3   misho      55:      version
1.1       misho      56:            The version field should be set to SUDO_API_VERSION.
                     57: 
                     58:            This allows ssuuddoo to determine the API version the plugin was built
                     59:            against.
                     60: 
1.1.1.3   misho      61:      open
                     62:            int (*open)(unsigned int version, sudo_conv_t conversation,
                     63:                        sudo_printf_t plugin_printf, char * const settings[],
                     64:                        char * const user_info[], char * const user_env[],
                     65:                        char * const plugin_options[]);
1.1       misho      66: 
                     67:            Returns 1 on success, 0 on failure, -1 if a general error occurred,
                     68:            or -2 if there was a usage error.  In the latter case, ssuuddoo will
                     69:            print a usage message before it exits.  If an error occurs, the
1.1.1.3   misho      70:            plugin may optionally call the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff()
1.1       misho      71:            function with SUDO_CONF_ERROR_MSG to present additional error
                     72:            information to the user.
                     73: 
                     74:            The function arguments are as follows:
                     75: 
                     76:            version
1.1.1.3   misho      77:                  The version passed in by ssuuddoo allows the plugin to determine
                     78:                  the major and minor version number of the plugin API
                     79:                  supported by ssuuddoo.
1.1       misho      80: 
                     81:            conversation
1.1.1.3   misho      82:                  A pointer to the ccoonnvveerrssaattiioonn() function that can be used by
                     83:                  the plugin to interact with the user (see below).  Returns 0
                     84:                  on success and -1 on failure.
1.1       misho      85: 
                     86:            plugin_printf
1.1.1.3   misho      87:                  A pointer to a pprriinnttff()-style function that may be used to
                     88:                  display informational or error messages (see below).  Returns
                     89:                  the number of characters printed on success and -1 on
                     90:                  failure.
1.1       misho      91: 
                     92:            settings
1.1.1.3   misho      93:                  A vector of user-supplied ssuuddoo settings in the form of
                     94:                  ``name=value'' strings.  The vector is terminated by a NULL
                     95:                  pointer.  These settings correspond to flags the user
                     96:                  specified when running ssuuddoo.  As such, they will only be
                     97:                  present when the corresponding flag has been specified on the
                     98:                  command line.
                     99: 
                    100:                  When parsing _s_e_t_t_i_n_g_s, the plugin should split on the ffiirrsstt
                    101:                  equal sign (`=') since the _n_a_m_e field will never include one
                    102:                  itself but the _v_a_l_u_e might.
                    103: 
1.1.1.4   misho     104:                  bsdauth_type=string
                    105:                        Authentication type, if specified by the --aa flag, to
                    106:                        use on systems where BSD authentication is supported.
                    107: 
                    108:                  closefrom=number
                    109:                        If specified, the user has requested via the --CC flag
                    110:                        that ssuuddoo close all files descriptors with a value of
                    111:                        _n_u_m_b_e_r or higher.  The plugin may optionally pass this,
                    112:                        or another value, back in the _c_o_m_m_a_n_d___i_n_f_o list.
                    113: 
1.1.1.3   misho     114:                  debug_flags=string
                    115:                        A comma-separated list of debug flags that correspond
1.1.1.4   misho     116:                        to ssuuddoo's Debug entry in sudo.conf(4), if there is one.
                    117:                        The flags are passed to the plugin as they appear in
                    118:                        sudo.conf(4).  The syntax used by ssuuddoo and the ssuuddooeerrss
                    119:                        plugin is _s_u_b_s_y_s_t_e_m@_p_r_i_o_r_i_t_y but the plugin is free to
                    120:                        use a different format so long as it does not include a
                    121:                        comma (`,').  There is not currently a way to specify a
                    122:                        set of debug flags specific to the plugin--the flags
                    123:                        are shared by ssuuddoo and the plugin.
1.1.1.3   misho     124: 
                    125:                  debug_level=number
                    126:                        This setting has been deprecated in favor of
                    127:                        _d_e_b_u_g___f_l_a_g_s.
                    128: 
1.1.1.4   misho     129:                  ignore_ticket=bool
                    130:                        Set to true if the user specified the --kk flag along
                    131:                        with a command, indicating that the user wishes to
                    132:                        ignore any cached authentication credentials.
                    133:                        _i_m_p_l_i_e_d___s_h_e_l_l to true.  This allows ssuuddoo with no
                    134:                        arguments to be used similarly to su(1).  If the plugin
                    135:                        does not to support this usage, it may return a value
                    136:                        of -2 from the cchheecckk__ppoolliiccyy() function, which will
                    137:                        cause ssuuddoo to print a usage message and exit.
1.1.1.3   misho     138: 
1.1.1.4   misho     139:                  implied_shell=bool
                    140:                        If the user does not specify a program on the command
                    141:                        line, ssuuddoo will pass the plugin the path to the user's
                    142:                        shell and set
1.1.1.3   misho     143: 
1.1.1.4   misho     144:                  login_class=string
                    145:                        BSD login class to use when setting resource limits and
                    146:                        nice value, if specified by the --cc flag.
1.1.1.3   misho     147: 
1.1.1.4   misho     148:                  login_shell=bool
                    149:                        Set to true if the user specified the --ii flag,
                    150:                        indicating that the user wishes to run a login shell.
                    151: 
                    152:                  max_groups=int
                    153:                        The maximum number of groups a user may belong to.
                    154:                        This will only be present if there is a corresponding
                    155:                        setting in sudo.conf(4).
                    156: 
                    157:                  network_addrs=list
                    158:                        A space-separated list of IP network addresses and
                    159:                        netmasks in the form ``addr/netmask'', e.g.
                    160:                        ``192.168.1.2/255.255.255.0''.  The address and netmask
                    161:                        pairs may be either IPv4 or IPv6, depending on what the
                    162:                        operating system supports.  If the address contains a
                    163:                        colon (`:'), it is an IPv6 address, else it is IPv4.
                    164: 
                    165:                  noninteractive=bool
                    166:                        Set to true if the user specified the --nn flag,
                    167:                        indicating that ssuuddoo should operate in non-interactive
                    168:                        mode.  The plugin may reject a command run in non-
                    169:                        interactive mode if user interaction is required.
                    170: 
                    171:                  plugin_dir=string
                    172:                        The default plugin directory used by the ssuuddoo front
                    173:                        end.  This is the default directory set at compile time
                    174:                        and may not correspond to the directory the running
                    175:                        plugin was loaded from.  It may be used by a plugin to
                    176:                        locate support files.
1.1.1.3   misho     177: 
                    178:                  preserve_environment=bool
                    179:                        Set to true if the user specified the --EE flag,
                    180:                        indicating that the user wishes to preserve the
                    181:                        environment.
                    182: 
                    183:                  preserve_groups=bool
                    184:                        Set to true if the user specified the --PP flag,
                    185:                        indicating that the user wishes to preserve the group
                    186:                        vector instead of setting it based on the runas user.
                    187: 
1.1.1.4   misho     188:                  progname=string
                    189:                        The command name that sudo was run as, typically
                    190:                        ``sudo'' or ``sudoedit''.
1.1.1.3   misho     191: 
1.1.1.4   misho     192:                  prompt=string
                    193:                        The prompt to use when requesting a password, if
                    194:                        specified via the --pp flag.
1.1.1.3   misho     195: 
1.1.1.5 ! misho     196:                  remote_host=string
        !           197:                        The name of the remote host to run the command on, if
        !           198:                        specified via the --hh option.  Support for running the
        !           199:                        command on a remote host is meant to be implemented via
        !           200:                        a helper program that is executed in place of the user-
        !           201:                        specified command.  The ssuuddoo front end is only capable
        !           202:                        of executing commands on the local host.  Only
        !           203:                        available starting with API version 1.4.
        !           204: 
1.1.1.4   misho     205:                  run_shell=bool
                    206:                        Set to true if the user specified the --ss flag,
                    207:                        indicating that the user wishes to run a shell.
                    208: 
                    209:                  runas_group=string
1.1.1.5 ! misho     210:                        The group name or gid to run the command as, if
1.1.1.4   misho     211:                        specified via the --gg flag.
                    212: 
                    213:                  runas_user=string
1.1.1.5 ! misho     214:                        The user name or uid to run the command as, if
1.1.1.4   misho     215:                        specified via the --uu flag.
1.1.1.3   misho     216: 
                    217:                  selinux_role=string
                    218:                        SELinux role to use when executing the command, if
                    219:                        specified by the --rr flag.
                    220: 
                    221:                  selinux_type=string
                    222:                        SELinux type to use when executing the command, if
                    223:                        specified by the --tt flag.
                    224: 
1.1.1.4   misho     225:                  set_home=bool
                    226:                        Set to true if the user specified the --HH flag.  If
                    227:                        true, set the HOME environment variable to the target
                    228:                        user's home directory.
1.1.1.3   misho     229: 
                    230:                  sudoedit=bool
                    231:                        Set to true when the --ee flag is is specified or if
                    232:                        invoked as ssuuddooeeddiitt.  The plugin shall substitute an
                    233:                        editor into _a_r_g_v in the cchheecckk__ppoolliiccyy() function or
                    234:                        return -2 with a usage error if the plugin does not
                    235:                        support _s_u_d_o_e_d_i_t.  For more information, see the
                    236:                        _c_h_e_c_k___p_o_l_i_c_y section.
                    237: 
                    238:                  Additional settings may be added in the future so the plugin
                    239:                  should silently ignore settings that it does not recognize.
1.1       misho     240: 
                    241:            user_info
1.1.1.3   misho     242:                  A vector of information about the user running the command in
                    243:                  the form of ``name=value'' strings.  The vector is terminated
                    244:                  by a NULL pointer.
                    245: 
                    246:                  When parsing _u_s_e_r___i_n_f_o, the plugin should split on the ffiirrsstt
                    247:                  equal sign (`=') since the _n_a_m_e field will never include one
                    248:                  itself but the _v_a_l_u_e might.
                    249: 
1.1.1.4   misho     250:                  cols=int
                    251:                        The number of columns the user's terminal supports.  If
                    252:                        there is no terminal device available, a default value
                    253:                        of 80 is used.
1.1.1.3   misho     254: 
1.1.1.4   misho     255:                  cwd=string
                    256:                        The user's current working directory.
1.1.1.3   misho     257: 
1.1.1.4   misho     258:                  egid=gid_t
                    259:                        The effective group ID of the user invoking ssuuddoo.
1.1.1.3   misho     260: 
                    261:                  euid=uid_t
                    262:                        The effective user ID of the user invoking ssuuddoo.
                    263: 
                    264:                  gid=gid_t
                    265:                        The real group ID of the user invoking ssuuddoo.
                    266: 
                    267:                  groups=list
                    268:                        The user's supplementary group list formatted as a
                    269:                        string of comma-separated group IDs.
                    270: 
                    271:                  host=string
                    272:                        The local machine's hostname as returned by the
                    273:                        gethostname(2) system call.
                    274: 
                    275:                  lines=int
                    276:                        The number of lines the user's terminal supports.  If
                    277:                        there is no terminal device available, a default value
                    278:                        of 24 is used.
                    279: 
1.1.1.4   misho     280:                  pgid=int
                    281:                        The ID of the process group that the running ssuuddoo
                    282:                        process is a member of.  Only available starting with
1.1.1.5 ! misho     283:                        API version 1.2.
1.1.1.4   misho     284: 
                    285:                  pid=int
                    286:                        The process ID of the running ssuuddoo process.  Only
1.1.1.5 ! misho     287:                        available starting with API version 1.2.
1.1.1.4   misho     288: 
                    289:                  plugin_options
                    290:                        Any (non-comment) strings immediately after the plugin
                    291:                        path are passed as arguments to the plugin.  These
                    292:                        arguments are split on a white space boundary and are
                    293:                        passed to the plugin in the form of a NULL-terminated
                    294:                        array of strings.  If no arguments were specified,
                    295:                        _p_l_u_g_i_n___o_p_t_i_o_n_s will be the NULL pointer.
                    296: 
                    297:                        NOTE: the _p_l_u_g_i_n___o_p_t_i_o_n_s parameter is only available
                    298:                        starting with API version 1.2.  A plugin mmuusstt check the
                    299:                        API version specified by the ssuuddoo front end before
                    300:                        using _p_l_u_g_i_n___o_p_t_i_o_n_s.  Failure to do so may result in a
                    301:                        crash.
                    302: 
                    303:                  ppid=int
                    304:                        The parent process ID of the running ssuuddoo process.
1.1.1.5 ! misho     305:                        Only available starting with API version 1.2.
1.1.1.4   misho     306: 
                    307:                  sid=int
                    308:                        The session ID of the running ssuuddoo process or 0 if ssuuddoo
                    309:                        is not part of a POSIX job control session.  Only
1.1.1.5 ! misho     310:                        available starting with API version 1.2.
1.1.1.4   misho     311: 
                    312:                  tcpgid=int
                    313:                        The ID of the foreground process group associated with
                    314:                        the terminal device associated with the ssuuddoo process or
                    315:                        -1 if there is no terminal present.  Only available
1.1.1.5 ! misho     316:                        starting with API version 1.2.
1.1.1.4   misho     317: 
                    318:                  tty=string
                    319:                        The path to the user's terminal device.  If the user
                    320:                        has no terminal device associated with the session, the
                    321:                        value will be empty, as in ``tty=''.
                    322: 
                    323:                  uid=uid_t
                    324:                        The real user ID of the user invoking ssuuddoo.
                    325: 
                    326:                  user=string
                    327:                        The name of the user invoking ssuuddoo.
1.1       misho     328: 
                    329:            user_env
1.1.1.3   misho     330:                  The user's environment in the form of a NULL-terminated
                    331:                  vector of ``name=value'' strings.
1.1       misho     332: 
1.1.1.3   misho     333:                  When parsing _u_s_e_r___e_n_v, the plugin should split on the ffiirrsstt
                    334:                  equal sign (`=') since the _n_a_m_e field will never include one
                    335:                  itself but the _v_a_l_u_e might.
1.1       misho     336: 
1.1.1.3   misho     337:      close
                    338:            void (*close)(int exit_status, int error);
1.1       misho     339: 
1.1.1.3   misho     340:            The cclloossee() function is called when the command being run by ssuuddoo
1.1       misho     341:            finishes.
                    342: 
                    343:            The function arguments are as follows:
                    344: 
                    345:            exit_status
1.1.1.3   misho     346:                  The command's exit status, as returned by the wait(2) system
                    347:                  call.  The value of exit_status is undefined if error is non-
                    348:                  zero.
1.1       misho     349: 
                    350:            error
1.1.1.3   misho     351:                  If the command could not be executed, this is set to the
                    352:                  value of errno set by the execve(2) system call.  The plugin
                    353:                  is responsible for displaying error information via the
                    354:                  ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff() function.  If the command
                    355:                  was successfully executed, the value of error is 0.
                    356: 
1.1.1.4   misho     357:            If no cclloossee() function is defined, no I/O logging plugins are
                    358:            loaded, and neither the _t_i_m_e_o_u_t not _u_s_e___p_t_y options are set in the
                    359:            command_info list, the ssuuddoo front end may execute the command
                    360:            directly instead of running it as a child process.
                    361: 
1.1.1.3   misho     362:      show_version
                    363:            int (*show_version)(int verbose);
                    364: 
                    365:            The sshhooww__vveerrssiioonn() function is called by ssuuddoo when the user
                    366:            specifies the --VV option.  The plugin may display its version
                    367:            information to the user via the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff()
                    368:            function using SUDO_CONV_INFO_MSG.  If the user requests detailed
                    369:            version information, the verbose flag will be set.
                    370: 
                    371:      check_policy
                    372:            int (*check_policy)(int argc, char * const argv[]
                    373:                                char *env_add[], char **command_info[],
                    374:                                char **argv_out[], char **user_env_out[]);
1.1       misho     375: 
1.1.1.3   misho     376:            The cchheecckk__ppoolliiccyy() function is called by ssuuddoo to determine whether
1.1       misho     377:            the user is allowed to run the specified commands.
                    378: 
                    379:            If the _s_u_d_o_e_d_i_t option was enabled in the _s_e_t_t_i_n_g_s array passed to
1.1.1.3   misho     380:            the ooppeenn() function, the user has requested _s_u_d_o_e_d_i_t mode.
                    381:            _s_u_d_o_e_d_i_t is a mechanism for editing one or more files where an
                    382:            editor is run with the user's credentials instead of with elevated
                    383:            privileges.  ssuuddoo achieves this by creating user-writable temporary
                    384:            copies of the files to be edited and then overwriting the originals
                    385:            with the temporary copies after editing is complete.  If the plugin
                    386:            supports _s_u_d_o_e_d_i_t, it should choose the editor to be used,
                    387:            potentially from a variable in the user's environment, such as
                    388:            EDITOR, and include it in _a_r_g_v___o_u_t (note that environment variables
                    389:            may include command line flags).  The files to be edited should be
                    390:            copied from _a_r_g_v into _a_r_g_v___o_u_t, separated from the editor and its
                    391:            arguments by a ``--'' element.  The ``--'' will be removed by ssuuddoo
                    392:            before the editor is executed.  The plugin should also set
                    393:            _s_u_d_o_e_d_i_t_=_t_r_u_e in the _c_o_m_m_a_n_d___i_n_f_o list.
                    394: 
                    395:            The cchheecckk__ppoolliiccyy() function returns 1 if the command is allowed, 0
                    396:            if not allowed, -1 for a general error, or -2 for a usage error or
                    397:            if _s_u_d_o_e_d_i_t was specified but is unsupported by the plugin.  In the
1.1       misho     398:            latter case, ssuuddoo will print a usage message before it exits.  If
1.1.1.3   misho     399:            an error occurs, the plugin may optionally call the ccoonnvveerrssaattiioonn()
                    400:            or pplluuggiinn__pprriinnttff() function with SUDO_CONF_ERROR_MSG to present
1.1       misho     401:            additional error information to the user.
                    402: 
                    403:            The function arguments are as follows:
                    404: 
1.1.1.3   misho     405:            argc  The number of elements in _a_r_g_v, not counting the final NULL
                    406:                  pointer.
                    407: 
                    408:            argv  The argument vector describing the command the user wishes to
                    409:                  run, in the same form as what would be passed to the
                    410:                  execve(2) system call.  The vector is terminated by a NULL
                    411:                  pointer.
1.1       misho     412: 
                    413:            env_add
1.1.1.3   misho     414:                  Additional environment variables specified by the user on the
                    415:                  command line in the form of a NULL-terminated vector of
                    416:                  ``name=value'' strings.  The plugin may reject the command if
                    417:                  one or more variables are not allowed to be set, or it may
                    418:                  silently ignore such variables.
                    419: 
                    420:                  When parsing _e_n_v___a_d_d, the plugin should split on the ffiirrsstt
                    421:                  equal sign (`=') since the _n_a_m_e field will never include one
                    422:                  itself but the _v_a_l_u_e might.
1.1       misho     423: 
                    424:            command_info
1.1.1.3   misho     425:                  Information about the command being run in the form of
                    426:                  ``name=value'' strings.  These values are used by ssuuddoo to set
                    427:                  the execution environment when running a command.  The plugin
                    428:                  is responsible for creating and populating the vector, which
                    429:                  must be terminated with a NULL pointer.  The following values
                    430:                  are recognized by ssuuddoo:
                    431: 
1.1.1.4   misho     432:                  chroot=string
                    433:                        The root directory to use when running the command.
1.1.1.3   misho     434: 
1.1.1.4   misho     435:                  closefrom=number
                    436:                        If specified, ssuuddoo will close all files descriptors
                    437:                        with a value of _n_u_m_b_e_r or higher.
1.1.1.3   misho     438: 
1.1.1.4   misho     439:                  command=string
                    440:                        Fully qualified path to the command to be executed.
1.1.1.3   misho     441: 
                    442:                  cwd=string
                    443:                        The current working directory to change to when
                    444:                        executing the command.
                    445: 
1.1.1.4   misho     446:                  exec_background=bool
                    447:                        By default, ssuuddoo runs a command as the foreground
                    448:                        process as long as ssuuddoo itself is running in the
                    449:                        foreground.  When _e_x_e_c___b_a_c_k_g_r_o_u_n_d is enabled and the
                    450:                        command is being run in a pty (due to I/O logging or
                    451:                        the _u_s_e___p_t_y setting), the command will be run as a
                    452:                        background process.  Attempts to read from the
                    453:                        controlling terminal (or to change terminal settings)
                    454:                        will result in the command being suspended with the
                    455:                        SIGTTIN signal (or SIGTTOU in the case of terminal
                    456:                        settings).  If this happens when ssuuddoo is a foreground
                    457:                        process, the command will be granted the controlling
                    458:                        terminal and resumed in the foreground with no user
                    459:                        intervention required.  The advantage of initially
                    460:                        running the command in the background is that ssuuddoo need
                    461:                        not read from the terminal unless the command
                    462:                        explicitly requests it.  Otherwise, any terminal input
                    463:                        must be passed to the command, whether it has required
                    464:                        it or not (the kernel buffers terminals so it is not
                    465:                        possible to tell whether the command really wants the
                    466:                        input).  This is different from historic _s_u_d_o behavior
                    467:                        or when the command is not being run in a pty.
                    468: 
                    469:                        For this to work seamlessly, the operating system must
                    470:                        support the automatic restarting of system calls.
                    471:                        Unfortunately, not all operating systems do this by
                    472:                        default, and even those that do may have bugs.  For
                    473:                        example, Mac OS X fails to restart the ttccggeettaattttrr() and
                    474:                        ttccsseettaattttrr() system calls (this is a bug in Mac OS X).
                    475:                        Furthermore, because this behavior depends on the
                    476:                        command stopping with the SIGTTIN or SIGTTOU signals,
                    477:                        programs that catch these signals and suspend
                    478:                        themselves with a different signal (usually SIGTOP)
                    479:                        will not be automatically foregrounded.  Some versions
                    480:                        of the linux su(1) command behave this way.  Because of
                    481:                        this, a plugin should not set _e_x_e_c___b_a_c_k_g_r_o_u_n_d unless it
                    482:                        is explicitly enabled by the administrator and there
                    483:                        should be a way to enabled or disable it on a per-
                    484:                        command basis.
1.1.1.3   misho     485: 
1.1.1.4   misho     486:                        This setting has no effect unless I/O logging is
                    487:                        enabled or _u_s_e___p_t_y is enabled.
1.1.1.3   misho     488: 
                    489:                  iolog_compress=bool
                    490:                        Set to true if the I/O logging plugins, if any, should
                    491:                        compress the log data.  This is a hint to the I/O
                    492:                        logging plugin which may choose to ignore it.
                    493: 
                    494:                  iolog_path=string
                    495:                        Fully qualified path to the file or directory in which
                    496:                        I/O log is to be stored.  This is a hint to the I/O
                    497:                        logging plugin which may choose to ignore it.  If no
                    498:                        I/O logging plugin is loaded, this setting has no
                    499:                        effect.
                    500: 
                    501:                  iolog_stdin=bool
                    502:                        Set to true if the I/O logging plugins, if any, should
                    503:                        log the standard input if it is not connected to a
                    504:                        terminal device.  This is a hint to the I/O logging
                    505:                        plugin which may choose to ignore it.
                    506: 
                    507:                  iolog_stdout=bool
                    508:                        Set to true if the I/O logging plugins, if any, should
                    509:                        log the standard output if it is not connected to a
                    510:                        terminal device.  This is a hint to the I/O logging
                    511:                        plugin which may choose to ignore it.
                    512: 
                    513:                  iolog_stderr=bool
                    514:                        Set to true if the I/O logging plugins, if any, should
                    515:                        log the standard error if it is not connected to a
                    516:                        terminal device.  This is a hint to the I/O logging
                    517:                        plugin which may choose to ignore it.
                    518: 
                    519:                  iolog_ttyin=bool
                    520:                        Set to true if the I/O logging plugins, if any, should
                    521:                        log all terminal input.  This only includes input typed
                    522:                        by the user and not from a pipe or redirected from a
                    523:                        file.  This is a hint to the I/O logging plugin which
                    524:                        may choose to ignore it.
                    525: 
                    526:                  iolog_ttyout=bool
                    527:                        Set to true if the I/O logging plugins, if any, should
                    528:                        log all terminal output.  This only includes output to
                    529:                        the screen, not output to a pipe or file.  This is a
                    530:                        hint to the I/O logging plugin which may choose to
                    531:                        ignore it.
                    532: 
1.1.1.4   misho     533:                  login_class=string
                    534:                        BSD login class to use when setting resource limits and
                    535:                        nice value (optional).  This option is only set on
                    536:                        systems that support login classes.
                    537: 
                    538:                  nice=int
                    539:                        Nice value (priority) to use when executing the
                    540:                        command.  The nice value, if specified, overrides the
                    541:                        priority associated with the _l_o_g_i_n___c_l_a_s_s on BSD
                    542:                        systems.
                    543: 
                    544:                  noexec=bool
                    545:                        If set, prevent the command from executing other
                    546:                        programs.
                    547: 
                    548:                  preserve_groups=bool
                    549:                        If set, ssuuddoo will preserve the user's group vector
                    550:                        instead of initializing the group vector based on
                    551:                        runas_user.
                    552: 
                    553:                  runas_egid=gid
                    554:                        Effective group ID to run the command as.  If not
                    555:                        specified, the value of _r_u_n_a_s___g_i_d is used.
                    556: 
                    557:                  runas_euid=uid
                    558:                        Effective user ID to run the command as.  If not
                    559:                        specified, the value of _r_u_n_a_s___u_i_d is used.
                    560: 
                    561:                  runas_gid=gid
                    562:                        Group ID to run the command as.
                    563: 
                    564:                  runas_groups=list
                    565:                        The supplementary group vector to use for the command
                    566:                        in the form of a comma-separated list of group IDs.  If
                    567:                        _p_r_e_s_e_r_v_e___g_r_o_u_p_s is set, this option is ignored.
                    568: 
                    569:                  runas_uid=uid
                    570:                        User ID to run the command as.
                    571: 
                    572:                  selinux_role=string
                    573:                        SELinux role to use when executing the command.
                    574: 
                    575:                  selinux_type=string
                    576:                        SELinux type to use when executing the command.
1.1.1.3   misho     577: 
                    578:                  set_utmp=bool
                    579:                        Create a utmp (or utmpx) entry when a pseudo-tty is
                    580:                        allocated.  By default, the new entry will be a copy of
                    581:                        the user's existing utmp entry (if any), with the tty,
                    582:                        time, type and pid fields updated.
                    583: 
1.1.1.4   misho     584:                  sudoedit=bool
                    585:                        Set to true when in _s_u_d_o_e_d_i_t mode.  The plugin may
                    586:                        enable _s_u_d_o_e_d_i_t mode even if ssuuddoo was not invoked as
                    587:                        ssuuddooeeddiitt.  This allows the plugin to perform command
                    588:                        substitution and transparently enable _s_u_d_o_e_d_i_t when the
                    589:                        user attempts to run an editor.
                    590: 
                    591:                  timeout=int
                    592:                        Command timeout.  If non-zero then when the timeout
                    593:                        expires the command will be killed.
                    594: 
                    595:                  umask=octal
                    596:                        The file creation mask to use when executing the
                    597:                        command.
                    598: 
                    599:                  use_pty=bool
                    600:                        Allocate a pseudo-tty to run the command in, regardless
                    601:                        of whether or not I/O logging is in use.  By default,
                    602:                        ssuuddoo will only run the command in a pty when an I/O log
                    603:                        plugin is loaded.
                    604: 
1.1.1.3   misho     605:                  utmp_user=string
                    606:                        User name to use when constructing a new utmp (or
                    607:                        utmpx) entry when _s_e_t___u_t_m_p is enabled.  This option can
                    608:                        be used to set the user field in the utmp entry to the
                    609:                        user the command runs as rather than the invoking user.
                    610:                        If not set, ssuuddoo will base the new entry on the
                    611:                        invoking user's existing entry.
1.1       misho     612: 
1.1.1.3   misho     613:                  Unsupported values will be ignored.
1.1       misho     614: 
                    615:            argv_out
1.1.1.3   misho     616:                  The NULL-terminated argument vector to pass to the execve(2)
                    617:                  system call when executing the command.  The plugin is
                    618:                  responsible for allocating and populating the vector.
1.1       misho     619: 
                    620:            user_env_out
1.1.1.3   misho     621:                  The NULL-terminated environment vector to use when executing
                    622:                  the command.  The plugin is responsible for allocating and
                    623:                  populating the vector.
                    624: 
                    625:      list
                    626:            int (*list)(int verbose, const char *list_user,
                    627:                        int argc, char * const argv[]);
1.1       misho     628: 
                    629:            List available privileges for the invoking user.  Returns 1 on
                    630:            success, 0 on failure and -1 on error.  On error, the plugin may
1.1.1.3   misho     631:            optionally call the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff() function with
1.1       misho     632:            SUDO_CONF_ERROR_MSG to present additional error information to the
                    633:            user.
                    634: 
1.1.1.3   misho     635:            Privileges should be output via the ccoonnvveerrssaattiioonn() or
                    636:            pplluuggiinn__pprriinnttff() function using SUDO_CONV_INFO_MSG,
1.1       misho     637: 
                    638:            verbose
1.1.1.3   misho     639:                  Flag indicating whether to list in verbose mode or not.
1.1       misho     640: 
                    641:            list_user
1.1.1.3   misho     642:                  The name of a different user to list privileges for if the
                    643:                  policy allows it.  If NULL, the plugin should list the
                    644:                  privileges of the invoking user.
                    645: 
                    646:            argc  The number of elements in _a_r_g_v, not counting the final NULL
                    647:                  pointer.
                    648: 
                    649:            argv  If non-NULL, an argument vector describing a command the user
                    650:                  wishes to check against the policy in the same form as what
                    651:                  would be passed to the execve(2) system call.  If the command
                    652:                  is permitted by the policy, the fully-qualified path to the
                    653:                  command should be displayed along with any command line
                    654:                  arguments.
1.1       misho     655: 
1.1.1.3   misho     656:      validate
                    657:            int (*validate)(void);
1.1       misho     658: 
1.1.1.3   misho     659:            The vvaalliiddaattee() function is called when ssuuddoo is run with the --vv
1.1.1.4   misho     660:            flag.  For policy plugins such as ssuuddooeerrss that cache authentication
1.1       misho     661:            credentials, this function will validate and cache the credentials.
                    662: 
1.1.1.3   misho     663:            The vvaalliiddaattee() function should be NULL if the plugin does not
                    664:            support credential caching.
1.1       misho     665: 
                    666:            Returns 1 on success, 0 on failure and -1 on error.  On error, the
1.1.1.3   misho     667:            plugin may optionally call the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff()
1.1       misho     668:            function with SUDO_CONF_ERROR_MSG to present additional error
                    669:            information to the user.
                    670: 
1.1.1.3   misho     671:      invalidate
                    672:            void (*invalidate)(int remove);
1.1       misho     673: 
1.1.1.3   misho     674:            The iinnvvaalliiddaattee() function is called when ssuuddoo is called with the --kk
1.1.1.4   misho     675:            or --KK flag.  For policy plugins such as ssuuddooeerrss that cache
1.1       misho     676:            authentication credentials, this function will invalidate the
                    677:            credentials.  If the _r_e_m_o_v_e flag is set, the plugin may remove the
                    678:            credentials instead of simply invalidating them.
                    679: 
1.1.1.3   misho     680:            The iinnvvaalliiddaattee() function should be NULL if the plugin does not
1.1       misho     681:            support credential caching.
                    682: 
1.1.1.3   misho     683:      init_session
                    684:            int (*init_session)(struct passwd *pwd, char **user_envp[);
1.1       misho     685: 
1.1.1.3   misho     686:            The iinniitt__sseessssiioonn() function is called before ssuuddoo sets up the
1.1.1.2   misho     687:            execution environment for the command.  It is run in the parent
                    688:            ssuuddoo process and before any uid or gid changes.  This can be used
                    689:            to perform session setup that is not supported by _c_o_m_m_a_n_d___i_n_f_o,
1.1.1.3   misho     690:            such as opening the PAM session.  The cclloossee() function can be used
                    691:            to tear down the session that was opened by init_session.
1.1       misho     692: 
                    693:            The _p_w_d argument points to a passwd struct for the user the command
                    694:            will be run as if the uid the command will run as was found in the
                    695:            password database, otherwise it will be NULL.
                    696: 
1.1.1.2   misho     697:            The _u_s_e_r___e_n_v argument points to the environment the command will
1.1.1.3   misho     698:            run in, in the form of a NULL-terminated vector of ``name=value''
1.1.1.2   misho     699:            strings.  This is the same string passed back to the front end via
1.1.1.3   misho     700:            the Policy Plugin's _u_s_e_r___e_n_v___o_u_t parameter.  If the iinniitt__sseessssiioonn()
1.1.1.2   misho     701:            function needs to modify the user environment, it should update the
                    702:            pointer stored in _u_s_e_r___e_n_v.  The expected use case is to merge the
                    703:            contents of the PAM environment (if any) with the contents of
                    704:            _u_s_e_r___e_n_v.  NOTE: the _u_s_e_r___e_n_v parameter is only available starting
                    705:            with API version 1.2.  A plugin mmuusstt check the API version
                    706:            specified by the ssuuddoo front end before using _u_s_e_r___e_n_v.  Failure to
                    707:            do so may result in a crash.
                    708: 
1.1       misho     709:            Returns 1 on success, 0 on failure and -1 on error.  On error, the
1.1.1.3   misho     710:            plugin may optionally call the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff()
1.1       misho     711:            function with SUDO_CONF_ERROR_MSG to present additional error
                    712:            information to the user.
                    713: 
1.1.1.3   misho     714:      register_hooks
                    715:            void (*register_hooks)(int version,
                    716:               int (*register_hook)(struct sudo_hook *hook));
1.1.1.2   misho     717: 
1.1.1.3   misho     718:            The rreeggiisstteerr__hhooookkss() function is called by the sudo front end to
1.1.1.2   misho     719:            register any hooks the plugin needs.  If the plugin does not
                    720:            support hooks, register_hooks should be set to the NULL pointer.
                    721: 
                    722:            The _v_e_r_s_i_o_n argument describes the version of the hooks API
                    723:            supported by the ssuuddoo front end.
                    724: 
1.1.1.3   misho     725:            The rreeggiisstteerr__hhooookk() function should be used to register any
                    726:            supported hooks the plugin needs.  It returns 0 on success, 1 if
                    727:            the hook type is not supported and -1 if the major version in
                    728:            struct hook does not match the front end's major hook API version.
1.1.1.2   misho     729: 
1.1.1.3   misho     730:            See the _H_o_o_k _f_u_n_c_t_i_o_n _A_P_I section below for more information about
                    731:            hooks.
1.1.1.2   misho     732: 
1.1.1.3   misho     733:            NOTE: the rreeggiisstteerr__hhooookkss() function is only available starting with
1.1.1.2   misho     734:            API version 1.2.  If the ssuuddoo front end doesn't support API version
                    735:            1.2 or higher, register_hooks will not be called.
                    736: 
1.1.1.3   misho     737:      deregister_hooks
                    738:            void (*deregister_hooks)(int version,
                    739:               int (*deregister_hook)(struct sudo_hook *hook));
1.1.1.2   misho     740: 
1.1.1.3   misho     741:            The ddeerreeggiisstteerr__hhooookkss() function is called by the sudo front end to
1.1.1.2   misho     742:            deregister any hooks the plugin has registered.  If the plugin does
                    743:            not support hooks, deregister_hooks should be set to the NULL
                    744:            pointer.
                    745: 
                    746:            The _v_e_r_s_i_o_n argument describes the version of the hooks API
                    747:            supported by the ssuuddoo front end.
                    748: 
1.1.1.3   misho     749:            The ddeerreeggiisstteerr__hhooookk() function should be used to deregister any
                    750:            hooks that were put in place by the rreeggiisstteerr__hhooookk() function.  If
                    751:            the plugin tries to deregister a hook that the front end does not
1.1.1.2   misho     752:            support, deregister_hook will return an error.
                    753: 
1.1.1.3   misho     754:            See the _H_o_o_k _f_u_n_c_t_i_o_n _A_P_I section below for more information about
                    755:            hooks.
1.1       misho     756: 
1.1.1.3   misho     757:            NOTE: the ddeerreeggiisstteerr__hhooookkss() function is only available starting
                    758:            with API version 1.2.  If the ssuuddoo front end doesn't support API
                    759:            version 1.2 or higher, deregister_hooks will not be called.
                    760: 
                    761:      _P_o_l_i_c_y _P_l_u_g_i_n _V_e_r_s_i_o_n _M_a_c_r_o_s
                    762: 
                    763:      /* Plugin API version major/minor. */
                    764:      #define SUDO_API_VERSION_MAJOR 1
                    765:      #define SUDO_API_VERSION_MINOR 2
                    766:      #define SUDO_API_MKVERSION(x, y) ((x << 16) | y)
                    767:      #define SUDO_API_VERSION SUDO_API_MKVERSION(SUDO_API_VERSION_MAJOR,\
                    768:                                                  SUDO_API_VERSION_MINOR)
                    769: 
                    770:      /* Getters and setters for API version */
                    771:      #define SUDO_API_VERSION_GET_MAJOR(v) ((v) >> 16)
                    772:      #define SUDO_API_VERSION_GET_MINOR(v) ((v) & 0xffff)
                    773:      #define SUDO_API_VERSION_SET_MAJOR(vp, n) do { \
                    774:          *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \
                    775:      } while(0)
                    776:      #define SUDO_VERSION_SET_MINOR(vp, n) do { \
                    777:          *(vp) = (*(vp) & 0xffff0000) | (n); \
                    778:      } while(0)
                    779: 
                    780:    II//OO pplluuggiinn AAPPII
                    781:      struct io_plugin {
                    782:      #define SUDO_IO_PLUGIN 2
                    783:          unsigned int type; /* always SUDO_IO_PLUGIN */
                    784:          unsigned int version; /* always SUDO_API_VERSION */
1.1.1.4   misho     785:          int (*open)(unsigned int version, sudo_conv_t conversation,
1.1.1.3   misho     786:                      sudo_printf_t plugin_printf, char * const settings[],
1.1.1.4   misho     787:                      char * const user_info[], char * const command_info[],
                    788:                      int argc, char * const argv[], char * const user_env[],
                    789:                      char * const plugin_options[]);
1.1.1.3   misho     790:          void (*close)(int exit_status, int error); /* wait status or error */
                    791:          int (*show_version)(int verbose);
                    792:          int (*log_ttyin)(const char *buf, unsigned int len);
                    793:          int (*log_ttyout)(const char *buf, unsigned int len);
                    794:          int (*log_stdin)(const char *buf, unsigned int len);
                    795:          int (*log_stdout)(const char *buf, unsigned int len);
                    796:          int (*log_stderr)(const char *buf, unsigned int len);
                    797:          void (*register_hooks)(int version,
                    798:             int (*register_hook)(struct sudo_hook *hook));
                    799:          void (*deregister_hooks)(int version,
                    800:             int (*deregister_hook)(struct sudo_hook *hook));
                    801:      };
                    802: 
                    803:      When an I/O plugin is loaded, ssuuddoo runs the command in a pseudo-tty.
                    804:      This makes it possible to log the input and output from the user's
                    805:      session.  If any of the standard input, standard output or standard error
                    806:      do not correspond to a tty, ssuuddoo will open a pipe to capture the I/O for
                    807:      logging before passing it on.
                    808: 
                    809:      The log_ttyin function receives the raw user input from the terminal
                    810:      device (note that this will include input even when echo is disabled,
                    811:      such as when a password is read).  The log_ttyout function receives
                    812:      output from the pseudo-tty that is suitable for replaying the user's
                    813:      session at a later time.  The lloogg__ssttddiinn(), lloogg__ssttddoouutt() and lloogg__ssttddeerrrr()
                    814:      functions are only called if the standard input, standard output or
                    815:      standard error respectively correspond to something other than a tty.
                    816: 
                    817:      Any of the logging functions may be set to the NULL pointer if no logging
                    818:      is to be performed.  If the open function returns 0, no I/O will be sent
                    819:      to the plugin.
1.1       misho     820: 
1.1.1.3   misho     821:      The io_plugin struct has the following fields:
1.1       misho     822: 
1.1.1.3   misho     823:      type  The type field should always be set to SUDO_IO_PLUGIN.
1.1       misho     824: 
1.1.1.3   misho     825:      version
1.1       misho     826:            The version field should be set to SUDO_API_VERSION.
                    827: 
                    828:            This allows ssuuddoo to determine the API version the plugin was built
                    829:            against.
                    830: 
1.1.1.3   misho     831:      open
1.1.1.4   misho     832:            int (*open)(unsigned int version, sudo_conv_t conversation,
1.1.1.3   misho     833:                        sudo_printf_t plugin_printf, char * const settings[],
                    834:                        char * const user_info[], int argc, char * const argv[],
                    835:                        char * const user_env[], char * const plugin_options[]);
                    836: 
                    837:            The ooppeenn() function is run before the lloogg__iinnppuutt(), lloogg__oouuttppuutt() or
                    838:            sshhooww__vveerrssiioonn() functions are called.  It is only called if the
                    839:            version is being requested or the cchheecckk__ppoolliiccyy() function has
1.1       misho     840:            returned successfully.  It returns 1 on success, 0 on failure, -1
                    841:            if a general error occurred, or -2 if there was a usage error.  In
                    842:            the latter case, ssuuddoo will print a usage message before it exits.
1.1.1.3   misho     843:            If an error occurs, the plugin may optionally call the
                    844:            ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff() function with SUDO_CONF_ERROR_MSG
                    845:            to present additional error information to the user.
1.1       misho     846: 
                    847:            The function arguments are as follows:
                    848: 
                    849:            version
1.1.1.3   misho     850:                  The version passed in by ssuuddoo allows the plugin to determine
                    851:                  the major and minor version number of the plugin API
                    852:                  supported by ssuuddoo.
1.1       misho     853: 
                    854:            conversation
1.1.1.3   misho     855:                  A pointer to the ccoonnvveerrssaattiioonn() function that may be used by
                    856:                  the sshhooww__vveerrssiioonn() function to display version information
                    857:                  (see sshhooww__vveerrssiioonn() below).  The ccoonnvveerrssaattiioonn() function may
                    858:                  also be used to display additional error message to the user.
                    859:                  The ccoonnvveerrssaattiioonn() function returns 0 on success and -1 on
                    860:                  failure.
1.1       misho     861: 
                    862:            plugin_printf
1.1.1.3   misho     863:                  A pointer to a pprriinnttff()-style function that may be used by
                    864:                  the sshhooww__vveerrssiioonn() function to display version information
                    865:                  (see show_version below).  The pplluuggiinn__pprriinnttff() function may
                    866:                  also be used to display additional error message to the user.
                    867:                  The pplluuggiinn__pprriinnttff() function returns number of characters
                    868:                  printed on success and -1 on failure.
1.1       misho     869: 
                    870:            settings
1.1.1.3   misho     871:                  A vector of user-supplied ssuuddoo settings in the form of
                    872:                  ``name=value'' strings.  The vector is terminated by a NULL
                    873:                  pointer.  These settings correspond to flags the user
                    874:                  specified when running ssuuddoo.  As such, they will only be
                    875:                  present when the corresponding flag has been specified on the
                    876:                  command line.
                    877: 
                    878:                  When parsing _s_e_t_t_i_n_g_s, the plugin should split on the ffiirrsstt
                    879:                  equal sign (`=') since the _n_a_m_e field will never include one
                    880:                  itself but the _v_a_l_u_e might.
1.1       misho     881: 
1.1.1.3   misho     882:                  See the _P_o_l_i_c_y _p_l_u_g_i_n _A_P_I section for a list of all possible
                    883:                  settings.
1.1       misho     884: 
                    885:            user_info
1.1.1.3   misho     886:                  A vector of information about the user running the command in
                    887:                  the form of ``name=value'' strings.  The vector is terminated
                    888:                  by a NULL pointer.
                    889: 
                    890:                  When parsing _u_s_e_r___i_n_f_o, the plugin should split on the ffiirrsstt
                    891:                  equal sign (`=') since the _n_a_m_e field will never include one
                    892:                  itself but the _v_a_l_u_e might.
                    893: 
                    894:                  See the _P_o_l_i_c_y _p_l_u_g_i_n _A_P_I section for a list of all possible
                    895:                  strings.
                    896: 
                    897:            argc  The number of elements in _a_r_g_v, not counting the final NULL
                    898:                  pointer.
                    899: 
                    900:            argv  If non-NULL, an argument vector describing a command the user
                    901:                  wishes to run in the same form as what would be passed to the
                    902:                  execve(2) system call.
1.1       misho     903: 
                    904:            user_env
1.1.1.3   misho     905:                  The user's environment in the form of a NULL-terminated
                    906:                  vector of ``name=value'' strings.
1.1       misho     907: 
1.1.1.3   misho     908:                  When parsing _u_s_e_r___e_n_v, the plugin should split on the ffiirrsstt
                    909:                  equal sign (`=') since the _n_a_m_e field will never include one
                    910:                  itself but the _v_a_l_u_e might.
1.1       misho     911: 
1.1.1.2   misho     912:            plugin_options
1.1.1.3   misho     913:                  Any (non-comment) strings immediately after the plugin path
                    914:                  are treated as arguments to the plugin.  These arguments are
                    915:                  split on a white space boundary and are passed to the plugin
                    916:                  in the form of a NULL-terminated array of strings.  If no
                    917:                  arguments were specified, _p_l_u_g_i_n___o_p_t_i_o_n_s will be the NULL
                    918:                  pointer.
                    919: 
                    920:                  NOTE: the _p_l_u_g_i_n___o_p_t_i_o_n_s parameter is only available starting
                    921:                  with API version 1.2.  A plugin mmuusstt check the API version
                    922:                  specified by the ssuuddoo front end before using _p_l_u_g_i_n___o_p_t_i_o_n_s.
                    923:                  Failure to do so may result in a crash.
1.1.1.2   misho     924: 
1.1.1.3   misho     925:      close
                    926:            void (*close)(int exit_status, int error);
1.1       misho     927: 
1.1.1.3   misho     928:            The cclloossee() function is called when the command being run by ssuuddoo
1.1       misho     929:            finishes.
                    930: 
                    931:            The function arguments are as follows:
                    932: 
                    933:            exit_status
1.1.1.3   misho     934:                  The command's exit status, as returned by the wait(2) system
                    935:                  call.  The value of exit_status is undefined if error is non-
                    936:                  zero.
1.1       misho     937: 
                    938:            error
1.1.1.3   misho     939:                  If the command could not be executed, this is set to the
                    940:                  value of errno set by the execve(2) system call.  If the
                    941:                  command was successfully executed, the value of error is 0.
                    942: 
                    943:      show_version
                    944:            int (*show_version)(int verbose);
                    945: 
                    946:            The sshhooww__vveerrssiioonn() function is called by ssuuddoo when the user
                    947:            specifies the --VV option.  The plugin may display its version
                    948:            information to the user via the ccoonnvveerrssaattiioonn() or pplluuggiinn__pprriinnttff()
                    949:            function using SUDO_CONV_INFO_MSG.  If the user requests detailed
                    950:            version information, the verbose flag will be set.
                    951: 
                    952:      log_ttyin
                    953:            int (*log_ttyin)(const char *buf, unsigned int len);
                    954: 
                    955:            The lloogg__ttttyyiinn() function is called whenever data can be read from
                    956:            the user but before it is passed to the running command.  This
                    957:            allows the plugin to reject data if it chooses to (for instance if
                    958:            the input contains banned content).  Returns 1 if the data should
                    959:            be passed to the command, 0 if the data is rejected (which will
1.1       misho     960:            terminate the command) or -1 if an error occurred.
                    961: 
                    962:            The function arguments are as follows:
                    963: 
1.1.1.3   misho     964:            buf   The buffer containing user input.
1.1       misho     965: 
1.1.1.3   misho     966:            len   The length of _b_u_f in bytes.
1.1       misho     967: 
1.1.1.3   misho     968:      log_ttyout
                    969:            int (*log_ttyout)(const char *buf, unsigned int len);
1.1       misho     970: 
1.1.1.3   misho     971:            The lloogg__ttttyyoouutt() function is called whenever data can be read from
1.1       misho     972:            the command but before it is written to the user's terminal.  This
                    973:            allows the plugin to reject data if it chooses to (for instance if
                    974:            the output contains banned content).  Returns 1 if the data should
                    975:            be passed to the user, 0 if the data is rejected (which will
                    976:            terminate the command) or -1 if an error occurred.
                    977: 
                    978:            The function arguments are as follows:
                    979: 
1.1.1.3   misho     980:            buf   The buffer containing command output.
1.1       misho     981: 
1.1.1.3   misho     982:            len   The length of _b_u_f in bytes.
1.1       misho     983: 
1.1.1.3   misho     984:      log_stdin
                    985:            int (*log_stdin)(const char *buf, unsigned int len);
1.1       misho     986: 
1.1.1.3   misho     987:            The lloogg__ssttddiinn() function is only used if the standard input does
                    988:            not correspond to a tty device.  It is called whenever data can be
                    989:            read from the standard input but before it is passed to the running
1.1       misho     990:            command.  This allows the plugin to reject data if it chooses to
                    991:            (for instance if the input contains banned content).  Returns 1 if
                    992:            the data should be passed to the command, 0 if the data is rejected
                    993:            (which will terminate the command) or -1 if an error occurred.
                    994: 
                    995:            The function arguments are as follows:
                    996: 
1.1.1.3   misho     997:            buf   The buffer containing user input.
1.1       misho     998: 
1.1.1.3   misho     999:            len   The length of _b_u_f in bytes.
1.1       misho    1000: 
1.1.1.3   misho    1001:      log_stdout
                   1002:            int (*log_stdout)(const char *buf, unsigned int len);
1.1       misho    1003: 
1.1.1.3   misho    1004:            The lloogg__ssttddoouutt() function is only used if the standard output does
1.1       misho    1005:            not correspond to a tty device.  It is called whenever data can be
                   1006:            read from the command but before it is written to the standard
                   1007:            output.  This allows the plugin to reject data if it chooses to
                   1008:            (for instance if the output contains banned content).  Returns 1 if
                   1009:            the data should be passed to the user, 0 if the data is rejected
                   1010:            (which will terminate the command) or -1 if an error occurred.
                   1011: 
                   1012:            The function arguments are as follows:
                   1013: 
1.1.1.3   misho    1014:            buf   The buffer containing command output.
1.1       misho    1015: 
1.1.1.3   misho    1016:            len   The length of _b_u_f in bytes.
1.1       misho    1017: 
1.1.1.3   misho    1018:      log_stderr
                   1019:            int (*log_stderr)(const char *buf, unsigned int len);
1.1       misho    1020: 
1.1.1.3   misho    1021:            The lloogg__ssttddeerrrr() function is only used if the standard error does
                   1022:            not correspond to a tty device.  It is called whenever data can be
                   1023:            read from the command but before it is written to the standard
                   1024:            error.  This allows the plugin to reject data if it chooses to (for
1.1       misho    1025:            instance if the output contains banned content).  Returns 1 if the
                   1026:            data should be passed to the user, 0 if the data is rejected (which
                   1027:            will terminate the command) or -1 if an error occurred.
                   1028: 
                   1029:            The function arguments are as follows:
                   1030: 
1.1.1.3   misho    1031:            buf   The buffer containing command output.
1.1       misho    1032: 
1.1.1.3   misho    1033:            len   The length of _b_u_f in bytes.
1.1       misho    1034: 
1.1.1.3   misho    1035:      register_hooks
                   1036:            See the _P_o_l_i_c_y _p_l_u_g_i_n _A_P_I section for a description of
1.1.1.2   misho    1037:            register_hooks.
                   1038: 
1.1.1.3   misho    1039:      deregister_hooks
                   1040:            See the _P_o_l_i_c_y _p_l_u_g_i_n _A_P_I section for a description of
1.1.1.2   misho    1041:            deregister_hooks.
                   1042: 
1.1.1.3   misho    1043:      _I_/_O _P_l_u_g_i_n _V_e_r_s_i_o_n _M_a_c_r_o_s
1.1       misho    1044: 
1.1.1.3   misho    1045:      Same as for the _P_o_l_i_c_y _p_l_u_g_i_n _A_P_I.
1.1       misho    1046: 
1.1.1.4   misho    1047:    SSiiggnnaall hhaannddlleerrss
                   1048:      The ssuuddoo front end installs default signal handlers to trap common
                   1049:      signals while the plugin functions are run.  The following signals are
                   1050:      trapped by default before the command is executed:
                   1051: 
                   1052:      oo   SIGALRM
                   1053:      oo   SIGHUP
                   1054:      oo   SIGINT
                   1055:      oo   SIGQUIT
                   1056:      oo   SIGTERM
                   1057:      oo   SIGTSTP
                   1058:      oo   SIGUSR1
                   1059:      oo   SIGUSR2
                   1060: 
                   1061:      If a fatal signal is received before the command is executed, ssuuddoo will
                   1062:      call the plugin's cclloossee() function with an exit status of 128 plus the
                   1063:      value of the signal that was received.  This allows for consistent
                   1064:      logging of commands killed by a signal for plugins that log such
                   1065:      information in their cclloossee() function.
                   1066: 
                   1067:      A plugin may temporarily install its own signal handlers but must restore
                   1068:      the original handler before the plugin function returns.
                   1069: 
1.1.1.3   misho    1070:    HHooookk ffuunnccttiioonn AAPPII
                   1071:      Beginning with plugin API version 1.2, it is possible to install hooks
                   1072:      for certain functions called by the ssuuddoo front end.
1.1.1.2   misho    1073: 
1.1.1.3   misho    1074:      Currently, the only supported hooks relate to the handling of environment
                   1075:      variables.  Hooks can be used to intercept attempts to get, set, or
                   1076:      remove environment variables so that these changes can be reflected in
                   1077:      the version of the environment that is used to execute a command.  A
                   1078:      future version of the API will support hooking internal ssuuddoo front end
                   1079:      functions as well.
1.1.1.2   misho    1080: 
1.1.1.3   misho    1081:      _H_o_o_k _s_t_r_u_c_t_u_r_e
1.1.1.2   misho    1082: 
1.1.1.3   misho    1083:      Hooks in ssuuddoo are described by the following structure:
1.1.1.2   misho    1084: 
1.1.1.3   misho    1085:      typedef int (*sudo_hook_fn_t)();
1.1.1.2   misho    1086: 
1.1.1.3   misho    1087:      struct sudo_hook {
                   1088:          int hook_version;
                   1089:          int hook_type;
                   1090:          sudo_hook_fn_t hook_fn;
                   1091:          void *closure;
                   1092:      };
1.1.1.2   misho    1093: 
1.1.1.3   misho    1094:      The sudo_hook structure has the following fields:
1.1.1.2   misho    1095: 
1.1.1.3   misho    1096:      hook_version
1.1.1.2   misho    1097:            The hook_version field should be set to SUDO_HOOK_VERSION.
                   1098: 
1.1.1.3   misho    1099:      hook_type
1.1.1.2   misho    1100:            The hook_type field may be one of the following supported hook
                   1101:            types:
                   1102: 
                   1103:            SUDO_HOOK_SETENV
1.1.1.3   misho    1104:                  The C library setenv(3) function.  Any registered hooks will
                   1105:                  run before the C library implementation.  The hook_fn field
                   1106:                  should be a function that matches the following typedef:
1.1.1.2   misho    1107: 
1.1.1.3   misho    1108:                  typedef int (*sudo_hook_fn_setenv_t)(const char *name,
                   1109:                     const char *value, int overwrite, void *closure);
1.1.1.2   misho    1110: 
1.1.1.3   misho    1111:                  If the registered hook does not match the typedef the results
                   1112:                  are unspecified.
1.1.1.2   misho    1113: 
                   1114:            SUDO_HOOK_UNSETENV
1.1.1.3   misho    1115:                  The C library unsetenv(3) function.  Any registered hooks
                   1116:                  will run before the C library implementation.  The hook_fn
                   1117:                  field should be a function that matches the following
                   1118:                  typedef:
1.1.1.2   misho    1119: 
1.1.1.3   misho    1120:                  typedef int (*sudo_hook_fn_unsetenv_t)(const char *name,
                   1121:                     void *closure);
1.1.1.2   misho    1122: 
                   1123:            SUDO_HOOK_GETENV
1.1.1.3   misho    1124:                  The C library getenv(3) function.  Any registered hooks will
                   1125:                  run before the C library implementation.  The hook_fn field
                   1126:                  should be a function that matches the following typedef:
1.1.1.2   misho    1127: 
1.1.1.3   misho    1128:                  typedef int (*sudo_hook_fn_getenv_t)(const char *name,
                   1129:                     char **value, void *closure);
1.1.1.2   misho    1130: 
1.1.1.3   misho    1131:                  If the registered hook does not match the typedef the results
                   1132:                  are unspecified.
1.1.1.2   misho    1133: 
                   1134:            SUDO_HOOK_PUTENV
1.1.1.3   misho    1135:                  The C library putenv(3) function.  Any registered hooks will
                   1136:                  run before the C library implementation.  The hook_fn field
                   1137:                  should be a function that matches the following typedef:
1.1.1.2   misho    1138: 
1.1.1.3   misho    1139:                  typedef int (*sudo_hook_fn_putenv_t)(char *string,
                   1140:                     void *closure);
1.1.1.2   misho    1141: 
1.1.1.3   misho    1142:                  If the registered hook does not match the typedef the results
                   1143:                  are unspecified.
1.1.1.2   misho    1144: 
1.1.1.3   misho    1145:      hook_fn
                   1146:            sudo_hook_fn_t hook_fn;
1.1.1.2   misho    1147: 
                   1148:            The hook_fn field should be set to the plugin's hook
                   1149:            implementation.  The actual function arguments will vary depending
                   1150:            on the hook_type (see hook_type above).  In all cases, the closure
                   1151:            field of struct sudo_hook is passed as the last function parameter.
                   1152:            This can be used to pass arbitrary data to the plugin's hook
                   1153:            implementation.
                   1154: 
                   1155:            The function return value may be one of the following:
                   1156: 
                   1157:            SUDO_HOOK_RET_ERROR
1.1.1.3   misho    1158:                  The hook function encountered an error.
1.1.1.2   misho    1159: 
                   1160:            SUDO_HOOK_RET_NEXT
1.1.1.3   misho    1161:                  The hook completed without error, go on to the next hook
                   1162:                  (including the native implementation if applicable).  For
                   1163:                  example, a getenv(3) hook might return SUDO_HOOK_RET_NEXT if
                   1164:                  the specified variable was not found in the private copy of
                   1165:                  the environment.
1.1.1.2   misho    1166: 
                   1167:            SUDO_HOOK_RET_STOP
1.1.1.3   misho    1168:                  The hook completed without error, stop processing hooks for
                   1169:                  this invocation.  This can be used to replace the native
                   1170:                  implementation.  For example, a setenv hook that operates on
                   1171:                  a private copy of the environment but leaves environ
                   1172:                  unchanged.
                   1173: 
                   1174:      Note that it is very easy to create an infinite loop when hooking C
                   1175:      library functions.  For example, a getenv(3) hook that calls the
                   1176:      snprintf(3) function may create a loop if the snprintf(3) implementation
                   1177:      calls getenv(3) to check the locale.  To prevent this, you may wish to
                   1178:      use a static variable in the hook function to guard against nested calls.
                   1179:      For example:
                   1180: 
                   1181:      static int in_progress = 0; /* avoid recursion */
                   1182:      if (in_progress)
                   1183:          return SUDO_HOOK_RET_NEXT;
                   1184:      in_progress = 1;
                   1185:      ...
                   1186:      in_progress = 0;
                   1187:      return SUDO_HOOK_RET_STOP;
                   1188: 
                   1189:      _H_o_o_k _A_P_I _V_e_r_s_i_o_n _M_a_c_r_o_s
                   1190: 
                   1191:      /* Hook API version major/minor */
                   1192:      #define SUDO_HOOK_VERSION_MAJOR 1
                   1193:      #define SUDO_HOOK_VERSION_MINOR 0
                   1194:      #define SUDO_HOOK_MKVERSION(x, y) ((x << 16) | y)
                   1195:      #define SUDO_HOOK_VERSION SUDO_HOOK_MKVERSION(SUDO_HOOK_VERSION_MAJOR,\
                   1196:                                                    SUDO_HOOK_VERSION_MINOR)
                   1197: 
                   1198:      /* Getters and setters for hook API version */
                   1199:      #define SUDO_HOOK_VERSION_GET_MAJOR(v) ((v) >> 16)
                   1200:      #define SUDO_HOOK_VERSION_GET_MINOR(v) ((v) & 0xffff)
                   1201:      #define SUDO_HOOK_VERSION_SET_MAJOR(vp, n) do { \
                   1202:          *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \
                   1203:      } while(0)
                   1204:      #define SUDO_HOOK_VERSION_SET_MINOR(vp, n) do { \
                   1205:          *(vp) = (*(vp) & 0xffff0000) | (n); \
                   1206:      } while(0)
1.1.1.2   misho    1207: 
1.1.1.5 ! misho    1208:    RReemmoottee ccoommmmaanndd eexxeeccuuttiioonn
        !          1209:      The ssuuddoo front end does not have native support for running remote
        !          1210:      commands.  However, starting with ssuuddoo 1.8.8, the --hh option may be used
        !          1211:      to specify a remote host that is passed to the policy plugin.  A plugin
        !          1212:      may also accept a _r_u_n_a_s___u_s_e_r in the form of ``user@hostname'' which will
        !          1213:      work with older versions of ssuuddoo.  It is anticipated that remote commands
        !          1214:      will be supported by executing a ``helper'' program.  The policy plugin
        !          1215:      should setup the execution environment such that the ssuuddoo front end will
        !          1216:      run the helper which, in turn, will connect to the remote host and run
        !          1217:      the command.
        !          1218: 
        !          1219:      For example, the policy plugin could utilize sssshh to perform remote
        !          1220:      command execution.  The helper program would be responsible for running
        !          1221:      sssshh with the proper options to use a private key or certificate that the
        !          1222:      remote host will accept and run a program on the remote host that would
        !          1223:      setup the execution environment accordingly.
        !          1224: 
        !          1225:      Note that remote ssuuddooeeddiitt functionality must be handled by the policy
        !          1226:      plugin, not ssuuddoo itself as the front end has no knowledge that a remote
        !          1227:      command is being executed.  This may be addressed in a future revision of
        !          1228:      the plugin API.
        !          1229: 
1.1       misho    1230:    CCoonnvveerrssaattiioonn AAPPII
1.1.1.3   misho    1231:      If the plugin needs to interact with the user, it may do so via the
                   1232:      ccoonnvveerrssaattiioonn() function.  A plugin should not attempt to read directly
                   1233:      from the standard input or the user's tty (neither of which are
                   1234:      guaranteed to exist).  The caller must include a trailing newline in msg
                   1235:      if one is to be printed.
                   1236: 
                   1237:      A pprriinnttff()-style function is also available that can be used to display
                   1238:      informational or error messages to the user, which is usually more
                   1239:      convenient for simple messages where no use input is required.
                   1240: 
                   1241:      struct sudo_conv_message {
                   1242:      #define SUDO_CONV_PROMPT_ECHO_OFF  0x0001 /* do not echo user input */
                   1243:      #define SUDO_CONV_PROMPT_ECHO_ON   0x0002 /* echo user input */
                   1244:      #define SUDO_CONV_ERROR_MSG        0x0003 /* error message */
                   1245:      #define SUDO_CONV_INFO_MSG         0x0004 /* informational message */
                   1246:      #define SUDO_CONV_PROMPT_MASK      0x0005 /* mask user input */
                   1247:      #define SUDO_CONV_DEBUG_MSG        0x0006 /* debugging message */
                   1248:      #define SUDO_CONV_PROMPT_ECHO_OK   0x1000 /* flag: allow echo if no tty */
                   1249:          int msg_type;
                   1250:          int timeout;
                   1251:          const char *msg;
                   1252:      };
                   1253: 
1.1.1.5 ! misho    1254:      #define SUDO_CONV_REPL_MAX      255
        !          1255: 
1.1.1.3   misho    1256:      struct sudo_conv_reply {
                   1257:          char *reply;
                   1258:      };
                   1259: 
                   1260:      typedef int (*sudo_conv_t)(int num_msgs,
                   1261:                   const struct sudo_conv_message msgs[],
                   1262:                   struct sudo_conv_reply replies[]);
                   1263: 
                   1264:      typedef int (*sudo_printf_t)(int msg_type, const char *fmt, ...);
                   1265: 
                   1266:      Pointers to the ccoonnvveerrssaattiioonn() and pprriinnttff()-style functions are passed in
                   1267:      to the plugin's ooppeenn() function when the plugin is initialized.
                   1268: 
                   1269:      To use the ccoonnvveerrssaattiioonn() function, the plugin must pass an array of
                   1270:      sudo_conv_message and sudo_conv_reply structures.  There must be a struct
                   1271:      sudo_conv_message and struct sudo_conv_reply for each message in the
                   1272:      conversation.  The plugin is responsible for freeing the reply buffer
1.1.1.5 ! misho    1273:      located in each struct sudo_conv_reply, if it is not NULL.
        !          1274:      SUDO_CONV_REPL_MAX represents the maximum length of the reply buffer (not
        !          1275:      including the trailing NUL character).  In practical terms, this is the
        !          1276:      longest password ssuuddoo will support.  It is also useful as a maximum value
        !          1277:      for the mmeemmsseett__ss() function when clearing passwords filled in by the
        !          1278:      conversation function.
1.1.1.3   misho    1279: 
                   1280:      The pprriinnttff()-style function uses the same underlying mechanism as the
                   1281:      ccoonnvveerrssaattiioonn() function but only supports SUDO_CONV_INFO_MSG,
                   1282:      SUDO_CONV_ERROR_MSG and SUDO_CONV_DEBUG_MSG for the _m_s_g___t_y_p_e parameter.
                   1283:      It can be more convenient than using the ccoonnvveerrssaattiioonn() function if no
                   1284:      user reply is needed and supports standard pprriinnttff() escape sequences.
                   1285: 
                   1286:      Unlike, SUDO_CONV_INFO_MSG and Dv SUDO_CONV_ERROR_MSG , messages sent
                   1287:      with the SUDO_CONV_DEBUG_MSG _m_s_g___t_y_p_e are not directly user-visible.
                   1288:      Instead, they are logged to the file specified in the Debug statement (if
1.1.1.4   misho    1289:      any) in the sudo.conf(4).  file.  This allows a plugin to log debugging
                   1290:      information and is intended to be used in conjunction with the
                   1291:      _d_e_b_u_g___f_l_a_g_s setting.
1.1.1.3   misho    1292: 
                   1293:      See the sample plugin for an example of the ccoonnvveerrssaattiioonn() function
                   1294:      usage.
                   1295: 
                   1296:    SSuuddooeerrss ggrroouupp pplluuggiinn AAPPII
1.1.1.4   misho    1297:      The ssuuddooeerrss plugin supports its own plugin interface to allow non-Unix
                   1298:      group lookups.  This can be used to query a group source other than the
                   1299:      standard Unix group database.  Two sample group plugins are bundled with
                   1300:      ssuuddoo, _g_r_o_u_p___f_i_l_e and _s_y_s_t_e_m___g_r_o_u_p, are detailed in sudoers(4).  Third
                   1301:      party group plugins include a QAS AD plugin available from Quest
                   1302:      Software.
1.1.1.3   misho    1303: 
                   1304:      A group plugin must declare and populate a sudoers_group_plugin struct in
                   1305:      the global scope.  This structure contains pointers to the functions that
                   1306:      implement plugin initialization, cleanup and group lookup.
                   1307: 
                   1308:      struct sudoers_group_plugin {
                   1309:         unsigned int version;
                   1310:         int (*init)(int version, sudo_printf_t sudo_printf,
                   1311:                     char *const argv[]);
                   1312:         void (*cleanup)(void);
                   1313:         int (*query)(const char *user, const char *group,
                   1314:                      const struct passwd *pwd);
                   1315:      };
1.1       misho    1316: 
1.1.1.3   misho    1317:      The sudoers_group_plugin struct has the following fields:
1.1       misho    1318: 
1.1.1.3   misho    1319:      version
1.1       misho    1320:            The version field should be set to GROUP_API_VERSION.
                   1321: 
1.1.1.4   misho    1322:            This allows ssuuddooeerrss to determine the API version the group plugin
1.1       misho    1323:            was built against.
                   1324: 
1.1.1.3   misho    1325:      init
                   1326:            int (*init)(int version, sudo_printf_t plugin_printf,
                   1327:                        char *const argv[]);
1.1       misho    1328: 
1.1.1.3   misho    1329:            The iinniitt() function is called after _s_u_d_o_e_r_s has been parsed but
1.1       misho    1330:            before any policy checks.  It returns 1 on success, 0 on failure
                   1331:            (or if the plugin is not configured), and -1 if a error occurred.
1.1.1.3   misho    1332:            If an error occurs, the plugin may call the pplluuggiinn__pprriinnttff()
                   1333:            function with SUDO_CONF_ERROR_MSG to present additional error
                   1334:            information to the user.
1.1       misho    1335: 
                   1336:            The function arguments are as follows:
                   1337: 
                   1338:            version
1.1.1.4   misho    1339:                  The version passed in by ssuuddooeerrss allows the plugin to
1.1.1.3   misho    1340:                  determine the major and minor version number of the group
1.1.1.4   misho    1341:                  plugin API supported by ssuuddooeerrss.
1.1       misho    1342: 
                   1343:            plugin_printf
1.1.1.3   misho    1344:                  A pointer to a pprriinnttff()-style function that may be used to
                   1345:                  display informational or error message to the user.  Returns
                   1346:                  the number of characters printed on success and -1 on
                   1347:                  failure.
                   1348: 
                   1349:            argv  A NULL-terminated array of arguments generated from the
                   1350:                  _g_r_o_u_p___p_l_u_g_i_n option in _s_u_d_o_e_r_s.  If no arguments were given,
                   1351:                  _a_r_g_v will be NULL.
                   1352: 
                   1353:      cleanup
                   1354:            void (*cleanup)();
                   1355: 
1.1.1.4   misho    1356:            The cclleeaannuupp() function is called when ssuuddooeerrss has finished its
1.1.1.3   misho    1357:            group checks.  The plugin should free any memory it has allocated
                   1358:            and close open file handles.
                   1359: 
                   1360:      query
                   1361:            int (*query)(const char *user, const char *group,
                   1362:                         const struct passwd *pwd);
1.1       misho    1363: 
1.1.1.3   misho    1364:            The qquueerryy() function is used to ask the group plugin whether _u_s_e_r
                   1365:            is a member of _g_r_o_u_p.
1.1       misho    1366: 
                   1367:            The function arguments are as follows:
                   1368: 
1.1.1.3   misho    1369:            user  The name of the user being looked up in the external group
                   1370:                  database.
1.1       misho    1371: 
                   1372:            group
1.1.1.3   misho    1373:                  The name of the group being queried.
1.1       misho    1374: 
1.1.1.3   misho    1375:            pwd   The password database entry for _u_s_e_r, if any.  If _u_s_e_r is not
                   1376:                  present in the password database, _p_w_d will be NULL.
1.1       misho    1377: 
1.1.1.3   misho    1378:      _G_r_o_u_p _A_P_I _V_e_r_s_i_o_n _M_a_c_r_o_s
1.1       misho    1379: 
1.1.1.3   misho    1380:      /* Sudoers group plugin version major/minor */
                   1381:      #define GROUP_API_VERSION_MAJOR 1
                   1382:      #define GROUP_API_VERSION_MINOR 0
                   1383:      #define GROUP_API_VERSION ((GROUP_API_VERSION_MAJOR << 16) | \
                   1384:                                 GROUP_API_VERSION_MINOR)
                   1385: 
                   1386:      /* Getters and setters for group version */
                   1387:      #define GROUP_API_VERSION_GET_MAJOR(v) ((v) >> 16)
                   1388:      #define GROUP_API_VERSION_GET_MINOR(v) ((v) & 0xffff)
                   1389:      #define GROUP_API_VERSION_SET_MAJOR(vp, n) do { \
                   1390:          *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \
                   1391:      } while(0)
                   1392:      #define GROUP_API_VERSION_SET_MINOR(vp, n) do { \
                   1393:          *(vp) = (*(vp) & 0xffff0000) | (n); \
                   1394:      } while(0)
1.1       misho    1395: 
1.1.1.2   misho    1396: PPLLUUGGIINN AAPPII CCHHAANNGGEELLOOGG
1.1.1.3   misho    1397:      The following revisions have been made to the Sudo Plugin API.
1.1.1.2   misho    1398: 
1.1.1.3   misho    1399:      Version 1.0
1.1.1.2   misho    1400:            Initial API version.
                   1401: 
1.1.1.4   misho    1402:      Version 1.1 (sudo 1.8.0)
1.1.1.3   misho    1403:            The I/O logging plugin's ooppeenn() function was modified to take the
1.1.1.2   misho    1404:            command_info list as an argument.
                   1405: 
1.1.1.4   misho    1406:      Version 1.2 (sudo 1.8.5)
1.1.1.3   misho    1407:            The Policy and I/O logging plugins' ooppeenn() functions are now passed
1.1.1.4   misho    1408:            a list of plugin parameters if any are specified in sudo.conf(4).
1.1.1.2   misho    1409: 
                   1410:            A simple hooks API has been introduced to allow plugins to hook in
                   1411:            to the system's environment handling functions.
                   1412: 
                   1413:            The init_session Policy plugin function is now passed a pointer to
                   1414:            the user environment which can be updated as needed.  This can be
                   1415:            used to merge in environment variables stored in the PAM handle
                   1416:            before a command is run.
                   1417: 
1.1.1.4   misho    1418:      Version 1.3 (sudo 1.8.7)
                   1419:            Support for the _e_x_e_c___b_a_c_k_g_r_o_u_n_d entry has been added to the
                   1420:            command_info list.
                   1421: 
                   1422:            The _m_a_x___g_r_o_u_p_s and _p_l_u_g_i_n___d_i_r entries were added to the settings
                   1423:            list.
                   1424: 
                   1425:            The vveerrssiioonn() and cclloossee() functions are now optional.  Previously,
                   1426:            a missing vveerrssiioonn() or cclloossee() function would result in a crash.
                   1427:            If no policy plugin cclloossee() function is defined, a default cclloossee()
                   1428:            function will be provided by the ssuuddoo front end that displays a
                   1429:            warning if the command could not be executed.
                   1430: 
                   1431:            The ssuuddoo front end now installs default signal handlers to trap
                   1432:            common signals while the plugin functions are run.
                   1433: 
1.1.1.5 ! misho    1434:      Version 1.4 (sudo 1.8.8)
        !          1435:            The _r_e_m_o_t_e___h_o_s_t entry was added to the settings list.
        !          1436: 
1.1       misho    1437: SSEEEE AALLSSOO
1.1.1.4   misho    1438:      sudo.conf(4), sudoers(4), sudo(1m)
1.1       misho    1439: 
                   1440: BBUUGGSS
1.1.1.3   misho    1441:      If you feel you have found a bug in ssuuddoo, please submit a bug report at
                   1442:      http://www.sudo.ws/sudo/bugs/
1.1       misho    1443: 
                   1444: SSUUPPPPOORRTT
1.1.1.3   misho    1445:      Limited free support is available via the sudo-users mailing list, see
                   1446:      http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or search the
                   1447:      archives.
1.1       misho    1448: 
                   1449: DDIISSCCLLAAIIMMEERR
1.1.1.3   misho    1450:      ssuuddoo is provided ``AS IS'' and any express or implied warranties,
                   1451:      including, but not limited to, the implied warranties of merchantability
                   1452:      and fitness for a particular purpose are disclaimed.  See the LICENSE
                   1453:      file distributed with ssuuddoo or http://www.sudo.ws/sudo/license.html for
                   1454:      complete details.
1.1       misho    1455: 
1.1.1.5 ! misho    1456: Sudo 1.8.8                      August 16, 2013                     Sudo 1.8.8

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>