annotate src/auth/auth-cache.c @ 9608:f30e6a345d73 HEAD

Added tag 1.2.14 for changeset eb04e2b13e3d
author Timo Sirainen <tss@iki.fi>
date Tue, 24 Aug 2010 18:10:29 +0100
parents 00cd9aacd03c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 9110
diff changeset
1 /* Copyright (c) 2004-2010 Dovecot authors, see the included COPYING file */
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "common.h"
2855
0e0682b3167b SIGHUP now clears cache.
Timo Sirainen <tss@iki.fi>
parents: 2851
diff changeset
4 #include "lib-signals.h"
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "hash.h"
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "str.h"
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "strescape.h"
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "var-expand.h"
3064
2d33734b16d5 Split auth_request* functions from mech.c to auth-request.c
Timo Sirainen <tss@iki.fi>
parents: 2975
diff changeset
9 #include "auth-request.h"
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "auth-cache.h"
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <time.h>
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 struct auth_cache {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct hash_table *hash;
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
16 struct auth_cache_node *head, *tail;
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 size_t size_left;
6174
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
19 unsigned int ttl_secs, neg_ttl_secs;
3415
4e36a99268dd Count cache hits and misses, report them on SIGUSR2.
Timo Sirainen <tss@iki.fi>
parents: 3172
diff changeset
20
4e36a99268dd Count cache hits and misses, report them on SIGUSR2.
Timo Sirainen <tss@iki.fi>
parents: 3172
diff changeset
21 unsigned int hit_count, miss_count;
8670
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
22 unsigned int pos_entries, neg_entries;
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
23 unsigned long long pos_size, neg_size;
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 };
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
3694
12d00d9ceb6e cache_key was set wrong for sql/ldap passdbs, so auth_cache was completely
Timo Sirainen <tss@iki.fi>
parents: 3657
diff changeset
26 char *auth_cache_parse_key(pool_t pool, const char *query)
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 string_t *str;
2971
1f7bcbb09f90 When building cache key, use each %key only once, more wastes only memory.
Timo Sirainen <tss@iki.fi>
parents: 2856
diff changeset
29 char key_seen[256];
2975
c59fd95ad3ee Auth cache key was built wrong if any modifiers were used for %vars.
Timo Sirainen <tss@iki.fi>
parents: 2971
diff changeset
30 uint8_t key;
2971
1f7bcbb09f90 When building cache key, use each %key only once, more wastes only memory.
Timo Sirainen <tss@iki.fi>
parents: 2856
diff changeset
31
1f7bcbb09f90 When building cache key, use each %key only once, more wastes only memory.
Timo Sirainen <tss@iki.fi>
parents: 2856
diff changeset
32 memset(key_seen, 0, sizeof(key_seen));
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
3694
12d00d9ceb6e cache_key was set wrong for sql/ldap passdbs, so auth_cache was completely
Timo Sirainen <tss@iki.fi>
parents: 3657
diff changeset
34 str = str_new(pool, 32);
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 for (; *query != '\0'; query++) {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 if (*query == '%' && query[1] != '\0') {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 query++;
2975
c59fd95ad3ee Auth cache key was built wrong if any modifiers were used for %vars.
Timo Sirainen <tss@iki.fi>
parents: 2971
diff changeset
38 key = var_get_key(query);
c59fd95ad3ee Auth cache key was built wrong if any modifiers were used for %vars.
Timo Sirainen <tss@iki.fi>
parents: 2971
diff changeset
39 if (key != '\0' && key != '%' && !key_seen[key]) {
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 if (str_len(str) != 0)
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 str_append_c(str, '\t');
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 str_append_c(str, '%');
2975
c59fd95ad3ee Auth cache key was built wrong if any modifiers were used for %vars.
Timo Sirainen <tss@iki.fi>
parents: 2971
diff changeset
43 str_append_c(str, key);
2971
1f7bcbb09f90 When building cache key, use each %key only once, more wastes only memory.
Timo Sirainen <tss@iki.fi>
parents: 2856
diff changeset
44
1f7bcbb09f90 When building cache key, use each %key only once, more wastes only memory.
Timo Sirainen <tss@iki.fi>
parents: 2856
diff changeset
45 /* @UNSAFE */
2975
c59fd95ad3ee Auth cache key was built wrong if any modifiers were used for %vars.
Timo Sirainen <tss@iki.fi>
parents: 2971
diff changeset
46 key_seen[key] = 1;
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 }
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
50 return str_free_without_data(&str);
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 static void
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
54 auth_cache_node_unlink(struct auth_cache *cache, struct auth_cache_node *node)
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 if (node->prev != NULL)
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 node->prev->next = node->next;
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 else {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 /* unlinking tail */
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 cache->tail = node->next;
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 if (node->next != NULL)
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 node->next->prev = node->prev;
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 else {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 /* unlinking head */
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 cache->head = node->prev;
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 static void
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
72 auth_cache_node_link_head(struct auth_cache *cache,
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
73 struct auth_cache_node *node)
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 node->prev = cache->head;
2851
Timo Sirainen <tss@iki.fi>
parents: 2840
diff changeset
76 node->next = NULL;
Timo Sirainen <tss@iki.fi>
parents: 2840
diff changeset
77
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 cache->head = node;
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 if (node->prev != NULL)
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 node->prev->next = node;
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 else
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 cache->tail = node;
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 static void
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
86 auth_cache_node_destroy(struct auth_cache *cache, struct auth_cache_node *node)
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 auth_cache_node_unlink(cache, node);
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 cache->size_left += node->alloc_size;
8573
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
91 hash_table_remove(cache->hash, node->data);
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 i_free(node);
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94
8882
9f3968f49ceb lib-signals: Changed callback API to return siginfo_t.
Timo Sirainen <tss@iki.fi>
parents: 8670
diff changeset
95 static void sig_auth_cache_clear(const siginfo_t *si ATTR_UNUSED, void *context)
3620
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
96 {
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
97 struct auth_cache *cache = context;
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
98
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
99 i_info("SIGHUP received, clearing cache");
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
100 auth_cache_clear(cache);
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
101 }
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
102
8882
9f3968f49ceb lib-signals: Changed callback API to return siginfo_t.
Timo Sirainen <tss@iki.fi>
parents: 8670
diff changeset
103 static void sig_auth_cache_stats(const siginfo_t *si ATTR_UNUSED, void *context)
3620
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
104 {
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
105 struct auth_cache *cache = context;
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
106 unsigned int total_count;
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
107
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
108 total_count = cache->hit_count + cache->miss_count;
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
109 i_info("Authentication cache hits %u/%u (%u%%)",
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
110 cache->hit_count, total_count,
3644
6a94b8412638 Don't crash with SIGUSR2 if auth cache hasn't seen any hits
Timo Sirainen <tss@iki.fi>
parents: 3620
diff changeset
111 total_count == 0 ? 100 : (cache->hit_count * 100 / total_count));
3620
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
112
8670
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
113 i_info("Authentication cache inserts: "
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
114 "positive: %u %lluB, negative: %u %lluB",
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
115 cache->pos_entries, cache->pos_size,
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
116 cache->neg_entries, cache->neg_size);
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
117
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
118 /* reset counters */
3620
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
119 cache->hit_count = cache->miss_count = 0;
8670
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
120 cache->pos_entries = cache->neg_entries = 0;
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
121 cache->pos_size = cache->neg_size = 0;
3620
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
122 }
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
123
6174
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
124 struct auth_cache *auth_cache_new(size_t max_size, unsigned int ttl_secs,
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
125 unsigned int neg_ttl_secs
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
126 )
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 struct auth_cache *cache;
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 cache = i_new(struct auth_cache, 1);
8573
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
131 cache->hash = hash_table_create(default_pool, default_pool, 0, str_hash,
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
132 (hash_cmp_callback_t *)strcmp);
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 cache->size_left = max_size;
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 cache->ttl_secs = ttl_secs;
6174
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
135 cache->neg_ttl_secs = neg_ttl_secs;
3620
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
136
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
137 lib_signals_set_handler(SIGHUP, TRUE, sig_auth_cache_clear, cache);
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
138 lib_signals_set_handler(SIGUSR2, TRUE, sig_auth_cache_stats, cache);
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 return cache;
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
142 void auth_cache_free(struct auth_cache **_cache)
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
144 struct auth_cache *cache = *_cache;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
145
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
146 *_cache = NULL;
3620
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
147 lib_signals_unset_handler(SIGHUP, sig_auth_cache_clear, cache);
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
148 lib_signals_unset_handler(SIGUSR2, sig_auth_cache_stats, cache);
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
149
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3415
diff changeset
150 auth_cache_clear(cache);
8573
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
151 hash_table_destroy(&cache->hash);
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 i_free(cache);
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 void auth_cache_clear(struct auth_cache *cache)
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 while (cache->tail != NULL)
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 auth_cache_node_destroy(cache, cache->tail);
8573
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
159 hash_table_clear(cache->hash, FALSE);
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
162 const char *
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
163 auth_cache_lookup(struct auth_cache *cache, const struct auth_request *request,
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
164 const char *key, struct auth_cache_node **node_r,
9110
8a23ab43132a auth_cache_negative_ttl is now also used for password mismatches.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
165 bool *expired_r, bool *neg_expired_r)
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 string_t *str;
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
168 struct auth_cache_node *node;
6174
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
169 const char *value;
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
170 unsigned int ttl_secs;
9110
8a23ab43132a auth_cache_negative_ttl is now also used for password mismatches.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
171 time_t now;
2855
0e0682b3167b SIGHUP now clears cache.
Timo Sirainen <tss@iki.fi>
parents: 2851
diff changeset
172
3167
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
173 *expired_r = FALSE;
9110
8a23ab43132a auth_cache_negative_ttl is now also used for password mismatches.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
174 *neg_expired_r = FALSE;
3167
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
175
4686
ba802ac3b743 auth cache didn't work properly with multiple passdbs.
Timo Sirainen <tss@iki.fi>
parents: 4658
diff changeset
176 /* %! is prepended automatically. it contains the passdb ID number. */
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 str = t_str_new(256);
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4779
diff changeset
178 var_expand(str, t_strconcat(request->userdb_lookup ? "U" : "P",
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4779
diff changeset
179 "%!/", key, NULL),
8597
9f885dbd8157 auth: Removed extra string escaping from places where it's not necessary (or is even harmful).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
180 auth_request_get_var_expand_table(request, NULL));
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181
8573
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
182 node = hash_table_lookup(cache->hash, str_c(str));
3415
4e36a99268dd Count cache hits and misses, report them on SIGUSR2.
Timo Sirainen <tss@iki.fi>
parents: 3172
diff changeset
183 if (node == NULL) {
4e36a99268dd Count cache hits and misses, report them on SIGUSR2.
Timo Sirainen <tss@iki.fi>
parents: 3172
diff changeset
184 cache->miss_count++;
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 return NULL;
3415
4e36a99268dd Count cache hits and misses, report them on SIGUSR2.
Timo Sirainen <tss@iki.fi>
parents: 3172
diff changeset
186 }
4e36a99268dd Count cache hits and misses, report them on SIGUSR2.
Timo Sirainen <tss@iki.fi>
parents: 3172
diff changeset
187 cache->hit_count++;
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188
6174
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
189 value = node->data + strlen(node->data) + 1;
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
190 ttl_secs = *value == '\0' ? cache->neg_ttl_secs : cache->ttl_secs;
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
191
9110
8a23ab43132a auth_cache_negative_ttl is now also used for password mismatches.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
192 now = time(NULL);
8a23ab43132a auth_cache_negative_ttl is now also used for password mismatches.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
193 if (node->created < now - (time_t)ttl_secs) {
3167
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
194 /* TTL expired */
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
195 *expired_r = TRUE;
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
196 } else {
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
197 /* move to head */
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
198 if (node != cache->head) {
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
199 auth_cache_node_unlink(cache, node);
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
200 auth_cache_node_link_head(cache, node);
97f53e0cce63 Fallback to using expired records from auth cache if database lookups fail.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
201 }
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 }
9110
8a23ab43132a auth_cache_negative_ttl is now also used for password mismatches.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
203 if (node->created < now - (time_t)cache->neg_ttl_secs)
8a23ab43132a auth_cache_negative_ttl is now also used for password mismatches.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
204 *neg_expired_r = TRUE;
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
206 if (node_r != NULL)
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
207 *node_r = node;
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
208
6174
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
209 return value;
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 }
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211
5131
172fb23d3c8f If user is changed with "user=x" in extra_fields, cache the entry with the
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
212 void auth_cache_insert(struct auth_cache *cache, struct auth_request *request,
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
213 const char *key, const char *value, bool last_success)
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 {
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 string_t *str;
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
216 struct auth_cache_node *node;
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 size_t data_size, alloc_size, value_len = strlen(value);
5131
172fb23d3c8f If user is changed with "user=x" in extra_fields, cache the entry with the
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
218 char *current_username;
172fb23d3c8f If user is changed with "user=x" in extra_fields, cache the entry with the
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
219
6174
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
220 if (*value == '\0' && cache->neg_ttl_secs == 0) {
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
221 /* we're not caching negative entries */
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
222 return;
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
223 }
6c48466c23fa Added auth_cache_negative_ttl setting.
Timo Sirainen <tss@iki.fi>
parents: 5131
diff changeset
224
6658
d22888a77a1e Auth cache didn't work for usernames that got translated internally.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
225 /* store into cache using the translated username, except if we're doing
5131
172fb23d3c8f If user is changed with "user=x" in extra_fields, cache the entry with the
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
226 a master user login */
172fb23d3c8f If user is changed with "user=x" in extra_fields, cache the entry with the
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
227 current_username = request->user;
6658
d22888a77a1e Auth cache didn't work for usernames that got translated internally.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
228 if (request->translated_username != NULL &&
5131
172fb23d3c8f If user is changed with "user=x" in extra_fields, cache the entry with the
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
229 request->requested_login_user == NULL)
6658
d22888a77a1e Auth cache didn't work for usernames that got translated internally.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
230 request->user = t_strdup_noconst(request->translated_username);
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4779
diff changeset
232 /* %! is prepended automatically. it contains the db ID number. */
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 str = t_str_new(256);
4955
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4779
diff changeset
234 var_expand(str, t_strconcat(request->userdb_lookup ? "U" : "P",
f0cc5486696e Authentication cache caches now also userdb data. Code by Tommi Saviranta.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4779
diff changeset
235 "%!/", key, NULL),
8597
9f885dbd8157 auth: Removed extra string escaping from places where it's not necessary (or is even harmful).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
236 auth_request_get_var_expand_table(request, NULL));
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237
5131
172fb23d3c8f If user is changed with "user=x" in extra_fields, cache the entry with the
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
238 request->user = current_username;
172fb23d3c8f If user is changed with "user=x" in extra_fields, cache the entry with the
Timo Sirainen <tss@iki.fi>
parents: 4955
diff changeset
239
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 data_size = str_len(str) + 1 + value_len + 1;
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
241 alloc_size = sizeof(struct auth_cache_node) -
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
242 sizeof(node->data) + data_size;
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 /* make sure we have enough space */
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 while (cache->size_left < alloc_size)
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 auth_cache_node_destroy(cache, cache->tail);
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247
8573
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
248 node = hash_table_lookup(cache->hash, str_c(str));
3172
b951764080cc auth_cache_insert(): Don't remove expired nodes just because they're
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
249 if (node != NULL) {
b951764080cc auth_cache_insert(): Don't remove expired nodes just because they're
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
250 /* key is already in cache (probably expired), remove it */
b951764080cc auth_cache_insert(): Don't remove expired nodes just because they're
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
251 auth_cache_node_destroy(cache, node);
b951764080cc auth_cache_insert(): Don't remove expired nodes just because they're
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
252 }
b951764080cc auth_cache_insert(): Don't remove expired nodes just because they're
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
253
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 /* @UNSAFE */
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 node = i_malloc(alloc_size);
3172
b951764080cc auth_cache_insert(): Don't remove expired nodes just because they're
Timo Sirainen <tss@iki.fi>
parents: 3167
diff changeset
256 node->created = time(NULL);
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 node->alloc_size = alloc_size;
4658
3b49b9ec87dc auth_cache: Try to handle changing passwords automatically: If password
Timo Sirainen <tss@iki.fi>
parents: 4295
diff changeset
258 node->last_success = last_success;
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 memcpy(node->data, str_data(str), str_len(str));
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 memcpy(node->data + str_len(str) + 1, value, value_len);
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 auth_cache_node_link_head(cache, node);
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 cache->size_left -= alloc_size;
8573
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
265 hash_table_insert(cache->hash, node->data, node);
8670
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
266
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
267 if (*value != '\0') {
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
268 cache->pos_entries++;
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
269 cache->pos_size += alloc_size;
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
270 } else {
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
271 cache->neg_entries++;
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
272 cache->neg_size += alloc_size;
85476be1fee2 Sending SIGUSR2 to dovecot-auth now also logs statistics about cache inserts.
Timo Sirainen <tss@iki.fi>
parents: 8597
diff changeset
273 }
2798
54b29901a793 Added simple LRU cache for auth requests. Currently only for sql passdb.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 }
4779
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
275
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
276 void auth_cache_remove(struct auth_cache *cache,
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
277 const struct auth_request *request,
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
278 const char *key)
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
279 {
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
280 string_t *str;
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
281 struct auth_cache_node *node;
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
282
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
283 str = t_str_new(256);
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
284 var_expand(str, key,
8597
9f885dbd8157 auth: Removed extra string escaping from places where it's not necessary (or is even harmful).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
285 auth_request_get_var_expand_table(request, NULL));
4779
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
286
8573
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
287 node = hash_table_lookup(cache->hash, str_c(str));
4779
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
288 if (node == NULL)
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
289 return;
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
290
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
291 auth_cache_node_destroy(cache, node);
fc291a997b03 Add auth_cache_remove() function which will be used by OTP code to evict
Timo Sirainen <tss@iki.fi>
parents: 4686
diff changeset
292 }