2010-02-23 19:11:37 +03:00
/*
Unix SMB / CIFS implementation .
DNS utility library
Copyright ( C ) Gerald ( Jerry ) Carter 2006.
Copyright ( C ) Jeremy Allison 2007.
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
# include "libads/sitename_cache.h"
/****************************************************************************
Store and fetch the AD client sitename .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define SITENAME_KEY "AD_SITENAME / DOMAIN / %s"
static char * sitename_key ( const char * realm )
{
char * keystr ;
if ( asprintf_strupper_m ( & keystr , SITENAME_KEY , realm ) = = - 1 ) {
return NULL ;
}
return keystr ;
}
/****************************************************************************
Store the AD client sitename .
We store indefinately as every new CLDAP query will re - write this .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
bool sitename_store ( const char * realm , const char * sitename )
{
time_t expire ;
bool ret = False ;
char * key ;
if ( ! realm | | ( strlen ( realm ) = = 0 ) ) {
DEBUG ( 0 , ( " sitename_store: no realm \n " ) ) ;
return False ;
}
key = sitename_key ( realm ) ;
if ( ! sitename | | ( sitename & & ! * sitename ) ) {
DEBUG ( 5 , ( " sitename_store: deleting empty sitename! \n " ) ) ;
ret = gencache_del ( key ) ;
SAFE_FREE ( key ) ;
return ret ;
}
expire = get_time_t_max ( ) ; /* Store indefinately. */
DEBUG ( 10 , ( " sitename_store: realm = [%s], sitename = [%s], expire = [%u] \n " ,
realm , sitename , ( unsigned int ) expire ) ) ;
ret = gencache_set ( key , sitename , expire ) ;
SAFE_FREE ( key ) ;
return ret ;
}
/****************************************************************************
Fetch the AD client sitename .
Caller must free .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-09-05 00:58:18 +04:00
char * sitename_fetch ( TALLOC_CTX * mem_ctx , const char * realm )
2010-02-23 19:11:37 +03:00
{
char * sitename = NULL ;
time_t timeout ;
bool ret = False ;
const char * query_realm ;
char * key ;
if ( ! realm | | ( strlen ( realm ) = = 0 ) ) {
query_realm = lp_realm ( ) ;
} else {
query_realm = realm ;
}
key = sitename_key ( query_realm ) ;
2013-09-05 00:58:18 +04:00
ret = gencache_get ( key , mem_ctx , & sitename , & timeout ) ;
2010-02-23 19:11:37 +03:00
SAFE_FREE ( key ) ;
if ( ! ret ) {
2016-07-12 11:23:24 +03:00
DBG_INFO ( " No stored sitename for realm '%s' \n " , query_realm ) ;
2010-02-23 19:11:37 +03:00
} else {
2016-07-12 11:23:24 +03:00
DBG_INFO ( " Returning sitename for realm '%s': \" %s \" \n " ,
query_realm , sitename ) ;
2010-02-23 19:11:37 +03:00
}
return sitename ;
}
/****************************************************************************
Did the sitename change ?
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
bool stored_sitename_changed ( const char * realm , const char * sitename )
{
bool ret = False ;
char * new_sitename ;
if ( ! realm | | ( strlen ( realm ) = = 0 ) ) {
DEBUG ( 0 , ( " stored_sitename_changed: no realm \n " ) ) ;
return False ;
}
2013-09-05 00:58:18 +04:00
new_sitename = sitename_fetch ( talloc_tos ( ) , realm ) ;
2010-02-23 19:11:37 +03:00
if ( sitename & & new_sitename & & ! strequal ( sitename , new_sitename ) ) {
ret = True ;
} else if ( ( sitename & & ! new_sitename ) | |
( ! sitename & & new_sitename ) ) {
ret = True ;
}
2013-09-05 00:58:18 +04:00
TALLOC_FREE ( new_sitename ) ;
2010-02-23 19:11:37 +03:00
return ret ;
}