Apply old patch from me that handles client's behind NAT
Tested by Harald Barth and bugfix by Ragnar Sundblad
This commit is contained in:
@@ -445,7 +445,8 @@ verify (krb5_auth_context *auth_context,
|
|||||||
struct sockaddr *sa,
|
struct sockaddr *sa,
|
||||||
int sa_size,
|
int sa_size,
|
||||||
u_char *msg,
|
u_char *msg,
|
||||||
size_t len)
|
size_t len,
|
||||||
|
krb5_address *client_addr)
|
||||||
{
|
{
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
uint16_t pkt_len, pkt_ver, ap_req_len;
|
uint16_t pkt_len, pkt_ver, ap_req_len;
|
||||||
@@ -546,6 +547,21 @@ verify (krb5_auth_context *auth_context,
|
|||||||
krb_priv_data.data = msg + 6 + ap_req_len;
|
krb_priv_data.data = msg + 6 + ap_req_len;
|
||||||
krb_priv_data.length = len - 6 - ap_req_len;
|
krb_priv_data.length = len - 6 - ap_req_len;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only enforce client addresses on on tickets with addresses. If
|
||||||
|
* its addressless, we are guessing its behind NAT and really
|
||||||
|
* can't know this information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((*ticket)->ticket.caddr && (*ticket)->ticket.caddr->len > 0) {
|
||||||
|
ret = krb5_auth_con_setaddrs (context, *auth_context,
|
||||||
|
NULL, client_addr);
|
||||||
|
if (ret) {
|
||||||
|
krb5_warn (context, ret, "krb5_auth_con_setaddr(this)");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret = krb5_rd_priv (context,
|
ret = krb5_rd_priv (context,
|
||||||
*auth_context,
|
*auth_context,
|
||||||
&krb_priv_data,
|
&krb_priv_data,
|
||||||
@@ -582,7 +598,7 @@ process (krb5_realm *realms,
|
|||||||
krb5_address other_addr;
|
krb5_address other_addr;
|
||||||
uint16_t version;
|
uint16_t version;
|
||||||
|
|
||||||
|
memset(&other_addr, 0, sizeof(other_addr));
|
||||||
krb5_data_zero (&out_data);
|
krb5_data_zero (&out_data);
|
||||||
|
|
||||||
ret = krb5_auth_con_init (context, &auth_context);
|
ret = krb5_auth_con_init (context, &auth_context);
|
||||||
@@ -600,18 +616,27 @@ process (krb5_realm *realms,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = krb5_auth_con_setaddrs (context,
|
ret = krb5_auth_con_setaddrs (context, auth_context, this_addr, NULL);
|
||||||
auth_context,
|
|
||||||
this_addr,
|
|
||||||
&other_addr);
|
|
||||||
krb5_free_address (context, &other_addr);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
krb5_warn (context, ret, "krb5_auth_con_setaddr");
|
krb5_warn (context, ret, "krb5_auth_con_setaddr(this)");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verify (&auth_context, realms, keytab, &ticket, &out_data,
|
if (verify (&auth_context, realms, keytab, &ticket, &out_data,
|
||||||
&version, s, sa, sa_size, msg, len) == 0) {
|
&version, s, sa, sa_size, msg, len, &other_addr) == 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We always set the client_addr, to assume that the client
|
||||||
|
* can ignore it if it choose to do so (just the server does
|
||||||
|
* so for addressless tickets).
|
||||||
|
*/
|
||||||
|
ret = krb5_auth_con_setaddrs (context, auth_context,
|
||||||
|
this_addr, &other_addr);
|
||||||
|
if (ret) {
|
||||||
|
krb5_warn (context, ret, "krb5_auth_con_setaddr(other)");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
change (auth_context,
|
change (auth_context,
|
||||||
ticket->client,
|
ticket->client,
|
||||||
version,
|
version,
|
||||||
@@ -623,8 +648,9 @@ process (krb5_realm *realms,
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
krb5_data_free (&out_data);
|
krb5_free_address(context, &other_addr);
|
||||||
krb5_auth_con_free (context, auth_context);
|
krb5_data_free(&out_data);
|
||||||
|
krb5_auth_con_free(context, auth_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
Reference in New Issue
Block a user