#include "k5-int.h"
#include "kdc_util.h"
#include <syslog.h>
#include "adm_proto.h"
void
log_as_req(krb5_context context,
const struct sockaddr *local_addr,
const struct sockaddr *remote_addr,
krb5_kdc_req *request, krb5_kdc_rep *reply,
krb5_db_entry *client, const char *cname,
krb5_db_entry *server, const char *sname,
krb5_timestamp authtime,
const char *status, krb5_error_code errcode, const char *emsg)
{
char fromstring[128];
char *ktypestr = NULL;
const char *cname2 = cname ? cname : "<unknown client>";
const char *sname2 = sname ? sname : "<unknown server>";
krb5_address laddr = { 0 }, raddr = { 0 };
k5_print_addr(remote_addr, fromstring, sizeof(fromstring));
ktypestr = ktypes2str(request->ktype, request->nktypes);
if (status == NULL) {
char *rep_etypestr = rep_etypes2str(reply);
krb5_klog_syslog(LOG_INFO, _("AS_REQ (%s) %s: ISSUE: authtime %u, %s, "
"%s for %s"),
ktypestr ? ktypestr : "", fromstring,
(unsigned int)authtime,
rep_etypestr ? rep_etypestr : "", cname2, sname2);
free(rep_etypestr);
} else {
krb5_klog_syslog(LOG_INFO, _("AS_REQ (%s) %s: %s: %s for %s%s%s"),
ktypestr ? ktypestr : "", fromstring, status, cname2,
sname2, emsg ? ", " : "", emsg ? emsg : "");
}
(void)k5_sockaddr_to_address(local_addr, TRUE, &laddr);
(void)k5_sockaddr_to_address(remote_addr, TRUE, &raddr);
krb5_db_audit_as_req(context, request, &laddr, &raddr, client, server,
authtime, errcode);
free(ktypestr);
}
static void
unparse_and_limit(krb5_context ctx, krb5_principal princ, char **str)
{
krb5_unparse_name(ctx, princ, str);
limit_string(*str);
}
void
log_tgs_req(krb5_context ctx, const struct sockaddr *from,
krb5_kdc_req *request, krb5_kdc_rep *reply,
krb5_principal cprinc, krb5_principal sprinc,
krb5_principal altcprinc,
krb5_timestamp authtime,
unsigned int c_flags,
const char *status, krb5_error_code errcode, const char *emsg)
{
char *ktypestr = NULL, *rep_etypestr = NULL;
char fromstring[128];
char *cname = NULL, *sname = NULL, *altcname = NULL;
char *logcname = NULL, *logsname = NULL, *logaltcname = NULL;
k5_print_addr(from, fromstring, sizeof(fromstring));
unparse_and_limit(ctx, cprinc, &cname);
logcname = (cname != NULL) ? cname : "<unknown client>";
unparse_and_limit(ctx, sprinc, &sname);
logsname = (sname != NULL) ? sname : "<unknown server>";
unparse_and_limit(ctx, altcprinc, &altcname);
logaltcname = (altcname != NULL) ? altcname : "<unknown>";
if (errcode != KRB5KDC_ERR_SERVER_NOMATCH) {
ktypestr = ktypes2str(request->ktype, request->nktypes);
if (reply != NULL)
rep_etypestr = rep_etypes2str(reply);
krb5_klog_syslog(LOG_INFO, _("TGS_REQ (%s) %s: %s: authtime %u, %s%s "
"%s for %s%s%s"),
ktypestr ? ktypestr : "", fromstring, status,
(unsigned int)authtime,
rep_etypestr ? rep_etypestr : "",
!errcode ? "," : "", logcname, logsname,
errcode ? ", " : "", errcode ? emsg : "");
if (isflagset(c_flags, KRB5_KDB_FLAG_PROTOCOL_TRANSITION))
krb5_klog_syslog(LOG_INFO,
_("... PROTOCOL-TRANSITION s4u-client=%s"),
logaltcname);
else if (isflagset(c_flags, KRB5_KDB_FLAG_CONSTRAINED_DELEGATION))
krb5_klog_syslog(LOG_INFO,
_("... CONSTRAINED-DELEGATION s4u-client=%s"),
logaltcname);
} else
krb5_klog_syslog(LOG_INFO, _("TGS_REQ %s: %s: authtime %u, %s for %s, "
"2nd tkt client %s"),
fromstring, status, (unsigned int)authtime,
logcname, logsname, logaltcname);
free(rep_etypestr);
free(ktypestr);
krb5_free_unparsed_name(ctx, cname);
krb5_free_unparsed_name(ctx, sname);
krb5_free_unparsed_name(ctx, altcname);
}
void
log_tgs_badtrans(krb5_context ctx, krb5_principal cprinc,
krb5_principal sprinc, krb5_data *trcont,
krb5_error_code errcode)
{
unsigned int tlen;
char *tdots;
const char *emsg = NULL;
char *cname = NULL, *sname = NULL;
char *logcname = NULL, *logsname = NULL;
unparse_and_limit(ctx, cprinc, &cname);
logcname = (cname != NULL) ? cname : "<unknown client>";
unparse_and_limit(ctx, sprinc, &sname);
logsname = (sname != NULL) ? sname : "<unknown server>";
tlen = trcont->length;
tdots = tlen > 125 ? "..." : "";
tlen = tlen > 125 ? 125 : tlen;
if (errcode == KRB5KRB_AP_ERR_ILL_CR_TKT)
krb5_klog_syslog(LOG_INFO, _("bad realm transit path from '%s' "
"to '%s' via '%.*s%s'"),
logcname, logsname, tlen,
trcont->data, tdots);
else {
emsg = krb5_get_error_message(ctx, errcode);
krb5_klog_syslog(LOG_ERR, _("unexpected error checking transit "
"from '%s' to '%s' via '%.*s%s': %s"),
logcname, logsname, tlen,
trcont->data, tdots,
emsg);
krb5_free_error_message(ctx, emsg);
emsg = NULL;
}
krb5_free_unparsed_name(ctx, cname);
krb5_free_unparsed_name(ctx, sname);
}
void
log_tgs_alt_tgt(krb5_context context, krb5_principal p)
{
char *sname;
if (krb5_unparse_name(context, p, &sname)) {
krb5_klog_syslog(LOG_INFO,
_("TGS_REQ: issuing alternate <un-unparsable> TGT"));
} else {
limit_string(sname);
krb5_klog_syslog(LOG_INFO, _("TGS_REQ: issuing TGT %s"), sname);
free(sname);
}
}