1/*
2 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3 * Use is subject to license terms.
4 */
5
6
7/*
8 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
9 *
10 *	Openvision retains the copyright to derivative works of
11 *	this source code.  Do *NOT* create a derivative of this
12 *	source code before consulting with your legal department.
13 *	Do *NOT* integrate *ANY* of this source code into another
14 *	product before consulting with your legal department.
15 *
16 *	For further information, read the top-level Openvision
17 *	copyright which is contained in the top-level MIT Kerberos
18 *	copyright.
19 *
20 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
21 *
22 */
23
24
25/*
26 * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved.
27 *
28 */
29
30#include <kadm5/admin.h>
31#include <stdio.h>
32#include <rpc/rpc.h>    /* SUNWresync 121 XXX */
33#include <gssapi_krb5.h> /* for gss_nt_krb5_name */
34#include <syslog.h>
35#ifdef HAVE_MEMORY_H
36#include <memory.h>
37#endif
38#include <rpc/rpcsec_gss.h>
39#include <kadm5/kadm_rpc.h>
40#include <krb5.h>
41#include <libintl.h>
42#include <krb5/adm_proto.h>
43#ifdef HAVE_ARPA_INET_H
44#include <arpa/inet.h>
45#endif
46#include "misc.h"
47#include "kadm5/server_internal.h"
48
49extern void *global_server_handle;
50
51void log_badauth(OM_uint32 major, OM_uint32 minor,
52		 struct sockaddr_in *addr, char *data);
53/*
54 * Function: kadm_1
55 *
56 * Purpose: RPC proccessing procedure.
57 *	    originally generated from rpcgen
58 *
59 * Arguments:
60 *	rqstp		    (input) rpc request structure
61 *	transp		    (input) rpc transport structure
62 *	(input/output)
63 * 	<return value>
64 *
65 * Requires:
66 * Effects:
67 * Modifies:
68 */
69
70void kadm_1(rqstp, transp)
71   struct svc_req *rqstp;
72   register SVCXPRT *transp;
73{
74     union {
75	  cprinc_arg create_principal_2_arg;
76	  dprinc_arg delete_principal_2_arg;
77	  mprinc_arg modify_principal_2_arg;
78	  rprinc_arg rename_principal_2_arg;
79	  gprinc_arg get_principal_2_arg;
80	  chpass_arg chpass_principal_2_arg;
81	  chrand_arg chrand_principal_2_arg;
82	  cpol_arg create_policy_2_arg;
83	  dpol_arg delete_policy_2_arg;
84	  mpol_arg modify_policy_2_arg;
85	  gpol_arg get_policy_2_arg;
86	  setkey_arg setkey_principal_2_arg;
87	  setv4key_arg setv4key_principal_2_arg;
88	  cprinc3_arg create_principal3_2_arg;
89	  chpass3_arg chpass_principal3_2_arg;
90	  chrand3_arg chrand_principal3_2_arg;
91	  setkey3_arg setkey_principal3_2_arg;
92     } argument;
93     char *result;
94     bool_t (*xdr_argument)(), (*xdr_result)();
95     char *(*local)();
96
97     if (rqstp->rq_cred.oa_flavor != RPCSEC_GSS) {
98		krb5_klog_syslog(LOG_ERR,
99		    gettext("Authentication attempt failed: invalid "
100			"RPC authentication flavor %d"),
101		 rqstp->rq_cred.oa_flavor);
102	  svcerr_weakauth(transp);
103	  return;
104     }
105
106     switch (rqstp->rq_proc) {
107     case NULLPROC:
108	  (void) svc_sendreply(transp, xdr_void, (char *)NULL);
109	  return;
110
111     case CREATE_PRINCIPAL:
112	  xdr_argument = xdr_cprinc_arg;
113	  xdr_result = xdr_generic_ret;
114	  local = (char *(*)()) create_principal_2_svc;
115	  break;
116
117     case DELETE_PRINCIPAL:
118	  xdr_argument = xdr_dprinc_arg;
119	  xdr_result = xdr_generic_ret;
120	  local = (char *(*)()) delete_principal_2_svc;
121	  break;
122
123     case MODIFY_PRINCIPAL:
124	  xdr_argument = xdr_mprinc_arg;
125	  xdr_result = xdr_generic_ret;
126	  local = (char *(*)()) modify_principal_2_svc;
127	  break;
128
129     case RENAME_PRINCIPAL:
130	  xdr_argument = xdr_rprinc_arg;
131	  xdr_result = xdr_generic_ret;
132	  local = (char *(*)()) rename_principal_2_svc;
133	  break;
134
135     case GET_PRINCIPAL:
136	  xdr_argument = xdr_gprinc_arg;
137	  xdr_result = xdr_gprinc_ret;
138	  local = (char *(*)()) get_principal_2_svc;
139	  break;
140
141     case GET_PRINCS:
142	  xdr_argument = xdr_gprincs_arg;
143	  xdr_result = xdr_gprincs_ret;
144	  local = (char *(*)()) get_princs_2_svc;
145	  break;
146
147     case CHPASS_PRINCIPAL:
148	  xdr_argument = xdr_chpass_arg;
149	  xdr_result = xdr_generic_ret;
150	  local = (char *(*)()) chpass_principal_2_svc;
151	  break;
152
153#ifdef SUNWOFF
154     case SETV4KEY_PRINCIPAL:
155	  xdr_argument = xdr_setv4key_arg;
156	  xdr_result = xdr_generic_ret;
157	  local = (char *(*)()) setv4key_principal_2_svc;
158	  break;
159#endif
160
161     case SETKEY_PRINCIPAL:
162	  xdr_argument = xdr_setkey_arg;
163	  xdr_result = xdr_generic_ret;
164	  local = (char *(*)()) setkey_principal_2_svc;
165	  break;
166
167     case CHRAND_PRINCIPAL:
168	  xdr_argument = xdr_chrand_arg;
169	  xdr_result = xdr_chrand_ret;
170	  local = (char *(*)()) chrand_principal_2_svc;
171	  break;
172
173     case CREATE_POLICY:
174	  xdr_argument = xdr_cpol_arg;
175	  xdr_result = xdr_generic_ret;
176	  local = (char *(*)()) create_policy_2_svc;
177	  break;
178
179     case DELETE_POLICY:
180	  xdr_argument = xdr_dpol_arg;
181	  xdr_result = xdr_generic_ret;
182	  local = (char *(*)()) delete_policy_2_svc;
183	  break;
184
185     case MODIFY_POLICY:
186	  xdr_argument = xdr_mpol_arg;
187	  xdr_result = xdr_generic_ret;
188	  local = (char *(*)()) modify_policy_2_svc;
189	  break;
190
191     case GET_POLICY:
192	  xdr_argument = xdr_gpol_arg;
193	  xdr_result = xdr_gpol_ret;
194	  local = (char *(*)()) get_policy_2_svc;
195	  break;
196
197     case GET_POLS:
198	  xdr_argument = xdr_gpols_arg;
199	  xdr_result = xdr_gpols_ret;
200	  local = (char *(*)()) get_pols_2_svc;
201	  break;
202
203     case GET_PRIVS:
204	  xdr_argument = xdr_u_int;
205	  xdr_result = xdr_getprivs_ret;
206	  local = (char *(*)()) get_privs_2_svc;
207	  break;
208
209     case INIT:
210	  xdr_argument = xdr_u_int;
211	  xdr_result = xdr_generic_ret;
212	  local = (char *(*)()) init_2_svc;
213	  break;
214
215     case CREATE_PRINCIPAL3:
216	  xdr_argument = xdr_cprinc3_arg;
217	  xdr_result = xdr_generic_ret;
218	  local = (char *(*)()) create_principal3_2_svc;
219	  break;
220
221     case CHPASS_PRINCIPAL3:
222	  xdr_argument = xdr_chpass3_arg;
223	  xdr_result = xdr_generic_ret;
224	  local = (char *(*)()) chpass_principal3_2_svc;
225	  break;
226
227     case CHRAND_PRINCIPAL3:
228	  xdr_argument = xdr_chrand3_arg;
229	  xdr_result = xdr_chrand_ret;
230	  local = (char *(*)()) chrand_principal3_2_svc;
231	  break;
232
233     case SETKEY_PRINCIPAL3:
234	  xdr_argument = xdr_setkey3_arg;
235	  xdr_result = xdr_generic_ret;
236	  local = (char *(*)()) setkey_principal3_2_svc;
237	  break;
238
239     default:
240	  krb5_klog_syslog(LOG_ERR,
241		    gettext("Invalid KADM5 procedure number: %d"),
242		 rqstp->rq_proc);
243	  svcerr_noproc(transp);
244	  return;
245     }
246     memset((char *)&argument, 0, sizeof(argument));
247     if (!svc_getargs(transp, xdr_argument, (char *) &argument)) {
248	  svcerr_decode(transp);
249	  return;
250     }
251     result = (*local)(&argument, rqstp);
252     if (result != NULL && !svc_sendreply(transp, xdr_result, (char *) result)) {
253		krb5_klog_syslog(LOG_ERR,
254		    gettext("WARNING! Unable to send function results, "
255			    "continuing."));
256	  svcerr_systemerr(transp);
257     }
258     if (!svc_freeargs(transp, xdr_argument, (char *) &argument)) {
259	  krb5_klog_syslog(LOG_ERR,
260		    gettext("WARNING! Unable to free arguments, "
261			"continuing."));
262     }
263     return;
264}
265