client-common.c revision 3595d562038a9cb119660ed60913acca2bf17f4d
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen/* Copyright (C) 2002-2005 Timo Sirainen */
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "common.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#include "hostpid.h"
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen#include "str.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "str-sanitize.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "var-expand.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "client-common.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include <stdlib.h>
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainenstatic const struct var_expand_table *
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainenget_var_expand_table(struct client *client)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen static struct var_expand_table static_tab[] = {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { 'u', NULL },
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen { 'n', NULL },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { 'd', NULL },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { 's', NULL },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { 'h', NULL },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { 'l', NULL },
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen { 'r', NULL },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { 'p', NULL },
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen { 'm', NULL },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { 'c', NULL },
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen { '\0', NULL }
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen };
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen struct var_expand_table *tab;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen tab = t_malloc(sizeof(static_tab));
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen memcpy(tab, static_tab, sizeof(static_tab));
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen if (client->virtual_user != NULL) {
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen tab[0].value = client->virtual_user;
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen tab[1].value = t_strcut(client->virtual_user, '@');
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen tab[2].value = strchr(client->virtual_user, '@');
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen if (tab[2].value != NULL) tab[2].value++;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen tab[3].value = login_protocol;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen tab[4].value = getenv("HOME");
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen tab[5].value = net_ip2addr(&client->local_ip);
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen tab[6].value = net_ip2addr(&client->ip);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen tab[7].value = my_pid;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen tab[8].value = client->auth_mech_name == NULL ? NULL :
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_sanitize(client->auth_mech_name, MAX_MECH_NAME);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen tab[9].value = client->tls ? "TLS" :
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen client->secured ? "secured" : NULL;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen return tab;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic int have_key(const struct var_expand_table *table, const char *str)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen char key;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen unsigned int i;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen key = var_get_key(str);
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen for (i = 0; table[i].key != '\0'; i++) {
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen if (table[i].key == key) {
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen return table[i].value != NULL &&
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen table[i].value[0] != '\0';
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return FALSE;
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen}
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenvoid client_syslog(struct client *client, const char *msg)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen static struct var_expand_table static_tab[3] = {
baf1148108b7d9739626b47cc57298c36929586aTimo Sirainen { 's', NULL },
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen { '$', NULL },
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen { '\0', NULL }
baf1148108b7d9739626b47cc57298c36929586aTimo Sirainen };
baf1148108b7d9739626b47cc57298c36929586aTimo Sirainen const struct var_expand_table *var_expand_table;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen struct var_expand_table *tab;
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen const char *p, *const *e;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen string_t *str;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen t_push();
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen var_expand_table = get_var_expand_table(client);
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen tab = t_malloc(sizeof(static_tab));
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen memcpy(tab, static_tab, sizeof(static_tab));
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str = t_str_new(256);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen for (e = log_format_elements; *e != NULL; e++) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen for (p = *e; *p != '\0'; p++) {
6389aeec8c26b585e583c364b48ad12adf741898Timo Sirainen if (*p != '%' || p[1] == '\0')
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen continue;
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen p++;
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen if (have_key(var_expand_table, p)) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (str_len(str) > 0)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen str_append(str, ", ");
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen var_expand(str, *e, var_expand_table);
e60a349c641bb2f4723e4a395a25f55531682d2bTimo Sirainen break;
88ea893b45d3ed8d68000921db9156c03cbe1b00Timo Sirainen }
88ea893b45d3ed8d68000921db9156c03cbe1b00Timo Sirainen }
9c4e6f29ad07fbd27cb9ac510fa69f8c60709f1fTimo Sirainen }
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen tab[0].value = t_strdup(str_c(str));
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen tab[1].value = msg;
79fcd3f95a6266cc62ceaa753e56dd4456ab7c4bTimo Sirainen str_truncate(str, 0);
79fcd3f95a6266cc62ceaa753e56dd4456ab7c4bTimo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen var_expand(str, log_format, tab);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen i_info("%s", str_c(str));
88ea893b45d3ed8d68000921db9156c03cbe1b00Timo Sirainen
88ea893b45d3ed8d68000921db9156c03cbe1b00Timo Sirainen t_pop();
88ea893b45d3ed8d68000921db9156c03cbe1b00Timo Sirainen}
88ea893b45d3ed8d68000921db9156c03cbe1b00Timo Sirainen