diff options
-rw-r--r-- | ChangeLog | 28 | ||||
-rw-r--r-- | inet/getprtname_r.c | 28 | ||||
-rw-r--r-- | nss/Makefile | 6 | ||||
-rw-r--r-- | nss/getXXent_r.c | 20 | ||||
-rw-r--r-- | nss/key-lookup.c | 23 | ||||
-rw-r--r-- | nss/nss_files/files-netgrp.c | 2 | ||||
-rw-r--r-- | rpc/auth_des.h | 1 | ||||
-rw-r--r-- | sunrpc/Makefile | 4 | ||||
-rw-r--r-- | sunrpc/publickey.c | 110 | ||||
-rw-r--r-- | sunrpc/rpc/auth_des.h | 42 | ||||
-rw-r--r-- | sunrpc/rpc/rpc.h | 10 |
11 files changed, 242 insertions, 32 deletions
@@ -1,3 +1,31 @@ +Sun Nov 10 23:28:16 1996 Ulrich Drepper <drepper@cygnus.com> + + * inet/getprtname_r.c: Reformat copyright. + + * nss/Makefile (databases): Add key. + (libnss_files-routines): Exclude key database. + (libnss_db-routines): Likewise. + * nss/key-lookup.c: New file. + + * nss/getXXent_r.c (last_nip): Remember last service used since + last setXXent call. + (SETFUNC): Don't force to work through whole list of services in + call to __nss_next. + Update last_nip if necessary. + (ENDFUNC): Only process endXXent function up to currently used + last service. + (GETFUNC): Update last_nip if necessary. + + * nss/nss_files/files-netgrp.c (_nss_netgroup_parseline): Don't + make static. + + * rpc/auth_des.h: New file. + * sunrpc/Makefile (headers): Add auth_des.h. + (routines): Add publickey. + * sunrpc/publickey.c: New file. Interface to public key handling. + * sunrpc/rpc/auth_des.h: New file. + * sunrpc/rpc/netdb.h: Really include <rpc/auth_des.h>. + Sun Nov 10 02:37:15 1996 Ulrich Drepper <drepper@cygnus.com> * inet/gethstent_r.c: Update copyright. diff --git a/inet/getprtname_r.c b/inet/getprtname_r.c index 8de7410..40a4e37 100644 --- a/inet/getprtname_r.c +++ b/inet/getprtname_r.c @@ -1,21 +1,21 @@ /* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <netdb.h> diff --git a/nss/Makefile b/nss/Makefile index a921bb7..93ffbae 100644 --- a/nss/Makefile +++ b/nss/Makefile @@ -33,7 +33,7 @@ routines = nsswitch $(addsuffix -lookup,$(databases)) # Caution: if you add a database here, you must add its real name # in databases.def, too. databases = proto service hosts network grp pwd rpc ethers \ - spwd netgrp + spwd netgrp key # Specify rules for the nss_* modules. We have some services. services := files dns db @@ -48,12 +48,12 @@ subdir-dirs = $(services:%=nss_%) vpath %.c $(subdir-dirs) -libnss_files-routines := $(addprefix files-,$(databases)) +libnss_files-routines := $(addprefix files-,$(filter-out key, $(databases))) distribute += files-XXX.c files-parse.c libnss_dns-routines := dns-host dns-network -libnss_db-routines := $(addprefix db-,$(filter-out hosts network,\ +libnss_db-routines := $(addprefix db-,$(filter-out hosts network key,\ $(databases))) generated += $(filter-out db-netgrp.c, \ $(addsuffix .c,$(libnss_db-routines))) diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c index 52e2136..0db0a8b 100644 --- a/nss/getXXent_r.c +++ b/nss/getXXent_r.c @@ -96,6 +96,8 @@ typedef int (*get_function) (LOOKUP_TYPE *, char *, int H_ERRNO_PARM); /* This handle for the NSS data base is shared between all set/get/endXXXent functions. */ static service_user *nip; +/* Remember the last service used since the last call to `endXXent'. */ +static service_user *last_nip; /* Remember the first service_entry, it's always the same. */ static service_user *startp; @@ -159,12 +161,14 @@ SETFUNC_NAME (STAYOPEN) no_more = setup ((void **) &fct, SETFUNC_NAME_STRING, 1); while (! no_more) { + int is_last_nip = nip == last_nip; enum nss_status status = (*fct) (STAYOPEN_VAR); no_more = __nss_next (&nip, SETFUNC_NAME_STRING, (void **) &fct, - status, 1); + status, 0); + if (is_last_nip) + last_nip = nip; } - nip = NULL; #ifdef STAYOPEN_TMP STAYOPEN_TMPVAR = STAYOPEN_VAR; @@ -197,9 +201,13 @@ ENDFUNC_NAME (void) /* Ignore status, we force check in __NSS_NEXT. */ (void) (*fct) (); + if (nip == last_nip) + /* We have processed all services which were used. */ + break; + no_more = __nss_next (&nip, ENDFUNC_NAME_STRING, (void **) &fct, 0, 1); } - nip = NULL; + last_nip = nip = NULL; __libc_lock_unlock (lock); } @@ -232,6 +240,7 @@ INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen, no_more = setup ((void **) &fct, GETFUNC_NAME_STRING, 0); while (! no_more) { + int is_last_nip = nip == last_nip; service_user *current_nip = nip; status = (*fct) (resbuf, buffer, buflen H_ERRNO_VAR); @@ -239,11 +248,14 @@ INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen, no_more = __nss_next (&nip, GETFUNC_NAME_STRING, (void **) &fct, status, 0); + if (is_last_nip) + last_nip = nip; + if (! no_more && current_nip != nip) /* Call the `setXXent' function. This wasn't done before. */ do { - set_function *sfct; + set_function sfct; no_more = __nss_lookup (&nip, SETFUNC_NAME_STRING, (void **) &sfct); diff --git a/nss/key-lookup.c b/nss/key-lookup.c new file mode 100644 index 0000000..1730f74 --- /dev/null +++ b/nss/key-lookup.c @@ -0,0 +1,23 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#define DATABASE_NAME publickey +#define DEFAULT_CONFIG "nis nisplus" + +#include "XXX-lookup.c" diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c index 5f8b939..83e1382 100644 --- a/nss/nss_files/files-netgrp.c +++ b/nss/nss_files/files-netgrp.c @@ -160,7 +160,7 @@ _nss_files_endnetgrent (struct __netgrent *result) } -static enum nss_status +enum nss_status _nss_netgroup_parseline (char **cursor, struct __netgrent *result, char *buffer, int buflen) { diff --git a/rpc/auth_des.h b/rpc/auth_des.h new file mode 100644 index 0000000..02736aa --- /dev/null +++ b/rpc/auth_des.h @@ -0,0 +1 @@ +#include <sunrpc/rpc/auth_des.h> diff --git a/sunrpc/Makefile b/sunrpc/Makefile index 6d457a0..82d4ea7 100644 --- a/sunrpc/Makefile +++ b/sunrpc/Makefile @@ -48,7 +48,7 @@ subdir := sunrpc headers = $(addprefix rpc/,auth.h auth_unix.h clnt.h netdb.h pmap_clnt.h \ pmap_prot.h pmap_rmt.h rpc.h rpc_msg.h svc.h \ - svc_auth.h types.h xdr.h) \ + svc_auth.h types.h xdr.h auth_des.h) \ $(rpcsvc:%=rpcsvc/%) $(rpcsvc:%.x=rpcsvc/%.h) rpcsvc = bootparam.x nlm_prot.x rstat.x \ yppasswd.x klm_prot.x rex.x sm_inter.x mount.x \ @@ -64,7 +64,7 @@ routines := auth_none auth_unix authuxprot bindrsvprt \ pmap_prot2 pmap_rmt rpc_prot rpc_common rpc_cmsg \ svc svc_auth svc_authux svc_raw svc_run svc_simple \ svc_tcp svc_udp xdr xdr_array xdr_float xdr_mem \ - xdr_rec xdr_ref xdr_stdio + xdr_rec xdr_ref xdr_stdio publickey others := rpcinfo install-bin := rpcgen diff --git a/sunrpc/publickey.c b/sunrpc/publickey.c new file mode 100644 index 0000000..9a31432 --- /dev/null +++ b/sunrpc/publickey.c @@ -0,0 +1,110 @@ +/* Get public or secret key from key server. + Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <rpc/netdb.h> + +#include "nsswitch.h" + + +/* Type of the lookup function for the public key. */ +typedef int (*public_function) (const char *, char *); + +/* Type of the lookup function for the secret key. */ +typedef int (*secret_function) (const char *, char *, const char *); + +/* The lookup function for the first entry of this service. */ +extern int __nss_publickey_lookup (service_user **nip, const char *name, + void **fctp); + + +int +getpublickey (const char *name, char *key) +{ + static service_user *startp = NULL; + static public_function start_fct; + service_user *nip; + public_function fct; + enum nss_status status = NSS_STATUS_UNAVAIL; + int no_more; + + if (startp == NULL) + { + no_more = __nss_publickey_lookup (&nip, "getpublickey", (void **) &fct); + if (no_more) + startp = (service_user *) -1; + else + { + startp = nip; + start_fct = fct; + } + } + else + { + fct = start_fct; + no_more = (nip = startp) == (service_user *) -1; + } + + while (! no_more) + { + status = (*fct) (name, key); + + no_more = __nss_next (&nip, "getpublickey", (void **) &fct, status, 0); + } + + return status == NSS_STATUS_SUCCESS; +} + + +int +getsecretkey (const char *name, char *key, const char *passwd) +{ + static service_user *startp = NULL; + static secret_function start_fct; + service_user *nip; + secret_function fct; + enum nss_status status = NSS_STATUS_UNAVAIL; + int no_more; + + if (startp == NULL) + { + no_more = __nss_publickey_lookup (&nip, "getsecretkey", (void **) &fct); + if (no_more) + startp = (service_user *) -1; + else + { + startp = nip; + start_fct = fct; + } + } + else + { + fct = start_fct; + no_more = (nip = startp) == (service_user *) -1; + } + + while (! no_more) + { + status = (*fct) (name, key, passwd); + + no_more = __nss_next (&nip, "getsecretkey", (void **) &fct, status, 0); + } + + return status == NSS_STATUS_SUCCESS; +} diff --git a/sunrpc/rpc/auth_des.h b/sunrpc/rpc/auth_des.h new file mode 100644 index 0000000..24afaee --- /dev/null +++ b/sunrpc/rpc/auth_des.h @@ -0,0 +1,42 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _RPC_AUTH_DES_H + +#define _RPC_AUTH_DES_H 1 +#include <sys/cdefs.h> + +/* This is no complete version of this header. More defintions with + the real authentification stuff will come in 1997. For now we only + need to define the function for handling public keys. */ + + +/* Get the public key for NAME and place it in KEY. NAME can only be + up to MAXNETNAMELEN bytes long and the destination buffer KEY should + have HEXKEYBATES + 1 bytes long to fit all characters from the key. */ +extern int getpublickey __P ((__const char *__name, char *__key)); + +/* Get the secret key for NAME and place it in KEY. PASSWD is used to + decrypt the encrypted key stored in the database. NAME can only be + up to MAXNETNAMELEN bytes long and the destination buffer KEY + should have HEXKEYBATES + 1 bytes long to fit all characters from + the key. */ +extern int getsecretkey __P ((__const char *__name, char *__key, + __const char *__passwd)); + +#endif /* rpc/auth_des.h */ diff --git a/sunrpc/rpc/rpc.h b/sunrpc/rpc/rpc.h index d11e83e..f4328ef 100644 --- a/sunrpc/rpc/rpc.h +++ b/sunrpc/rpc/rpc.h @@ -6,11 +6,11 @@ * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. - * + * * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * + * * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. @@ -52,13 +52,7 @@ /* semi-private protocol headers */ #include <rpc/rpc_msg.h> /* protocol for rpc messages */ #include <rpc/auth_unix.h> /* protocol for unix style cred */ -/* - * Uncomment-out the next line if you are building the rpc library with - * DES Authentication (see the README file in the secure_rpc/ directory). - */ -#if 0 #include <rpc/auth_des.h> /* protocol for des style cred */ -#endif /* Server side only remote procedure callee */ #include <rpc/svc.h> /* service manager and multiplexer */ |