File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / doc / sudo_plugin.cat
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:23:02 2012 UTC (12 years, 5 months ago) by misho
Branches: sudo, MAIN
CVS tags: v1_8_3p2, HEAD
sudo

    1: SUDO_PLUGIN(1m)              MAINTENANCE COMMANDS              SUDO_PLUGIN(1m)
    2: 
    3: 
    4: 
    5: NNAAMMEE
    6:        sudo_plugin - Sudo Plugin API
    7: 
    8: DDEESSCCRRIIPPTTIIOONN
    9:        Starting with version 1.8, ssuuddoo supports a plugin API for policy and
   10:        session logging.  By default, the _s_u_d_o_e_r_s policy plugin and an
   11:        associated I/O logging plugin are used.  Via the plugin API, ssuuddoo can
   12:        be configured to use alternate policy and/or I/O logging plugins
   13:        provided by third parties.  The plugins to be used are specified via
   14:        the _/_e_t_c_/_s_u_d_o_._c_o_n_f file.
   15: 
   16:        The API is versioned with a major and minor number.  The minor version
   17:        number is incremented when additions are made.  The major number is
   18:        incremented when incompatible changes are made.  A plugin should be
   19:        check the version passed to it and make sure that the major version
   20:        matches.
   21: 
   22:        The plugin API is defined by the sudo_plugin.h header file.
   23: 
   24:    TThhee ssuuddoo..ccoonnff FFiillee
   25:        The _/_e_t_c_/_s_u_d_o_._c_o_n_f file contains plugin configuration directives.
   26:        Currently, the only supported keyword is the Plugin directive, which
   27:        causes a plugin plugin to be loaded.
   28: 
   29:        A Plugin line consists of the Plugin keyword, followed by the
   30:        _s_y_m_b_o_l___n_a_m_e and the _p_a_t_h to the shared object containing the plugin.
   31:        The _s_y_m_b_o_l___n_a_m_e is the name of the struct policy_plugin or struct
   32:        io_plugin in the plugin shared object.  The _p_a_t_h may be fully qualified
   33:        or relative.  If not fully qualified it is relative to the
   34:        _/_u_s_r_/_l_o_c_a_l_/_l_i_b_e_x_e_c directory.  Any additional parameters after the _p_a_t_h
   35:        are ignored.  Lines that don't begin with Plugin or Path are silently
   36:        ignored.
   37: 
   38:        The same shared object may contain multiple plugins, each with a
   39:        different symbol name.  The shared object file must be owned by uid 0
   40:        and only writable by its owner.  Because of ambiguities that arise from
   41:        composite policies, only a single policy plugin may be specified.  This
   42:        limitation does not apply to I/O plugins.
   43: 
   44:         #
   45:         # Default /etc/sudo.conf file
   46:         #
   47:         # Format:
   48:         #   Plugin plugin_name plugin_path
   49:         #   Path askpass /path/to/askpass
   50:         #
   51:         # The plugin_path is relative to /usr/local/libexec unless
   52:         #   fully qualified.
   53:         # The plugin_name corresponds to a global symbol in the plugin
   54:         #   that contains the plugin interface structure.
   55:         #
   56:         Plugin sudoers_policy sudoers.so
   57:         Plugin sudoers_io sudoers.so
   58: 
   59:    PPoolliiccyy PPlluuggiinn AAPPII
   60:        A policy plugin must declare and populate a policy_plugin struct in the
   61:        global scope.  This structure contains pointers to the functions that
   62:        implement the ssuuddoo policy checks.  The name of the symbol should be
   63:        specified in _/_e_t_c_/_s_u_d_o_._c_o_n_f along with a path to the plugin so that
   64:        ssuuddoo can load it.
   65: 
   66:         struct policy_plugin {
   67:         #define SUDO_POLICY_PLUGIN     1
   68:             unsigned int type; /* always SUDO_POLICY_PLUGIN */
   69:             unsigned int version; /* always SUDO_API_VERSION */
   70:             int (*open)(unsigned int version, sudo_conv_t conversation,
   71:                         sudo_printf_t plugin_printf, char * const settings[],
   72:                         char * const user_info[], char * const user_env[]);
   73:             void (*close)(int exit_status, int error);
   74:             int (*show_version)(int verbose);
   75:             int (*check_policy)(int argc, char * const argv[],
   76:                                 char *env_add[], char **command_info[],
   77:                                 char **argv_out[], char **user_env_out[]);
   78:             int (*list)(int argc, char * const argv[], int verbose,
   79:                         const char *list_user);
   80:             int (*validate)(void);
   81:             void (*invalidate)(int remove);
   82:             int (*init_session)(struct passwd *pwd);
   83:         };
   84: 
   85:        The policy_plugin struct has the following fields:
   86: 
   87:        type
   88:            The type field should always be set to SUDO_POLICY_PLUGIN.
   89: 
   90:        version
   91:            The version field should be set to SUDO_API_VERSION.
   92: 
   93:            This allows ssuuddoo to determine the API version the plugin was built
   94:            against.
   95: 
   96:        open
   97:             int (*open)(unsigned int version, sudo_conv_t conversation,
   98:                         sudo_printf_t plugin_printf, char * const settings[],
   99:                         char * const user_info[], char * const user_env[]);
  100: 
  101:            Returns 1 on success, 0 on failure, -1 if a general error occurred,
  102:            or -2 if there was a usage error.  In the latter case, ssuuddoo will
  103:            print a usage message before it exits.  If an error occurs, the
  104:            plugin may optionally call the conversation or plugin_printf
  105:            function with SUDO_CONF_ERROR_MSG to present additional error
  106:            information to the user.
  107: 
  108:            The function arguments are as follows:
  109: 
  110:            version
  111:                The version passed in by ssuuddoo allows the plugin to determine
  112:                the major and minor version number of the plugin API supported
  113:                by ssuuddoo.
  114: 
  115:            conversation
  116:                A pointer to the conversation function that can be used by the
  117:                plugin to interact with the user (see below).  Returns 0 on
  118:                success and -1 on failure.
  119: 
  120:            plugin_printf
  121:                A pointer to a printf-style function that may be used to
  122:                display informational or error messages (see below).  Returns
  123:                the number of characters printed on success and -1 on failure.
  124: 
  125:            settings
  126:                A vector of user-supplied ssuuddoo settings in the form of
  127:                "name=value" strings.  The vector is terminated by a NULL
  128:                pointer.  These settings correspond to flags the user specified
  129:                when running ssuuddoo.  As such, they will only be present when the
  130:                corresponding flag has been specified on the command line.
  131: 
  132:                When parsing _s_e_t_t_i_n_g_s, the plugin should split on the ffiirrsstt
  133:                equal sign ('=') since the _n_a_m_e field will never include one
  134:                itself but the _v_a_l_u_e might.
  135: 
  136:                debug_level=number
  137:                    A numeric debug level, from 1-9, if specified via the -D
  138:                    flag.
  139: 
  140:                runas_user=string
  141:                    The user name or uid to to run the command as, if specified
  142:                    via the -u flag.
  143: 
  144:                runas_group=string
  145:                    The group name or gid to to run the command as, if
  146:                    specified via the -g flag.
  147: 
  148:                prompt=string
  149:                    The prompt to use when requesting a password, if specified
  150:                    via the -p flag.
  151: 
  152:                set_home=bool
  153:                    Set to true if the user specified the -H flag.  If true,
  154:                    set the HOME environment variable to the target user's home
  155:                    directory.
  156: 
  157:                preserve_environment=bool
  158:                    Set to true if the user specified the -E flag, indicating
  159:                    that the user wishes to preserve the environment.
  160: 
  161:                run_shell=bool
  162:                    Set to true if the user specified the -s flag, indicating
  163:                    that the user wishes to run a shell.
  164: 
  165:                login_shell=bool
  166:                    Set to true if the user specified the -i flag, indicating
  167:                    that the user wishes to run a login shell.
  168: 
  169:                implied_shell=bool
  170:                    If the user does not specify a program on the command line,
  171:                    ssuuddoo will pass the plugin the path to the user's shell and
  172:                    set _i_m_p_l_i_e_d___s_h_e_l_l to true.  This allows ssuuddoo with no
  173:                    arguments to be used similarly to _s_u(1).  If the plugin
  174:                    does not to support this usage, it may return a value of -2
  175:                    from the check_policy function, which will cause ssuuddoo to
  176:                    print a usage message and exit.
  177: 
  178:                preserve_groups=bool
  179:                    Set to true if the user specified the -P flag, indicating
  180:                    that the user wishes to preserve the group vector instead
  181:                    of setting it based on the runas user.
  182: 
  183:                ignore_ticket=bool
  184:                    Set to true if the user specified the -k flag along with a
  185:                    command, indicating that the user wishes to ignore any
  186:                    cached authentication credentials.
  187: 
  188:                noninteractive=bool
  189:                    Set to true if the user specified the -n flag, indicating
  190:                    that ssuuddoo should operate in non-interactive mode.  The
  191:                    plugin may reject a command run in non-interactive mode if
  192:                    user interaction is required.
  193: 
  194:                login_class=string
  195:                    BSD login class to use when setting resource limits and
  196:                    nice value, if specified by the -c flag.
  197: 
  198:                selinux_role=string
  199:                    SELinux role to use when executing the command, if
  200:                    specified by the -r flag.
  201: 
  202:                selinux_type=string
  203:                    SELinux type to use when executing the command, if
  204:                    specified by the -t flag.
  205: 
  206:                bsdauth_type=string
  207:                    Authentication type, if specified by the -a flag, to use on
  208:                    systems where BSD authentication is supported.
  209: 
  210:                network_addrs=list
  211:                    A space-separated list of IP network addresses and netmasks
  212:                    in the form "addr/netmask", e.g.
  213:                    "192.168.1.2/255.255.255.0".  The address and netmask pairs
  214:                    may be either IPv4 or IPv6, depending on what the operating
  215:                    system supports.  If the address contains a colon (':'), it
  216:                    is an IPv6 address, else it is IPv4.
  217: 
  218:                progname=string
  219:                    The command name that sudo was run as, typically "sudo" or
  220:                    "sudoedit".
  221: 
  222:                sudoedit=bool
  223:                    Set to true when the -e flag is is specified or if invoked
  224:                    as ssuuddooeeddiitt.  The plugin shall substitute an editor into
  225:                    _a_r_g_v in the _c_h_e_c_k___p_o_l_i_c_y function or return -2 with a usage
  226:                    error if the plugin does not support _s_u_d_o_e_d_i_t.  For more
  227:                    information, see the _c_h_e_c_k___p_o_l_i_c_y section.
  228: 
  229:                closefrom=number
  230:                    If specified, the user has requested via the -C flag that
  231:                    ssuuddoo close all files descriptors with a value of _n_u_m_b_e_r or
  232:                    higher.  The plugin may optionally pass this, or another
  233:                    value, back in the _c_o_m_m_a_n_d___i_n_f_o list.
  234: 
  235:                Additional settings may be added in the future so the plugin
  236:                should silently ignore settings that it does not recognize.
  237: 
  238:            user_info
  239:                A vector of information about the user running the command in
  240:                the form of "name=value" strings.  The vector is terminated by
  241:                a NULL pointer.
  242: 
  243:                When parsing _u_s_e_r___i_n_f_o, the plugin should split on the ffiirrsstt
  244:                equal sign ('=') since the _n_a_m_e field will never include one
  245:                itself but the _v_a_l_u_e might.
  246: 
  247:                user=string
  248:                    The name of the user invoking ssuuddoo.
  249: 
  250:                uid=uid_t
  251:                    The real user ID of the user invoking ssuuddoo.
  252: 
  253:                gid=gid_t
  254:                    The real group ID of the user invoking ssuuddoo.
  255: 
  256:                groups=list
  257:                    The user's supplementary group list formatted as a string
  258:                    of comma-separated group IDs.
  259: 
  260:                cwd=string
  261:                    The user's current working directory.
  262: 
  263:                tty=string
  264:                    The path to the user's terminal device.  If the user has no
  265:                    terminal device associated with the session, the value will
  266:                    be empty, as in tty=.
  267: 
  268:                host=string
  269:                    The local machine's hostname as returned by the
  270:                    gethostname() system call.
  271: 
  272:                lines=int
  273:                    The number of lines the user's terminal supports.  If there
  274:                    is no terminal device available, a default value of 24 is
  275:                    used.
  276: 
  277:                cols=int
  278:                    The number of columns the user's terminal supports.  If
  279:                    there is no terminal device available, a default value of
  280:                    80 is used.
  281: 
  282:            user_env
  283:                The user's environment in the form of a NULL-terminated vector
  284:                of "name=value" strings.
  285: 
  286:                When parsing _u_s_e_r___e_n_v, the plugin should split on the ffiirrsstt
  287:                equal sign ('=') since the _n_a_m_e field will never include one
  288:                itself but the _v_a_l_u_e might.
  289: 
  290:        close
  291:             void (*close)(int exit_status, int error);
  292: 
  293:            The close function is called when the command being run by ssuuddoo
  294:            finishes.
  295: 
  296:            The function arguments are as follows:
  297: 
  298:            exit_status
  299:                The command's exit status, as returned by the _w_a_i_t(2) system
  300:                call.  The value of exit_status is undefined if error is non-
  301:                zero.
  302: 
  303:            error
  304:                If the command could not be executed, this is set to the value
  305:                of errno set by the _e_x_e_c_v_e(2) system call.  The plugin is
  306:                responsible for displaying error information via the
  307:                conversation or plugin_printf function.  If the command was
  308:                successfully executed, the value of error is 0.
  309: 
  310:        show_version
  311:             int (*show_version)(int verbose);
  312: 
  313:            The show_version function is called by ssuuddoo when the user specifies
  314:            the -V option.  The plugin may display its version information to
  315:            the user via the conversation or plugin_printf function using
  316:            SUDO_CONV_INFO_MSG.  If the user requests detailed version
  317:            information, the verbose flag will be set.
  318: 
  319:        check_policy
  320:             int (*check_policy)(int argc, char * const argv[]
  321:                                 char *env_add[], char **command_info[],
  322:                                 char **argv_out[], char **user_env_out[]);
  323: 
  324:            The _c_h_e_c_k___p_o_l_i_c_y function is called by ssuuddoo to determine whether
  325:            the user is allowed to run the specified commands.
  326: 
  327:            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
  328:            the _o_p_e_n function, the user has requested _s_u_d_o_e_d_i_t mode.  _s_u_d_o_e_d_i_t
  329:            is a mechanism for editing one or more files where an editor is run
  330:            with the user's credentials instead of with elevated privileges.
  331:            ssuuddoo achieves this by creating user-writable temporary copies of
  332:            the files to be edited and then overwriting the originals with the
  333:            temporary copies after editing is complete.  If the plugin supports
  334:            ssuuddooeeddiitt, it should choose the editor to be used, potentially from
  335:            a variable in the user's environment, such as EDITOR, and include
  336:            it in _a_r_g_v___o_u_t (note that environment variables may include command
  337:            line flags).  The files to be edited should be copied from _a_r_g_v
  338:            into _a_r_g_v___o_u_t, separated from the editor and its arguments by a
  339:            "--" element.  The "--" will be removed by ssuuddoo before the editor
  340:            is executed.  The plugin should also set _s_u_d_o_e_d_i_t_=_t_r_u_e in the
  341:            _c_o_m_m_a_n_d___i_n_f_o list.
  342: 
  343:            The _c_h_e_c_k___p_o_l_i_c_y function returns 1 if the command is allowed, 0 if
  344:            not allowed, -1 for a general error, or -2 for a usage error or if
  345:            ssuuddooeeddiitt was specified but is unsupported by the plugin.  In the
  346:            latter case, ssuuddoo will print a usage message before it exits.  If
  347:            an error occurs, the plugin may optionally call the conversation or
  348:            plugin_printf function with SUDO_CONF_ERROR_MSG to present
  349:            additional error information to the user.
  350: 
  351:            The function arguments are as follows:
  352: 
  353:            argc
  354:                The number of elements in _a_r_g_v, not counting the final NULL
  355:                pointer.
  356: 
  357:            argv
  358:                The argument vector describing the command the user wishes to
  359:                run, in the same form as what would be passed to the _e_x_e_c_v_e_(_)
  360:                system call.  The vector is terminated by a NULL pointer.
  361: 
  362:            env_add
  363:                Additional environment variables specified by the user on the
  364:                command line in the form of a NULL-terminated vector of
  365:                "name=value" strings.  The plugin may reject the command if one
  366:                or more variables are not allowed to be set, or it may silently
  367:                ignore such variables.
  368: 
  369:                When parsing _e_n_v___a_d_d, the plugin should split on the ffiirrsstt
  370:                equal sign ('=') since the _n_a_m_e field will never include one
  371:                itself but the _v_a_l_u_e might.
  372: 
  373:            command_info
  374:                Information about the command being run in the form of
  375:                "name=value" strings.  These values are used by ssuuddoo to set the
  376:                execution environment when running a command.  The plugin is
  377:                responsible for creating and populating the vector, which must
  378:                be terminated with a NULL pointer.  The following values are
  379:                recognized by ssuuddoo:
  380: 
  381:                command=string
  382:                    Fully qualified path to the command to be executed.
  383: 
  384:                runas_uid=uid
  385:                    User ID to run the command as.
  386: 
  387:                runas_euid=uid
  388:                    Effective user ID to run the command as.  If not specified,
  389:                    the value of _r_u_n_a_s___u_i_d is used.
  390: 
  391:                runas_gid=gid
  392:                    Group ID to run the command as.
  393: 
  394:                runas_egid=gid
  395:                    Effective group ID to run the command as.  If not
  396:                    specified, the value of _r_u_n_a_s___g_i_d is used.
  397: 
  398:                runas_groups=list
  399:                    The supplementary group vector to use for the command in
  400:                    the form of a comma-separated list of group IDs.  If
  401:                    _p_r_e_s_e_r_v_e___g_r_o_u_p_s is set, this option is ignored.
  402: 
  403:                login_class=string
  404:                    BSD login class to use when setting resource limits and
  405:                    nice value (optional).  This option is only set on systems
  406:                    that support login classes.
  407: 
  408:                preserve_groups=bool
  409:                    If set, ssuuddoo will preserve the user's group vector instead
  410:                    of initializing the group vector based on runas_user.
  411: 
  412:                cwd=string
  413:                    The current working directory to change to when executing
  414:                    the command.
  415: 
  416:                noexec=bool
  417:                    If set, prevent the command from executing other programs.
  418: 
  419:                chroot=string
  420:                    The root directory to use when running the command.
  421: 
  422:                nice=int
  423:                    Nice value (priority) to use when executing the command.
  424:                    The nice value, if specified, overrides the priority
  425:                    associated with the _l_o_g_i_n___c_l_a_s_s on BSD systems.
  426: 
  427:                umask=octal
  428:                    The file creation mask to use when executing the command.
  429: 
  430:                selinux_role=string
  431:                    SELinux role to use when executing the command.
  432: 
  433:                selinux_type=string
  434:                    SELinux type to use when executing the command.
  435: 
  436:                timeout=int
  437:                    Command timeout.  If non-zero then when the timeout expires
  438:                    the command will be killed.
  439: 
  440:                sudoedit=bool
  441:                    Set to true when in _s_u_d_o_e_d_i_t mode.  The plugin may enable
  442:                    _s_u_d_o_e_d_i_t mode even if ssuuddoo was not invoked as ssuuddooeeddiitt.
  443:                    This allows the plugin to perform command substitution and
  444:                    transparently enable _s_u_d_o_e_d_i_t when the user attempts to run
  445:                    an editor.
  446: 
  447:                closefrom=number
  448:                    If specified, ssuuddoo will close all files descriptors with a
  449:                    value of _n_u_m_b_e_r or higher.
  450: 
  451:                iolog_compress=bool
  452:                    Set to true if the I/O logging plugins, if any, should
  453:                    compress the log data.  This is a hint to the I/O logging
  454:                    plugin which may choose to ignore it.
  455: 
  456:                iolog_path=string
  457:                    Fully qualified path to the file or directory in which I/O
  458:                    log is to be stored.  This is a hint to the I/O logging
  459:                    plugin which may choose to ignore it.  If no I/O logging
  460:                    plugin is loaded, this setting has no effect.
  461: 
  462:                iolog_stdin=bool
  463:                    Set to true if the I/O logging plugins, if any, should log
  464:                    the standard input if it is not connected to a terminal
  465:                    device.  This is a hint to the I/O logging plugin which may
  466:                    choose to ignore it.
  467: 
  468:                iolog_stdout=bool
  469:                    Set to true if the I/O logging plugins, if any, should log
  470:                    the standard output if it is not connected to a terminal
  471:                    device.  This is a hint to the I/O logging plugin which may
  472:                    choose to ignore it.
  473: 
  474:                iolog_stderr=bool
  475:                    Set to true if the I/O logging plugins, if any, should log
  476:                    the standard error if it is not connected to a terminal
  477:                    device.  This is a hint to the I/O logging plugin which may
  478:                    choose to ignore it.
  479: 
  480:                iolog_ttyin=bool
  481:                    Set to true if the I/O logging plugins, if any, should log
  482:                    all terminal input.  This only includes input typed by the
  483:                    user and not from a pipe or redirected from a file.  This
  484:                    is a hint to the I/O logging plugin which may choose to
  485:                    ignore it.
  486: 
  487:                iolog_ttyout=bool
  488:                    Set to true if the I/O logging plugins, if any, should log
  489:                    all terminal output.  This only includes output to the
  490:                    screen, not output to a pipe or file.  This is a hint to
  491:                    the I/O logging plugin which may choose to ignore it.
  492: 
  493:                use_pty=bool
  494:                    Allocate a pseudo-tty to run the command in, regardless of
  495:                    whether or not I/O logging is in use.  By default, ssuuddoo
  496:                    will only run the command in a pty when an I/O log plugin
  497:                    is loaded.
  498: 
  499:                set_utmp=bool
  500:                    Create a utmp (or utmpx) entry when a pseudo-tty is
  501:                    allocated.  By default, the new entry will be a copy of the
  502:                    user's existing utmp entry (if any), with the tty, time,
  503:                    type and pid fields updated.
  504: 
  505:                utmp_user=string
  506:                    User name to use when constructing a new utmp (or utmpx)
  507:                    entry when _s_e_t___u_t_m_p is enabled.  This option can be used to
  508:                    set the user field in the utmp entry to the user the
  509:                    command runs as rather than the invoking user.  If not set,
  510:                    ssuuddoo will base the new entry on the invoking user's
  511:                    existing entry.
  512: 
  513:                Unsupported values will be ignored.
  514: 
  515:            argv_out
  516:                The NULL-terminated argument vector to pass to the _e_x_e_c_v_e_(_)
  517:                system call when executing the command.  The plugin is
  518:                responsible for allocating and populating the vector.
  519: 
  520:            user_env_out
  521:                The NULL-terminated environment vector to use when executing
  522:                the command.  The plugin is responsible for allocating and
  523:                populating the vector.
  524: 
  525:        list
  526:             int (*list)(int verbose, const char *list_user,
  527:                         int argc, char * const argv[]);
  528: 
  529:            List available privileges for the invoking user.  Returns 1 on
  530:            success, 0 on failure and -1 on error.  On error, the plugin may
  531:            optionally call the conversation or plugin_printf function with
  532:            SUDO_CONF_ERROR_MSG to present additional error information to the
  533:            user.
  534: 
  535:            Privileges should be output via the conversation or plugin_printf
  536:            function using SUDO_CONV_INFO_MSG.
  537: 
  538:            verbose
  539:                Flag indicating whether to list in verbose mode or not.
  540: 
  541:            list_user
  542:                The name of a different user to list privileges for if the
  543:                policy allows it.  If NULL, the plugin should list the
  544:                privileges of the invoking user.
  545: 
  546:            argc
  547:                The number of elements in _a_r_g_v, not counting the final NULL
  548:                pointer.
  549: 
  550:            argv
  551:                If non-NULL, an argument vector describing a command the user
  552:                wishes to check against the policy in the same form as what
  553:                would be passed to the _e_x_e_c_v_e_(_) system call.  If the command is
  554:                permitted by the policy, the fully-qualified path to the
  555:                command should be displayed along with any command line
  556:                arguments.
  557: 
  558:        validate
  559:             int (*validate)(void);
  560: 
  561:            The validate function is called when ssuuddoo is run with the -v flag.
  562:            For policy plugins such as _s_u_d_o_e_r_s that cache authentication
  563:            credentials, this function will validate and cache the credentials.
  564: 
  565:            The validate function should be NULL if the plugin does not support
  566:            credential caching.
  567: 
  568:            Returns 1 on success, 0 on failure and -1 on error.  On error, the
  569:            plugin may optionally call the conversation or plugin_printf
  570:            function with SUDO_CONF_ERROR_MSG to present additional error
  571:            information to the user.
  572: 
  573:        invalidate
  574:             void (*invalidate)(int remove);
  575: 
  576:            The invalidate function is called when ssuuddoo is called with the -k
  577:            or -K flag.  For policy plugins such as _s_u_d_o_e_r_s that cache
  578:            authentication credentials, this function will invalidate the
  579:            credentials.  If the _r_e_m_o_v_e flag is set, the plugin may remove the
  580:            credentials instead of simply invalidating them.
  581: 
  582:            The invalidate function should be NULL if the plugin does not
  583:            support credential caching.
  584: 
  585:        init_session
  586:             int (*init_session)(struct passwd *pwd);
  587: 
  588:            The init_session function is called when ssuuddoo sets up the execution
  589:            environment for the command, immediately before the contents of the
  590:            _c_o_m_m_a_n_d___i_n_f_o list are applied (before the uid changes).  This can
  591:            be used to do session setup that is not supported by _c_o_m_m_a_n_d___i_n_f_o,
  592:            such as opening the PAM session.
  593: 
  594:            The _p_w_d argument points to a passwd struct for the user the command
  595:            will be run as if the uid the command will run as was found in the
  596:            password database, otherwise it will be NULL.
  597: 
  598:            Returns 1 on success, 0 on failure and -1 on error.  On error, the
  599:            plugin may optionally call the conversation or plugin_printf
  600:            function with SUDO_CONF_ERROR_MSG to present additional error
  601:            information to the user.
  602: 
  603:        _V_e_r_s_i_o_n _m_a_c_r_o_s
  604: 
  605:         #define SUDO_API_VERSION_GET_MAJOR(v) ((v) >> 16)
  606:         #define SUDO_API_VERSION_GET_MINOR(v) ((v) & 0xffff)
  607:         #define SUDO_API_VERSION_SET_MAJOR(vp, n) do { \
  608:             *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \
  609:         } while(0)
  610:         #define SUDO_VERSION_SET_MINOR(vp, n) do { \
  611:             *(vp) = (*(vp) & 0xffff0000) | (n); \
  612:         } while(0)
  613: 
  614:         #define SUDO_API_VERSION_MAJOR 1
  615:         #define SUDO_API_VERSION_MINOR 0
  616:         #define SUDO_API_VERSION ((SUDO_API_VERSION_MAJOR << 16) | \
  617:                                   SUDO_API_VERSION_MINOR)
  618: 
  619:    II//OO PPlluuggiinn AAPPII
  620:         struct io_plugin {
  621:         #define SUDO_IO_PLUGIN         2
  622:             unsigned int type; /* always SUDO_IO_PLUGIN */
  623:             unsigned int version; /* always SUDO_API_VERSION */
  624:             int (*open)(unsigned int version, sudo_conv_t conversation
  625:                         sudo_printf_t plugin_printf, char * const settings[],
  626:                         char * const user_info[], int argc, char * const argv[],
  627:                         char * const user_env[]);
  628:             void (*close)(int exit_status, int error); /* wait status or error */
  629:             int (*show_version)(int verbose);
  630:             int (*log_ttyin)(const char *buf, unsigned int len);
  631:             int (*log_ttyout)(const char *buf, unsigned int len);
  632:             int (*log_stdin)(const char *buf, unsigned int len);
  633:             int (*log_stdout)(const char *buf, unsigned int len);
  634:             int (*log_stderr)(const char *buf, unsigned int len);
  635:         };
  636: 
  637:        When an I/O plugin is loaded, ssuuddoo runs the command in a pseudo-tty.
  638:        This makes it possible to log the input and output from the user's
  639:        session.  If any of the standard input, standard output or standard
  640:        error do not correspond to a tty, ssuuddoo will open a pipe to capture the
  641:        I/O for logging before passing it on.
  642: 
  643:        The log_ttyin function receives the raw user input from the terminal
  644:        device (note that this will include input even when echo is disabled,
  645:        such as when a password is read). The log_ttyout function receives
  646:        output from the pseudo-tty that is suitable for replaying the user's
  647:        session at a later time.  The log_stdin, log_stdout and log_stderr
  648:        functions are only called if the standard input, standard output or
  649:        standard error respectively correspond to something other than a tty.
  650: 
  651:        Any of the logging functions may be set to the NULL pointer if no
  652:        logging is to be performed.  If the open function returns 0, no I/O
  653:        will be sent to the plugin.
  654: 
  655:        The io_plugin struct has the following fields:
  656: 
  657:        type
  658:            The type field should always be set to SUDO_IO_PLUGIN
  659: 
  660:        version
  661:            The version field should be set to SUDO_API_VERSION.
  662: 
  663:            This allows ssuuddoo to determine the API version the plugin was built
  664:            against.
  665: 
  666:        open
  667:             int (*open)(unsigned int version, sudo_conv_t conversation
  668:                         sudo_printf_t plugin_printf, char * const settings[],
  669:                         char * const user_info[], int argc, char * const argv[],
  670:                         char * const user_env[]);
  671: 
  672:            The _o_p_e_n function is run before the _l_o_g___i_n_p_u_t, _l_o_g___o_u_t_p_u_t or
  673:            _s_h_o_w___v_e_r_s_i_o_n functions are called.  It is only called if the
  674:            version is being requested or the _c_h_e_c_k___p_o_l_i_c_y function has
  675:            returned successfully.  It returns 1 on success, 0 on failure, -1
  676:            if a general error occurred, or -2 if there was a usage error.  In
  677:            the latter case, ssuuddoo will print a usage message before it exits.
  678:            If an error occurs, the plugin may optionally call the conversation
  679:            or plugin_printf function with SUDO_CONF_ERROR_MSG to present
  680:            additional error information to the user.
  681: 
  682:            The function arguments are as follows:
  683: 
  684:            version
  685:                The version passed in by ssuuddoo allows the plugin to determine
  686:                the major and minor version number of the plugin API supported
  687:                by ssuuddoo.
  688: 
  689:            conversation
  690:                A pointer to the conversation function that may be used by the
  691:                _s_h_o_w___v_e_r_s_i_o_n function to display version information (see
  692:                show_version below).  The conversation function may also be
  693:                used to display additional error message to the user.  The
  694:                conversation function returns 0 on success and -1 on failure.
  695: 
  696:            plugin_printf
  697:                A pointer to a printf-style function that may be used by the
  698:                _s_h_o_w___v_e_r_s_i_o_n function to display version information (see
  699:                show_version below).  The plugin_printf function may also be
  700:                used to display additional error message to the user.  The
  701:                plugin_printf function returns number of characters printed on
  702:                success and -1 on failure.
  703: 
  704:            settings
  705:                A vector of user-supplied ssuuddoo settings in the form of
  706:                "name=value" strings.  The vector is terminated by a NULL
  707:                pointer.  These settings correspond to flags the user specified
  708:                when running ssuuddoo.  As such, they will only be present when the
  709:                corresponding flag has been specified on the command line.
  710: 
  711:                When parsing _s_e_t_t_i_n_g_s, the plugin should split on the ffiirrsstt
  712:                equal sign ('=') since the _n_a_m_e field will never include one
  713:                itself but the _v_a_l_u_e might.
  714: 
  715:                See the "Policy Plugin API" section for a list of all possible
  716:                settings.
  717: 
  718:            user_info
  719:                A vector of information about the user running the command in
  720:                the form of "name=value" strings.  The vector is terminated by
  721:                a NULL pointer.
  722: 
  723:                When parsing _u_s_e_r___i_n_f_o, the plugin should split on the ffiirrsstt
  724:                equal sign ('=') since the _n_a_m_e field will never include one
  725:                itself but the _v_a_l_u_e might.
  726: 
  727:                See the "Policy Plugin API" section for a list of all possible
  728:                strings.
  729: 
  730:            argc
  731:                The number of elements in _a_r_g_v, not counting the final NULL
  732:                pointer.
  733: 
  734:            argv
  735:                If non-NULL, an argument vector describing a command the user
  736:                wishes to run in the same form as what would be passed to the
  737:                _e_x_e_c_v_e_(_) system call.
  738: 
  739:            user_env
  740:                The user's environment in the form of a NULL-terminated vector
  741:                of "name=value" strings.
  742: 
  743:                When parsing _u_s_e_r___e_n_v, the plugin should split on the ffiirrsstt
  744:                equal sign ('=') since the _n_a_m_e field will never include one
  745:                itself but the _v_a_l_u_e might.
  746: 
  747:        close
  748:             void (*close)(int exit_status, int error);
  749: 
  750:            The close function is called when the command being run by ssuuddoo
  751:            finishes.
  752: 
  753:            The function arguments are as follows:
  754: 
  755:            exit_status
  756:                The command's exit status, as returned by the _w_a_i_t(2) system
  757:                call.  The value of exit_status is undefined if error is non-
  758:                zero.
  759: 
  760:            error
  761:                If the command could not be executed, this is set to the value
  762:                of errno set by the _e_x_e_c_v_e(2) system call.  If the command was
  763:                successfully executed, the value of error is 0.
  764: 
  765:        show_version
  766:             int (*show_version)(int verbose);
  767: 
  768:            The show_version function is called by ssuuddoo when the user specifies
  769:            the -V option.  The plugin may display its version information to
  770:            the user via the conversation or plugin_printf function using
  771:            SUDO_CONV_INFO_MSG.  If the user requests detailed version
  772:            information, the verbose flag will be set.
  773: 
  774:        log_ttyin
  775:             int (*log_ttyin)(const char *buf, unsigned int len);
  776: 
  777:            The _l_o_g___t_t_y_i_n function is called whenever data can be read from the
  778:            user but before it is passed to the running command.  This allows
  779:            the plugin to reject data if it chooses to (for instance if the
  780:            input contains banned content).  Returns 1 if the data should be
  781:            passed to the command, 0 if the data is rejected (which will
  782:            terminate the command) or -1 if an error occurred.
  783: 
  784:            The function arguments are as follows:
  785: 
  786:            buf The buffer containing user input.
  787: 
  788:            len The length of _b_u_f in bytes.
  789: 
  790:        log_ttyout
  791:             int (*log_ttyout)(const char *buf, unsigned int len);
  792: 
  793:            The _l_o_g___t_t_y_o_u_t function is called whenever data can be read from
  794:            the command but before it is written to the user's terminal.  This
  795:            allows the plugin to reject data if it chooses to (for instance if
  796:            the output contains banned content).  Returns 1 if the data should
  797:            be passed to the user, 0 if the data is rejected (which will
  798:            terminate the command) or -1 if an error occurred.
  799: 
  800:            The function arguments are as follows:
  801: 
  802:            buf The buffer containing command output.
  803: 
  804:            len The length of _b_u_f in bytes.
  805: 
  806:        log_stdin
  807:             int (*log_stdin)(const char *buf, unsigned int len);
  808: 
  809:            The _l_o_g___s_t_d_i_n function is only used if the standard input does not
  810:            correspond to a tty device.  It is called whenever data can be read
  811:            from the standard input but before it is passed to the running
  812:            command.  This allows the plugin to reject data if it chooses to
  813:            (for instance if the input contains banned content).  Returns 1 if
  814:            the data should be passed to the command, 0 if the data is rejected
  815:            (which will terminate the command) or -1 if an error occurred.
  816: 
  817:            The function arguments are as follows:
  818: 
  819:            buf The buffer containing user input.
  820: 
  821:            len The length of _b_u_f in bytes.
  822: 
  823:        log_stdout
  824:             int (*log_stdout)(const char *buf, unsigned int len);
  825: 
  826:            The _l_o_g___s_t_d_o_u_t function is only used if the standard output does
  827:            not correspond to a tty device.  It is called whenever data can be
  828:            read from the command but before it is written to the standard
  829:            output.  This allows the plugin to reject data if it chooses to
  830:            (for instance if the output contains banned content).  Returns 1 if
  831:            the data should be passed to the user, 0 if the data is rejected
  832:            (which will terminate the command) or -1 if an error occurred.
  833: 
  834:            The function arguments are as follows:
  835: 
  836:            buf The buffer containing command output.
  837: 
  838:            len The length of _b_u_f in bytes.
  839: 
  840:        log_stderr
  841:             int (*log_stderr)(const char *buf, unsigned int len);
  842: 
  843:            The _l_o_g___s_t_d_e_r_r function is only used if the standard error does not
  844:            correspond to a tty device.  It is called whenever data can be read
  845:            from the command but before it is written to the standard error.
  846:            This allows the plugin to reject data if it chooses to (for
  847:            instance if the output contains banned content).  Returns 1 if the
  848:            data should be passed to the user, 0 if the data is rejected (which
  849:            will terminate the command) or -1 if an error occurred.
  850: 
  851:            The function arguments are as follows:
  852: 
  853:            buf The buffer containing command output.
  854: 
  855:            len The length of _b_u_f in bytes.
  856: 
  857:        _V_e_r_s_i_o_n _m_a_c_r_o_s
  858: 
  859:        Same as for the "Policy Plugin API".
  860: 
  861:    CCoonnvveerrssaattiioonn AAPPII
  862:        If the plugin needs to interact with the user, it may do so via the
  863:        conversation function.  A plugin should not attempt to read directly
  864:        from the standard input or the user's tty (neither of which are
  865:        guaranteed to exist).  The caller must include a trailing newline in
  866:        msg if one is to be printed.
  867: 
  868:        A printf-style function is also available that can be used to display
  869:        informational or error messages to the user, which is usually more
  870:        convenient for simple messages where no use input is required.
  871: 
  872:         struct sudo_conv_message {
  873:         #define SUDO_CONV_PROMPT_ECHO_OFF  0x0001 /* do not echo user input */
  874:         #define SUDO_CONV_PROMPT_ECHO_ON   0x0002 /* echo user input */
  875:         #define SUDO_CONV_ERROR_MSG        0x0003 /* error message */
  876:         #define SUDO_CONV_INFO_MSG         0x0004 /* informational message */
  877:         #define SUDO_CONV_PROMPT_MASK      0x0005 /* mask user input */
  878:         #define SUDO_CONV_PROMPT_ECHO_OK   0x1000 /* flag: allow echo if no tty */
  879:             int msg_type;
  880:             int timeout;
  881:             const char *msg;
  882:         };
  883: 
  884:         struct sudo_conv_reply {
  885:             char *reply;
  886:         };
  887: 
  888:         typedef int (*sudo_conv_t)(int num_msgs,
  889:                      const struct sudo_conv_message msgs[],
  890:                      struct sudo_conv_reply replies[]);
  891: 
  892:         typedef int (*sudo_printf_t)(int msg_type, const char *fmt, ...);
  893: 
  894:        Pointers to the conversation and printf-style functions are passed in
  895:        to the plugin's open function when the plugin is initialized.
  896: 
  897:        To use the conversation function, the plugin must pass an array of
  898:        sudo_conv_message and sudo_conv_reply structures.  There must be a
  899:        struct sudo_conv_message and struct sudo_conv_reply for each message in
  900:        the conversation.  The plugin is responsible for freeing the reply
  901:        buffer filled in to the struct sudo_conv_reply, if any.
  902: 
  903:        The printf-style function uses the same underlying mechanism as the
  904:        conversation function but only supports SUDO_CONV_INFO_MSG and
  905:        SUDO_CONV_ERROR_MSG for the _m_s_g___t_y_p_e parameter.  It can be more
  906:        convenient than using the conversation function if no user reply is
  907:        needed and supports standard _p_r_i_n_t_f_(_) escape sequences.
  908: 
  909:        See the sample plugin for an example of the conversation function
  910:        usage.
  911: 
  912:    SSuuddooeerrss GGrroouupp PPlluuggiinn AAPPII
  913:        The _s_u_d_o_e_r_s module supports a plugin interface to allow non-Unix group
  914:        lookups.  This can be used to query a group source other than the
  915:        standard Unix group database.  A sample group plugin is bundled with
  916:        ssuuddoo that implements file-based lookups.  Third party group plugins
  917:        include a QAS AD plugin available from Quest Software.
  918: 
  919:        A group plugin must declare and populate a sudoers_group_plugin struct
  920:        in the global scope.  This structure contains pointers to the functions
  921:        that implement plugin initialization, cleanup and group lookup.
  922: 
  923:         struct sudoers_group_plugin {
  924:            unsigned int version;
  925:            int (*init)(int version, sudo_printf_t sudo_printf,
  926:                        char *const argv[]);
  927:            void (*cleanup)(void);
  928:            int (*query)(const char *user, const char *group,
  929:                         const struct passwd *pwd);
  930:        };
  931: 
  932:        The sudoers_group_plugin struct has the following fields:
  933: 
  934:        version
  935:            The version field should be set to GROUP_API_VERSION.
  936: 
  937:            This allows _s_u_d_o_e_r_s to determine the API version the group plugin
  938:            was built against.
  939: 
  940:        init
  941:             int (*init)(int version, sudo_printf_t plugin_printf,
  942:                         char *const argv[]);
  943: 
  944:            The _i_n_i_t function is called after _s_u_d_o_e_r_s has been parsed but
  945:            before any policy checks.  It returns 1 on success, 0 on failure
  946:            (or if the plugin is not configured), and -1 if a error occurred.
  947:            If an error occurs, the plugin may call the plugin_printf function
  948:            with SUDO_CONF_ERROR_MSG to present additional error information to
  949:            the user.
  950: 
  951:            The function arguments are as follows:
  952: 
  953:            version
  954:                The version passed in by _s_u_d_o_e_r_s allows the plugin to determine
  955:                the major and minor version number of the group plugin API
  956:                supported by _s_u_d_o_e_r_s.
  957: 
  958:            plugin_printf
  959:                A pointer to a printf-style function that may be used to
  960:                display informational or error message to the user.  Returns
  961:                the number of characters printed on success and -1 on failure.
  962: 
  963:            argv
  964:                A NULL-terminated array of arguments generated from the
  965:                _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,
  966:                _a_r_g_v will be NULL.
  967: 
  968:        cleanup
  969:             void (*cleanup)();
  970: 
  971:            The _c_l_e_a_n_u_p function is called when _s_u_d_o_e_r_s has finished its group
  972:            checks.  The plugin should free any memory it has allocated and
  973:            close open file handles.
  974: 
  975:        query
  976:             int (*query)(const char *user, const char *group,
  977:                          const struct passwd *pwd);
  978: 
  979:            The _q_u_e_r_y function is used to ask the group plugin whether _u_s_e_r is
  980:            a member of _g_r_o_u_p.
  981: 
  982:            The function arguments are as follows:
  983: 
  984:            user
  985:                The name of the user being looked up in the external group
  986:                database.
  987: 
  988:            group
  989:                The name of the group being queried.
  990: 
  991:            pwd The password database entry for _u_s_e_r, if any.  If _u_s_e_r is not
  992:                present in the password database, _p_w_d will be NULL.
  993: 
  994:        _V_e_r_s_i_o_n _M_a_c_r_o_s
  995: 
  996:         /* Sudoers group plugin version major/minor */
  997:         #define GROUP_API_VERSION_MAJOR 1
  998:         #define GROUP_API_VERSION_MINOR 0
  999:         #define GROUP_API_VERSION ((GROUP_API_VERSION_MAJOR << 16) | \
 1000:                                    GROUP_API_VERSION_MINOR)
 1001: 
 1002:         /* Getters and setters for group version */
 1003:         #define GROUP_API_VERSION_GET_MAJOR(v) ((v) >> 16)
 1004:         #define GROUP_API_VERSION_GET_MINOR(v) ((v) & 0xffff)
 1005:         #define GROUP_API_VERSION_SET_MAJOR(vp, n) do { \
 1006:             *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \
 1007:         } while(0)
 1008:         #define GROUP_API_VERSION_SET_MINOR(vp, n) do { \
 1009:             *(vp) = (*(vp) & 0xffff0000) | (n); \
 1010:         } while(0)
 1011: 
 1012: SSEEEE AALLSSOO
 1013:        _s_u_d_o_e_r_s(4), _s_u_d_o(1m)
 1014: 
 1015: BBUUGGSS
 1016:        If you feel you have found a bug in ssuuddoo, please submit a bug report at
 1017:        http://www.sudo.ws/sudo/bugs/
 1018: 
 1019: SSUUPPPPOORRTT
 1020:        Limited free support is available via the sudo-workers mailing list,
 1021:        see http://www.sudo.ws/mailman/listinfo/sudo-workers to subscribe or
 1022:        search the archives.
 1023: 
 1024: DDIISSCCLLAAIIMMEERR
 1025:        ssuuddoo is provided ``AS IS'' and any express or implied warranties,
 1026:        including, but not limited to, the implied warranties of
 1027:        merchantability and fitness for a particular purpose are disclaimed.
 1028:        See the LICENSE file distributed with ssuuddoo or
 1029:        http://www.sudo.ws/sudo/license.html for complete details.
 1030: 
 1031: 
 1032: 
 1033: 1.8.3                         September 16, 2011               SUDO_PLUGIN(1m)

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