s3: Cache the username map in gencache
authorVolker Lendecke <vl@samba.org>
Fri, 9 Apr 2010 15:19:13 +0000 (17:19 +0200)
committerVolker Lendecke <vl@samba.org>
Tue, 13 Apr 2010 07:30:06 +0000 (09:30 +0200)
This is for uses with a heavy-weight username map script

docs-xml/smbdotconf/security/usernamemapcachetime.xml [new file with mode: 0644]
source3/include/proto.h
source3/param/loadparm.c
source3/smbd/map_username.c

diff --git a/docs-xml/smbdotconf/security/usernamemapcachetime.xml b/docs-xml/smbdotconf/security/usernamemapcachetime.xml
new file mode 100644 (file)
index 0000000..5461cb1
--- /dev/null
@@ -0,0 +1,18 @@
+<samba:parameter name="username map cache time"
+                 context="G"
+                 advanced="1" developer="0"
+                                type="integer"
+                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+<description>
+    <para>This option controls if and how long the result of the
+      <smbconfoption name="username map"/> and
+      <smbconfoption name="username map script"/> across smbds in gencache.
+      If set to non-zero, it denotes the number of seconds the output of
+      both mappings will be cached.</para>
+    <para>This option is mainly useful for heavy-weight
+      <smbconfoption name="username map script"/> scripts.</para>
+</description>
+
+<value type="default">0</value>
+<value type="example">60</value>
+</samba:parameter>
index f1cba8ffa24e9c579c9b4fec2fb407c7b3dfbd31..71962ae93c6b244e0dd8e7a4ea0ccb666ed89ffd 100644 (file)
@@ -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);
index 077fc6355f2a725c04f0db94744f98a3037031d3..350f3c077caceeb7d9f8d27fc5454f55f8f0e9ce 100644 (file)
@@ -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)
 
index 8c8eb2ed9d0e3544300c62f78d1bb2eb0ec0c6ec..dc5d48efaadd323adcd47991c92205cdb84657b9 100644 (file)
@@ -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;
 }