Line data Source code
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 : #define SITENAME_KEY "AD_SITENAME/DOMAIN/%s"
30 :
31 2273 : static char *sitename_key(TALLOC_CTX *mem_ctx, const char *realm)
32 : {
33 2273 : char *keystr = talloc_asprintf_strupper_m(
34 : mem_ctx, SITENAME_KEY, realm);
35 2273 : return keystr;
36 : }
37 :
38 :
39 : /****************************************************************************
40 : Store the AD client sitename.
41 : We store indefinately as every new CLDAP query will re-write this.
42 : ****************************************************************************/
43 :
44 358 : bool sitename_store(const char *realm, const char *sitename)
45 : {
46 : time_t expire;
47 358 : bool ret = False;
48 : char *key;
49 :
50 358 : if (!realm || (strlen(realm) == 0)) {
51 0 : DEBUG(0,("sitename_store: no realm\n"));
52 0 : return False;
53 : }
54 :
55 358 : key = sitename_key(talloc_tos(), realm);
56 :
57 358 : 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 : }
63 :
64 358 : expire = get_time_t_max(); /* Store indefinately. */
65 :
66 358 : DEBUG(10,("sitename_store: realm = [%s], sitename = [%s], expire = [%u]\n",
67 : realm, sitename, (unsigned int)expire ));
68 :
69 358 : ret = gencache_set( key, sitename, expire );
70 358 : TALLOC_FREE(key);
71 358 : return ret;
72 : }
73 :
74 : /****************************************************************************
75 : Fetch the AD client sitename.
76 : Caller must free.
77 : ****************************************************************************/
78 :
79 1915 : char *sitename_fetch(TALLOC_CTX *mem_ctx, const char *realm)
80 : {
81 1915 : char *sitename = NULL;
82 : time_t timeout;
83 1915 : bool ret = False;
84 : const char *query_realm;
85 : char *key;
86 :
87 1915 : if (!realm || (strlen(realm) == 0)) {
88 14 : query_realm = lp_realm();
89 : } else {
90 1901 : query_realm = realm;
91 : }
92 :
93 1915 : key = sitename_key(talloc_tos(), query_realm);
94 :
95 1915 : ret = gencache_get( key, mem_ctx, &sitename, &timeout );
96 1915 : TALLOC_FREE(key);
97 1915 : if ( !ret ) {
98 1150 : DBG_INFO("No stored sitename for realm '%s'\n", query_realm);
99 : } else {
100 765 : DBG_INFO("Returning sitename for realm '%s': \"%s\"\n",
101 : query_realm, sitename);
102 : }
103 1915 : return sitename;
104 : }
105 :
106 : /****************************************************************************
107 : Did the sitename change ?
108 : ****************************************************************************/
109 :
110 29 : bool stored_sitename_changed(const char *realm, const char *sitename)
111 : {
112 29 : bool ret = False;
113 :
114 : char *new_sitename;
115 :
116 29 : if (!realm || (strlen(realm) == 0)) {
117 0 : DEBUG(0,("stored_sitename_changed: no realm\n"));
118 0 : return False;
119 : }
120 :
121 29 : new_sitename = sitename_fetch(talloc_tos(), realm);
122 :
123 29 : if (sitename && new_sitename && !strequal(sitename, new_sitename)) {
124 0 : ret = True;
125 29 : } else if ((sitename && !new_sitename) ||
126 3 : (!sitename && new_sitename)) {
127 3 : ret = True;
128 : }
129 29 : TALLOC_FREE(new_sitename);
130 29 : return ret;
131 : }
132 :
|