xref: /illumos-gate/usr/src/cmd/krb5/kadmin/server/kadm_rpc_svc.c (revision 516fc7f3e48e25d0375ea3f93ead33ec38bc597b)
1 /*
2  * Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 #pragma ident	"%Z%%M%	%I%	%E% SMI"
7 
8 /*
9  * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
10  *
11  *	Openvision retains the copyright to derivative works of
12  *	this source code.  Do *NOT* create a derivative of this
13  *	source code before consulting with your legal department.
14  *	Do *NOT* integrate *ANY* of this source code into another
15  *	product before consulting with your legal department.
16  *
17  *	For further information, read the top-level Openvision
18  *	copyright which is contained in the top-level MIT Kerberos
19  *	copyright.
20  *
21  * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
22  *
23  */
24 
25 
26 /*
27  * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved.
28  *
29  * $Id: kadm_rpc_svc.c,v 1.16 2000/02/19 02:05:52 tlyu Exp $
30  *
31  */
32 
33 #if !defined(lint) && !defined(__CODECENTER__)
34 static char *rcsid = "$Header: /cvs/krbdev/krb5/src/kadmin/server/kadm_rpc_svc.c,v 1.16 2000/02/19 02:05:52 tlyu Exp $";
35 #endif
36 
37 #include <stdio.h>
38 #include <rpc/rpc.h>    /* SUNWresync 121 XXX */
39 #include <syslog.h>
40 #include <memory.h>
41 #include <rpc/rpcsec_gss.h>
42 #include <kadm5/kadm_rpc.h>
43 #include <krb5.h>
44 #include <kadm5/admin.h>
45 #include <libintl.h>
46 
47 /*
48  * Function: kadm_1
49  *
50  * Purpose: RPC proccessing procedure.
51  *	    originally generated from rpcgen
52  *
53  * Arguments:
54  *	rqstp		    (input) rpc request structure
55  *	transp		    (input) rpc transport structure
56  *	(input/output)
57  * 	<return value>
58  *
59  * Requires:
60  * Effects:
61  * Modifies:
62  */
63 
64 void
65 kadm_1(rqstp, transp)
66    struct svc_req *rqstp;
67    register SVCXPRT *transp;
68 {
69      union {
70 	  cprinc_arg create_principal_1_arg;
71 	  dprinc_arg delete_principal_1_arg;
72 	  mprinc_arg modify_principal_1_arg;
73 	  rprinc_arg rename_principal_1_arg;
74 	  gprinc_arg get_principal_1_arg;
75 	  chpass_arg chpass_principal_1_arg;
76 	  chrand_arg chrand_principal_1_arg;
77 	  cpol_arg create_policy_1_arg;
78 	  dpol_arg delete_policy_1_arg;
79 	  mpol_arg modify_policy_1_arg;
80 	  gpol_arg get_policy_1_arg;
81 	  setkey_arg setkey_principal_1_arg;
82 	  setv4key_arg setv4key_principal_1_arg;
83 	  cprinc3_arg create_principal3_1_arg;
84 	  chpass3_arg chpass_principal3_1_arg;
85 	  chrand3_arg chrand_principal3_1_arg;
86 	  setkey3_arg setkey_principal3_1_arg;
87      } argument;
88      char *result;
89 
90      bool_t (*xdr_argument)(), (*xdr_result)();
91      char *(*local)();
92 
93 	if (rqstp->rq_cred.oa_flavor != RPCSEC_GSS) {
94 		krb5_klog_syslog(LOG_ERR,
95 		    gettext("Authentication attempt failed: invalid "
96 			"RPC authentication flavor %d"),
97 		 rqstp->rq_cred.oa_flavor);
98 	  svcerr_weakauth(transp);
99 	  return;
100      }
101 
102      switch (rqstp->rq_proc) {
103      case NULLPROC:
104 	  (void) svc_sendreply(transp, xdr_void, (char *)NULL);
105 	  return;
106 
107      case CREATE_PRINCIPAL:
108 	  xdr_argument = xdr_cprinc_arg;
109 	  xdr_result = xdr_generic_ret;
110 	  local = (char *(*)()) create_principal_1;
111 	  break;
112 
113      case DELETE_PRINCIPAL:
114 	  xdr_argument = xdr_dprinc_arg;
115 	  xdr_result = xdr_generic_ret;
116 	  local = (char *(*)()) delete_principal_1;
117 	  break;
118 
119      case MODIFY_PRINCIPAL:
120 	  xdr_argument = xdr_mprinc_arg;
121 	  xdr_result = xdr_generic_ret;
122 	  local = (char *(*)()) modify_principal_1;
123 	  break;
124 
125      case RENAME_PRINCIPAL:
126 	  xdr_argument = xdr_rprinc_arg;
127 	  xdr_result = xdr_generic_ret;
128 	  local = (char *(*)()) rename_principal_1;
129 	  break;
130 
131      case GET_PRINCIPAL:
132 	  xdr_argument = xdr_gprinc_arg;
133 	  xdr_result = xdr_gprinc_ret;
134 	  local = (char *(*)()) get_principal_1;
135 	  break;
136 
137      case GET_PRINCS:
138 	  xdr_argument = xdr_gprincs_arg;
139 	  xdr_result = xdr_gprincs_ret;
140 	  local = (char *(*)()) get_princs_1;
141 	  break;
142 
143      case CHPASS_PRINCIPAL:
144 	  xdr_argument = xdr_chpass_arg;
145 	  xdr_result = xdr_generic_ret;
146 	  local = (char *(*)()) chpass_principal_1;
147 	  break;
148 
149 #ifdef SUNWOFF
150      case SETV4KEY_PRINCIPAL:
151 	  xdr_argument = xdr_setv4key_arg;
152 	  xdr_result = xdr_generic_ret;
153 	  local = (char *(*)()) setv4key_principal_1;
154 	  break;
155 #endif
156 
157      case SETKEY_PRINCIPAL:
158 	  xdr_argument = xdr_setkey_arg;
159 	  xdr_result = xdr_generic_ret;
160 	  local = (char *(*)()) setkey_principal_1;
161 	  break;
162 
163      case CHRAND_PRINCIPAL:
164 	  xdr_argument = xdr_chrand_arg;
165 	  xdr_result = xdr_chrand_ret;
166 	  local = (char *(*)()) chrand_principal_1;
167 	  break;
168 
169      case CREATE_POLICY:
170 	  xdr_argument = xdr_cpol_arg;
171 	  xdr_result = xdr_generic_ret;
172 	  local = (char *(*)()) create_policy_1;
173 	  break;
174 
175      case DELETE_POLICY:
176 	  xdr_argument = xdr_dpol_arg;
177 	  xdr_result = xdr_generic_ret;
178 	  local = (char *(*)()) delete_policy_1;
179 	  break;
180 
181      case MODIFY_POLICY:
182 	  xdr_argument = xdr_mpol_arg;
183 	  xdr_result = xdr_generic_ret;
184 	  local = (char *(*)()) modify_policy_1;
185 	  break;
186 
187      case GET_POLICY:
188 	  xdr_argument = xdr_gpol_arg;
189 	  xdr_result = xdr_gpol_ret;
190 	  local = (char *(*)()) get_policy_1;
191 	  break;
192 
193      case GET_POLS:
194 	  xdr_argument = xdr_gpols_arg;
195 	  xdr_result = xdr_gpols_ret;
196 	  local = (char *(*)()) get_pols_1;
197 	  break;
198 
199      case GET_PRIVS:
200 		xdr_argument = xdr_u_int;
201 	  xdr_result = xdr_getprivs_ret;
202 	  local = (char *(*)()) get_privs_1;
203 	  break;
204 
205      case INIT:
206 		xdr_argument = xdr_u_int;
207 	  xdr_result = xdr_generic_ret;
208 	  local = (char *(*)()) init_1;
209 	  break;
210 
211      case CREATE_PRINCIPAL3:
212 	  xdr_argument = xdr_cprinc3_arg;
213 	  xdr_result = xdr_generic_ret;
214 	  local = (char *(*)()) create_principal3_1;
215 	  break;
216 
217      case CHPASS_PRINCIPAL3:
218 	  xdr_argument = xdr_chpass3_arg;
219 	  xdr_result = xdr_generic_ret;
220 	  local = (char *(*)()) chpass_principal3_1;
221 	  break;
222 
223      case CHRAND_PRINCIPAL3:
224 	  xdr_argument = xdr_chrand3_arg;
225 	  xdr_result = xdr_chrand_ret;
226 	  local = (char *(*)()) chrand_principal3_1;
227 	  break;
228 
229      case SETKEY_PRINCIPAL3:
230 	  xdr_argument = xdr_setkey3_arg;
231 	  xdr_result = xdr_generic_ret;
232 	  local = (char *(*)()) setkey_principal3_1;
233 	  break;
234 
235      default:
236 		krb5_klog_syslog(LOG_ERR,
237 		    gettext("Invalid KADM5 procedure number: %d"),
238 		 rqstp->rq_proc);
239 	  svcerr_noproc(transp);
240 	  return;
241      }
242      memset((char *)&argument, 0, sizeof(argument));
243 	if (!svc_getargs(transp, xdr_argument, (char *) &argument)) {
244 	  svcerr_decode(transp);
245 	  return;
246      }
247      result = (*local)(&argument, rqstp);
248 	if (result != NULL &&
249 	    !svc_sendreply(transp, xdr_result, (char *) result)) {
250 		krb5_klog_syslog(LOG_ERR,
251 		    gettext("WARNING! Unable to send function results, "
252 			    "continuing."));
253 	  svcerr_systemerr(transp);
254      }
255 	if (!svc_freeargs(transp, xdr_argument, (char *) &argument)) {
256 		krb5_klog_syslog(LOG_ERR,
257 		    gettext("WARNING! Unable to free arguments, "
258 			"continuing."));
259      }
260 }
261