Merge pull request #128 from jhrozek/sssd

Flush sssd caches in addition to nscd caches
This commit is contained in:
Serge Hallyn 2018-10-18 12:26:38 -07:00 committed by GitHub
commit 58ee899dce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 146 additions and 0 deletions

View File

@ -280,6 +280,9 @@ AC_ARG_WITH(sha-crypt,
AC_ARG_WITH(nscd, AC_ARG_WITH(nscd,
[AC_HELP_STRING([--with-nscd], [enable support for nscd @<:@default=yes@:>@])], [AC_HELP_STRING([--with-nscd], [enable support for nscd @<:@default=yes@:>@])],
[with_nscd=$withval], [with_nscd=yes]) [with_nscd=$withval], [with_nscd=yes])
AC_ARG_WITH(sssd,
[AC_HELP_STRING([--with-sssd], [enable support for flushing sssd caches @<:@default=yes@:>@])],
[with_sssd=$withval], [with_sssd=yes])
AC_ARG_WITH(group-name-max-length, AC_ARG_WITH(group-name-max-length,
[AC_HELP_STRING([--with-group-name-max-length], [set max group name length @<:@default=16@:>@])], [AC_HELP_STRING([--with-group-name-max-length], [set max group name length @<:@default=16@:>@])],
[with_group_name_max_length=$withval], [with_group_name_max_length=yes]) [with_group_name_max_length=$withval], [with_group_name_max_length=yes])
@ -304,6 +307,12 @@ if test "$with_nscd" = "yes"; then
[AC_MSG_ERROR([posix_spawn is needed for nscd support])]) [AC_MSG_ERROR([posix_spawn is needed for nscd support])])
fi fi
if test "$with_sssd" = "yes"; then
AC_CHECK_FUNC(posix_spawn,
[AC_DEFINE(USE_SSSD, 1, [Define to support flushing of sssd caches])],
[AC_MSG_ERROR([posix_spawn is needed for sssd support])])
fi
dnl Check for some functions in libc first, only if not found check for dnl Check for some functions in libc first, only if not found check for
dnl other libraries. This should prevent linking libnsl if not really dnl other libraries. This should prevent linking libnsl if not really
dnl needed (Linux glibc, Irix), but still link it if needed (Solaris). dnl needed (Linux glibc, Irix), but still link it if needed (Solaris).
@ -679,5 +688,6 @@ echo " shadow group support: $enable_shadowgrp"
echo " S/Key support: $with_skey" echo " S/Key support: $with_skey"
echo " SHA passwords encryption: $with_sha_crypt" echo " SHA passwords encryption: $with_sha_crypt"
echo " nscd support: $with_nscd" echo " nscd support: $with_nscd"
echo " sssd support: $with_sssd"
echo " subordinate IDs support: $enable_subids" echo " subordinate IDs support: $enable_subids"
echo echo

View File

@ -30,6 +30,8 @@ libshadow_la_SOURCES = \
lockpw.c \ lockpw.c \
nscd.c \ nscd.c \
nscd.h \ nscd.h \
sssd.c \
sssd.h \
pam_defs.h \ pam_defs.h \
port.c \ port.c \
port.h \ port.h \

View File

@ -45,6 +45,7 @@
#include <stdio.h> #include <stdio.h>
#include <signal.h> #include <signal.h>
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#ifdef WITH_TCB #ifdef WITH_TCB
#include <tcb.h> #include <tcb.h>
#endif /* WITH_TCB */ #endif /* WITH_TCB */
@ -485,6 +486,7 @@ static void dec_lock_count (void)
if (nscd_need_reload) { if (nscd_need_reload) {
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_PASSWD | SSSD_DB_GROUP);
nscd_need_reload = false; nscd_need_reload = false;
} }
#ifdef HAVE_LCKPWDF #ifdef HAVE_LCKPWDF

75
lib/sssd.c Normal file
View File

