svc_auth.c revision 1.10.6.1 1 1.10.6.1 minoura /* $NetBSD: svc_auth.c,v 1.10.6.1 2000/06/23 16:17:50 minoura Exp $ */
2 1.2 cgd
3 1.1 cgd /*
4 1.1 cgd * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
5 1.1 cgd * unrestricted use provided that this legend is included on all tape
6 1.1 cgd * media and as a part of the software program in whole or part. Users
7 1.1 cgd * may copy or modify Sun RPC without charge, but are not authorized
8 1.1 cgd * to license or distribute it to anyone else except as part of a product or
9 1.1 cgd * program developed by the user.
10 1.1 cgd *
11 1.1 cgd * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
12 1.1 cgd * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
13 1.1 cgd * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
14 1.1 cgd *
15 1.1 cgd * Sun RPC is provided with no support and without any obligation on the
16 1.1 cgd * part of Sun Microsystems, Inc. to assist in its use, correction,
17 1.1 cgd * modification or enhancement.
18 1.10.6.1 minoura *
19 1.1 cgd * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
20 1.1 cgd * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
21 1.1 cgd * OR ANY PART THEREOF.
22 1.10.6.1 minoura *
23 1.1 cgd * In no event will Sun Microsystems, Inc. be liable for any lost revenue
24 1.1 cgd * or profits or other special, indirect and consequential damages, even if
25 1.1 cgd * Sun has been advised of the possibility of such damages.
26 1.10.6.1 minoura *
27 1.1 cgd * Sun Microsystems, Inc.
28 1.1 cgd * 2550 Garcia Avenue
29 1.1 cgd * Mountain View, California 94043
30 1.1 cgd */
31 1.10.6.1 minoura /*
32 1.10.6.1 minoura * Copyright (c) 1986-1991 by Sun Microsystems Inc.
33 1.10.6.1 minoura */
34 1.10.6.1 minoura
35 1.10.6.1 minoura /* #ident "@(#)svc_auth.c 1.16 94/04/24 SMI" */
36 1.1 cgd
37 1.3 christos #if 0
38 1.10.6.1 minoura #if !defined(lint) && defined(SCCSIDS)
39 1.10.6.1 minoura static char sccsid[] = "@(#)svc_auth.c 1.26 89/02/07 Copyr 1984 Sun Micro";
40 1.3 christos #endif
41 1.1 cgd #endif
42 1.1 cgd
43 1.1 cgd /*
44 1.10.6.1 minoura * svc_auth.c, Server-side rpc authenticator interface.
45 1.1 cgd *
46 1.1 cgd */
47 1.1 cgd
48 1.10.6.1 minoura #include "namespace.h"
49 1.10.6.1 minoura #include "reentrant.h"
50 1.10.6.1 minoura #include <sys/types.h>
51 1.1 cgd #include <rpc/rpc.h>
52 1.10.6.1 minoura #include <stdlib.h>
53 1.10.6.1 minoura
54 1.10.6.1 minoura #ifdef __weak_alias
55 1.10.6.1 minoura __weak_alias(svc_auth_reg,_svc_auth_reg)
56 1.10.6.1 minoura #endif
57 1.1 cgd
58 1.1 cgd /*
59 1.10.6.1 minoura * svcauthsw is the bdevsw of server side authentication.
60 1.10.6.1 minoura *
61 1.1 cgd * Server side authenticators are called from authenticate by
62 1.1 cgd * using the client auth struct flavor field to index into svcauthsw.
63 1.10.6.1 minoura * The server auth flavors must implement a routine that looks
64 1.10.6.1 minoura * like:
65 1.10.6.1 minoura *
66 1.1 cgd * enum auth_stat
67 1.1 cgd * flavorx_auth(rqst, msg)
68 1.10.6.1 minoura * register struct svc_req *rqst;
69 1.10.6.1 minoura * register struct rpc_msg *msg;
70 1.1 cgd *
71 1.1 cgd */
72 1.1 cgd
73 1.10.6.1 minoura /* declarations to allow servers to specify new authentication flavors */
74 1.10.6.1 minoura struct authsvc {
75 1.10.6.1 minoura int flavor;
76 1.10.6.1 minoura enum auth_stat (*handler) __P((struct svc_req *, struct rpc_msg *));
77 1.10.6.1 minoura struct authsvc *next;
78 1.1 cgd };
79 1.10.6.1 minoura static struct authsvc *Auths = NULL;
80 1.1 cgd
81 1.1 cgd /*
82 1.1 cgd * The call rpc message, msg has been obtained from the wire. The msg contains
83 1.1 cgd * the raw form of credentials and verifiers. authenticate returns AUTH_OK
84 1.1 cgd * if the msg is successfully authenticated. If AUTH_OK then the routine also
85 1.1 cgd * does the following things:
86 1.1 cgd * set rqst->rq_xprt->verf to the appropriate response verifier;
87 1.1 cgd * sets rqst->rq_client_cred to the "cooked" form of the credentials.
88 1.1 cgd *
89 1.1 cgd * NB: rqst->rq_cxprt->verf must be pre-alloctaed;
90 1.1 cgd * its length is set appropriately.
91 1.1 cgd *
92 1.1 cgd * The caller still owns and is responsible for msg->u.cmb.cred and
93 1.1 cgd * msg->u.cmb.verf. The authentication system retains ownership of
94 1.1 cgd * rqst->rq_client_cred, the cooked credentials.
95 1.1 cgd *
96 1.1 cgd * There is an assumption that any flavour less than AUTH_NULL is
97 1.1 cgd * invalid.
98 1.1 cgd */
99 1.1 cgd enum auth_stat
100 1.1 cgd _authenticate(rqst, msg)
101 1.10.6.1 minoura register struct svc_req *rqst;
102 1.1 cgd struct rpc_msg *msg;
103 1.1 cgd {
104 1.10.6.1 minoura register int cred_flavor;
105 1.10.6.1 minoura register struct authsvc *asp;
106 1.10.6.1 minoura enum auth_stat dummy;
107 1.10.6.1 minoura #ifdef __REENT
108 1.10.6.1 minoura extern mutex_t authsvc_lock;
109 1.10.6.1 minoura #endif
110 1.9 lukem
111 1.10.6.1 minoura /* VARIABLES PROTECTED BY authsvc_lock: asp, Auths */
112 1.1 cgd
113 1.1 cgd rqst->rq_cred = msg->rm_call.cb_cred;
114 1.1 cgd rqst->rq_xprt->xp_verf.oa_flavor = _null_auth.oa_flavor;
115 1.1 cgd rqst->rq_xprt->xp_verf.oa_length = 0;
116 1.1 cgd cred_flavor = rqst->rq_cred.oa_flavor;
117 1.10.6.1 minoura switch (cred_flavor) {
118 1.10.6.1 minoura case AUTH_NULL:
119 1.10.6.1 minoura dummy = _svcauth_null(rqst, msg);
120 1.10.6.1 minoura return (dummy);
121 1.10.6.1 minoura case AUTH_SYS:
122 1.10.6.1 minoura dummy = _svcauth_unix(rqst, msg);
123 1.10.6.1 minoura return (dummy);
124 1.10.6.1 minoura case AUTH_SHORT:
125 1.10.6.1 minoura dummy = _svcauth_short(rqst, msg);
126 1.10.6.1 minoura return (dummy);
127 1.10.6.1 minoura #if 0
128 1.10.6.1 minoura case AUTH_DES:
129 1.10.6.1 minoura dummy = __svcauth_des(rqst, msg);
130 1.10.6.1 minoura return (dummy);
131 1.10.6.1 minoura #endif
132 1.10.6.1 minoura default:
133 1.10.6.1 minoura break;
134 1.10.6.1 minoura }
135 1.10.6.1 minoura
136 1.10.6.1 minoura /* flavor doesn't match any of the builtin types, so try new ones */
137 1.10.6.1 minoura mutex_lock(&authsvc_lock);
138 1.10.6.1 minoura for (asp = Auths; asp; asp = asp->next) {
139 1.10.6.1 minoura if (asp->flavor == cred_flavor) {
140 1.10.6.1 minoura enum auth_stat as;
141 1.10.6.1 minoura
142 1.10.6.1 minoura as = (*asp->handler)(rqst, msg);
143 1.10.6.1 minoura mutex_unlock(&authsvc_lock);
144 1.10.6.1 minoura return (as);
145 1.10.6.1 minoura }
146 1.1 cgd }
147 1.10.6.1 minoura mutex_unlock(&authsvc_lock);
148 1.1 cgd
149 1.1 cgd return (AUTH_REJECTEDCRED);
150 1.1 cgd }
151 1.1 cgd
152 1.10.6.1 minoura /*ARGSUSED*/
153 1.1 cgd enum auth_stat
154 1.3 christos _svcauth_null(rqst, msg)
155 1.3 christos struct svc_req *rqst;
156 1.3 christos struct rpc_msg *msg;
157 1.1 cgd {
158 1.1 cgd return (AUTH_OK);
159 1.10.6.1 minoura }
160 1.10.6.1 minoura
161 1.10.6.1 minoura /*
162 1.10.6.1 minoura * Allow the rpc service to register new authentication types that it is
163 1.10.6.1 minoura * prepared to handle. When an authentication flavor is registered,
164 1.10.6.1 minoura * the flavor is checked against already registered values. If not
165 1.10.6.1 minoura * registered, then a new Auths entry is added on the list.
166 1.10.6.1 minoura *
167 1.10.6.1 minoura * There is no provision to delete a registration once registered.
168 1.10.6.1 minoura *
169 1.10.6.1 minoura * This routine returns:
170 1.10.6.1 minoura * 0 if registration successful
171 1.10.6.1 minoura * 1 if flavor already registered
172 1.10.6.1 minoura * -1 if can't register (errno set)
173 1.10.6.1 minoura */
174 1.10.6.1 minoura
175 1.10.6.1 minoura int
176 1.10.6.1 minoura svc_auth_reg(cred_flavor, handler)
177 1.10.6.1 minoura register int cred_flavor;
178 1.10.6.1 minoura enum auth_stat (*handler) __P((struct svc_req *, struct rpc_msg *));
179 1.10.6.1 minoura {
180 1.10.6.1 minoura register struct authsvc *asp;
181 1.10.6.1 minoura #ifdef __REENT
182 1.10.6.1 minoura extern mutex_t authsvc_lock;
183 1.10.6.1 minoura #endif
184 1.10.6.1 minoura
185 1.10.6.1 minoura switch (cred_flavor) {
186 1.10.6.1 minoura case AUTH_NULL:
187 1.10.6.1 minoura case AUTH_SYS:
188 1.10.6.1 minoura case AUTH_SHORT:
189 1.10.6.1 minoura #if 0
190 1.10.6.1 minoura case AUTH_DES:
191 1.10.6.1 minoura #endif
192 1.10.6.1 minoura /* already registered */
193 1.10.6.1 minoura return (1);
194 1.10.6.1 minoura
195 1.10.6.1 minoura default:
196 1.10.6.1 minoura mutex_lock(&authsvc_lock);
197 1.10.6.1 minoura for (asp = Auths; asp; asp = asp->next) {
198 1.10.6.1 minoura if (asp->flavor == cred_flavor) {
199 1.10.6.1 minoura /* already registered */
200 1.10.6.1 minoura mutex_unlock(&authsvc_lock);
201 1.10.6.1 minoura return (1);
202 1.10.6.1 minoura }
203 1.10.6.1 minoura }
204 1.10.6.1 minoura
205 1.10.6.1 minoura /* this is a new one, so go ahead and register it */
206 1.10.6.1 minoura asp = (struct authsvc *)mem_alloc(sizeof (*asp));
207 1.10.6.1 minoura if (asp == NULL) {
208 1.10.6.1 minoura mutex_unlock(&authsvc_lock);
209 1.10.6.1 minoura return (-1);
210 1.10.6.1 minoura }
211 1.10.6.1 minoura asp->flavor = cred_flavor;
212 1.10.6.1 minoura asp->handler = handler;
213 1.10.6.1 minoura asp->next = Auths;
214 1.10.6.1 minoura Auths = asp;
215 1.10.6.1 minoura mutex_unlock(&authsvc_lock);
216 1.10.6.1 minoura break;
217 1.10.6.1 minoura }
218 1.10.6.1 minoura return (0);
219 1.1 cgd }
220