#ifndef SUDO_EVENTLOG_H
#define SUDO_EVENTLOG_H
#include <sys/types.h>
#include <time.h>
#ifdef HAVE_STDBOOL_H
# include <stdbool.h>
#else
# include <compat/stdbool.h>
#endif
enum event_type {
EVLOG_ACCEPT,
EVLOG_REJECT,
EVLOG_EXIT,
EVLOG_ALERT
};
#define EVLOG_NONE 0x00
#define EVLOG_SYSLOG 0x01
#define EVLOG_FILE 0x02
enum eventlog_format {
EVLOG_SUDO,
EVLOG_JSON_COMPACT,
EVLOG_JSON_PRETTY
};
#define EVLOG_RAW 0x01
#define EVLOG_MAIL 0x02
#define EVLOG_MAIL_ONLY 0x04
#define EVLOG_CWD 0x08
#ifndef MAXSYSLOGLEN
# define MAXSYSLOGLEN 960
#endif
#define EVENTLOG_INDENT " "
struct eventlog_config {
int type;
enum eventlog_format format;
size_t file_maxlen;
size_t syslog_maxlen;
int syslog_acceptpri;
int syslog_rejectpri;
int syslog_alertpri;
uid_t mailuid;
gid_t mailgid;
bool omit_hostname;
const char *logpath;
const char *time_fmt;
const char *mailerpath;
const char *mailerflags;
const char *mailfrom;
const char *mailto;
const char *mailsub;
FILE *(*open_log)(int type, const char *);
void (*close_log)(int type, FILE *);
};
struct eventlog {
char *iolog_path;
const char *iolog_file;
char *command;
char *cwd;
char *runchroot;
char *runcwd;
char *rungroup;
char *runuser;
char *peeraddr;
char *signal_name;
char *source;
char *submithost;
char *submituser;
char *submitgroup;
char **submitenv;
char *ttyname;
char **runargv;
char **runenv;
char **env_add;
struct timespec event_time;
struct timespec iolog_offset;
struct timespec run_time;
int exit_value;
int lines;
int columns;
uid_t runuid;
gid_t rungid;
bool dumped_core;
char sessid[7];
char uuid_str[37];
};
struct json_container;
struct sudo_lbuf;
typedef bool (*eventlog_json_callback_t)(struct json_container *, void *);
bool eventlog_accept(const struct eventlog *evlog, int flags, eventlog_json_callback_t info_cb, void *info);
bool eventlog_exit(const struct eventlog *evlog, int flags);
bool eventlog_alert(const struct eventlog *evlog, int flags, struct timespec *alert_time, const char *reason, const char *errstr);
bool eventlog_mail(const struct eventlog *evlog, int flags, struct timespec *event_time, const char *reason, const char *errstr, char * const extra[]);
bool eventlog_reject(const struct eventlog *evlog, int flags, const char *reason, eventlog_json_callback_t info_cb, void *info);
bool eventlog_store_json(struct json_container *jsonc, const struct eventlog *evlog);
bool eventlog_store_sudo(int event_type, const struct eventlog *evlog, struct sudo_lbuf *lbuf);
void eventlog_free(struct eventlog *evlog);
void eventlog_free_contents(struct eventlog *evlog);
void eventlog_set_type(int type);
void eventlog_set_format(enum eventlog_format format);
void eventlog_set_syslog_acceptpri(int pri);
void eventlog_set_syslog_rejectpri(int pri);
void eventlog_set_syslog_alertpri(int pri);
void eventlog_set_syslog_maxlen(size_t len);
void eventlog_set_file_maxlen(size_t len);
void eventlog_set_mailuser(uid_t uid, gid_t gid);
void eventlog_set_omit_hostname(bool omit_hostname);
void eventlog_set_logpath(const char *path);
void eventlog_set_time_fmt(const char *fmt);
void eventlog_set_mailerpath(const char *path);
void eventlog_set_mailerflags(const char *mflags);
void eventlog_set_mailfrom(const char *from_addr);
void eventlog_set_mailto(const char *to_addr);
void eventlog_set_mailsub(const char *subject);
void eventlog_set_open_log(FILE *(*fn)(int type, const char *));
void eventlog_set_close_log(void (*fn)(int type, FILE *));
const struct eventlog_config *eventlog_getconf(void);
size_t eventlog_writeln(FILE *fp, char *line, size_t len, size_t maxlen);
struct eventlog_json_object;
struct eventlog_json_object *eventlog_json_read(FILE *fp, const char *filename);
bool eventlog_json_parse(struct eventlog_json_object *object, struct eventlog *evlog);
void eventlog_json_free(struct eventlog_json_object *root);
#endif