@ -0,0 +1,75 @@
/* Author: Peter Vrabec <pvrabec@redhat.com> */
#include <config.h>
#ifdef USE_SSSD
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include "exitcodes.h"
#include "defines.h"
#include "prototypes.h"
#include "sssd.h"
#define MSG_SSSD_FLUSH_CACHE_FAILED "%s: Failed to flush the sssd cache.\n"
int sssd_flush_cache (int dbflags)
{
int status, code, rv;
const char *cmd = "/usr/sbin/sss_cache";
char *sss_cache_args = NULL;
const char *spawnedArgs[] = {"sss_cache", NULL, NULL};
const char *spawnedEnv[] = {NULL};
int i = 0;
sss_cache_args = malloc(4);
if (sss_cache_args == NULL) {
return -1;
}
sss_cache_args[i++] = '-';
if (dbflags & SSSD_DB_PASSWD) {
sss_cache_args[i++] = 'U';
}
if (dbflags & SSSD_DB_GROUP) {
sss_cache_args[i++] = 'G';
}
sss_cache_args[i++] = '\0';
if (i == 2) {
/* Neither passwd nor group, nothing to do */
free(sss_cache_args);
return 0;
}
spawnedArgs[1] = sss_cache_args;
rv = run_command (cmd, spawnedArgs, spawnedEnv, &status);
free(sss_cache_args);
if (rv != 0) {
/* run_command writes its own more detailed message. */
(void) fprintf (stderr, _(MSG_SSSD_FLUSH_CACHE_FAILED), Prog);
return -1;
}
code = WEXITSTATUS (status);
if (!WIFEXITED (status)) {
(void) fprintf (stderr,
_("%s: sss_cache did not terminate normally (signal %d)\n"),
Prog, WTERMSIG (status));
return -1;
} else if (code == E_CMD_NOTFOUND) {
/* sss_cache is not installed, or it is installed but uses an
interpreter that is missing. Probably the former. */
return 0;
} else if (code != 0) {
(void) fprintf (stderr, _("%s: sss_cache exited with status %d\n"),
Prog, code);
(void) fprintf (stderr, _(MSG_SSSD_FLUSH_CACHE_FAILED), Prog);
return -1;
}
return 0;
}
#else /* USE_SSSD */
extern int errno; /* warning: ANSI C forbids an empty source file */
#endif /* USE_SSSD */

17
lib/sssd.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef _SSSD_H_
#define _SSSD_H_
#define SSSD_DB_PASSWD 0x001
#define SSSD_DB_GROUP 0x002
/*
* sssd_flush_cache - flush specified service buffer in sssd cache
*/
#ifdef USE_SSSD
extern int sssd_flush_cache (int dbflags);
#else
#define sssd_flush_cache(service) (0)
#endif
#endif

View File

@ -47,6 +47,7 @@
#include "defines.h" #include "defines.h"
#include "getdef.h" #include "getdef.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#ifdef USE_PAM #ifdef USE_PAM
#include "pam_defs.h" #include "pam_defs.h"
#endif #endif
@ -746,6 +747,7 @@ int main (int argc, char **argv)
SYSLOG ((LOG_INFO, "changed user '%s' information", user)); SYSLOG ((LOG_INFO, "changed user '%s' information", user));
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
sssd_flush_cache (SSSD_DB_PASSWD);
closelog (); closelog ();
exit (E_SUCCESS); exit (E_SUCCESS);

View File

@ -46,6 +46,7 @@
#endif /* ACCT_TOOLS_SETUID */ #endif /* ACCT_TOOLS_SETUID */
#include "defines.h" #include "defines.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#include "groupio.h" #include "groupio.h"
#ifdef SHADOWGRP #ifdef SHADOWGRP
@ -581,6 +582,7 @@ int main (int argc, char **argv)
close_files (); close_files ();
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_GROUP);
return (0); return (0);
} }

View File

@ -44,6 +44,7 @@
#endif /* USE_PAM */ #endif /* USE_PAM */
#include "defines.h" #include "defines.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "getdef.h" #include "getdef.h"
#include "prototypes.h" #include "prototypes.h"
#include "pwio.h" #include "pwio.h"
@ -624,6 +625,7 @@ int main (int argc, char **argv)
} }
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
sssd_flush_cache (SSSD_DB_PASSWD);
return (0); return (0);
} }

View File

