pam_group: Add ruser and luser options.
authorPeter Avalos <pavalos@dragonflybsd.org>
Sat, 24 Dec 2011 20:15:58 +0000 (12:15 -0800)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sat, 24 Dec 2011 20:15:58 +0000 (12:15 -0800)
The former corresponds to the current behavior, where the module checks
that the supplicant is a member of the required group.  The latter
checks the target user instead.  If neither option was specified,
pam_group(8) assumes "ruser" and issues a warning.

Obtained-from:  FreeBSD 219563 & 219564

lib/pam_module/pam_group/pam_group.8
lib/pam_module/pam_group/pam_group.c

index 1ee17e8..9be9b96 100644 (file)
@@ -1,4 +1,5 @@
 .\" Copyright (c) 2003 Networks Associates Technology, Inc.
 .\" Copyright (c) 2003 Networks Associates Technology, Inc.
+.\" Copyright (c) 2004-2011 Dag-Erling Smørgrav
 .\" All rights reserved.
 .\"
 .\" Portions of this software were developed for the FreeBSD Project by
 .\" All rights reserved.
 .\"
 .\" Portions of this software were developed for the FreeBSD Project by
@@ -30,9 +31,9 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\" $FreeBSD: src/lib/libpam/modules/pam_group/pam_group.8,v 1.3 2004/07/02 23:52:17 ru Exp $
+.\" $FreeBSD: src/lib/libpam/modules/pam_group/pam_group.8,v 1.4 2011/03/12 11:12:30 des Exp $
 .\"
 .\"
-.Dd February 6, 2003
+.Dd December 24, 2011
 .Dt PAM_GROUP 8
 .Os
 .Sh NAME
 .Dt PAM_GROUP 8
 .Os
 .Sh NAME
@@ -64,10 +65,23 @@ it does exist and the applicant is a member.
 Specify the name of the group to check.
 The default is
 .Dq Li wheel .
 Specify the name of the group to check.
 The default is
 .Dq Li wheel .
+.It Cm luser
+Accept or reject based on the target user's group membership.
 .It Cm root_only
 Skip this module entirely if the target account is not the superuser
 account.
 .It Cm root_only
 Skip this module entirely if the target account is not the superuser
 account.
+.It Cm ruser
+Accept or reject based on the supplicant's group membership.
+This is the default.
 .El
 .El
+.Pp
+Note that the
+.Cm luser
+and
+.Cm ruser
+options are mutually exclusive, and that
+.Nm
+will fail if both are specified.
 .Sh SEE ALSO
 .Xr pam.conf 5 ,
 .Xr pam 8
 .Sh SEE ALSO
 .Xr pam.conf 5 ,
 .Xr pam 8
index d9e44f3..c76158e 100644 (file)
@@ -1,5 +1,6 @@
 /*-
  * Copyright (c) 2003 Networks Associates Technology, Inc.
 /*-
  * Copyright (c) 2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
  * All rights reserved.
  *
  * Portions of this software were developed for the FreeBSD Project by
  * All rights reserved.
  *
  * Portions of this software were developed for the FreeBSD Project by
@@ -31,7 +32,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/lib/libpam/modules/pam_group/pam_group.c,v 1.4 2003/12/11 13:55:15 des Exp $
+ * $FreeBSD: src/lib/libpam/modules/pam_group/pam_group.c,v 1.6 2011/03/12 11:26:37 des Exp $
  */
 
 #include <sys/types.h>
  */
 
 #include <sys/types.h>
@@ -55,6 +56,7 @@ PAM_EXTERN int
 pam_sm_authenticate(pam_handle_t *pamh, int flags __unused,
                    int argc __unused, const char *argv[] __unused)
 {
 pam_sm_authenticate(pam_handle_t *pamh, int flags __unused,
                    int argc __unused, const char *argv[] __unused)
 {
+       int local, remote;
        const char *group, *user;
        const void *ruser;
        char *const *list;
        const char *group, *user;
        const void *ruser;
        char *const *list;
@@ -68,10 +70,24 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags __unused,
        if (pwd->pw_uid != 0 && openpam_get_option(pamh, "root_only"))
                return (PAM_IGNORE);
 
        if (pwd->pw_uid != 0 && openpam_get_option(pamh, "root_only"))
                return (PAM_IGNORE);
 
-       /* get applicant */
-       if (pam_get_item(pamh, PAM_RUSER, &ruser) != PAM_SUCCESS
-           || ruser == NULL || (pwd = getpwnam(ruser)) == NULL)
-               return (PAM_AUTH_ERR);
+       /* check local / remote */
+       local = openpam_get_option(pamh, "luser") ? 1 : 0;
+       remote = openpam_get_option(pamh, "ruser") ? 1 : 0;
+       if (local && remote) {
+               openpam_log(PAM_LOG_ERROR, "(pam_group) "
+                   "the luser and ruser options are mutually exclusive");
+               return (PAM_SERVICE_ERR);
+       } else if (local) {
+               /* we already have the correct struct passwd */
+       } else {
+               if (!remote)
+                       openpam_log(PAM_LOG_NOTICE, "(pam_group) "
+                           "neither luser nor ruser specified, assuming ruser");
+               /* default / historical behavior */
+               if (pam_get_item(pamh, PAM_RUSER, &ruser) != PAM_SUCCESS ||
+                   ruser == NULL || (pwd = getpwnam(ruser)) == NULL)
+                       return (PAM_AUTH_ERR);
+       }
 
        /* get regulating group */
        if ((group = openpam_get_option(pamh, "group")) == NULL)
 
        /* get regulating group */
        if ((group = openpam_get_option(pamh, "group")) == NULL)