client-common.c revision 9439bed2f07d6475febd8a247cd2f0990fb32a13
a8c5a86d183db25a57bf193c06b41e092ec2e151Timo Sirainen/* Copyright (C) 2002-2005 Timo Sirainen */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include "common.h"
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainen#include "hostpid.h"
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include "str.h"
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen#include "str-sanitize.h"
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include "var-expand.h"
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include "client-common.h"
abf015c9682f0f723db87a7c97bc284ef814818fTimo Sirainen
70afae43cc78ea6ecca83f6c587072c442a15ec1Timo Sirainen#include <stdlib.h>
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainenstatic const struct var_expand_table *
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainenget_var_expand_table(struct client *client)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen static struct var_expand_table static_tab[] = {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 'u', NULL },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 'n', NULL },
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen { 'd', NULL },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 's', NULL },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 'h', NULL },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 'l', NULL },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 'r', NULL },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 'p', NULL },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 'm', NULL },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 'c', NULL },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { '\0', NULL }
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainen };
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainen struct var_expand_table *tab;
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainen
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainen tab = t_malloc(sizeof(static_tab));
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainen memcpy(tab, static_tab, sizeof(static_tab));
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainen
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainen if (client->virtual_user != NULL) {
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainen tab[0].value = client->virtual_user;
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainen tab[1].value = t_strcut(client->virtual_user, '@');
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainen tab[2].value = strchr(client->virtual_user, '@');
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainen if (tab[2].value != NULL) tab[2].value++;
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainen }
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainen tab[3].value = login_protocol;
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainen tab[4].value = getenv("HOME");
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainen tab[5].value = net_ip2addr(&client->local_ip);
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainen tab[6].value = net_ip2addr(&client->ip);
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainen tab[7].value = my_pid;
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainen tab[8].value = client->auth_mech_name == NULL ? NULL :
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainen str_sanitize(client->auth_mech_name, MAX_MECH_NAME);
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainen tab[9].value = client->tls ? "TLS" : client->secured ? "SSL" : NULL;
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainen
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainen return tab;
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainen}
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainenstatic int have_key(const struct var_expand_table *table, const char *str)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
1388b590dbd85245b591346f860bc1319953318aTimo Sirainen char key;
1388b590dbd85245b591346f860bc1319953318aTimo Sirainen unsigned int i;
49621bf0ef1d55aaaa2dc7d76011cbfeabdcfbe1Timo Sirainen
fa2433aebcf3fccfa30ca9eed9b1a9166cf92ee2Timo Sirainen key = var_get_key(str);
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen for (i = 0; table[i].key != '\0'; i++) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen if (table[i].key == key) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen return table[i].value != NULL &&
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen table[i].value[0] != '\0';
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen }
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen }
3482fee0e3733456512ba110780824e6daa7ff9fTimo Sirainen return FALSE;
3482fee0e3733456512ba110780824e6daa7ff9fTimo Sirainen}
3482fee0e3733456512ba110780824e6daa7ff9fTimo Sirainen
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainenvoid client_syslog(struct client *client, const char *msg)
12797080b552a3c1727b73b61cc7427bec0c7472Timo Sirainen{
49fd8c950e3da2ed32506e617a4b1480a07f874fTimo Sirainen static struct var_expand_table static_tab[3] = {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { 's', NULL },
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen { '$', NULL },
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen { '\0', NULL }
367e28a16854ee9f7247b2518f36f5e9163fcc10Timo Sirainen };
1388b590dbd85245b591346f860bc1319953318aTimo Sirainen const struct var_expand_table *var_expand_table;
d1fff80640050631b06bfab904a34b2ad24601e8Timo Sirainen struct var_expand_table *tab;
b9b841558c5f91db7f5fc71c0ac62aad1bbf6418Timo Sirainen const char *p, *const *e;
d1fff80640050631b06bfab904a34b2ad24601e8Timo Sirainen string_t *str;
1388b590dbd85245b591346f860bc1319953318aTimo Sirainen
2f90189c6ee66a17f7bf838a8eb8a69868630fb8Timo Sirainen t_push();
1388b590dbd85245b591346f860bc1319953318aTimo Sirainen var_expand_table = get_var_expand_table(client);
f3e17726502b6cf1912f30aae7e283b5d31ea69cTimo Sirainen
367e28a16854ee9f7247b2518f36f5e9163fcc10Timo Sirainen tab = t_malloc(sizeof(static_tab));
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen memcpy(tab, static_tab, sizeof(static_tab));
367e28a16854ee9f7247b2518f36f5e9163fcc10Timo Sirainen
e438c85a6b0f77889e25913bbbba808d6078282dStephan Bosch str = t_str_new(256);
e438c85a6b0f77889e25913bbbba808d6078282dStephan Bosch for (e = log_format_elements; *e != NULL; e++) {
5a9912dcadfd467c5ea54bdc3331eef359f0b1c5Timo Sirainen for (p = *e; *p != '\0'; p++) {
367e28a16854ee9f7247b2518f36f5e9163fcc10Timo Sirainen if (*p != '%' || p[1] == '\0')
367e28a16854ee9f7247b2518f36f5e9163fcc10Timo Sirainen continue;
38f227941bcf673e0e523c1ac7267bca9cbcd2c4Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen p++;
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen if (have_key(var_expand_table, p)) {
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen if (str_len(str) > 0)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen str_append(str, ", ");
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen var_expand(str, *e, var_expand_table);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen break;
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen }
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen }
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen }
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen tab[0].value = t_strdup(str_c(str));
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen tab[1].value = msg;
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen str_truncate(str, 0);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen
2eb2cf8eeb763bd5ca9b6848dce32f0303e88ec1Timo Sirainen var_expand(str, log_format, tab);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_info("%s", str_c(str));
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen t_pop();
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen