From b0c3d1159850e84f35236da2fc891819ca59eafa Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Thu, 29 Aug 2002 03:32:42 +0000 Subject: [PATCH] passfile support --- libraries/liblutil/Makefile.in | 4 +- libraries/liblutil/passfile.c | 97 ++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 libraries/liblutil/passfile.c diff --git a/libraries/liblutil/Makefile.in b/libraries/liblutil/Makefile.in index ba9f3ec5e7..a96d8d8bc8 100644 --- a/libraries/liblutil/Makefile.in +++ b/libraries/liblutil/Makefile.in @@ -13,11 +13,11 @@ NT_OBJS = ntservice.o slapdmsg.res UNIX_SRCS = detach.c UNIX_OBJS = detach.o -SRCS = base64.c csn.c entropy.c sasl.c signal.c hash.c \ +SRCS = base64.c csn.c entropy.c sasl.c signal.c hash.c passfile.c \ md5.c passwd.c sha1.c getpass.c lockf.c utils.c uuid.c sockpair.c \ @LIBSRCS@ $(@PLAT@_SRCS) -OBJS = base64.o csn.o entropy.o sasl.o signal.o hash.o \ +OBJS = base64.o csn.o entropy.o sasl.o signal.o hash.o passfile.o \ md5.o passwd.o sha1.o getpass.o lockf.o utils.o uuid.o sockpair.o \ @LIBOBJS@ $(@PLAT@_OBJS) diff --git a/libraries/liblutil/passfile.c b/libraries/liblutil/passfile.c new file mode 100644 index 0000000000..44c73a6625 --- /dev/null +++ b/libraries/liblutil/passfile.c @@ -0,0 +1,97 @@ +/* $OpenLDAP$ */ +/* + * Copyright 2002 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ + +#include "portable.h" + +#include + +#include +#include + +#ifdef HAVE_FSTAT +#include +#include +#endif /* HAVE_FSTAT */ + +#include +#include + +/* Get a password from a file. */ +int +lutil_get_filed_password( + const char *filename, + struct berval *passwd ) +{ + int rc; + size_t nread, nleft, nr; + FILE *f = fopen( filename, "r" ); + + if( f == NULL ) { + perror( filename ); + return -1; + } + + passwd->bv_val = NULL; + passwd->bv_len = 4196; + +#ifdef HAVE_FSTAT + { + struct stat sb; + if ( fstat( fileno( f ), &sb ) == 0 ) { + if( sb.st_mode & 006 ) { + fprintf( stderr, + "Warning: Password file %s is publicly readable/writeable\n", + filename ); + } + + passwd->bv_len = sb.st_size; + } + } +#endif /* HAVE_FSTAT */ + + passwd->bv_val = (char *) malloc( passwd->bv_len + 1 ); + if( passwd->bv_val == NULL ) { + perror( filename ); + return -1; + } + + nread = 0; + nleft = passwd->bv_len; + do { + if( nleft == 0 ) { + /* double the buffer size */ + char *p = (char *) realloc( passwd->bv_val, + 2 * passwd->bv_len + 1 ); + if( p == NULL ) { + free( passwd->bv_val ); + passwd->bv_val = NULL; + passwd->bv_len = 0; + return -1; + } + nleft = passwd->bv_len; + passwd->bv_len *= 2; + passwd->bv_val = p; + } + + nr = fread( &passwd->bv_val[nread], 1, nleft, f ); + + if( nr < nleft && ferror( f ) ) { + free( passwd->bv_val ); + passwd->bv_val = NULL; + passwd->bv_len = 0; + return -1; + } + + nread += nr; + nleft -= nr; + } while ( !feof(f) ); + + passwd->bv_len = nread; + passwd->bv_val[nread] = '\0'; + + fclose( f ); + return 0; +} -- 2.39.5