$OpenBSD: patch-src_user_c,v 1.17 2012/11/16 08:50:19 ajacoutot Exp $ --- src/user.c.orig Mon Nov 12 21:46:53 2012 +++ src/user.c Fri Nov 16 09:37:40 2012 @@ -116,7 +116,12 @@ account_type_from_pwent (struct passwd *pwent) { struct group *grp; gid_t wheel; +#ifndef __OpenBSD__ gid_t *groups; +#else + gid_t groups[NGROUPS_MAX + 1]; +#endif + gint ngroups; gint i; @@ -132,16 +137,28 @@ account_type_from_pwent (struct passwd *pwent) } wheel = grp->gr_gid; +#ifdef __OpenBSD__ + ngroups = sizeof(groups) / sizeof(gid_t); + if (getgrouplist (pwent->pw_name, pwent->pw_gid, groups, &ngroups) == -1) { + g_warning ("too many groups"); + return ACCOUNT_TYPE_STANDARD; + } +#else ngroups = get_user_groups (pwent->pw_name, pwent->pw_gid, &groups); +#endif for (i = 0; i < ngroups; i++) { if (groups[i] == wheel) { +#ifndef __OpenBSD__ g_free (groups); +#endif return ACCOUNT_TYPE_ADMINISTRATOR; } } +#ifndef __OpenBSD__ g_free (groups); +#endif return ACCOUNT_TYPE_STANDARD; } @@ -251,7 +268,11 @@ user_update_from_pwent (User *user, passwd = spent->sp_pwdp; #endif +#ifdef __OpenBSD__ + if (passwd && passwd[0] == '*') { +#else if (passwd && passwd[0] == '!') { +#endif locked = TRUE; } else { @@ -390,7 +411,7 @@ save_extra_data (User *user) error = NULL; data = g_key_file_to_data (keyfile, NULL, &error); if (error == NULL) { - filename = g_build_filename ("/var/lib/AccountsService/users", + filename = g_build_filename ("/var/db/AccountsService/users", user->user_name, NULL); g_file_set_contents (filename, data, -1, &error); @@ -411,9 +432,10 @@ move_extra_data (const gchar *old_name, gchar *old_filename; gchar *new_filename; - old_filename = g_build_filename ("/var/lib/AccountsService/users", + old_filename = g_build_filename ("/var/db/AccountsService/users", old_name, NULL); - new_filename = g_build_filename ("/var/lib/AccountsService/users", + + new_filename = g_build_filename ("/var/db/AccountsService/users", new_name, NULL); g_rename (old_filename, new_filename); @@ -1229,7 +1251,11 @@ user_change_locked_authorized_cb (Daemon "%s account of user '%s' (%d)", locked ? "locking" : "unlocking", user->user_name, user->uid); argv[0] = "/usr/sbin/usermod"; +#ifdef __OpenBSD__ + argv[1] = locked ? "-Z" : "-U"; +#else argv[1] = locked ? "-L" : "-U"; +#endif argv[2] = "--"; argv[3] = user->user_name; argv[4] = NULL; @@ -1278,13 +1304,23 @@ user_change_account_type_authorized_cb (Daemon { AccountType account_type = GPOINTER_TO_INT (data); GError *error; +#ifndef __OpenBSD__ gid_t *groups; +#else + gid_t groups[NGROUPS_MAX + 1]; + struct group *obsdgrp; +#endif gint ngroups; GString *str; gid_t wheel; struct group *grp; gint i; +#ifndef __OpenBSD__ const gchar *argv[6]; +#else + const gchar *argv[8]; + gchar *class = "\0"; +#endif if (user->account_type != account_type) { sys_log (context, @@ -1298,17 +1334,35 @@ user_change_account_type_authorized_cb (Daemon } wheel = grp->gr_gid; +#ifdef __OpenBSD__ + ngroups = sizeof(groups) / sizeof(gid_t); + if (getgrouplist (user->user_name, user->gid, groups, &ngroups) == -1) { + g_warning ("too many groups"); + account_type = ACCOUNT_TYPE_STANDARD; + } +#else ngroups = get_user_groups (user->user_name, user->gid, &groups); +#endif str = g_string_new (""); for (i = 0; i < ngroups; i++) { if (groups[i] == wheel) continue; +#ifdef __OpenBSD__ + obsdgrp = getgrgid(groups[i]); + g_string_append_printf (str, "%s,", obsdgrp->gr_name); +#else g_string_append_printf (str, "%d,", groups[i]); +#endif } switch (account_type) { case ACCOUNT_TYPE_ADMINISTRATOR: +#ifdef __OpenBSD__ + g_string_append_printf (str, "%s", "wheel"); + class = "staff"; +#else g_string_append_printf (str, "%d", wheel); +#endif break; case ACCOUNT_TYPE_STANDARD: default: @@ -1317,14 +1371,26 @@ user_change_account_type_authorized_cb (Daemon break; } +#ifndef __OpenBSD__ g_free (groups); +#endif argv[0] = "/usr/sbin/usermod"; +#ifdef __OpenBSD__ + argv[1] = "-S"; + argv[2] = str->str; + argv[3] = "-L"; + argv[4] = class; + argv[5] = "--"; + argv[6] = user->user_name; + argv[7] = NULL; +#else argv[1] = "-G"; argv[2] = str->str; argv[3] = "--"; argv[4] = user->user_name; argv[5] = NULL; +#endif g_string_free (str, FALSE);