File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / doc / sudo_plugin.man.in
Revision 1.1.1.6 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 16:12:54 2014 UTC (10 years ago) by misho
Branches: sudo, MAIN
CVS tags: v1_8_10p3_0, v1_8_10p3, HEAD
sudo v 1.8.10p3

    1: .\" DO NOT EDIT THIS FILE, IT IS NOT THE MASTER!
    2: .\" IT IS GENERATED AUTOMATICALLY FROM sudo_plugin.mdoc.in
    3: .\"
    4: .\" Copyright (c) 2009-2013 Todd C. Miller <Todd.Miller@courtesan.com>
    5: .\"
    6: .\" Permission to use, copy, modify, and distribute this software for any
    7: .\" purpose with or without fee is hereby granted, provided that the above
    8: .\" copyright notice and this permission notice appear in all copies.
    9: .\"
   10: .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   11: .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   12: .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   13: .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   14: .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   15: .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   16: .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   17: .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   18: .\"
   19: .TH "SUDO_PLUGIN" "5" "December 20, 2013" "Sudo @PACKAGE_VERSION@" "OpenBSD Programmer's Manual"
   20: .nh
   21: .if n .ad l
   22: .SH "NAME"
   23: \fBsudo_plugin\fR
   24: \- Sudo Plugin API
   25: .SH "DESCRIPTION"
   26: Starting with version 1.8,
   27: \fBsudo\fR
   28: supports a plugin API
   29: for policy and session logging.
   30: Plugins may be compiled as dynamic shared objects (the default on
   31: systems that support them) or compiled statically into the
   32: \fBsudo\fR
   33: binary itself.
   34: By default, the
   35: \fBsudoers\fR
   36: policy plugin and an associated I/O logging plugin are used.
   37: Via the plugin API,
   38: \fBsudo\fR
   39: can be configured to use alternate policy and/or I/O logging plugins
   40: provided by third parties.
   41: The plugins to be used are specified in the
   42: sudo.conf(@mansectform@)
   43: file.
   44: .PP
   45: The API is versioned with a major and minor number.
   46: The minor version number is incremented when additions are made.
   47: The major number is incremented when incompatible changes are made.
   48: A plugin should be check the version passed to it and make sure that the
   49: major version matches.
   50: .PP
   51: The plugin API is defined by the
   52: \fRsudo_plugin.h\fR
   53: header file.
   54: .SS "Policy plugin API"
   55: A policy plugin must declare and populate a
   56: \fRpolicy_plugin\fR
   57: struct in the global scope.
   58: This structure contains pointers to the functions that implement the
   59: \fBsudo\fR
   60: policy checks.
   61: The name of the symbol should be specified in
   62: sudo.conf(@mansectform@)
   63: along with a path to the plugin so that
   64: \fBsudo\fR
   65: can load it.
   66: .nf
   67: .sp
   68: .RS 0n
   69: struct policy_plugin {
   70: #define SUDO_POLICY_PLUGIN     1
   71:     unsigned int type; /* always SUDO_POLICY_PLUGIN */
   72:     unsigned int version; /* always SUDO_API_VERSION */
   73:     int (*open)(unsigned int version, sudo_conv_t conversation,
   74:                 sudo_printf_t plugin_printf, char * const settings[],
   75:                 char * const user_info[], char * const user_env[],
   76:                 char * const plugin_options[]);
   77:     void (*close)(int exit_status, int error);
   78:     int (*show_version)(int verbose);
   79:     int (*check_policy)(int argc, char * const argv[],
   80:                         char *env_add[], char **command_info[],
   81:                         char **argv_out[], char **user_env_out[]);
   82:     int (*list)(int argc, char * const argv[], int verbose,
   83:                 const char *list_user);
   84:     int (*validate)(void);
   85:     void (*invalidate)(int remove);
   86:     int (*init_session)(struct passwd *pwd, char **user_env[]);
   87:     void (*register_hooks)(int version,
   88:        int (*register_hook)(struct sudo_hook *hook));
   89:     void (*deregister_hooks)(int version,
   90:        int (*deregister_hook)(struct sudo_hook *hook));
   91: };
   92: .RE
   93: .fi
   94: .PP
   95: The policy_plugin struct has the following fields:
   96: .TP 6n
   97: type
   98: The
   99: \fRtype\fR
  100: field should always be set to SUDO_POLICY_PLUGIN.
  101: .TP 6n
  102: version
  103: The
  104: \fRversion\fR
  105: field should be set to
  106: \fRSUDO_API_VERSION\fR.
  107: .sp
  108: This allows
  109: \fBsudo\fR
  110: to determine the API version the plugin was
  111: built against.
  112: .TP 6n
  113: open
  114: .nf
  115: .RS 6n
  116: int (*open)(unsigned int version, sudo_conv_t conversation,
  117:             sudo_printf_t plugin_printf, char * const settings[],
  118:             char * const user_info[], char * const user_env[],
  119:             char * const plugin_options[]);
  120: .RE
  121: .fi
  122: .RS 6n
  123: .sp
  124: Returns 1 on success, 0 on failure, \-1 if a general error occurred,
  125: or \-2 if there was a usage error.
  126: In the latter case,
  127: \fBsudo\fR
  128: will print a usage message before it exits.
  129: If an error occurs, the plugin may optionally call the
  130: \fBconversation\fR()
  131: or
  132: \fBplugin_printf\fR()
  133: function with
  134: \fRSUDO_CONF_ERROR_MSG\fR
  135: to present additional error information to the user.
  136: .sp
  137: The function arguments are as follows:
  138: .TP 6n
  139: version
  140: The version passed in by
  141: \fBsudo\fR
  142: allows the plugin to determine the
  143: major and minor version number of the plugin API supported by
  144: \fBsudo\fR.
  145: .TP 6n
  146: conversation
  147: A pointer to the
  148: \fBconversation\fR()
  149: function that can be used by the plugin to interact with the user (see below).
  150: Returns 0 on success and \-1 on failure.
  151: .TP 6n
  152: plugin_printf
  153: A pointer to a
  154: \fBprintf\fR()-style
  155: function that may be used to display informational or error messages
  156: (see below).
  157: Returns the number of characters printed on success and \-1 on failure.
  158: .TP 6n
  159: settings
  160: A vector of user-supplied
  161: \fBsudo\fR
  162: settings in the form of
  163: \(lqname=value\(rq
  164: strings.
  165: The vector is terminated by a
  166: \fRNULL\fR
  167: pointer.
  168: These settings correspond to flags the user specified when running
  169: \fBsudo\fR.
  170: As such, they will only be present when the corresponding flag has
  171: been specified on the command line.
  172: .sp
  173: When parsing
  174: \fIsettings\fR,
  175: the plugin should split on the
  176: \fBfirst\fR
  177: equal sign
  178: (\(oq=\(cq)
  179: since the
  180: \fIname\fR
  181: field will never include one
  182: itself but the
  183: \fIvalue\fR
  184: might.
  185: .PP
  186: .RS 6n
  187: .PD 0
  188: .TP 6n
  189: bsdauth_type=string
  190: Authentication type, if specified by the
  191: \fB\-a\fR
  192: flag, to use on
  193: systems where BSD authentication is supported.
  194: .PD
  195: .TP 6n
  196: closefrom=number
  197: If specified, the user has requested via the
  198: \fB\-C\fR
  199: flag that
  200: \fBsudo\fR
  201: close all files descriptors with a value of
  202: \fInumber\fR
  203: or higher.
  204: The plugin may optionally pass this, or another value, back in the
  205: \fIcommand_info\fR
  206: list.
  207: .TP 6n
  208: debug_flags=string
  209: A comma-separated list of debug flags that correspond to
  210: \fBsudo\fR's
  211: \fRDebug\fR
  212: entry in
  213: sudo.conf(@mansectform@),
  214: if there is one.
  215: The flags are passed to the plugin as they appear in
  216: sudo.conf(@mansectform@).
  217: The syntax used by
  218: \fBsudo\fR
  219: and the
  220: \fBsudoers\fR
  221: plugin is
  222: \fIsubsystem\fR@\fIpriority\fR
  223: but the plugin is free to use a different
  224: format so long as it does not include a comma
  225: (\(oq,\&\(cq).
  226: There is not currently a way to specify a set of debug flags specific
  227: to the plugin--the flags are shared by
  228: \fBsudo\fR
  229: and the plugin.
  230: .TP 6n
  231: debug_level=number
  232: This setting has been deprecated in favor of
  233: \fIdebug_flags\fR.
  234: .TP 6n
  235: ignore_ticket=bool
  236: Set to true if the user specified the
  237: \fB\-k\fR
  238: flag along with a
  239: command, indicating that the user wishes to ignore any cached
  240: authentication credentials.
  241: \fIimplied_shell\fR
  242: to true.
  243: This allows
  244: \fBsudo\fR
  245: with no arguments
  246: to be used similarly to
  247: su(1).
  248: If the plugin does not to support this usage, it may return a value of \-2
  249: from the
  250: \fBcheck_policy\fR()
  251: function, which will cause
  252: \fBsudo\fR
  253: to print a usage message and
  254: exit.
  255: .TP 6n
  256: implied_shell=bool
  257: If the user does not specify a program on the command line,
  258: \fBsudo\fR
  259: will pass the plugin the path to the user's shell and set
  260: .TP 6n
  261: login_class=string
  262: BSD login class to use when setting resource limits and nice value,
  263: if specified by the
  264: \fB\-c\fR
  265: flag.
  266: .TP 6n
  267: login_shell=bool
  268: Set to true if the user specified the
  269: \fB\-i\fR
  270: flag, indicating that
  271: the user wishes to run a login shell.
  272: .TP 6n
  273: max_groups=int
  274: The maximum number of groups a user may belong to.
  275: This will only be present if there is a corresponding setting in
  276: sudo.conf(@mansectform@).
  277: .TP 6n
  278: network_addrs=list
  279: A space-separated list of IP network addresses and netmasks in the
  280: form
  281: \(lqaddr/netmask\(rq,
  282: e.g.\&
  283: \(lq192.168.1.2/255.255.255.0\(rq.
  284: The address and netmask pairs may be either IPv4 or IPv6, depending on
  285: what the operating system supports.
  286: If the address contains a colon
  287: (\(oq:\&\(cq),
  288: it is an IPv6 address, else it is IPv4.
  289: .TP 6n
  290: noninteractive=bool
  291: Set to true if the user specified the
  292: \fB\-n\fR
  293: flag, indicating that
  294: \fBsudo\fR
  295: should operate in non-interactive mode.
  296: The plugin may reject a command run in non-interactive mode if user
  297: interaction is required.
  298: .TP 6n
  299: plugin_dir=string
  300: The default plugin directory used by the
  301: \fBsudo\fR
  302: front end.
  303: This is the default directory set at compile time and may not
  304: correspond to the directory the running plugin was loaded from.
  305: It may be used by a plugin to locate support files.
  306: .TP 6n
  307: preserve_environment=bool
  308: Set to true if the user specified the
  309: \fB\-E\fR
  310: flag, indicating that
  311: the user wishes to preserve the environment.
  312: .TP 6n
  313: preserve_groups=bool
  314: Set to true if the user specified the
  315: \fB\-P\fR
  316: flag, indicating that
  317: the user wishes to preserve the group vector instead of setting it
  318: based on the runas user.
  319: .TP 6n
  320: progname=string
  321: The command name that sudo was run as, typically
  322: \(lqsudo\(rq
  323: or
  324: \(lqsudoedit\(rq.
  325: .TP 6n
  326: prompt=string
  327: The prompt to use when requesting a password, if specified via
  328: the
  329: \fB\-p\fR
  330: flag.
  331: .TP 6n
  332: remote_host=string
  333: The name of the remote host to run the command on, if specified via
  334: the
  335: \fB\-h\fR
  336: option.
  337: Support for running the command on a remote host is meant to be implemented
  338: via a helper program that is executed in place of the user-specified command.
  339: The
  340: \fBsudo\fR
  341: front end is only capable of executing commands on the local host.
  342: Only available starting with API version 1.4.
  343: .TP 6n
  344: run_shell=bool
  345: Set to true if the user specified the
  346: \fB\-s\fR
  347: flag, indicating that the user wishes to run a shell.
  348: .TP 6n
  349: runas_group=string
  350: The group name or gid to run the command as, if specified via
  351: the
  352: \fB\-g\fR
  353: flag.
  354: .TP 6n
  355: runas_user=string
  356: The user name or uid to run the command as, if specified via the
  357: \fB\-u\fR
  358: flag.
  359: .TP 6n
  360: selinux_role=string
  361: SELinux role to use when executing the command, if specified by
  362: the
  363: \fB\-r\fR
  364: flag.
  365: .TP 6n
  366: selinux_type=string
  367: SELinux type to use when executing the command, if specified by
  368: the
  369: \fB\-t\fR
  370: flag.
  371: .TP 6n
  372: set_home=bool
  373: Set to true if the user specified the
  374: \fB\-H\fR
  375: flag.
  376: If true, set the
  377: \fRHOME\fR
  378: environment variable to the target user's home directory.
  379: .TP 6n
  380: sudoedit=bool
  381: Set to true when the
  382: \fB\-e\fR
  383: flag is is specified or if invoked as
  384: \fBsudoedit\fR.
  385: The plugin shall substitute an editor into
  386: \fIargv\fR
  387: in the
  388: \fBcheck_policy\fR()
  389: function or return \-2 with a usage error
  390: if the plugin does not support
  391: \fIsudoedit\fR.
  392: For more information, see the
  393: \fIcheck_policy\fR
  394: section.
  395: .PP
  396: Additional settings may be added in the future so the plugin should
  397: silently ignore settings that it does not recognize.
  398: .RE
  399: .TP 6n
  400: user_info
  401: A vector of information about the user running the command in the form of
  402: \(lqname=value\(rq
  403: strings.
  404: The vector is terminated by a
  405: \fRNULL\fR
  406: pointer.
  407: .sp
  408: When parsing
  409: \fIuser_info\fR,
  410: the plugin should split on the
  411: \fBfirst\fR
  412: equal sign
  413: (\(oq=\(cq)
  414: since the
  415: \fIname\fR
  416: field will never include one
  417: itself but the
  418: \fIvalue\fR
  419: might.
  420: .PP
  421: .RS 6n
  422: .PD 0
  423: .TP 6n
  424: cols=int
  425: The number of columns the user's terminal supports.
  426: If there is no terminal device available, a default value of 80 is used.
  427: .PD
  428: .TP 6n
  429: cwd=string
  430: The user's current working directory.
  431: .TP 6n
  432: egid=gid_t
  433: The effective group ID of the user invoking
  434: \fBsudo\fR.
  435: .TP 6n
  436: euid=uid_t
  437: The effective user ID of the user invoking
  438: \fBsudo\fR.
  439: .TP 6n
  440: gid=gid_t
  441: The real group ID of the user invoking
  442: \fBsudo\fR.
  443: .TP 6n
  444: groups=list
  445: The user's supplementary group list formatted as a string of
  446: comma-separated group IDs.
  447: .TP 6n
  448: host=string
  449: The local machine's hostname as returned by the
  450: gethostname(2)
  451: system call.
  452: .TP 6n
  453: lines=int
  454: The number of lines the user's terminal supports.
  455: If there is
  456: no terminal device available, a default value of 24 is used.
  457: .TP 6n
  458: pgid=int
  459: The ID of the process group that the running
  460: \fBsudo\fR
  461: process is a member of.
  462: Only available starting with API version 1.2.
  463: .TP 6n
  464: pid=int
  465: The process ID of the running
  466: \fBsudo\fR
  467: process.
  468: Only available starting with API version 1.2.
  469: .TP 6n
  470: plugin_options
  471: Any (non-comment) strings immediately after the plugin path are
  472: passed as arguments to the plugin.
  473: These arguments are split on a white space boundary and are passed to
  474: the plugin in the form of a
  475: \fRNULL\fR-terminated
  476: array of strings.
  477: If no arguments were
  478: specified,
  479: \fIplugin_options\fR
  480: will be the
  481: \fRNULL\fR
  482: pointer.
  483: .sp
  484: NOTE: the
  485: \fIplugin_options\fR
  486: parameter is only available starting with
  487: API version 1.2.
  488: A plugin
  489: \fBmust\fR
  490: check the API version specified
  491: by the
  492: \fBsudo\fR
  493: front end before using
  494: \fIplugin_options\fR.
  495: Failure to do so may result in a crash.
  496: .TP 6n
  497: ppid=int
  498: The parent process ID of the running
  499: \fBsudo\fR
  500: process.
  501: Only available starting with API version 1.2.
  502: .TP 6n
  503: sid=int
  504: The session ID of the running
  505: \fBsudo\fR
  506: process or 0 if
  507: \fBsudo\fR
  508: is not part of a POSIX job control session.
  509: Only available starting with API version 1.2.
  510: .TP 6n
  511: tcpgid=int
  512: The ID of the foreground process group associated with the terminal
  513: device associated with the
  514: \fBsudo\fR
  515: process or \-1 if there is no
  516: terminal present.
  517: Only available starting with API version 1.2.
  518: .TP 6n
  519: tty=string
  520: The path to the user's terminal device.
  521: If the user has no terminal device associated with the session,
  522: the value will be empty, as in
  523: \(lq\fRtty=\fR\(rq.
  524: .TP 6n
  525: uid=uid_t
  526: The real user ID of the user invoking
  527: \fBsudo\fR.
  528: .TP 6n
  529: user=string
  530: The name of the user invoking
  531: \fBsudo\fR.
  532: .PD 0
  533: .PP
  534: .RE
  535: .PD
  536: .TP 6n
  537: user_env
  538: The user's environment in the form of a
  539: \fRNULL\fR-terminated vector of
  540: \(lqname=value\(rq
  541: strings.
  542: .sp
  543: When parsing
  544: \fIuser_env\fR,
  545: the plugin should split on the
  546: \fBfirst\fR
  547: equal sign
  548: (\(oq=\(cq)
  549: since the
  550: \fIname\fR
  551: field will never include one
  552: itself but the
  553: \fIvalue\fR
  554: might.
  555: .PD 0
  556: .PP
  557: .RE
  558: .PD
  559: .TP 6n
  560: close
  561: .br
  562: .nf
  563: .RS 6n
  564: void (*close)(int exit_status, int error);
  565: .RE
  566: .fi
  567: .RS 6n
  568: .sp
  569: The
  570: \fBclose\fR()
  571: function is called when the command being run by
  572: \fBsudo\fR
  573: finishes.
  574: .sp
  575: The function arguments are as follows:
  576: .TP 6n
  577: exit_status
  578: The command's exit status, as returned by the
  579: wait(2)
  580: system call.
  581: The value of
  582: \fRexit_status\fR
  583: is undefined if
  584: \fRerror\fR
  585: is non-zero.
  586: .TP 6n
  587: error
  588: .br
  589: If the command could not be executed, this is set to the value of
  590: \fRerrno\fR
  591: set by the
  592: execve(2)
  593: system call.
  594: The plugin is responsible for displaying error information via the
  595: \fBconversation\fR()
  596: or
  597: \fBplugin_printf\fR()
  598: function.
  599: If the command was successfully executed, the value of
  600: \fRerror\fR
  601: is 0.
  602: .PP
  603: If no
  604: \fBclose\fR()
  605: function is defined, no I/O logging plugins are loaded,
  606: and neither the
  607: \fItimeout\fR
  608: not
  609: \fIuse_pty\fR
  610: options are set in the
  611: \fRcommand_info\fR
  612: list, the
  613: \fBsudo\fR
  614: front end may execute the command directly instead of running
  615: it as a child process.
  616: .RE
  617: .TP 6n
  618: show_version
  619: .nf
  620: .RS 6n
  621: int (*show_version)(int verbose);
  622: .RE
  623: .fi
  624: .RS 6n
  625: .sp
  626: The
  627: \fBshow_version\fR()
  628: function is called by
  629: \fBsudo\fR
  630: when the user specifies
  631: the
  632: \fB\-V\fR
  633: option.
  634: The plugin may display its version information to the user via the
  635: \fBconversation\fR()
  636: or
  637: \fBplugin_printf\fR()
  638: function using
  639: \fRSUDO_CONV_INFO_MSG\fR.
  640: If the user requests detailed version information, the verbose flag will be set.
  641: .RE
  642: .TP 6n
  643: check_policy
  644: .nf
  645: .RS 6n
  646: int (*check_policy)(int argc, char * const argv[]
  647:                     char *env_add[], char **command_info[],
  648:                     char **argv_out[], char **user_env_out[]);
  649: .RE
  650: .fi
  651: .RS 6n
  652: .sp
  653: The
  654: \fBcheck_policy\fR()
  655: function is called by
  656: \fBsudo\fR
  657: to determine
  658: whether the user is allowed to run the specified commands.
  659: .sp
  660: If the
  661: \fIsudoedit\fR
  662: option was enabled in the
  663: \fIsettings\fR
  664: array
  665: passed to the
  666: \fBopen\fR()
  667: function, the user has requested
  668: \fIsudoedit\fR
  669: mode.
  670: \fIsudoedit\fR
  671: is a mechanism for editing one or more files
  672: where an editor is run with the user's credentials instead of with
  673: elevated privileges.
  674: \fBsudo\fR
  675: achieves this by creating user-writable
  676: temporary copies of the files to be edited and then overwriting the
  677: originals with the temporary copies after editing is complete.
  678: If the plugin supports
  679: \fIsudoedit\fR,
  680: it should choose the editor to be used, potentially from a variable
  681: in the user's environment, such as
  682: \fREDITOR\fR,
  683: and include it in
  684: \fIargv_out\fR
  685: (note that environment
  686: variables may include command line flags).
  687: The files to be edited should be copied from
  688: \fIargv\fR
  689: into
  690: \fIargv_out\fR,
  691: separated from the
  692: editor and its arguments by a
  693: \(lq\fR--\fR\(rq
  694: element.
  695: The
  696: \(lq\fR--\fR\(rq
  697: will
  698: be removed by
  699: \fBsudo\fR
  700: before the editor is executed.
  701: The plugin should also set
  702: \fIsudoedit=true\fR
  703: in the
  704: \fIcommand_info\fR
  705: list.
  706: .sp
  707: The
  708: \fBcheck_policy\fR()
  709: function returns 1 if the command is allowed,
  710: 0 if not allowed, \-1 for a general error, or \-2 for a usage error
  711: or if
  712: \fIsudoedit\fR
  713: was specified but is unsupported by the plugin.
  714: In the latter case,
  715: \fBsudo\fR
  716: will print a usage message before it
  717: exits.
  718: If an error occurs, the plugin may optionally call the
  719: \fBconversation\fR()
  720: or
  721: \fBplugin_printf\fR()
  722: function with
  723: \fRSUDO_CONF_ERROR_MSG\fR
  724: to present additional error information to the user.
  725: .sp
  726: The function arguments are as follows:
  727: .TP 6n
  728: argc
  729: The number of elements in
  730: \fIargv\fR,
  731: not counting the final
  732: \fRNULL\fR
  733: pointer.
  734: .TP 6n
  735: argv
  736: The argument vector describing the command the user wishes to run,
  737: in the same form as what would be passed to the
  738: execve(2)
  739: system call.
  740: The vector is terminated by a
  741: \fRNULL\fR
  742: pointer.
  743: .TP 6n
  744: env_add
  745: Additional environment variables specified by the user on the command
  746: line in the form of a
  747: \fRNULL\fR-terminated
  748: vector of
  749: \(lqname=value\(rq
  750: strings.
  751: The plugin may reject the command if one or more variables
  752: are not allowed to be set, or it may silently ignore such variables.
  753: .sp
  754: When parsing
  755: \fIenv_add\fR,
  756: the plugin should split on the
  757: \fBfirst\fR
  758: equal sign
  759: (\(oq=\(cq)
  760: since the
  761: \fIname\fR
  762: field will never include one
  763: itself but the
  764: \fIvalue\fR
  765: might.
  766: .TP 6n
  767: command_info
  768: Information about the command being run in the form of
  769: \(lqname=value\(rq
  770: strings.
  771: These values are used by
  772: \fBsudo\fR
  773: to set the execution
  774: environment when running a command.
  775: The plugin is responsible for creating and populating the vector,
  776: which must be terminated with a
  777: \fRNULL\fR
  778: pointer.
  779: The following values are recognized by
  780: \fBsudo\fR:
  781: .PP
  782: .RS 6n
  783: .PD 0
  784: .TP 6n
  785: chroot=string
  786: The root directory to use when running the command.
  787: .PD
  788: .TP 6n
  789: closefrom=number
  790: If specified,
  791: \fBsudo\fR
  792: will close all files descriptors with a value
  793: of
  794: \fInumber\fR
  795: or higher.
  796: .TP 6n
  797: command=string
  798: Fully qualified path to the command to be executed.
  799: .TP 6n
  800: cwd=string
  801: The current working directory to change to when executing the command.
  802: .TP 6n
  803: exec_background=bool
  804: By default,
  805: \fBsudo\fR
  806: runs a command as the foreground process as long as
  807: \fBsudo\fR
  808: itself is running in the foreground.
  809: When
  810: \fIexec_background\fR
  811: is enabled and the command is being run in a pty (due to I/O logging
  812: or the
  813: \fIuse_pty\fR
  814: setting), the command will be run as a background process.
  815: Attempts to read from the controlling terminal (or to change terminal
  816: settings) will result in the command being suspended with the
  817: \fRSIGTTIN\fR
  818: signal (or
  819: \fRSIGTTOU\fR
  820: in the case of terminal settings).
  821: If this happens when
  822: \fBsudo\fR
  823: is a foreground process, the command will be granted the controlling terminal
  824: and resumed in the foreground with no user intervention required.
  825: The advantage of initially running the command in the background is that
  826: \fBsudo\fR
  827: need not read from the terminal unless the command explicitly requests it.
  828: Otherwise, any terminal input must be passed to the command, whether it
  829: has required it or not (the kernel buffers terminals so it is not possible
  830: to tell whether the command really wants the input).
  831: This is different from historic
  832: \fIsudo\fR
  833: behavior or when the command is not being run in a pty.
  834: .sp
  835: For this to work seamlessly, the operating system must support the
  836: automatic restarting of system calls.
  837: Unfortunately, not all operating systems do this by default,
  838: and even those that do may have bugs.
  839: For example, Mac OS X fails to restart the
  840: \fBtcgetattr\fR()
  841: and
  842: \fBtcsetattr\fR()
  843: system calls (this is a bug in Mac OS X).
  844: Furthermore, because this behavior depends on the command stopping with the
  845: \fRSIGTTIN\fR
  846: or
  847: \fRSIGTTOU\fR
  848: signals, programs that catch these signals and suspend themselves
  849: with a different signal (usually
  850: \fRSIGTOP\fR)
  851: will not be automatically foregrounded.
  852: Some versions of the linux
  853: su(1)
  854: command behave this way.
  855: Because of this, a plugin should not set
  856: \fIexec_background\fR
  857: unless it is explicitly enabled by the administrator and there should
  858: be a way to enabled or disable it on a per-command basis.
  859: .sp
  860: This setting has no effect unless I/O logging is enabled or
  861: \fIuse_pty\fR
  862: is enabled.
  863: .TP 6n
  864: iolog_compress=bool
  865: Set to true if the I/O logging plugins, if any, should compress the
  866: log data.
  867: This is a hint to the I/O logging plugin which may choose to ignore it.
  868: .TP 6n
  869: iolog_path=string
  870: Fully qualified path to the file or directory in which I/O log is
  871: to be stored.
  872: This is a hint to the I/O logging plugin which may choose to ignore it.
  873: If no I/O logging plugin is loaded, this setting has no effect.
  874: .TP 6n
  875: iolog_stdin=bool
  876: Set to true if the I/O logging plugins, if any, should log the
  877: standard input if it is not connected to a terminal device.
  878: This is a hint to the I/O logging plugin which may choose to ignore it.
  879: .TP 6n
  880: iolog_stdout=bool
  881: Set to true if the I/O logging plugins, if any, should log the
  882: standard output if it is not connected to a terminal device.
  883: This is a hint to the I/O logging plugin which may choose to ignore it.
  884: .TP 6n
  885: iolog_stderr=bool
  886: Set to true if the I/O logging plugins, if any, should log the
  887: standard error if it is not connected to a terminal device.
  888: This is a hint to the I/O logging plugin which may choose to ignore it.
  889: .TP 6n
  890: iolog_ttyin=bool
  891: Set to true if the I/O logging plugins, if any, should log all
  892: terminal input.
  893: This only includes input typed by the user and not from a pipe or
  894: redirected from a file.
  895: This is a hint to the I/O logging plugin which may choose to ignore it.
  896: .TP 6n
  897: iolog_ttyout=bool
  898: Set to true if the I/O logging plugins, if any, should log all
  899: terminal output.
  900: This only includes output to the screen, not output to a pipe or file.
  901: This is a hint to the I/O logging plugin which may choose to ignore it.
  902: .TP 6n
  903: login_class=string
  904: BSD login class to use when setting resource limits and nice value
  905: (optional).
  906: This option is only set on systems that support login classes.
  907: .TP 6n
  908: nice=int
  909: Nice value (priority) to use when executing the command.
  910: The nice value, if specified, overrides the priority associated with the
  911: \fIlogin_class\fR
  912: on BSD systems.
  913: .TP 6n
  914: noexec=bool
  915: If set, prevent the command from executing other programs.
  916: .TP 6n
  917: preserve_fds=list
  918: A comma-separated list of file descriptors that should be
  919: preserved, regardless of the value of the
  920: \fIclosefrom\fR
  921: setting.
  922: Only available starting with API version 1.5.
  923: .TP 6n
  924: preserve_groups=bool
  925: If set,
  926: \fBsudo\fR
  927: will preserve the user's group vector instead of
  928: initializing the group vector based on
  929: \fRrunas_user\fR.
  930: .TP 6n
  931: runas_egid=gid
  932: Effective group ID to run the command as.
  933: If not specified, the value of
  934: \fIrunas_gid\fR
  935: is used.
  936: .TP 6n
  937: runas_euid=uid
  938: Effective user ID to run the command as.
  939: If not specified, the value of
  940: \fIrunas_uid\fR
  941: is used.
  942: .TP 6n
  943: runas_gid=gid
  944: Group ID to run the command as.
  945: .TP 6n
  946: runas_groups=list
  947: The supplementary group vector to use for the command in the form
  948: of a comma-separated list of group IDs.
  949: If
  950: \fIpreserve_groups\fR
  951: is set, this option is ignored.
  952: .TP 6n
  953: runas_uid=uid
  954: User ID to run the command as.
  955: .TP 6n
  956: selinux_role=string
  957: SELinux role to use when executing the command.
  958: .TP 6n
  959: selinux_type=string
  960: SELinux type to use when executing the command.
  961: .TP 6n
  962: set_utmp=bool
  963: Create a utmp (or utmpx) entry when a pseudo-tty is allocated.
  964: By default, the new entry will be a copy of the user's existing utmp
  965: entry (if any), with the tty, time, type and pid fields updated.
  966: .TP 6n
  967: sudoedit=bool
  968: Set to true when in
  969: \fIsudoedit\fR
  970: mode.
  971: The plugin may enable
  972: \fIsudoedit\fR
  973: mode even if
  974: \fBsudo\fR
  975: was not invoked as
  976: \fBsudoedit\fR.
  977: This allows the plugin to perform command substitution and transparently
  978: enable
  979: \fIsudoedit\fR
  980: when the user attempts to run an editor.
  981: .TP 6n
  982: timeout=int
  983: Command timeout.
  984: If non-zero then when the timeout expires the command will be killed.
  985: .TP 6n
  986: umask=octal
  987: The file creation mask to use when executing the command.
  988: .TP 6n
  989: use_pty=bool
  990: Allocate a pseudo-tty to run the command in, regardless of whether
  991: or not I/O logging is in use.
  992: By default,
  993: \fBsudo\fR
  994: will only run
  995: the command in a pty when an I/O log plugin is loaded.
  996: .TP 6n
  997: utmp_user=string
  998: User name to use when constructing a new utmp (or utmpx) entry when
  999: \fIset_utmp\fR
 1000: is enabled.
 1001: This option can be used to set the user field in the utmp entry to
 1002: the user the command runs as rather than the invoking user.
 1003: If not set,
 1004: \fBsudo\fR
 1005: will base the new entry on
 1006: the invoking user's existing entry.
 1007: .PP
 1008: Unsupported values will be ignored.
 1009: .RE
 1010: .TP 6n
 1011: argv_out
 1012: The
 1013: \fRNULL\fR-terminated
 1014: argument vector to pass to the
 1015: execve(2)
 1016: system call when executing the command.
 1017: The plugin is responsible for allocating and populating the vector.
 1018: .TP 6n
 1019: user_env_out
 1020: The
 1021: \fRNULL\fR-terminated
 1022: environment vector to use when executing the command.
 1023: The plugin is responsible for allocating and populating the vector.
 1024: .PD 0
 1025: .PP
 1026: .RE
 1027: .PD
 1028: .TP 6n
 1029: list
 1030: .nf
 1031: .RS 6n
 1032: int (*list)(int verbose, const char *list_user,
 1033:             int argc, char * const argv[]);
 1034: .RE
 1035: .fi
 1036: .RS 6n
 1037: .sp
 1038: List available privileges for the invoking user.
 1039: Returns 1 on success, 0 on failure and \-1 on error.
 1040: On error, the plugin may optionally call the
 1041: \fBconversation\fR()
 1042: or
 1043: \fBplugin_printf\fR()
 1044: function with
 1045: \fRSUDO_CONF_ERROR_MSG\fR
 1046: to present additional error information to
 1047: the user.
 1048: .sp
 1049: Privileges should be output via the
 1050: \fBconversation\fR()
 1051: or
 1052: \fBplugin_printf\fR()
 1053: function using
 1054: \fRSUDO_CONV_INFO_MSG\fR,
 1055: .TP 6n
 1056: verbose
 1057: Flag indicating whether to list in verbose mode or not.
 1058: .TP 6n
 1059: list_user
 1060: The name of a different user to list privileges for if the policy
 1061: allows it.
 1062: If
 1063: \fRNULL\fR,
 1064: the plugin should list the privileges of the invoking user.
 1065: .TP 6n
 1066: argc
 1067: The number of elements in
 1068: \fIargv\fR,
 1069: not counting the final
 1070: \fRNULL\fR
 1071: pointer.
 1072: .TP 6n
 1073: argv
 1074: If
 1075: non-\fRNULL\fR,
 1076: an argument vector describing a command the user
 1077: wishes to check against the policy in the same form as what would
 1078: be passed to the
 1079: execve(2)
 1080: system call.
 1081: If the command is permitted by the policy, the fully-qualified path
 1082: to the command should be displayed along with any command line arguments.
 1083: .PD 0
 1084: .PP
 1085: .RE
 1086: .PD
 1087: .TP 6n
 1088: validate
 1089: .nf
 1090: .RS 6n
 1091: int (*validate)(void);
 1092: .RE
 1093: .fi
 1094: .RS 6n
 1095: .sp
 1096: The
 1097: \fBvalidate\fR()
 1098: function is called when
 1099: \fBsudo\fR
 1100: is run with the
 1101: \fB\-v\fR
 1102: flag.
 1103: For policy plugins such as
 1104: \fBsudoers\fR
 1105: that cache
 1106: authentication credentials, this function will validate and cache
 1107: the credentials.
 1108: .sp
 1109: The
 1110: \fBvalidate\fR()
 1111: function should be
 1112: \fRNULL\fR
 1113: if the plugin does not support credential caching.
 1114: .sp
 1115: Returns 1 on success, 0 on failure and \-1 on error.
 1116: On error, the plugin may optionally call the
 1117: \fBconversation\fR()
 1118: or
 1119: \fBplugin_printf\fR()
 1120: function with
 1121: \fRSUDO_CONF_ERROR_MSG\fR
 1122: to present additional
 1123: error information to the user.
 1124: .RE
 1125: .TP 6n
 1126: invalidate
 1127: .nf
 1128: .RS 6n
 1129: void (*invalidate)(int remove);
 1130: .RE
 1131: .fi
 1132: .RS 6n
 1133: .sp
 1134: The
 1135: \fBinvalidate\fR()
 1136: function is called when
 1137: \fBsudo\fR
 1138: is called with
 1139: the
 1140: \fB\-k\fR
 1141: or
 1142: \fB\-K\fR
 1143: flag.
 1144: For policy plugins such as
 1145: \fBsudoers\fR
 1146: that
 1147: cache authentication credentials, this function will invalidate the
 1148: credentials.
 1149: If the
 1150: \fIremove\fR
 1151: flag is set, the plugin may remove
 1152: the credentials instead of simply invalidating them.
 1153: .sp
 1154: The
 1155: \fBinvalidate\fR()
 1156: function should be
 1157: \fRNULL\fR
 1158: if the plugin does not support credential caching.
 1159: .RE
 1160: .TP 6n
 1161: init_session
 1162: .nf
 1163: .RS 6n
 1164: int (*init_session)(struct passwd *pwd, char **user_envp[);
 1165: .RE
 1166: .fi
 1167: .RS 6n
 1168: .sp
 1169: The
 1170: \fBinit_session\fR()
 1171: function is called before
 1172: \fBsudo\fR
 1173: sets up the
 1174: execution environment for the command.
 1175: It is run in the parent
 1176: \fBsudo\fR
 1177: process and before any uid or gid changes.
 1178: This can be used to perform session setup that is not supported by
 1179: \fIcommand_info\fR,
 1180: such as opening the PAM session.
 1181: The
 1182: \fBclose\fR()
 1183: function can be
 1184: used to tear down the session that was opened by
 1185: \fRinit_session\fR.
 1186: .sp
 1187: The
 1188: \fIpwd\fR
 1189: argument points to a passwd struct for the user the
 1190: command will be run as if the uid the command will run as was found
 1191: in the password database, otherwise it will be
 1192: \fRNULL\fR.
 1193: .sp
 1194: The
 1195: \fIuser_env\fR
 1196: argument points to the environment the command will
 1197: run in, in the form of a
 1198: \fRNULL\fR-terminated
 1199: vector of
 1200: \(lqname=value\(rq
 1201: strings.
 1202: This is the same string passed back to the front end via
 1203: the Policy Plugin's
 1204: \fIuser_env_out\fR
 1205: parameter.
 1206: If the
 1207: \fBinit_session\fR()
 1208: function needs to modify the user environment, it should update the
 1209: pointer stored in
 1210: \fIuser_env\fR.
 1211: The expected use case is to merge the contents of the PAM environment
 1212: (if any) with the contents of
 1213: \fIuser_env\fR.
 1214: NOTE: the
 1215: \fIuser_env\fR
 1216: parameter is only available
 1217: starting with API version 1.2.
 1218: A plugin
 1219: \fBmust\fR
 1220: check the API
 1221: version specified by the
 1222: \fBsudo\fR
 1223: front end before using
 1224: \fIuser_env\fR.
 1225: Failure to do so may result in a crash.
 1226: .sp
 1227: Returns 1 on success, 0 on failure and \-1 on error.
 1228: On error, the plugin may optionally call the
 1229: \fBconversation\fR()
 1230: or
 1231: \fBplugin_printf\fR()
 1232: function with
 1233: \fRSUDO_CONF_ERROR_MSG\fR
 1234: to present additional
 1235: error information to the user.
 1236: .RE
 1237: .TP 6n
 1238: register_hooks
 1239: .nf
 1240: .RS 6n
 1241: void (*register_hooks)(int version,
 1242:    int (*register_hook)(struct sudo_hook *hook));
 1243: .RE
 1244: .fi
 1245: .RS 6n
 1246: .sp
 1247: The
 1248: \fBregister_hooks\fR()
 1249: function is called by the sudo front end to
 1250: register any hooks the plugin needs.
 1251: If the plugin does not support hooks,
 1252: \fRregister_hooks\fR
 1253: should be set to the
 1254: \fRNULL\fR
 1255: pointer.
 1256: .sp
 1257: The
 1258: \fIversion\fR
 1259: argument describes the version of the hooks API
 1260: supported by the
 1261: \fBsudo\fR
 1262: front end.
 1263: .sp
 1264: The
 1265: \fBregister_hook\fR()
 1266: function should be used to register any supported
 1267: hooks the plugin needs.
 1268: It returns 0 on success, 1 if the hook type is not supported and \-1
 1269: if the major version in
 1270: \fRstruct hook\fR
 1271: does not match the front end's major hook API version.
 1272: .sp
 1273: See the
 1274: \fIHook function API\fR
 1275: section below for more information
 1276: about hooks.
 1277: .sp
 1278: NOTE: the
 1279: \fBregister_hooks\fR()
 1280: function is only available starting
 1281: with API version 1.2.
 1282: If the
 1283: \fBsudo\fR
 1284: front end doesn't support API
 1285: version 1.2 or higher,
 1286: \fRregister_hooks\fR
 1287: will not be called.
 1288: .RE
 1289: .TP 6n
 1290: deregister_hooks
 1291: .nf
 1292: .RS 6n
 1293: void (*deregister_hooks)(int version,
 1294:    int (*deregister_hook)(struct sudo_hook *hook));
 1295: .RE
 1296: .fi
 1297: .RS 6n
 1298: .sp
 1299: The
 1300: \fBderegister_hooks\fR()
 1301: function is called by the sudo front end
 1302: to deregister any hooks the plugin has registered.
 1303: If the plugin does not support hooks,
 1304: \fRderegister_hooks\fR
 1305: should be set to the
 1306: \fRNULL\fR
 1307: pointer.
 1308: .sp
 1309: The
 1310: \fIversion\fR
 1311: argument describes the version of the hooks API
 1312: supported by the
 1313: \fBsudo\fR
 1314: front end.
 1315: .sp
 1316: The
 1317: \fBderegister_hook\fR()
 1318: function should be used to deregister any
 1319: hooks that were put in place by the
 1320: \fBregister_hook\fR()
 1321: function.
 1322: If the plugin tries to deregister a hook that the front end does not support,
 1323: \fRderegister_hook\fR
 1324: will return an error.
 1325: .sp
 1326: See the
 1327: \fIHook function API\fR
 1328: section below for more information
 1329: about hooks.
 1330: .sp
 1331: NOTE: the
 1332: \fBderegister_hooks\fR()
 1333: function is only available starting
 1334: with API version 1.2.
 1335: If the
 1336: \fBsudo\fR
 1337: front end doesn't support API
 1338: version 1.2 or higher,
 1339: \fRderegister_hooks\fR
 1340: will not be called.
 1341: .RE
 1342: .PP
 1343: \fIPolicy Plugin Version Macros\fR
 1344: .nf
 1345: .sp
 1346: .RS 0n
 1347: /* Plugin API version major/minor. */
 1348: #define SUDO_API_VERSION_MAJOR 1
 1349: #define SUDO_API_VERSION_MINOR 2
 1350: #define SUDO_API_MKVERSION(x, y) ((x << 16) | y)
 1351: #define SUDO_API_VERSION SUDO_API_MKVERSION(SUDO_API_VERSION_MAJOR,\e
 1352:                                             SUDO_API_VERSION_MINOR)
 1353: 
 1354: /* Getters and setters for API version */
 1355: #define SUDO_API_VERSION_GET_MAJOR(v) ((v) >> 16)
 1356: #define SUDO_API_VERSION_GET_MINOR(v) ((v) & 0xffff)
 1357: #define SUDO_API_VERSION_SET_MAJOR(vp, n) do { \e
 1358:     *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \e
 1359: } while(0)
 1360: #define SUDO_VERSION_SET_MINOR(vp, n) do { \e
 1361:     *(vp) = (*(vp) & 0xffff0000) | (n); \e
 1362: } while(0)
 1363: .RE
 1364: .fi
 1365: .SS "I/O plugin API"
 1366: .nf
 1367: .RS 0n
 1368: struct io_plugin {
 1369: #define SUDO_IO_PLUGIN 2
 1370:     unsigned int type; /* always SUDO_IO_PLUGIN */
 1371:     unsigned int version; /* always SUDO_API_VERSION */
 1372:     int (*open)(unsigned int version, sudo_conv_t conversation,
 1373:                 sudo_printf_t plugin_printf, char * const settings[],
 1374:                 char * const user_info[], char * const command_info[],
 1375:                 int argc, char * const argv[], char * const user_env[],
 1376:                 char * const plugin_options[]);
 1377:     void (*close)(int exit_status, int error); /* wait status or error */
 1378:     int (*show_version)(int verbose);
 1379:     int (*log_ttyin)(const char *buf, unsigned int len);
 1380:     int (*log_ttyout)(const char *buf, unsigned int len);
 1381:     int (*log_stdin)(const char *buf, unsigned int len);
 1382:     int (*log_stdout)(const char *buf, unsigned int len);
 1383:     int (*log_stderr)(const char *buf, unsigned int len);
 1384:     void (*register_hooks)(int version,
 1385:        int (*register_hook)(struct sudo_hook *hook));
 1386:     void (*deregister_hooks)(int version,
 1387:        int (*deregister_hook)(struct sudo_hook *hook));
 1388: };
 1389: .RE
 1390: .fi
 1391: .PP
 1392: When an I/O plugin is loaded,
 1393: \fBsudo\fR
 1394: runs the command in a pseudo-tty.
 1395: This makes it possible to log the input and output from the user's
 1396: session.
 1397: If any of the standard input, standard output or standard error do not
 1398: correspond to a tty,
 1399: \fBsudo\fR
 1400: will open a pipe to capture
 1401: the I/O for logging before passing it on.
 1402: .PP
 1403: The log_ttyin function receives the raw user input from the terminal
 1404: device (note that this will include input even when echo is disabled,
 1405: such as when a password is read).
 1406: The log_ttyout function receives output from the pseudo-tty that is
 1407: suitable for replaying the user's session at a later time.
 1408: The
 1409: \fBlog_stdin\fR(),
 1410: \fBlog_stdout\fR()
 1411: and
 1412: \fBlog_stderr\fR()
 1413: functions are only called if the standard input, standard output
 1414: or standard error respectively correspond to something other than
 1415: a tty.
 1416: .PP
 1417: Any of the logging functions may be set to the
 1418: \fRNULL\fR
 1419: pointer if no logging is to be performed.
 1420: If the open function returns 0, no I/O will be sent to the plugin.
 1421: .PP
 1422: The io_plugin struct has the following fields:
 1423: .TP 6n
 1424: type
 1425: The
 1426: \fRtype\fR
 1427: field should always be set to
 1428: \fRSUDO_IO_PLUGIN\fR.
 1429: .TP 6n
 1430: version
 1431: The
 1432: \fRversion\fR
 1433: field should be set to
 1434: \fRSUDO_API_VERSION\fR.
 1435: .sp
 1436: This allows
 1437: \fBsudo\fR
 1438: to determine the API version the plugin was
 1439: built against.
 1440: .TP 6n
 1441: open
 1442: .nf
 1443: .RS 6n
 1444: int (*open)(unsigned int version, sudo_conv_t conversation,
 1445:             sudo_printf_t plugin_printf, char * const settings[],
 1446:             char * const user_info[], int argc, char * const argv[],
 1447:             char * const user_env[], char * const plugin_options[]);
 1448: .RE
 1449: .fi
 1450: .RS 6n
 1451: .sp
 1452: The
 1453: \fBopen\fR()
 1454: function is run before the
 1455: \fBlog_input\fR(),
 1456: \fBlog_output\fR()
 1457: or
 1458: \fBshow_version\fR()
 1459: functions are called.
 1460: It is only called if the version is being requested or the
 1461: \fBcheck_policy\fR()
 1462: function has
 1463: returned successfully.
 1464: It returns 1 on success, 0 on failure, \-1 if a general error occurred,
 1465: or \-2 if there was a usage error.
 1466: In the latter case,
 1467: \fBsudo\fR
 1468: will print a usage message before it exits.
 1469: If an error occurs, the plugin may optionally call the
 1470: \fBconversation\fR()
 1471: or
 1472: \fBplugin_printf\fR()
 1473: function with
 1474: \fRSUDO_CONF_ERROR_MSG\fR
 1475: to present
 1476: additional error information to the user.
 1477: .sp
 1478: The function arguments are as follows:
 1479: .TP 6n
 1480: version
 1481: The version passed in by
 1482: \fBsudo\fR
 1483: allows the plugin to determine the
 1484: major and minor version number of the plugin API supported by
 1485: \fBsudo\fR.
 1486: .TP 6n
 1487: conversation
 1488: A pointer to the
 1489: \fBconversation\fR()
 1490: function that may be used by the
 1491: \fBshow_version\fR()
 1492: function to display version information (see
 1493: \fBshow_version\fR()
 1494: below).
 1495: The
 1496: \fBconversation\fR()
 1497: function may also be used to display additional error message to the user.
 1498: The
 1499: \fBconversation\fR()
 1500: function returns 0 on success and \-1 on failure.
 1501: .TP 6n
 1502: plugin_printf
 1503: A pointer to a
 1504: \fBprintf\fR()-style
 1505: function that may be used by the
 1506: \fBshow_version\fR()
 1507: function to display version information (see
 1508: show_version below).
 1509: The
 1510: \fBplugin_printf\fR()
 1511: function may also be used to display additional error message to the user.
 1512: The
 1513: \fBplugin_printf\fR()
 1514: function returns number of characters printed on success and \-1 on failure.
 1515: .TP 6n
 1516: settings
 1517: A vector of user-supplied
 1518: \fBsudo\fR
 1519: settings in the form of
 1520: \(lqname=value\(rq
 1521: strings.
 1522: The vector is terminated by a
 1523: \fRNULL\fR
 1524: pointer.
 1525: These settings correspond to flags the user specified when running
 1526: \fBsudo\fR.
 1527: As such, they will only be present when the corresponding flag has
 1528: been specified on the command line.
 1529: .sp
 1530: When parsing
 1531: \fIsettings\fR,
 1532: the plugin should split on the
 1533: \fBfirst\fR
 1534: equal sign
 1535: (\(oq=\(cq)
 1536: since the
 1537: \fIname\fR
 1538: field will never include one
 1539: itself but the
 1540: \fIvalue\fR
 1541: might.
 1542: .sp
 1543: See the
 1544: \fIPolicy plugin API\fR
 1545: section for a list of all possible settings.
 1546: .TP 6n
 1547: user_info
 1548: A vector of information about the user running the command in the form of
 1549: \(lqname=value\(rq
 1550: strings.
 1551: The vector is terminated by a
 1552: \fRNULL\fR
 1553: pointer.
 1554: .sp
 1555: When parsing
 1556: \fIuser_info\fR,
 1557: the plugin should split on the
 1558: \fBfirst\fR
 1559: equal sign
 1560: (\(oq=\(cq)
 1561: since the
 1562: \fIname\fR
 1563: field will never include one
 1564: itself but the
 1565: \fIvalue\fR
 1566: might.
 1567: .sp
 1568: See the
 1569: \fIPolicy plugin API\fR
 1570: section for a list of all possible strings.
 1571: .TP 6n
 1572: argc
 1573: The number of elements in
 1574: \fIargv\fR,
 1575: not counting the final
 1576: \fRNULL\fR
 1577: pointer.
 1578: .TP 6n
 1579: argv
 1580: If
 1581: non-\fRNULL\fR,
 1582: an argument vector describing a command the user
 1583: wishes to run in the same form as what would be passed to the
 1584: execve(2)
 1585: system call.
 1586: .TP 6n
 1587: user_env
 1588: The user's environment in the form of a
 1589: \fRNULL\fR-terminated
 1590: vector of
 1591: \(lqname=value\(rq
 1592: strings.
 1593: .sp
 1594: When parsing
 1595: \fIuser_env\fR,
 1596: the plugin should split on the
 1597: \fBfirst\fR
 1598: equal sign
 1599: (\(oq=\(cq)
 1600: since the
 1601: \fIname\fR
 1602: field will never include one
 1603: itself but the
 1604: \fIvalue\fR
 1605: might.
 1606: .TP 6n
 1607: plugin_options
 1608: Any (non-comment) strings immediately after the plugin path are
 1609: treated as arguments to the plugin.
 1610: These arguments are split on a white space boundary and are passed to
 1611: the plugin in the form of a
 1612: \fRNULL\fR-terminated
 1613: array of strings.
 1614: If no arguments were specified,
 1615: \fIplugin_options\fR
 1616: will be the
 1617: \fRNULL\fR
 1618: pointer.
 1619: .sp
 1620: NOTE: the
 1621: \fIplugin_options\fR
 1622: parameter is only available starting with
 1623: API version 1.2.
 1624: A plugin
 1625: \fBmust\fR
 1626: check the API version specified
 1627: by the
 1628: \fBsudo\fR
 1629: front end before using
 1630: \fIplugin_options\fR.
 1631: Failure to do so may result in a crash.
 1632: .PD 0
 1633: .PP
 1634: .RE
 1635: .PD
 1636: .TP 6n
 1637: close
 1638: .br
 1639: .nf
 1640: .RS 6n
 1641: void (*close)(int exit_status, int error);
 1642: .RE
 1643: .fi
 1644: .RS 6n
 1645: .sp
 1646: The
 1647: \fBclose\fR()
 1648: function is called when the command being run by
 1649: \fBsudo\fR
 1650: finishes.
 1651: .sp
 1652: The function arguments are as follows:
 1653: .TP 6n
 1654: exit_status
 1655: The command's exit status, as returned by the
 1656: wait(2)
 1657: system call.
 1658: The value of
 1659: \fRexit_status\fR
 1660: is undefined if
 1661: \fRerror\fR
 1662: is non-zero.
 1663: .TP 6n
 1664: error
 1665: .br
 1666: If the command could not be executed, this is set to the value of
 1667: \fRerrno\fR
 1668: set by the
 1669: execve(2)
 1670: system call.
 1671: If the command was successfully executed, the value of
 1672: \fRerror\fR
 1673: is 0.
 1674: .PD 0
 1675: .PP
 1676: .RE
 1677: .PD
 1678: .TP 6n
 1679: show_version
 1680: .nf
 1681: .RS 6n
 1682: int (*show_version)(int verbose);
 1683: .RE
 1684: .fi
 1685: .RS 6n
 1686: .sp
 1687: The
 1688: \fBshow_version\fR()
 1689: function is called by
 1690: \fBsudo\fR
 1691: when the user specifies
 1692: the
 1693: \fB\-V\fR
 1694: option.
 1695: The plugin may display its version information to the user via the
 1696: \fBconversation\fR()
 1697: or
 1698: \fBplugin_printf\fR()
 1699: function using
 1700: \fRSUDO_CONV_INFO_MSG\fR.
 1701: If the user requests detailed version information, the verbose flag will be set.
 1702: .RE
 1703: .TP 6n
 1704: log_ttyin
 1705: .nf
 1706: .RS 6n
 1707: int (*log_ttyin)(const char *buf, unsigned int len);
 1708: .RE
 1709: .fi
 1710: .RS 6n
 1711: .sp
 1712: The
 1713: \fBlog_ttyin\fR()
 1714: function is called whenever data can be read from
 1715: the user but before it is passed to the running command.
 1716: This allows the plugin to reject data if it chooses to (for instance
 1717: if the input contains banned content).
 1718: Returns 1 if the data should be passed to the command, 0 if the data
 1719: is rejected (which will terminate the command) or \-1 if an error occurred.
 1720: .sp
 1721: The function arguments are as follows:
 1722: .TP 6n
 1723: buf
 1724: The buffer containing user input.
 1725: .TP 6n
 1726: len
 1727: The length of
 1728: \fIbuf\fR
 1729: in bytes.
 1730: .PD 0
 1731: .PP
 1732: .RE
 1733: .PD
 1734: .TP 6n
 1735: log_ttyout
 1736: .nf
 1737: .RS 6n
 1738: int (*log_ttyout)(const char *buf, unsigned int len);
 1739: .RE
 1740: .fi
 1741: .RS 6n
 1742: .sp
 1743: The
 1744: \fBlog_ttyout\fR()
 1745: function is called whenever data can be read from
 1746: the command but before it is written to the user's terminal.
 1747: This allows the plugin to reject data if it chooses to (for instance
 1748: if the output contains banned content).
 1749: Returns 1 if the data should be passed to the user, 0 if the data is rejected
 1750: (which will terminate the command) or \-1 if an error occurred.
 1751: .sp
 1752: The function arguments are as follows:
 1753: .TP 6n
 1754: buf
 1755: The buffer containing command output.
 1756: .TP 6n
 1757: len
 1758: The length of
 1759: \fIbuf\fR
 1760: in bytes.
 1761: .PD 0
 1762: .PP
 1763: .RE
 1764: .PD
 1765: .TP 6n
 1766: log_stdin
 1767: .nf
 1768: .RS 6n
 1769: int (*log_stdin)(const char *buf, unsigned int len);
 1770: .RE
 1771: .fi
 1772: .RS 6n
 1773: .sp
 1774: The
 1775: \fBlog_stdin\fR()
 1776: function is only used if the standard input does
 1777: not correspond to a tty device.
 1778: It is called whenever data can be read from the standard input but
 1779: before it is passed to the running command.
 1780: This allows the plugin to reject data if it chooses to
 1781: (for instance if the input contains banned content).
 1782: Returns 1 if the data should be passed to the command, 0 if the data is
 1783: rejected (which will terminate the command) or \-1 if an error occurred.
 1784: .sp
 1785: The function arguments are as follows:
 1786: .TP 6n
 1787: buf
 1788: The buffer containing user input.
 1789: .TP 6n
 1790: len
 1791: The length of
 1792: \fIbuf\fR
 1793: in bytes.
 1794: .PD 0
 1795: .PP
 1796: .RE
 1797: .PD
 1798: .TP 6n
 1799: log_stdout
 1800: .nf
 1801: .RS 6n
 1802: int (*log_stdout)(const char *buf, unsigned int len);
 1803: .RE
 1804: .fi
 1805: .RS 6n
 1806: .sp
 1807: The
 1808: \fBlog_stdout\fR()
 1809: function is only used if the standard output does not correspond
 1810: to a tty device.
 1811: It is called whenever data can be read from the command but before
 1812: it is written to the standard output.
 1813: This allows the plugin to reject data if it chooses to
 1814: (for instance if the output contains banned content).
 1815: Returns 1 if the data should be passed to the user, 0 if the data is
 1816: rejected (which will terminate the command) or \-1 if an error occurred.
 1817: .sp
 1818: The function arguments are as follows:
 1819: .TP 6n
 1820: buf
 1821: The buffer containing command output.
 1822: .TP 6n
 1823: len
 1824: The length of
 1825: \fIbuf\fR
 1826: in bytes.
 1827: .PD 0
 1828: .PP
 1829: .RE
 1830: .PD
 1831: .TP 6n
 1832: log_stderr
 1833: .nf
 1834: .RS 6n
 1835: int (*log_stderr)(const char *buf, unsigned int len);
 1836: .RE
 1837: .fi
 1838: .RS 6n
 1839: .sp
 1840: The
 1841: \fBlog_stderr\fR()
 1842: function is only used if the standard error does
 1843: not correspond to a tty device.
 1844: It is called whenever data can be read from the command but before it
 1845: is written to the standard error.
 1846: This allows the plugin to reject data if it chooses to
 1847: (for instance if the output contains banned content).
 1848: Returns 1 if the data should be passed to the user, 0 if the data is
 1849: rejected (which will terminate the command) or \-1 if an error occurred.
 1850: .sp
 1851: The function arguments are as follows:
 1852: .TP 6n
 1853: buf
 1854: The buffer containing command output.
 1855: .TP 6n
 1856: len
 1857: The length of
 1858: \fIbuf\fR
 1859: in bytes.
 1860: .PD 0
 1861: .PP
 1862: .RE
 1863: .PD
 1864: .TP 6n
 1865: register_hooks
 1866: See the
 1867: \fIPolicy plugin API\fR
 1868: section for a description of
 1869: \fRregister_hooks\fR.
 1870: .TP 6n
 1871: deregister_hooks
 1872: See the
 1873: \fIPolicy plugin API\fR
 1874: section for a description of
 1875: \fRderegister_hooks.\fR
 1876: .PP
 1877: \fII/O Plugin Version Macros\fR
 1878: .PP
 1879: Same as for the
 1880: \fIPolicy plugin API\fR.
 1881: .SS "Signal handlers"
 1882: The
 1883: \fBsudo\fR
 1884: front end installs default signal handlers to trap common signals
 1885: while the plugin functions are run.
 1886: The following signals are trapped by default before the command is
 1887: executed:
 1888: .TP 4n
 1889: \fBo\fR
 1890: \fRSIGALRM\fR
 1891: .PD 0
 1892: .TP 4n
 1893: \fBo\fR
 1894: \fRSIGHUP\fR
 1895: .TP 4n
 1896: \fBo\fR
 1897: \fRSIGINT\fR
 1898: .TP 4n
 1899: \fBo\fR
 1900: \fRSIGQUIT\fR
 1901: .TP 4n
 1902: \fBo\fR
 1903: \fRSIGTERM\fR
 1904: .TP 4n
 1905: \fBo\fR
 1906: \fRSIGTSTP\fR
 1907: .TP 4n
 1908: \fBo\fR
 1909: \fRSIGUSR1\fR
 1910: .TP 4n
 1911: \fBo\fR
 1912: \fRSIGUSR2\fR
 1913: .PD
 1914: .PP
 1915: If a fatal signal is received before the command is executed,
 1916: \fBsudo\fR
 1917: will call the plugin's
 1918: \fBclose\fR()
 1919: function with an exit status of 128 plus the value of the signal
 1920: that was received.
 1921: This allows for consistent logging of commands killed by a signal
 1922: for plugins that log such information in their
 1923: \fBclose\fR()
 1924: function.
 1925: .PP
 1926: A plugin may temporarily install its own signal handlers but must
 1927: restore the original handler before the plugin function returns.
 1928: .SS "Hook function API"
 1929: Beginning with plugin API version 1.2, it is possible to install
 1930: hooks for certain functions called by the
 1931: \fBsudo\fR
 1932: front end.
 1933: .PP
 1934: Currently, the only supported hooks relate to the handling of
 1935: environment variables.
 1936: Hooks can be used to intercept attempts to get, set, or remove
 1937: environment variables so that these changes can be reflected in
 1938: the version of the environment that is used to execute a command.
 1939: A future version of the API will support hooking internal
 1940: \fBsudo\fR
 1941: front end functions as well.
 1942: .PP
 1943: \fIHook structure\fR
 1944: .PP
 1945: Hooks in
 1946: \fBsudo\fR
 1947: are described by the following structure:
 1948: .nf
 1949: .sp
 1950: .RS 0n
 1951: typedef int (*sudo_hook_fn_t)();
 1952: 
 1953: struct sudo_hook {
 1954:     int hook_version;
 1955:     int hook_type;
 1956:     sudo_hook_fn_t hook_fn;
 1957:     void *closure;
 1958: };
 1959: .RE
 1960: .fi
 1961: .PP
 1962: The
 1963: \fRsudo_hook\fR
 1964: structure has the following fields:
 1965: .TP 6n
 1966: hook_version
 1967: The
 1968: \fRhook_version\fR
 1969: field should be set to
 1970: \fRSUDO_HOOK_VERSION\fR.
 1971: .TP 6n
 1972: hook_type
 1973: The
 1974: \fRhook_type\fR
 1975: field may be one of the following supported hook types:
 1976: .PP
 1977: .RS 6n
 1978: .PD 0
 1979: .TP 6n
 1980: \fRSUDO_HOOK_SETENV\fR
 1981: The C library
 1982: setenv(3)
 1983: function.
 1984: Any registered hooks will run before the C library implementation.
 1985: The
 1986: \fRhook_fn\fR
 1987: field should
 1988: be a function that matches the following typedef:
 1989: .nf
 1990: .sp
 1991: .RS 6n
 1992: typedef int (*sudo_hook_fn_setenv_t)(const char *name,
 1993:    const char *value, int overwrite, void *closure);
 1994: .RE
 1995: .fi
 1996: .RS 6n
 1997: .sp
 1998: If the registered hook does not match the typedef the results are
 1999: unspecified.
 2000: .RE
 2001: .PD
 2002: .TP 6n
 2003: \fRSUDO_HOOK_UNSETENV\fR
 2004: The C library
 2005: unsetenv(3)
 2006: function.
 2007: Any registered hooks will run before the C library implementation.
 2008: The
 2009: \fRhook_fn\fR
 2010: field should
 2011: be a function that matches the following typedef:
 2012: .nf
 2013: .sp
 2014: .RS 6n
 2015: typedef int (*sudo_hook_fn_unsetenv_t)(const char *name,
 2016:    void *closure);
 2017: .RE
 2018: .fi
 2019: .TP 6n
 2020: \fRSUDO_HOOK_GETENV\fR
 2021: The C library
 2022: getenv(3)
 2023: function.
 2024: Any registered hooks will run before the C library implementation.
 2025: The
 2026: \fRhook_fn\fR
 2027: field should
 2028: be a function that matches the following typedef:
 2029: .nf
 2030: .sp
 2031: .RS 6n
 2032: typedef int (*sudo_hook_fn_getenv_t)(const char *name,
 2033:    char **value, void *closure);
 2034: .RE
 2035: .fi
 2036: .RS 6n
 2037: .sp
 2038: If the registered hook does not match the typedef the results are
 2039: unspecified.
 2040: .RE
 2041: .TP 6n
 2042: \fRSUDO_HOOK_PUTENV\fR
 2043: The C library
 2044: putenv(3)
 2045: function.
 2046: Any registered hooks will run before the C library implementation.
 2047: The
 2048: \fRhook_fn\fR
 2049: field should
 2050: be a function that matches the following typedef:
 2051: .nf
 2052: .sp
 2053: .RS 6n
 2054: typedef int (*sudo_hook_fn_putenv_t)(char *string,
 2055:    void *closure);
 2056: .RE
 2057: .fi
 2058: .RS 6n
 2059: .sp
 2060: If the registered hook does not match the typedef the results are
 2061: unspecified.
 2062: .RE
 2063: .PD 0
 2064: .PP
 2065: .RE
 2066: .PD
 2067: .TP 6n
 2068: hook_fn
 2069: sudo_hook_fn_t hook_fn;
 2070: .sp
 2071: The
 2072: \fRhook_fn\fR
 2073: field should be set to the plugin's hook implementation.
 2074: The actual function arguments will vary depending on the
 2075: \fRhook_type\fR
 2076: (see
 2077: \fRhook_type\fR
 2078: above).
 2079: In all cases, the
 2080: \fRclosure\fR
 2081: field of
 2082: \fRstruct sudo_hook\fR
 2083: is passed as the last function parameter.
 2084: This can be used to pass arbitrary data to the plugin's hook implementation.
 2085: .sp
 2086: The function return value may be one of the following:
 2087: .PP
 2088: .RS 6n
 2089: .PD 0
 2090: .TP 6n
 2091: \fRSUDO_HOOK_RET_ERROR\fR
 2092: The hook function encountered an error.
 2093: .PD
 2094: .TP 6n
 2095: \fRSUDO_HOOK_RET_NEXT\fR
 2096: The hook completed without error, go on to the next hook (including
 2097: the native implementation if applicable).
 2098: For example, a
 2099: getenv(3)
 2100: hook might return
 2101: \fRSUDO_HOOK_RET_NEXT\fR
 2102: if the specified variable was not found in the private copy of the environment.
 2103: .TP 6n
 2104: \fRSUDO_HOOK_RET_STOP\fR
 2105: The hook completed without error, stop processing hooks for this invocation.
 2106: This can be used to replace the native implementation.
 2107: For example, a
 2108: \fRsetenv\fR
 2109: hook that operates on a private copy of
 2110: the environment but leaves
 2111: \fRenviron\fR
 2112: unchanged.
 2113: .PD 0
 2114: .PP
 2115: .RE
 2116: .PD
 2117: .PP
 2118: Note that it is very easy to create an infinite loop when hooking
 2119: C library functions.
 2120: For example, a
 2121: getenv(3)
 2122: hook that calls the
 2123: snprintf(3)
 2124: function may create a loop if the
 2125: snprintf(3)
 2126: implementation calls
 2127: getenv(3)
 2128: to check the locale.
 2129: To prevent this, you may wish to use a static variable in the hook
 2130: function to guard against nested calls.
 2131: For example:
 2132: .nf
 2133: .sp
 2134: .RS 0n
 2135: static int in_progress = 0; /* avoid recursion */
 2136: if (in_progress)
 2137:     return SUDO_HOOK_RET_NEXT;
 2138: in_progress = 1;
 2139: \&...
 2140: in_progress = 0;
 2141: return SUDO_HOOK_RET_STOP;
 2142: .RE
 2143: .fi
 2144: .PP
 2145: \fIHook API Version Macros\fR
 2146: .nf
 2147: .sp
 2148: .RS 0n
 2149: /* Hook API version major/minor */
 2150: #define SUDO_HOOK_VERSION_MAJOR 1
 2151: #define SUDO_HOOK_VERSION_MINOR 0
 2152: #define SUDO_HOOK_MKVERSION(x, y) ((x << 16) | y)
 2153: #define SUDO_HOOK_VERSION SUDO_HOOK_MKVERSION(SUDO_HOOK_VERSION_MAJOR,\e
 2154:                                               SUDO_HOOK_VERSION_MINOR)
 2155: 
 2156: /* Getters and setters for hook API version */
 2157: #define SUDO_HOOK_VERSION_GET_MAJOR(v) ((v) >> 16)
 2158: #define SUDO_HOOK_VERSION_GET_MINOR(v) ((v) & 0xffff)
 2159: #define SUDO_HOOK_VERSION_SET_MAJOR(vp, n) do { \e
 2160:     *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \e
 2161: } while(0)
 2162: #define SUDO_HOOK_VERSION_SET_MINOR(vp, n) do { \e
 2163:     *(vp) = (*(vp) & 0xffff0000) | (n); \e
 2164: } while(0)
 2165: .RE
 2166: .fi
 2167: .SS "Remote command execution"
 2168: The
 2169: \fBsudo\fR
 2170: front end does not have native support for running remote commands.
 2171: However, starting with
 2172: \fBsudo\fR
 2173: 1.8.8, the
 2174: \fB\-h\fR
 2175: option may be used to specify a remote host that is passed
 2176: to the policy plugin.
 2177: A plugin may also accept a
 2178: \fIrunas_user\fR
 2179: in the form of
 2180: \(lquser@hostname\(rq
 2181: which will work with older versions of
 2182: \fBsudo\fR.
 2183: It is anticipated that remote commands will be supported by executing a
 2184: \(lqhelper\(rq
 2185: program.
 2186: The policy plugin should setup the execution environment such that the
 2187: \fBsudo\fR
 2188: front end will run the helper which, in turn, will connect to the
 2189: remote host and run the command.
 2190: .PP
 2191: For example, the policy plugin could utilize
 2192: \fBssh\fR
 2193: to perform remote command execution.
 2194: The helper program would be responsible for running
 2195: \fBssh\fR
 2196: with the proper options to use a private key or certificate
 2197: that the remote host will accept and run a program
 2198: on the remote host that would setup the execution environment
 2199: accordingly.
 2200: .PP
 2201: Note that remote
 2202: \fBsudoedit\fR
 2203: functionality must be handled by the policy plugin, not
 2204: \fBsudo\fR
 2205: itself as the front end has no knowledge that a remote command is
 2206: being executed.
 2207: This may be addressed in a future revision of the plugin API.
 2208: .SS "Conversation API"
 2209: If the plugin needs to interact with the user, it may do so via the
 2210: \fBconversation\fR()
 2211: function.
 2212: A plugin should not attempt to read directly from the standard input
 2213: or the user's tty (neither of which are guaranteed to exist).
 2214: The caller must include a trailing newline in
 2215: \fRmsg\fR
 2216: if one is to be printed.
 2217: .PP
 2218: A
 2219: \fBprintf\fR()-style
 2220: function is also available that can be used to display informational
 2221: or error messages to the user, which is usually more convenient for
 2222: simple messages where no use input is required.
 2223: .nf
 2224: .sp
 2225: .RS 0n
 2226: struct sudo_conv_message {
 2227: #define SUDO_CONV_PROMPT_ECHO_OFF  0x0001 /* do not echo user input */
 2228: #define SUDO_CONV_PROMPT_ECHO_ON   0x0002 /* echo user input */
 2229: #define SUDO_CONV_ERROR_MSG        0x0003 /* error message */
 2230: #define SUDO_CONV_INFO_MSG         0x0004 /* informational message */
 2231: #define SUDO_CONV_PROMPT_MASK      0x0005 /* mask user input */
 2232: #define SUDO_CONV_DEBUG_MSG        0x0006 /* debugging message */
 2233: #define SUDO_CONV_PROMPT_ECHO_OK   0x1000 /* flag: allow echo if no tty */
 2234:     int msg_type;
 2235:     int timeout;
 2236:     const char *msg;
 2237: };
 2238: 
 2239: #define SUDO_CONV_REPL_MAX      255
 2240: 
 2241: struct sudo_conv_reply {
 2242:     char *reply;
 2243: };
 2244: 
 2245: typedef int (*sudo_conv_t)(int num_msgs,
 2246:              const struct sudo_conv_message msgs[],
 2247:              struct sudo_conv_reply replies[]);
 2248: 
 2249: typedef int (*sudo_printf_t)(int msg_type, const char *fmt, ...);
 2250: .RE
 2251: .fi
 2252: .PP
 2253: Pointers to the
 2254: \fBconversation\fR()
 2255: and
 2256: \fBprintf\fR()-style
 2257: functions are passed
 2258: in to the plugin's
 2259: \fBopen\fR()
 2260: function when the plugin is initialized.
 2261: .PP
 2262: To use the
 2263: \fBconversation\fR()
 2264: function, the plugin must pass an array of
 2265: \fRsudo_conv_message\fR
 2266: and
 2267: \fRsudo_conv_reply\fR
 2268: structures.
 2269: There must be a
 2270: \fRstruct sudo_conv_message\fR
 2271: and
 2272: \fRstruct sudo_conv_reply\fR
 2273: for
 2274: each message in the conversation.
 2275: The plugin is responsible for freeing the reply buffer located in each
 2276: \fRstruct sudo_conv_reply\fR,
 2277: if it is not
 2278: \fRNULL\fR.
 2279: \fRSUDO_CONV_REPL_MAX\fR
 2280: represents the maximum length of the reply buffer (not including
 2281: the trailing NUL character).
 2282: In practical terms, this is the longest password
 2283: \fBsudo\fR
 2284: will support.
 2285: It is also useful as a maximum value for the
 2286: \fBmemset_s\fR()
 2287: function when clearing passwords filled in by the conversation function.
 2288: .PP
 2289: The
 2290: \fBprintf\fR()-style
 2291: function uses the same underlying mechanism as the
 2292: \fBconversation\fR()
 2293: function but only supports
 2294: \fRSUDO_CONV_INFO_MSG\fR,
 2295: \fRSUDO_CONV_ERROR_MSG\fR
 2296: and
 2297: \fRSUDO_CONV_DEBUG_MSG\fR
 2298: for the
 2299: \fImsg_type\fR
 2300: parameter.
 2301: It can be more convenient than using the
 2302: \fBconversation\fR()
 2303: function if no user reply is needed and supports standard
 2304: \fBprintf\fR()
 2305: escape sequences.
 2306: .PP
 2307: Unlike,
 2308: \fRSUDO_CONV_INFO_MSG\fR
 2309: and
 2310: Dv SUDO_CONV_ERROR_MSG ,
 2311: messages
 2312: sent with the
 2313: \fRSUDO_CONV_DEBUG_MSG\fR
 2314: \fImsg_type\fR
 2315: are not directly
 2316: user-visible.
 2317: Instead, they are logged to the file specified in the
 2318: \fRDebug\fR
 2319: statement (if any) in the
 2320: sudo.conf(@mansectform@).
 2321: file.
 2322: This allows a plugin to log debugging information and is intended
 2323: to be used in conjunction with the
 2324: \fIdebug_flags\fR
 2325: setting.
 2326: .PP
 2327: See the sample plugin for an example of the
 2328: \fBconversation\fR()
 2329: function usage.
 2330: .SS "Sudoers group plugin API"
 2331: The
 2332: \fBsudoers\fR
 2333: plugin supports its own plugin interface to allow non-Unix
 2334: group lookups.
 2335: This can be used to query a group source other than the standard Unix
 2336: group database.
 2337: Two sample group plugins are bundled with
 2338: \fBsudo\fR,
 2339: \fIgroup_file\fR
 2340: and
 2341: \fIsystem_group\fR,
 2342: are detailed in
 2343: sudoers(@mansectform@).
 2344: Third party group plugins include a QAS AD plugin available from Quest Software.
 2345: .PP
 2346: A group plugin must declare and populate a
 2347: \fRsudoers_group_plugin\fR
 2348: struct in the global scope.
 2349: This structure contains pointers to the functions that implement plugin
 2350: initialization, cleanup and group lookup.
 2351: .nf
 2352: .sp
 2353: .RS 0n
 2354: struct sudoers_group_plugin {
 2355:    unsigned int version;
 2356:    int (*init)(int version, sudo_printf_t sudo_printf,
 2357:                char *const argv[]);
 2358:    void (*cleanup)(void);
 2359:    int (*query)(const char *user, const char *group,
 2360:                 const struct passwd *pwd);
 2361: };
 2362: .RE
 2363: .fi
 2364: .PP
 2365: The
 2366: \fRsudoers_group_plugin\fR
 2367: struct has the following fields:
 2368: .TP 6n
 2369: version
 2370: The
 2371: \fRversion\fR
 2372: field should be set to GROUP_API_VERSION.
 2373: .sp
 2374: This allows
 2375: \fBsudoers\fR
 2376: to determine the API version the group plugin
 2377: was built against.
 2378: .TP 6n
 2379: init
 2380: .nf
 2381: .RS 6n
 2382: int (*init)(int version, sudo_printf_t plugin_printf,
 2383:             char *const argv[]);
 2384: .RE
 2385: .fi
 2386: .RS 6n
 2387: .sp
 2388: The
 2389: \fBinit\fR()
 2390: function is called after
 2391: \fIsudoers\fR
 2392: has been parsed but
 2393: before any policy checks.
 2394: It returns 1 on success, 0 on failure (or if the plugin is not configured),
 2395: and \-1 if a error occurred.
 2396: If an error occurs, the plugin may call the
 2397: \fBplugin_printf\fR()
 2398: function with
 2399: \fRSUDO_CONF_ERROR_MSG\fR
 2400: to present additional error information
 2401: to the user.
 2402: .sp
 2403: The function arguments are as follows:
 2404: .TP 6n
 2405: version
 2406: The version passed in by
 2407: \fBsudoers\fR
 2408: allows the plugin to determine the
 2409: major and minor version number of the group plugin API supported by
 2410: \fBsudoers\fR.
 2411: .TP 6n
 2412: plugin_printf
 2413: A pointer to a
 2414: \fBprintf\fR()-style
 2415: function that may be used to display informational or error message to the user.
 2416: Returns the number of characters printed on success and \-1 on failure.
 2417: .TP 6n
 2418: argv
 2419: A
 2420: \fRNULL\fR-terminated
 2421: array of arguments generated from the
 2422: \fIgroup_plugin\fR
 2423: option in
 2424: \fIsudoers\fR.
 2425: If no arguments were given,
 2426: \fIargv\fR
 2427: will be
 2428: \fRNULL\fR.
 2429: .PD 0
 2430: .PP
 2431: .RE
 2432: .PD
 2433: .TP 6n
 2434: cleanup
 2435: .nf
 2436: .RS 6n
 2437: void (*cleanup)();
 2438: .RE
 2439: .fi
 2440: .RS 6n
 2441: .sp
 2442: The
 2443: \fBcleanup\fR()
 2444: function is called when
 2445: \fBsudoers\fR
 2446: has finished its
 2447: group checks.
 2448: The plugin should free any memory it has allocated and close open file handles.
 2449: .RE
 2450: .TP 6n
 2451: query
 2452: .br
 2453: .nf
 2454: .RS 6n
 2455: int (*query)(const char *user, const char *group,
 2456:              const struct passwd *pwd);
 2457: .RE
 2458: .fi
 2459: .RS 6n
 2460: .sp
 2461: The
 2462: \fBquery\fR()
 2463: function is used to ask the group plugin whether
 2464: \fIuser\fR
 2465: is a member of
 2466: \fIgroup\fR.
 2467: .sp
 2468: The function arguments are as follows:
 2469: .TP 6n
 2470: user
 2471: The name of the user being looked up in the external group database.
 2472: .TP 6n
 2473: group
 2474: .br
 2475: The name of the group being queried.
 2476: .TP 6n
 2477: pwd
 2478: The password database entry for
 2479: \fIuser\fR,
 2480: if any.
 2481: If
 2482: \fIuser\fR
 2483: is not
 2484: present in the password database,
 2485: \fIpwd\fR
 2486: will be
 2487: \fRNULL\fR.
 2488: .PD 0
 2489: .PP
 2490: .RE
 2491: .PD
 2492: .PP
 2493: \fIGroup API Version Macros\fR
 2494: .nf
 2495: .sp
 2496: .RS 0n
 2497: /* Sudoers group plugin version major/minor */
 2498: #define GROUP_API_VERSION_MAJOR 1
 2499: #define GROUP_API_VERSION_MINOR 0
 2500: #define GROUP_API_VERSION ((GROUP_API_VERSION_MAJOR << 16) | \e
 2501:                            GROUP_API_VERSION_MINOR)
 2502: 
 2503: /* Getters and setters for group version */
 2504: #define GROUP_API_VERSION_GET_MAJOR(v) ((v) >> 16)
 2505: #define GROUP_API_VERSION_GET_MINOR(v) ((v) & 0xffff)
 2506: #define GROUP_API_VERSION_SET_MAJOR(vp, n) do { \e
 2507:     *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \e
 2508: } while(0)
 2509: #define GROUP_API_VERSION_SET_MINOR(vp, n) do { \e
 2510:     *(vp) = (*(vp) & 0xffff0000) | (n); \e
 2511: } while(0)
 2512: .RE
 2513: .fi
 2514: .SH "PLUGIN API CHANGELOG"
 2515: The following revisions have been made to the Sudo Plugin API.
 2516: .TP 6n
 2517: Version 1.0
 2518: Initial API version.
 2519: .TP 6n
 2520: Version 1.1 (sudo 1.8.0)
 2521: The I/O logging plugin's
 2522: \fBopen\fR()
 2523: function was modified to take the
 2524: \fRcommand_info\fR
 2525: list as an argument.
 2526: .TP 6n
 2527: Version 1.2 (sudo 1.8.5)
 2528: The Policy and I/O logging plugins'
 2529: \fBopen\fR()
 2530: functions are now passed
 2531: a list of plugin parameters if any are specified in
 2532: sudo.conf(@mansectform@).
 2533: .sp
 2534: A simple hooks API has been introduced to allow plugins to hook in to the
 2535: system's environment handling functions.
 2536: .sp
 2537: The
 2538: \fRinit_session\fR
 2539: Policy plugin function is now passed a pointer
 2540: to the user environment which can be updated as needed.
 2541: This can be used to merge in environment variables stored in the PAM
 2542: handle before a command is run.
 2543: .TP 6n
 2544: Version 1.3 (sudo 1.8.7)
 2545: Support for the
 2546: \fIexec_background\fR
 2547: entry has been added to the
 2548: \fRcommand_info\fR
 2549: list.
 2550: .sp
 2551: The
 2552: \fImax_groups\fR
 2553: and
 2554: \fIplugin_dir\fR
 2555: entries were added to the
 2556: \fRsettings\fR
 2557: list.
 2558: .sp
 2559: The
 2560: \fBversion\fR()
 2561: and
 2562: \fBclose\fR()
 2563: functions are now optional.
 2564: Previously, a missing
 2565: \fBversion\fR()
 2566: or
 2567: \fBclose\fR()
 2568: function would result in a crash.
 2569: If no policy plugin
 2570: \fBclose\fR()
 2571: function is defined, a default
 2572: \fBclose\fR()
 2573: function will be provided by the
 2574: \fBsudo\fR
 2575: front end that displays a warning if the command could not be
 2576: executed.
 2577: .sp
 2578: The
 2579: \fBsudo\fR
 2580: front end now installs default signal handlers to trap common signals
 2581: while the plugin functions are run.
 2582: .TP 6n
 2583: Version 1.4 (sudo 1.8.8)
 2584: The
 2585: \fIremote_host\fR
 2586: entry was added to the
 2587: \fRsettings\fR
 2588: list.
 2589: .TP 6n
 2590: Version 1.5 (sudo 1.8.9)
 2591: The
 2592: entry was added to the
 2593: \fRcommand_info\fR
 2594: list.
 2595: .SH "SEE ALSO"
 2596: sudo.conf(@mansectform@),
 2597: sudoers(@mansectform@),
 2598: sudo(@mansectsu@)
 2599: .SH "BUGS"
 2600: If you feel you have found a bug in
 2601: \fBsudo\fR,
 2602: please submit a bug report at http://www.sudo.ws/sudo/bugs/
 2603: .SH "SUPPORT"
 2604: Limited free support is available via the sudo-users mailing list,
 2605: see http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or
 2606: search the archives.
 2607: .SH "DISCLAIMER"
 2608: \fBsudo\fR
 2609: is provided
 2610: \(lqAS IS\(rq
 2611: and any express or implied warranties, including, but not limited
 2612: to, the implied warranties of merchantability and fitness for a
 2613: particular purpose are disclaimed.
 2614: See the LICENSE file distributed with
 2615: \fBsudo\fR
 2616: or http://www.sudo.ws/sudo/license.html for complete details.

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