@ -46,6 +46,7 @@
#include "defines.h" #include "defines.h"
#include "getdef.h" #include "getdef.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#include "pwauth.h" #include "pwauth.h"
#include "pwio.h" #include "pwio.h"
@ -557,6 +558,7 @@ int main (int argc, char **argv)
SYSLOG ((LOG_INFO, "changed user '%s' shell to '%s'", user, loginsh)); SYSLOG ((LOG_INFO, "changed user '%s' shell to '%s'", user, loginsh));
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
sssd_flush_cache (SSSD_DB_PASSWD);
closelog (); closelog ();
exit (E_SUCCESS); exit (E_SUCCESS);

View File

@ -45,6 +45,7 @@
#include "defines.h" #include "defines.h"
#include "groupio.h" #include "groupio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#ifdef SHADOWGRP #ifdef SHADOWGRP
#include "sgroupio.h" #include "sgroupio.h"
@ -1201,6 +1202,7 @@ int main (int argc, char **argv)
close_files (); close_files ();
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_GROUP);
exit (E_SUCCESS); exit (E_SUCCESS);
} }

View File

@ -51,6 +51,7 @@
#include "getdef.h" #include "getdef.h"
#include "groupio.h" #include "groupio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#ifdef SHADOWGRP #ifdef SHADOWGRP
#include "sgroupio.h" #include "sgroupio.h"
@ -625,6 +626,7 @@ int main (int argc, char **argv)
close_files (); close_files ();
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_GROUP);
return E_SUCCESS; return E_SUCCESS;
} }

View File

@ -49,6 +49,7 @@
#include "defines.h" #include "defines.h"
#include "groupio.h" #include "groupio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#ifdef SHADOWGRP #ifdef SHADOWGRP
#include "sgroupio.h" #include "sgroupio.h"
@ -492,6 +493,7 @@ int main (int argc, char **argv)
close_files (); close_files ();
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_GROUP);
return E_SUCCESS; return E_SUCCESS;
} }

View File

@ -51,6 +51,7 @@
#include "groupio.h" #include "groupio.h"
#include "pwio.h" #include "pwio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#ifdef SHADOWGRP #ifdef SHADOWGRP
#include "sgroupio.h" #include "sgroupio.h"
@ -877,6 +878,7 @@ int main (int argc, char **argv)
close_files (); close_files ();
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_GROUP);
return E_SUCCESS; return E_SUCCESS;
} }

View File

@ -45,6 +45,7 @@
#include "defines.h" #include "defines.h"
#include "groupio.h" #include "groupio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#ifdef SHADOWGRP #ifdef SHADOWGRP
@ -870,6 +871,7 @@ int main (int argc, char **argv)
close_files (changed); close_files (changed);
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_GROUP);
/* /*
* Tell the user what we did and exit. * Tell the user what we did and exit.

View File

@ -48,6 +48,7 @@
#include <unistd.h> #include <unistd.h>
#include <getopt.h> #include <getopt.h>
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
/*@-exitarg@*/ /*@-exitarg@*/
#include "exitcodes.h" #include "exitcodes.h"
@ -273,6 +274,7 @@ int main (int argc, char **argv)
} }
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_GROUP);
return 0; return 0;
} }

View File

@ -48,6 +48,7 @@
#include <grp.h> #include <grp.h>
#include <getopt.h> #include <getopt.h>
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
/*@-exitarg@*/ /*@-exitarg@*/
#include "exitcodes.h" #include "exitcodes.h"
@ -236,6 +237,7 @@ int main (int argc, char **argv)
} }
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_GROUP);
return 0; return 0;
} }

View File

@ -62,6 +62,7 @@
#include "getdef.h" #include "getdef.h"
#include "groupio.h" #include "groupio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "pwio.h" #include "pwio.h"
#include "sgroupio.h" #include "sgroupio.h"
#include "shadowio.h" #include "shadowio.h"
@ -1233,6 +1234,7 @@ int main (int argc, char **argv)
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_PASSWD | SSSD_DB_GROUP);
#ifdef USE_PAM #ifdef USE_PAM
unsigned int i; unsigned int i;

View File

