Path: blob/main/crypto/krb5/src/plugins/audit/test/au_test.c
34907 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */1/* plugins/audit/au_test.c - Test Audit plugin implementation */2/*3* Copyright (C) 2013 by the Massachusetts Institute of Technology.4* All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9*10* * Redistributions of source code must retain the above copyright11* notice, this list of conditions and the following disclaimer.12*13* * Redistributions in binary form must reproduce the above copyright14* notice, this list of conditions and the following disclaimer in15* the documentation and/or other materials provided with the16* distribution.17*18* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS19* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT20* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS21* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE22* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,23* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES24* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR25* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)26* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,27* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)28* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED29* OF THE POSSIBILITY OF SUCH DAMAGE.30*/31/*32* This test is to verify the JSON-based KDC audit functionality.33* It utilized MIT Kerberos <kdc_j_encode.h> routines for JSON processing.34*/3536#include <k5-int.h>37#include <krb5/audit_plugin.h>38#include <kdc_j_encode.h>39#include "k5-thread.h"4041struct krb5_audit_moddata_st {42int au_fd;43};4445krb5_error_code46audit_test_initvt(krb5_context context, int maj_ver, int min_ver,47krb5_plugin_vtable vtable);4849static FILE *au_fd;50static k5_mutex_t lock = K5_MUTEX_PARTIAL_INITIALIZER;5152/* Open connection to the audit system. Returns 0 on success. */53static krb5_error_code54open_au(krb5_audit_moddata *auctx)55{56au_fd = fopen("au.log", "a+");57if (au_fd == NULL)58return KRB5_PLUGIN_NO_HANDLE; /* audit module is unavailable */59k5_mutex_init(&lock);60return 0;61}6263/* Close connection to the audit system. Returns 0. */64static krb5_error_code65close_au(krb5_audit_moddata auctx)66{67fclose(au_fd);68k5_mutex_destroy(&lock);69return 0;70}7172/* Log KDC-start event. Returns 0 on success. */73static krb5_error_code74j_kdc_start(krb5_audit_moddata auctx, krb5_boolean ev_success)75{76krb5_error_code ret = 0;77char *jout = NULL;7879ret = kau_j_kdc_start(ev_success, &jout);80if (ret)81return ret;82k5_mutex_lock(&lock);83fprintf(au_fd,"%s\n", jout);84fflush(au_fd);85k5_mutex_unlock(&lock);86free(jout);87return ret;88}8990/* Log KDC-stop event. Returns 0 on success. */91static krb5_error_code92j_kdc_stop(krb5_audit_moddata auctx, krb5_boolean ev_success)93{94krb5_error_code ret = 0;95char *jout = NULL;9697ret = kau_j_kdc_stop(ev_success, &jout);98if (ret)99return ret;100k5_mutex_lock(&lock);101fprintf(au_fd,"%s\n", jout);102fflush(au_fd);103k5_mutex_unlock(&lock);104free(jout);105return ret;106}107108/* Log AS_REQ event. Returns 0 on success. */109static krb5_error_code110j_as_req(krb5_audit_moddata auctx, krb5_boolean ev_success,111krb5_audit_state *state)112{113krb5_error_code ret = 0;114char *jout = NULL;115116ret = kau_j_as_req(ev_success, state, &jout);117if (ret)118return ret;119k5_mutex_lock(&lock);120fprintf(au_fd,"%s\n", jout);121fflush(au_fd);122k5_mutex_unlock(&lock);123free(jout);124return ret;125}126127/* Log TGS_REQ event. Returns 0 on success. */128static krb5_error_code129j_tgs_req(krb5_audit_moddata auctx, krb5_boolean ev_success,130krb5_audit_state *state)131{132krb5_error_code ret = 0;133char *jout = NULL;134135ret = kau_j_tgs_req(ev_success, state, &jout);136if (ret)137return ret;138k5_mutex_lock(&lock);139fprintf(au_fd,"%s\n", jout);140fflush(au_fd);141k5_mutex_unlock(&lock);142free(jout);143return ret;144}145146/* Log S4U2SELF event. Returns 0 on success. */147static krb5_error_code148j_tgs_s4u2self(krb5_audit_moddata auctx, krb5_boolean ev_success,149krb5_audit_state *state)150{151krb5_error_code ret = 0;152char *jout = NULL;153154ret = kau_j_tgs_s4u2self(ev_success, state, &jout);155if (ret)156return ret;157k5_mutex_lock(&lock);158fprintf(au_fd,"%s\n", jout);159fflush(au_fd);160k5_mutex_unlock(&lock);161free(jout);162return ret;163}164165/* Log S4U2PROXY event. Returns 0 on success. */166static krb5_error_code167j_tgs_s4u2proxy(krb5_audit_moddata auctx, krb5_boolean ev_success,168krb5_audit_state *state)169{170krb5_error_code ret = 0;171char *jout = NULL;172173ret = kau_j_tgs_s4u2proxy(ev_success, state, &jout);174if (ret)175return ret;176k5_mutex_lock(&lock);177fprintf(au_fd,"%s\n", jout);178fflush(au_fd);179k5_mutex_unlock(&lock);180free(jout);181return ret;182}183184/* Log user-to-user event. Returns 0 on success. */185static krb5_error_code186j_tgs_u2u(krb5_audit_moddata auctx, krb5_boolean ev_success,187krb5_audit_state *state)188{189krb5_error_code ret = 0;190char *jout = NULL;191192ret = kau_j_tgs_u2u(ev_success, state, &jout);193if (ret)194return ret;195k5_mutex_lock(&lock);196fprintf(au_fd,"%s\n", jout);197fflush(au_fd);198k5_mutex_unlock(&lock);199free(jout);200return ret;201}202203krb5_error_code204audit_test_initvt(krb5_context context, int maj_ver, int min_ver,205krb5_plugin_vtable vtable)206{207krb5_audit_vtable vt;208209if (maj_ver != 1)210return KRB5_PLUGIN_VER_NOTSUPP;211212vt = (krb5_audit_vtable)vtable;213vt->name = "test";214215vt->open = open_au;216vt->close = close_au;217vt->kdc_start = j_kdc_start;218vt->kdc_stop = j_kdc_stop;219vt->as_req = j_as_req;220vt->tgs_req = j_tgs_req;221vt->tgs_s4u2self = j_tgs_s4u2self;222vt->tgs_s4u2proxy = j_tgs_s4u2proxy;223vt->tgs_u2u = j_tgs_u2u;224225return 0;226}227228229