/src/samba/source3/libads/sitename_cache.c
Line | Count | Source |
1 | | /* |
2 | | Unix SMB/CIFS implementation. |
3 | | DNS utility library |
4 | | Copyright (C) Gerald (Jerry) Carter 2006. |
5 | | Copyright (C) Jeremy Allison 2007. |
6 | | |
7 | | This program is free software; you can redistribute it and/or modify |
8 | | it under the terms of the GNU General Public License as published by |
9 | | the Free Software Foundation; either version 3 of the License, or |
10 | | (at your option) any later version. |
11 | | |
12 | | This program is distributed in the hope that it will be useful, |
13 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | | GNU General Public License for more details. |
16 | | |
17 | | You should have received a copy of the GNU General Public License |
18 | | along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 | | */ |
20 | | |
21 | | #include "includes.h" |
22 | | #include "libads/sitename_cache.h" |
23 | | #include "lib/gencache.h" |
24 | | |
25 | | /**************************************************************************** |
26 | | Store and fetch the AD client sitename. |
27 | | ****************************************************************************/ |
28 | | |
29 | 0 | #define SITENAME_KEY "AD_SITENAME/DOMAIN/%s" |
30 | | |
31 | | static char *sitename_key(TALLOC_CTX *mem_ctx, const char *realm) |
32 | 0 | { |
33 | 0 | char *keystr = talloc_asprintf_strupper_m( |
34 | 0 | mem_ctx, SITENAME_KEY, realm); |
35 | 0 | return keystr; |
36 | 0 | } |
37 | | |
38 | | |
39 | | /**************************************************************************** |
40 | | Store the AD client sitename. |
41 | | We store indefinitely as every new CLDAP query will re-write this. |
42 | | ****************************************************************************/ |
43 | | |
44 | | bool sitename_store(const char *realm, const char *sitename) |
45 | 0 | { |
46 | 0 | time_t expire; |
47 | 0 | bool ret = False; |
48 | 0 | char *key; |
49 | |
|
50 | 0 | if (!realm || (strlen(realm) == 0)) { |
51 | 0 | DEBUG(0,("sitename_store: no realm\n")); |
52 | 0 | return False; |
53 | 0 | } |
54 | | |
55 | 0 | key = sitename_key(talloc_tos(), realm); |
56 | |
|
57 | 0 | if (!sitename || (sitename && !*sitename)) { |
58 | 0 | DEBUG(5,("sitename_store: deleting empty sitename!\n")); |
59 | 0 | ret = gencache_del(key); |
60 | 0 | TALLOC_FREE(key); |
61 | 0 | return ret; |
62 | 0 | } |
63 | | |
64 | 0 | expire = get_time_t_max(); /* Store indefinitely. */ |
65 | |
|
66 | 0 | DEBUG(10,("sitename_store: realm = [%s], sitename = [%s], expire = [%jd]\n", |
67 | 0 | realm, sitename, (intmax_t)expire )); |
68 | |
|
69 | 0 | ret = gencache_set( key, sitename, expire ); |
70 | 0 | TALLOC_FREE(key); |
71 | 0 | return ret; |
72 | 0 | } |
73 | | |
74 | | /**************************************************************************** |
75 | | Fetch the AD client sitename. |
76 | | Caller must free. |
77 | | ****************************************************************************/ |
78 | | |
79 | | char *sitename_fetch(TALLOC_CTX *mem_ctx, const char *realm) |
80 | 0 | { |
81 | 0 | char *sitename = NULL; |
82 | 0 | time_t timeout; |
83 | 0 | bool ret = False; |
84 | 0 | const char *query_realm; |
85 | 0 | char *key; |
86 | |
|
87 | 0 | if (!realm || (strlen(realm) == 0)) { |
88 | 0 | query_realm = lp_realm(); |
89 | 0 | } else { |
90 | 0 | query_realm = realm; |
91 | 0 | } |
92 | |
|
93 | 0 | key = sitename_key(talloc_tos(), query_realm); |
94 | |
|
95 | 0 | ret = gencache_get( key, mem_ctx, &sitename, &timeout ); |
96 | 0 | TALLOC_FREE(key); |
97 | 0 | if ( !ret ) { |
98 | 0 | DBG_INFO("No stored sitename for realm '%s'\n", query_realm); |
99 | 0 | } else { |
100 | 0 | DBG_INFO("Returning sitename for realm '%s': \"%s\"\n", |
101 | 0 | query_realm, sitename); |
102 | 0 | } |
103 | 0 | return sitename; |
104 | 0 | } |
105 | | |
106 | | /**************************************************************************** |
107 | | Did the sitename change ? |
108 | | ****************************************************************************/ |
109 | | |
110 | | bool stored_sitename_changed(const char *realm, const char *sitename) |
111 | 0 | { |
112 | 0 | bool ret = False; |
113 | |
|
114 | 0 | char *new_sitename; |
115 | |
|
116 | 0 | if (!realm || (strlen(realm) == 0)) { |
117 | 0 | DEBUG(0,("stored_sitename_changed: no realm\n")); |
118 | 0 | return False; |
119 | 0 | } |
120 | | |
121 | 0 | new_sitename = sitename_fetch(talloc_tos(), realm); |
122 | |
|
123 | 0 | if (sitename && new_sitename && !strequal(sitename, new_sitename)) { |
124 | 0 | ret = True; |
125 | 0 | } else if ((sitename && !new_sitename) || |
126 | 0 | (!sitename && new_sitename)) { |
127 | 0 | ret = True; |
128 | 0 | } |
129 | | TALLOC_FREE(new_sitename); |
130 | 0 | return ret; |
131 | 0 | } |
132 | | |