r8302: import mini HEIMDAL into the tree
[amitay/samba.git] / source4 / heimdal / kdc / process.c
1 /*
2  * Copyright (c) 1997-2005 Kungliga Tekniska Högskolan
3  * (Royal Institute of Technology, Stockholm, Sweden). 
4  *
5  * All rights reserved. 
6  *
7  * Redistribution and use in source and binary forms, with or without 
8  * modification, are permitted provided that the following conditions 
9  * are met: 
10  *
11  * 1. Redistributions of source code must retain the above copyright 
12  *    notice, this list of conditions and the following disclaimer. 
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright 
15  *    notice, this list of conditions and the following disclaimer in the 
16  *    documentation and/or other materials provided with the distribution. 
17  *
18  * 3. Neither the name of the Institute nor the names of its contributors 
19  *    may be used to endorse or promote products derived from this software 
20  *    without specific prior written permission. 
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
32  * SUCH DAMAGE. 
33  */
34
35 #include "kdc_locl.h"
36
37 RCSID("$Id: process.c,v 1.2 2005/06/30 01:54:49 lha Exp $");
38
39 /*
40  * handle the request in `buf, len', from `addr' (or `from' as a string),
41  * sending a reply in `reply'.
42  */
43
44 int
45 krb5_kdc_process_generic_request(krb5_context context, 
46                                  krb5_kdc_configuration *config,
47                                  unsigned char *buf, 
48                                  size_t len, 
49                                  krb5_data *reply,
50                                  krb5_boolean *prependlength,
51                                  const char *from,
52                                  struct sockaddr *addr)
53 {
54     KDC_REQ req;
55     Ticket ticket;
56     krb5_error_code ret;
57     size_t i;
58
59     gettimeofday(&_kdc_now, NULL);
60     if(decode_AS_REQ(buf, len, &req, &i) == 0){
61         ret = _kdc_as_rep(context, config, &req, reply, from, addr);
62         free_AS_REQ(&req);
63         return ret;
64     }else if(decode_TGS_REQ(buf, len, &req, &i) == 0){
65         ret = _kdc_tgs_rep(context, config, &req, reply, from, addr);
66         free_TGS_REQ(&req);
67         return ret;
68     }else if(decode_Ticket(buf, len, &ticket, &i) == 0){
69         ret = _kdc_do_524(context, config, &ticket, reply, from, addr);
70         free_Ticket(&ticket);
71         return ret;
72     } else if(_kdc_maybe_version4(buf, len)){
73         *prependlength = FALSE; /* elbitapmoc sdrawkcab XXX */
74         _kdc_do_version4(context, config, buf, len, reply, from, 
75                          (struct sockaddr_in*)addr);
76         return 0;
77     } else if (config->enable_kaserver) {
78         ret = _kdc_do_kaserver(context, config, buf, len, reply, from,
79                                (struct sockaddr_in*)addr);
80         return ret;
81     }
82                           
83     return -1;
84 }
85
86 /*
87  * handle the request in `buf, len', from `addr' (or `from' as a string),
88  * sending a reply in `reply'.
89  *
90  * This only processes krb5 requests
91  */
92
93 int
94 krb5_kdc_process_krb5_request(krb5_context context, 
95                               krb5_kdc_configuration *config,
96                               unsigned char *buf, 
97                               size_t len, 
98                               krb5_data *reply,
99                               const char *from,
100                               struct sockaddr *addr)
101 {
102     KDC_REQ req;
103     krb5_error_code ret;
104     size_t i;
105
106     gettimeofday(&_kdc_now, NULL);
107     if(decode_AS_REQ(buf, len, &req, &i) == 0){
108         ret = _kdc_as_rep(context, config, &req, reply, from, addr);
109         free_AS_REQ(&req);
110         return ret;
111     }else if(decode_TGS_REQ(buf, len, &req, &i) == 0){
112         ret = _kdc_tgs_rep(context, config, &req, reply, from, addr);
113         free_TGS_REQ(&req);
114         return ret;
115     }
116     return -1;
117 }