@ -51,6 +51,7 @@
#include "defines.h" #include "defines.h"
#include "getdef.h" #include "getdef.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#include "pwauth.h" #include "pwauth.h"
#include "pwio.h" #include "pwio.h"
@ -1150,6 +1151,7 @@ int main (int argc, char **argv)
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_PASSWD | SSSD_DB_GROUP);
SYSLOG ((LOG_INFO, "password for '%s' changed by '%s'", name, myname)); SYSLOG ((LOG_INFO, "password for '%s' changed by '%s'", name, myname));
closelog (); closelog ();

View File

@ -48,6 +48,7 @@
#include "shadowio.h" #include "shadowio.h"
#include "getdef.h" #include "getdef.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#ifdef WITH_TCB #ifdef WITH_TCB
#include "tcbfuncs.h" #include "tcbfuncs.h"
#endif /* WITH_TCB */ #endif /* WITH_TCB */
@ -877,6 +878,7 @@ int main (int argc, char **argv)
close_files (changed); close_files (changed);
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
sssd_flush_cache (SSSD_DB_PASSWD);
/* /*
* Tell the user what we did and exit. * Tell the user what we did and exit.

View File

@ -72,6 +72,7 @@
#include "pwio.h" #include "pwio.h"
#include "shadowio.h" #include "shadowio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
/* /*
* exit status values * exit status values
@ -328,6 +329,7 @@ int main (int argc, char **argv)
} }
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
sssd_flush_cache (SSSD_DB_PASSWD);
return E_SUCCESS; return E_SUCCESS;
} }

View File

@ -42,6 +42,7 @@
#include <getopt.h> #include <getopt.h>
#include "defines.h" #include "defines.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#include "pwio.h" #include "pwio.h"
#include "shadowio.h" #include "shadowio.h"
@ -250,6 +251,7 @@ int main (int argc, char **argv)
} }
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
sssd_flush_cache (SSSD_DB_PASSWD);
return 0; return 0;
} }

View File

@ -60,6 +60,7 @@
#include "getdef.h" #include "getdef.h"
#include "groupio.h" #include "groupio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#include "pwauth.h" #include "pwauth.h"
#include "pwio.h" #include "pwio.h"
@ -2425,6 +2426,7 @@ int main (int argc, char **argv)
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_PASSWD | SSSD_DB_GROUP);
return E_SUCCESS; return E_SUCCESS;
} }

View File

@ -53,6 +53,7 @@
#include "getdef.h" #include "getdef.h"
#include "groupio.h" #include "groupio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#include "pwauth.h" #include "pwauth.h"
#include "pwio.h" #include "pwio.h"
@ -1328,6 +1329,7 @@ int main (int argc, char **argv)
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_PASSWD | SSSD_DB_GROUP);
return ((0 != errors) ? E_HOMEDIR : E_SUCCESS); return ((0 != errors) ? E_HOMEDIR : E_SUCCESS);
} }

View File

@ -57,6 +57,7 @@
#include "getdef.h" #include "getdef.h"
#include "groupio.h" #include "groupio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#include "pwauth.h" #include "pwauth.h"
#include "pwio.h" #include "pwio.h"
@ -2255,6 +2256,7 @@ int main (int argc, char **argv)
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_PASSWD | SSSD_DB_GROUP);
#ifdef WITH_SELINUX #ifdef WITH_SELINUX
if (Zflg) { if (Zflg) {

View File

@ -42,6 +42,7 @@
#include "defines.h" #include "defines.h"
#include "groupio.h" #include "groupio.h"
#include "nscd.h" #include "nscd.h"
#include "sssd.h"
#include "prototypes.h" #include "prototypes.h"
#include "pwio.h" #include "pwio.h"
#include "sgroupio.h" #include "sgroupio.h"
@ -556,6 +557,7 @@ int main (int argc, char **argv)
nscd_flush_cache ("passwd"); nscd_flush_cache ("passwd");
nscd_flush_cache ("group"); nscd_flush_cache ("group");
sssd_flush_cache (SSSD_DB_PASSWD | SSSD_DB_GROUP);
return E_SUCCESS; return E_SUCCESS;
} }