Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 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 | 76 node->next = NULL; |
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 | 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 } |