client-common.c revision 76b43e4417bab52e913da39b5f5bc2a130d3f149
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
08d6658a4e2ec8104cd1307f6baa75fdb07a24f8Mark Washenberger#include "common.h"
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen#include "hostpid.h"
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen#include "str.h"
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen#include "str-sanitize.h"
08d6658a4e2ec8104cd1307f6baa75fdb07a24f8Mark Washenberger#include "var-expand.h"
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen#include "ssl-proxy.h"
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen#include "client-common.h"
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen#include <stdlib.h>
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainenstatic const struct var_expand_table *
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainenget_var_expand_table(struct client *client)
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen{
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen static struct var_expand_table static_tab[] = {
25d624dd86700c82cd28427f3d3bebe7c8f7f459Timo Sirainen { 'u', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { 'n', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { 'd', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { 's', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { 'h', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { 'l', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { 'r', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { 'p', NULL },
714e2da5096fb52b8845d3c79f9bb26225a606c9Timo Sirainen { 'm', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { 'a', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { 'b', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { 'c', NULL },
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen { '\0', NULL }
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen };
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen struct var_expand_table *tab;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab = t_malloc(sizeof(static_tab));
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen memcpy(tab, static_tab, sizeof(static_tab));
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen if (client->virtual_user != NULL) {
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[0].value = client->virtual_user;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[1].value = t_strcut(client->virtual_user, '@');
04870054863757edf048c81dcce3c5e7dec453cdTimo Sirainen tab[2].value = strchr(client->virtual_user, '@');
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen if (tab[2].value != NULL) tab[2].value++;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen }
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[3].value = login_protocol;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[4].value = getenv("HOME");
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[5].value = net_ip2addr(&client->local_ip);
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[6].value = net_ip2addr(&client->ip);
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[7].value = my_pid;
bd63b5b860658b01b1f46f26d406e1e4a9dc019aTimo Sirainen tab[8].value = client->auth_mech_name == NULL ? NULL :
15a07b47846c47a81d69a14d649564e222d6f742Timo Sirainen str_sanitize(client->auth_mech_name, MAX_MECH_NAME);
cd2cd224d3216a243d55c71c298a5b7684de0ac4Timo Sirainen tab[9].value = dec2str(client->local_port);
c1faff067b29fb48426cb84260adba563e93189aTimo Sirainen tab[10].value = dec2str(client->remote_port);
6882df5fbca4a09cdaa95f54d70bb31b5920528cTimo Sirainen if (!client->tls) {
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[11].value = client->secured ? "secured" : NULL;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen } else {
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[11].value = client->proxy != NULL &&
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen ssl_proxy_is_handshaked(client->proxy) ? "TLS" :
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen "TLS handshaking";
eacce2276278ce6a8176a9a100807dba50bbfb36Timo Sirainen }
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen return tab;
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen}
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainenstatic bool have_key(const struct var_expand_table *table, const char *str)
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen{
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen char key;
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen unsigned int i;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen key = var_get_key(str);
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen for (i = 0; table[i].key != '\0'; i++) {
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen if (table[i].key == key) {
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen return table[i].value != NULL &&
4145cbac82bfc0c8bfeceeca0ef841700117930cTimo Sirainen table[i].value[0] != '\0';
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen }
eacce2276278ce6a8176a9a100807dba50bbfb36Timo Sirainen }
eacce2276278ce6a8176a9a100807dba50bbfb36Timo Sirainen return FALSE;
eacce2276278ce6a8176a9a100807dba50bbfb36Timo Sirainen}
eacce2276278ce6a8176a9a100807dba50bbfb36Timo Sirainen
eacce2276278ce6a8176a9a100807dba50bbfb36Timo Sirainenstatic void client_syslog_real(struct client *client, const char *msg)
eacce2276278ce6a8176a9a100807dba50bbfb36Timo Sirainen{
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen static struct var_expand_table static_tab[3] = {
eacce2276278ce6a8176a9a100807dba50bbfb36Timo Sirainen { 's', NULL },
eacce2276278ce6a8176a9a100807dba50bbfb36Timo Sirainen { '$', NULL },
eacce2276278ce6a8176a9a100807dba50bbfb36Timo Sirainen { '\0', NULL }
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen };
e1203014de25c8c3d3975a9f4b4a04616df4bba2Timo Sirainen const struct var_expand_table *var_expand_table;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen struct var_expand_table *tab;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen const char *p, *const *e;
e1203014de25c8c3d3975a9f4b4a04616df4bba2Timo Sirainen string_t *str;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
e10d8b1291090c26b9ef499637e6e632485ca5beTimo Sirainen var_expand_table = get_var_expand_table(client);
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab = t_malloc(sizeof(static_tab));
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen memcpy(tab, static_tab, sizeof(static_tab));
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen str = t_str_new(256);
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen for (e = log_format_elements; *e != NULL; e++) {
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen for (p = *e; *p != '\0'; p++) {
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen if (*p != '%' || p[1] == '\0')
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen continue;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen p++;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen if (have_key(var_expand_table, p)) {
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen if (str_len(str) > 0)
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen str_append(str, ", ");
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen var_expand(str, *e, var_expand_table);
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen break;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen }
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen }
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen }
411f318ed3a25fa66c1b932e10df43841e2725c9Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[0].value = t_strdup(str_c(str));
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen tab[1].value = msg;
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen str_truncate(str, 0);
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen var_expand(str, log_format, tab);
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen i_info("%s", str_c(str));
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen}
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainenvoid client_syslog(struct client *client, const char *msg)
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen{
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen T_FRAME(
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen client_syslog_real(client, msg);
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen );
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen}
02a54da28f376dd66d7939d8546a196a0045b486Timo Sirainen