1 /* 2 * Copyright (c) 1997 - 1999 Kungliga Tekniska H�gskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of the Institute nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #include "test_locl.h" 35 RCSID("$Id: uu_server.c,v 1.7 2000/08/09 20:53:08 assar Exp $"); 36 37 krb5_context context; 38 39 static int 40 proto (int sock, const char *service) 41 { 42 struct sockaddr_in remote, local; 43 socklen_t addrlen; 44 krb5_address remote_addr, local_addr; 45 krb5_ccache ccache; 46 krb5_auth_context auth_context; 47 krb5_error_code status; 48 krb5_data packet; 49 krb5_data data; 50 krb5_data client_name; 51 krb5_creds in_creds, *out_creds; 52 53 addrlen = sizeof(local); 54 if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0 55 || addrlen != sizeof(local)) 56 err (1, "getsockname)"); 57 58 addrlen = sizeof(remote); 59 if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0 60 || addrlen != sizeof(remote)) 61 err (1, "getpeername"); 62 63 status = krb5_auth_con_init (context, &auth_context); 64 if (status) 65 errx (1, "krb5_auth_con_init: %s", 66 krb5_get_err_text(context, status)); 67 68 local_addr.addr_type = AF_INET; 69 local_addr.address.length = sizeof(local.sin_addr); 70 local_addr.address.data = &local.sin_addr; 71 72 remote_addr.addr_type = AF_INET; 73 remote_addr.address.length = sizeof(remote.sin_addr); 74 remote_addr.address.data = &remote.sin_addr; 75 76 status = krb5_auth_con_setaddrs (context, 77 auth_context, 78 &local_addr, 79 &remote_addr); 80 if (status) 81 errx (1, "krb5_auth_con_setaddr: %s", 82 krb5_get_err_text(context, status)); 83 84 status = krb5_read_message(context, &sock, &client_name); 85 if(status) 86 krb5_err(context, 1, status, "krb5_read_message"); 87 88 memset(&in_creds, 0, sizeof(in_creds)); 89 status = krb5_cc_default(context, &ccache); 90 status = krb5_cc_get_principal(context, ccache, &in_creds.client); 91 92 status = krb5_read_message(context, &sock, &in_creds.second_ticket); 93 if(status) 94 krb5_err(context, 1, status, "krb5_read_message"); 95 96 status = krb5_parse_name(context, client_name.data, &in_creds.server); 97 if(status) 98 krb5_err(context, 1, status, "krb5_parse_name"); 99 100 status = krb5_get_credentials(context, KRB5_GC_USER_USER, ccache, 101 &in_creds, &out_creds); 102 if(status) 103 krb5_err(context, 1, status, "krb5_get_credentials"); 104 105 status = krb5_cc_default(context, &ccache); 106 107 status = krb5_sendauth(context, 108 &auth_context, 109 &sock, 110 VERSION, 111 in_creds.client, 112 in_creds.server, 113 AP_OPTS_USE_SESSION_KEY, 114 NULL, 115 out_creds, 116 ccache, 117 NULL, 118 NULL, 119 NULL); 120 121 if (status) 122 krb5_err(context, 1, status, "krb5_sendauth"); 123 124 fprintf (stderr, "User is `%.*s'\n", (int)client_name.length, 125 (char *)client_name.data); 126 127 krb5_data_zero (&data); 128 krb5_data_zero (&packet); 129 130 status = krb5_read_message(context, &sock, &packet); 131 if(status) 132 krb5_err(context, 1, status, "krb5_read_message"); 133 134 status = krb5_rd_safe (context, 135 auth_context, 136 &packet, 137 &data, 138 NULL); 139 if (status) 140 errx (1, "krb5_rd_safe: %s", 141 krb5_get_err_text(context, status)); 142 143 fprintf (stderr, "safe packet: %.*s\n", (int)data.length, 144 (char *)data.data); 145 146 status = krb5_read_message(context, &sock, &packet); 147 if(status) 148 krb5_err(context, 1, status, "krb5_read_message"); 149 150 status = krb5_rd_priv (context, 151 auth_context, 152 &packet, 153 &data, 154 NULL); 155 if (status) 156 errx (1, "krb5_rd_priv: %s", 157 krb5_get_err_text(context, status)); 158 159 fprintf (stderr, "priv packet: %.*s\n", (int)data.length, 160 (char *)data.data); 161 162 return 0; 163 } 164 165 static int 166 doit (int port, const char *service) 167 { 168 int sock, sock2; 169 struct sockaddr_in my_addr; 170 int one = 1; 171 172 sock = socket (AF_INET, SOCK_STREAM, 0); 173 if (sock < 0) 174 err (1, "socket"); 175 176 memset (&my_addr, 0, sizeof(my_addr)); 177 my_addr.sin_family = AF_INET; 178 my_addr.sin_port = port; 179 my_addr.sin_addr.s_addr = INADDR_ANY; 180 181 if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, 182 (void *)&one, sizeof(one)) < 0) 183 warn ("setsockopt SO_REUSEADDR"); 184 185 if (bind (sock, (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0) 186 err (1, "bind"); 187 188 if (listen (sock, 1) < 0) 189 err (1, "listen"); 190 191 sock2 = accept (sock, NULL, NULL); 192 if (sock2 < 0) 193 err (1, "accept"); 194 195 return proto (sock2, service); 196 } 197 198 int 199 main(int argc, char **argv) 200 { 201 int port = server_setup(&context, argc, argv); 202 return doit (port, service); 203 } 204