From 5fc2801c09cdfe74253b52b9bf93d7ecad1a98cf Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 9 Apr 2010 17:19:13 +0200 Subject: s3: Cache the username map in gencache This is for uses with a heavy-weight username map script --- source3/include/proto.h | 1 + source3/param/loadparm.c | 11 ++++++++++ source3/smbd/map_username.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) (limited to 'source3') diff --git a/source3/include/proto.h b/source3/include/proto.h index f1cba8ffa2..71962ae93c 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -3998,6 +3998,7 @@ char *lp_addmachine_script(void); char *lp_shutdown_script(void); char *lp_abort_shutdown_script(void); char *lp_username_map_script(void); +int lp_username_map_cache_time(void); char *lp_check_password_script(void); char *lp_wins_hook(void); const char *lp_template_homedir(void); diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 077fc6355f..350f3c077c 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -181,6 +181,7 @@ struct global { char *szShutdownScript; char *szAbortShutdownScript; char *szUsernameMapScript; + int iUsernameMapCacheTime; char *szCheckPasswordScript; char *szWINSHook; char *szUtmpDir; @@ -3290,6 +3291,15 @@ static struct parm_struct parm_table[] = { .enum_list = NULL, .flags = FLAG_ADVANCED, }, + { + .label = "username map cache time", + .type = P_INTEGER, + .p_class = P_GLOBAL, + .ptr = &Globals.iUsernameMapCacheTime, + .special = NULL, + .enum_list = NULL, + .flags = FLAG_ADVANCED, + }, { .label = "logon script", .type = P_STRING, @@ -5494,6 +5504,7 @@ FN_GLOBAL_STRING(lp_addmachine_script, &Globals.szAddMachineScript) FN_GLOBAL_STRING(lp_shutdown_script, &Globals.szShutdownScript) FN_GLOBAL_STRING(lp_abort_shutdown_script, &Globals.szAbortShutdownScript) FN_GLOBAL_STRING(lp_username_map_script, &Globals.szUsernameMapScript) +FN_GLOBAL_INTEGER(lp_username_map_cache_time, &Globals.iUsernameMapCacheTime) FN_GLOBAL_STRING(lp_check_password_script, &Globals.szCheckPasswordScript) diff --git a/source3/smbd/map_username.c b/source3/smbd/map_username.c index 8c8eb2ed9d..dc5d48efaa 100644 --- a/source3/smbd/map_username.c +++ b/source3/smbd/map_username.c @@ -76,6 +76,48 @@ static char *skip_space(char *s) return s; } +static bool fetch_map_from_gencache(fstring user) +{ + char *key, *value; + bool found; + + if (lp_username_map_cache_time() == 0) { + return false; + } + + key = talloc_asprintf_strupper_m(talloc_tos(), "USERNAME_MAP/%s", + user); + if (key == NULL) { + return false; + } + found = gencache_get(key, &value, NULL); + TALLOC_FREE(key); + if (!found) { + return false; + } + fstrcpy(user, value); + SAFE_FREE(value); + return true; +} + +static void store_map_in_gencache(const char *from, const char *to) +{ + char *key; + int cache_time = lp_username_map_cache_time(); + + if (cache_time == 0) { + return; + } + + key = talloc_asprintf_strupper_m(talloc_tos(), "USERNAME_MAP/%s", + from); + if (key == NULL) { + return; + } + gencache_set(key, to, cache_time + time(NULL)); + TALLOC_FREE(key); +} + bool map_username(struct smbd_server_connection *sconn, fstring user) { XFILE *f; @@ -97,6 +139,10 @@ bool map_username(struct smbd_server_connection *sconn, fstring user) return true; } + if (fetch_map_from_gencache(user)) { + return true; + } + /* first try the username map script */ if ( *cmd ) { @@ -134,6 +180,7 @@ bool map_username(struct smbd_server_connection *sconn, fstring user) if (numlines && qlines) { DEBUG(3,("Mapped user %s to %s\n", user, qlines[0] )); set_last_from_to(user, qlines[0]); + store_map_in_gencache(user, qlines[0]); fstrcpy( user, qlines[0] ); } @@ -197,6 +244,7 @@ bool map_username(struct smbd_server_connection *sconn, fstring user) mapped_user = True; set_last_from_to(user, unixname); + store_map_in_gencache(user, unixname); fstrcpy( user, unixname ); if ( return_if_mapped ) { @@ -217,6 +265,7 @@ bool map_username(struct smbd_server_connection *sconn, fstring user) */ set_last_from_to(user, user); + store_map_in_gencache(user, user); return mapped_user; } -- cgit