- char * const *cur;
- const char *p, *groups = NULL;
- const char *debug_flags = NULL;
- int flags = 0;
- debug_decl(deserialize_info, SUDO_DEBUG_PLUGIN)
-
-#define MATCHES(s, v) (strncmp(s, v, sizeof(v) - 1) == 0)
-
- /* Parse sudo.conf plugin args. */
- if (args != NULL) {
- for (cur = args; *cur != NULL; cur++) {
- if (MATCHES(*cur, "sudoers_file=")) {
- sudoers_file = *cur + sizeof("sudoers_file=") - 1;
- continue;
- }
- if (MATCHES(*cur, "sudoers_uid=")) {
- sudoers_uid = (uid_t) atoi(*cur + sizeof("sudoers_uid=") - 1);
- continue;
- }
- if (MATCHES(*cur, "sudoers_gid=")) {
- sudoers_gid = (gid_t) atoi(*cur + sizeof("sudoers_gid=") - 1);
- continue;
- }
- if (MATCHES(*cur, "sudoers_mode=")) {
- sudoers_mode = (mode_t) strtol(*cur + sizeof("sudoers_mode=") - 1,
- NULL, 8);
- continue;
- }
- }
- }
-
- /* Parse command line settings. */
- user_closefrom = -1;
- for (cur = settings; *cur != NULL; cur++) {
- if (MATCHES(*cur, "closefrom=")) {
- user_closefrom = atoi(*cur + sizeof("closefrom=") - 1);
- continue;
- }
- if (MATCHES(*cur, "debug_flags=")) {
- debug_flags = *cur + sizeof("debug_flags=") - 1;
- continue;
- }
- if (MATCHES(*cur, "runas_user=")) {
- runas_user = *cur + sizeof("runas_user=") - 1;
- sudo_user.flags |= RUNAS_USER_SPECIFIED;
- continue;
- }
- if (MATCHES(*cur, "runas_group=")) {
- runas_group = *cur + sizeof("runas_group=") - 1;
- sudo_user.flags |= RUNAS_GROUP_SPECIFIED;
- continue;
- }
- if (MATCHES(*cur, "prompt=")) {
- user_prompt = *cur + sizeof("prompt=") - 1;
- def_passprompt_override = true;
- continue;
- }
- if (MATCHES(*cur, "set_home=")) {
- if (atobool(*cur + sizeof("set_home=") - 1) == true)
- SET(flags, MODE_RESET_HOME);
- continue;
- }
- if (MATCHES(*cur, "preserve_environment=")) {
- if (atobool(*cur + sizeof("preserve_environment=") - 1) == true)
- SET(flags, MODE_PRESERVE_ENV);
- continue;
- }
- if (MATCHES(*cur, "run_shell=")) {
- if (atobool(*cur + sizeof("run_shell=") - 1) == true)
- SET(flags, MODE_SHELL);
- continue;
- }
- if (MATCHES(*cur, "login_shell=")) {
- if (atobool(*cur + sizeof("login_shell=") - 1) == true) {
- SET(flags, MODE_LOGIN_SHELL);
- def_env_reset = true;
- }
- continue;
- }
- if (MATCHES(*cur, "implied_shell=")) {
- if (atobool(*cur + sizeof("implied_shell=") - 1) == true)
- SET(flags, MODE_IMPLIED_SHELL);
- continue;
- }
- if (MATCHES(*cur, "preserve_groups=")) {
- if (atobool(*cur + sizeof("preserve_groups=") - 1) == true)
- SET(flags, MODE_PRESERVE_GROUPS);
- continue;
- }
- if (MATCHES(*cur, "ignore_ticket=")) {
- if (atobool(*cur + sizeof("ignore_ticket=") - 1) == true)
- SET(flags, MODE_IGNORE_TICKET);
- continue;
- }
- if (MATCHES(*cur, "noninteractive=")) {
- if (atobool(*cur + sizeof("noninteractive=") - 1) == true)
- SET(flags, MODE_NONINTERACTIVE);
- continue;
- }
- if (MATCHES(*cur, "sudoedit=")) {
- if (atobool(*cur + sizeof("sudoedit=") - 1) == true)
- SET(flags, MODE_EDIT);
- continue;
- }
- if (MATCHES(*cur, "login_class=")) {
- login_class = *cur + sizeof("login_class=") - 1;
- def_use_loginclass = true;
- continue;
- }
-#ifdef HAVE_PRIV_SET
- if (MATCHES(*cur, "runas_privs=")) {
- def_privs = *cur + sizeof("runas_privs=") - 1;
- continue;
- }
- if (MATCHES(*cur, "runas_limitprivs=")) {
- def_limitprivs = *cur + sizeof("runas_limitprivs=") - 1;
- continue;
- }
-#endif /* HAVE_PRIV_SET */
-#ifdef HAVE_SELINUX
- if (MATCHES(*cur, "selinux_role=")) {
- user_role = *cur + sizeof("selinux_role=") - 1;
- continue;
- }
- if (MATCHES(*cur, "selinux_type=")) {
- user_type = *cur + sizeof("selinux_type=") - 1;
- continue;
- }
-#endif /* HAVE_SELINUX */
-#ifdef HAVE_BSD_AUTH_H
- if (MATCHES(*cur, "bsdauth_type=")) {
- login_style = *cur + sizeof("bsdauth_type=") - 1;
- continue;
- }
-#endif /* HAVE_BSD_AUTH_H */
-#if !defined(HAVE_GETPROGNAME) && !defined(HAVE___PROGNAME)
- if (MATCHES(*cur, "progname=")) {
- setprogname(*cur + sizeof("progname=") - 1);
- continue;
- }
-#endif
- if (MATCHES(*cur, "network_addrs=")) {
- interfaces_string = *cur + sizeof("network_addrs=") - 1;
- set_interfaces(interfaces_string);
- continue;
- }
- }
-
- for (cur = user_info; *cur != NULL; cur++) {
- if (MATCHES(*cur, "user=")) {
- user_name = estrdup(*cur + sizeof("user=") - 1);
- continue;
- }
- if (MATCHES(*cur, "uid=")) {
- user_uid = (uid_t) atoi(*cur + sizeof("uid=") - 1);
- continue;
- }
- if (MATCHES(*cur, "gid=")) {
- p = *cur + sizeof("gid=") - 1;
- user_gid = (gid_t) atoi(p);
- continue;
- }
- if (MATCHES(*cur, "groups=")) {
- groups = *cur + sizeof("groups=") - 1;
- continue;
- }
- if (MATCHES(*cur, "cwd=")) {
- user_cwd = estrdup(*cur + sizeof("cwd=") - 1);
- continue;
- }
- if (MATCHES(*cur, "tty=")) {
- user_tty = user_ttypath = estrdup(*cur + sizeof("tty=") - 1);
- if (strncmp(user_tty, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0)
- user_tty += sizeof(_PATH_DEV) - 1;
- continue;
- }
- if (MATCHES(*cur, "host=")) {
- user_host = user_shost = estrdup(*cur + sizeof("host=") - 1);
- if ((p = strchr(user_host, '.')))
- user_shost = estrndup(user_host, (size_t)(p - user_host));
- continue;
- }
- if (MATCHES(*cur, "lines=")) {
- sudo_user.lines = atoi(*cur + sizeof("lines=") - 1);
- continue;
- }
- if (MATCHES(*cur, "cols=")) {
- sudo_user.cols = atoi(*cur + sizeof("cols=") - 1);
- continue;
- }
- if (MATCHES(*cur, "sid=")) {
- sudo_user.sid = atoi(*cur + sizeof("sid=") - 1);
- continue;
- }
- }
- if (user_cwd == NULL)
- user_cwd = "unknown";
- if (user_tty == NULL)
- user_tty = "unknown"; /* user_ttypath remains NULL */
-
- if (groups != NULL && groups[0] != '\0') {
- const char *cp;
- GETGROUPS_T *gids;
- int ngids;
-
- /* Count number of groups, including passwd gid. */
- ngids = 2;
- for (cp = groups; *cp != '\0'; cp++) {
- if (*cp == ',')
- ngids++;
- }
-
- /* The first gid in the list is the passwd group gid. */
- gids = emalloc2(ngids, sizeof(GETGROUPS_T));
- gids[0] = user_gid;
- ngids = 1;
- cp = groups;
- for (;;) {
- gids[ngids] = atoi(cp);
- if (gids[0] != gids[ngids])
- ngids++;
- cp = strchr(cp, ',');
- if (cp == NULL)
- break;
- cp++; /* skip over comma */
- }
- user_gids = gids;
- user_ngids = ngids;
- }