The branch, master has been updated
       via  15f64af... s3-rpc: Create a file with all functions for a internal 
named pipe.
       via  3344adc... s3-rpc: Seperate rpc_srv_register for plain connection.
       via  9097bdd... s3-auth: Moved smbd user functions to a generic place.
       via  fad86dd... s3-smbd: Remove unneeded dependency of map_username to 
globals.c.
      from  09daf63... s3-selftest: do not call main RPC-SPOOLSS testsuite.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 15f64af8e3d5aa889a9c9fb852a3357237ba9972
Author: Andreas Schneider <a...@samba.org>
Date:   Thu Jun 3 22:04:08 2010 +0200

    s3-rpc: Create a file with all functions for a internal named pipe.
    
    This makes it possible to use the samr rpc server in winbind without
    linking in smbd.
    
    Reviewed-by: Simo Sorce <i...@samba.org>

commit 3344adc3404df47f02f6eb3096cb623ae94850b8
Author: Andreas Schneider <a...@samba.org>
Date:   Thu Jun 3 22:01:46 2010 +0200

    s3-rpc: Seperate rpc_srv_register for plain connection.
    
    This will make it possible to create plain rpc named pipe connnections.
    
    Reviewed-by: Simo Sorce <i...@samba.org>

commit 9097bdddd03f81579699e0d0ce725a7453a3a158
Author: Andreas Schneider <a...@samba.org>
Date:   Wed Jun 2 19:39:18 2010 +0200

    s3-auth: Moved smbd user functions to a generic place.
    
    Reviewed-by: Simo Sorce <i...@samba.org>

commit fad86ddf5531c8f5862b697e99c24a7bd526d73e
Author: Andreas Schneider <a...@samba.org>
Date:   Mon May 31 18:33:38 2010 +0200

    s3-smbd: Remove unneeded dependency of map_username to globals.c.
    
    Reviewed-by: Simo Sorce <i...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/Makefile.in                        |   10 +-
 source3/auth/user_util.c                   |  406 ++++++++++++++++++++++++++++
 source3/include/proto.h                    |    4 +
 source3/rpc_server/rpc_ncacn_np_internal.c |  242 +++++++++++++++++
 source3/rpc_server/srv_pipe.c              |  157 +++---------
 source3/rpc_server/srv_pipe_hnd.c          |  203 --------------
 source3/rpc_server/srv_pipe_internal.h     |   42 +++
 source3/rpc_server/srv_pipe_register.c     |  200 ++++++++++++++
 source3/smbd/globals.c                     |    3 -
 source3/smbd/globals.h                     |    3 -
 source3/smbd/map_username.c                |  271 -------------------
 source3/smbd/password.c                    |  133 ---------
 source3/wscript_build                      |    9 +-
 13 files changed, 939 insertions(+), 744 deletions(-)
 create mode 100644 source3/auth/user_util.c
 create mode 100644 source3/rpc_server/rpc_ncacn_np_internal.c
 create mode 100644 source3/rpc_server/srv_pipe_internal.h
 create mode 100644 source3/rpc_server/srv_pipe_register.c
 delete mode 100644 source3/smbd/map_username.c


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index 82407e5..d9e4ec5 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -653,8 +653,11 @@ RPC_EVENTLOG_OBJ = rpc_server/srv_eventlog_nt.o \
 
 NPA_TSTREAM_OBJ = ../libcli/named_pipe_auth/npa_tstream.o
 
-RPC_PIPE_OBJ = rpc_server/srv_pipe_hnd.o \
-               rpc_server/srv_pipe.o rpc_server/srv_lsa_hnd.o
+RPC_NCACN_NP_INTERNAL = rpc_server/srv_pipe_register.o 
rpc_server/rpc_ncacn_np_internal.o \
+                       rpc_server/srv_lsa_hnd.o
+
+RPC_PIPE_OBJ = rpc_server/srv_pipe.o rpc_server/srv_pipe_hnd.o \
+              $(RPC_NCACN_NP_INTERNAL)
 
 RPC_ECHO_OBJ = rpc_server/srv_echo_nt.o librpc/gen_ndr/srv_echo.o
 
@@ -772,6 +775,7 @@ AUTH_OBJ = auth/auth.o @AUTH_STATIC@ auth/auth_util.o 
auth/token_util.o \
           auth/server_info.o \
           auth/server_info_sam.o \
           auth/user_info.o \
+          auth/user_util.o \
           auth/auth_compat.o auth/auth_ntlmssp.o \
           $(PLAINTEXT_AUTH_OBJ) $(SLCACHE_OBJ) $(DCUTIL_OBJ)
 
@@ -783,7 +787,7 @@ BUILDOPT_OBJ = smbd/build_options.o
 
 SMBD_OBJ_SRV = smbd/server_reload.o \
               smbd/files.o smbd/connection.o \
-              smbd/utmp.o smbd/session.o smbd/map_username.o \
+              smbd/utmp.o smbd/session.o \
                smbd/dfree.o smbd/dir.o smbd/password.o smbd/conn.o \
               smbd/share_access.o smbd/fileio.o \
                smbd/ipc.o smbd/lanman.o smbd/negprot.o \
diff --git a/source3/auth/user_util.c b/source3/auth/user_util.c
new file mode 100644
index 0000000..3d7123c
--- /dev/null
+++ b/source3/auth/user_util.c
@@ -0,0 +1,406 @@
+/*
+   Unix SMB/CIFS implementation.
+   Username handling
+   Copyright (C) Andrew Tridgell 1992-1998
+   Copyright (C) Jeremy Allison 1997-2001.
+   Copyright (C) Volker Lendecke 2006
+
+   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"
+
+/*******************************************************************
+ Map a username from a dos name to a unix name by looking in the username
+ map. Note that this modifies the name in place.
+ This is the main function that should be called *once* on
+ any incoming or new username - in order to canonicalize the name.
+ This is being done to de-couple the case conversions from the user mapping
+ function. Previously, the map_username was being called
+ every time Get_Pwnam_alloc was called.
+ Returns True if username was changed, false otherwise.
+********************************************************************/
+
+static char *last_from = NULL;
+static char *last_to = NULL;
+
+static const char *get_last_from(void)
+{
+       if (!last_from) {
+               return "";
+       }
+       return last_from;
+}
+
+static const char *get_last_to(void)
+{
+       if (!last_to) {
+               return "";
+       }
+       return last_to;
+}
+
+static bool set_last_from_to(const char *from, const char *to)
+{
+       char *orig_from = last_from;
+       char *orig_to = last_to;
+
+       last_from = SMB_STRDUP(from);
+       last_to = SMB_STRDUP(to);
+
+       SAFE_FREE(orig_from);
+       SAFE_FREE(orig_to);
+
+       if (!last_from || !last_to) {
+               SAFE_FREE(last_from);
+               SAFE_FREE(last_to);
+               return false;
+       }
+       return true;
+}
+
+static char *skip_space(char *s)
+{
+       while (isspace((int)(*s))) {
+               s += 1;
+       }
+       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);
+}
+
+/****************************************************************************
+ Check if a user is in a netgroup user list. If at first we don't succeed,
+ try lower case.
+****************************************************************************/
+
+bool user_in_netgroup(const char *user, const char *ngname)
+{
+#ifdef HAVE_NETGROUP
+       static char *my_yp_domain = NULL;
+       fstring lowercase_user;
+
+       if (my_yp_domain == NULL) {
+               yp_get_default_domain(&my_yp_domain);
+       }
+
+       if (my_yp_domain == NULL) {
+               DEBUG(5,("Unable to get default yp domain, "
+                       "let's try without specifying it\n"));
+       }
+
+       DEBUG(5,("looking for user %s of domain %s in netgroup %s\n",
+               user, my_yp_domain?my_yp_domain:"(ANY)", ngname));
+
+       if (innetgr(ngname, NULL, user, my_yp_domain)) {
+               DEBUG(5,("user_in_netgroup: Found\n"));
+               return true;
+       }
+
+       /*
+        * Ok, innetgr is case sensitive. Try once more with lowercase
+        * just in case. Attempt to fix #703. JRA.
+        */
+       fstrcpy(lowercase_user, user);
+       strlower_m(lowercase_user);
+
+       if (strcmp(user,lowercase_user) == 0) {
+               /* user name was already lower case! */
+               return false;
+       }
+
+       DEBUG(5,("looking for user %s of domain %s in netgroup %s\n",
+               lowercase_user, my_yp_domain?my_yp_domain:"(ANY)", ngname));
+
+       if (innetgr(ngname, NULL, lowercase_user, my_yp_domain)) {
+               DEBUG(5,("user_in_netgroup: Found\n"));
+               return true;
+       }
+#endif /* HAVE_NETGROUP */
+       return false;
+}
+
+/****************************************************************************
+ Check if a user is in a user list - can check combinations of UNIX
+ and netgroup lists.
+****************************************************************************/
+
+bool user_in_list(const char *user,const char **list)
+{
+       if (!list || !*list)
+               return False;
+
+       DEBUG(10,("user_in_list: checking user %s in list\n", user));
+
+       while (*list) {
+
+               DEBUG(10,("user_in_list: checking user |%s| against |%s|\n",
+                         user, *list));
+
+               /*
+                * Check raw username.
+                */
+               if (strequal(user, *list))
+                       return(True);
+
+               /*
+                * Now check to see if any combination
+                * of UNIX and netgroups has been specified.
+                */
+
+               if(**list == '@') {
+                       /*
+                        * Old behaviour. Check netgroup list
+                        * followed by UNIX list.
+                        */
+                       if(user_in_netgroup(user, *list +1))
+                               return True;
+                       if(user_in_group(user, *list +1))
+                               return True;
+               } else if (**list == '+') {
+
+                       if((*(*list +1)) == '&') {
+                               /*
+                                * Search UNIX list followed by netgroup.
+                                */
+                               if(user_in_group(user, *list +2))
+                                       return True;
+                               if(user_in_netgroup(user, *list +2))
+                                       return True;
+
+                       } else {
+
+                               /*
+                                * Just search UNIX list.
+                                */
+
+                               if(user_in_group(user, *list +1))
+                                       return True;
+                       }
+
+               } else if (**list == '&') {
+
+                       if(*(*list +1) == '+') {
+                               /*
+                                * Search netgroup list followed by UNIX list.
+                                */
+                               if(user_in_netgroup(user, *list +2))
+                                       return True;
+                               if(user_in_group(user, *list +2))
+                                       return True;
+                       } else {
+                               /*
+                                * Just search netgroup list.
+                                */
+                               if(user_in_netgroup(user, *list +1))
+                                       return True;
+                       }
+               }
+
+               list++;
+       }
+       return(False);
+}
+
+bool map_username(fstring user)
+{
+       XFILE *f;
+       char *mapfile = lp_username_map();
+       char *s;
+       char buf[512];
+       bool mapped_user = False;
+       char *cmd = lp_username_map_script();
+
+       if (!*user)
+               return false;
+
+       if (strequal(user,get_last_to()))
+               return false;
+
+       if (strequal(user,get_last_from())) {
+               DEBUG(3,("Mapped user %s to %s\n",user,get_last_to()));
+               fstrcpy(user,get_last_to());
+               return true;
+       }
+
+       if (fetch_map_from_gencache(user)) {
+               return true;
+       }
+
+       /* first try the username map script */
+
+       if ( *cmd ) {
+               char **qlines;
+               char *command = NULL;
+               int numlines, ret, fd;
+
+               command = talloc_asprintf(talloc_tos(),
+                                       "%s \"%s\"",
+                                       cmd,
+                                       user);
+               if (!command) {
+                       return false;
+               }
+
+               DEBUG(10,("Running [%s]\n", command));
+               ret = smbrun(command, &fd);
+               DEBUGADD(10,("returned [%d]\n", ret));
+
+               TALLOC_FREE(command);
+
+               if ( ret != 0 ) {
+                       if (fd != -1)
+                               close(fd);
+                       return False;
+               }
+
+               numlines = 0;
+               qlines = fd_lines_load(fd, &numlines, 0, talloc_tos());
+               DEBUGADD(10,("Lines returned = [%d]\n", numlines));
+               close(fd);
+
+               /* should be either no lines or a single line with the mapped 
username */
+
+               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] );
+               }
+
+               TALLOC_FREE(qlines);
+
+               return numlines != 0;
+       }
+
+       /* ok.  let's try the mapfile */
+       if (!*mapfile)
+               return False;
+
+       f = x_fopen(mapfile,O_RDONLY, 0);
+       if (!f) {
+               DEBUG(0,("can't open username map %s. Error %s\n",mapfile, 
strerror(errno) ));
+               return False;
+       }
+
+       DEBUG(4,("Scanning username map %s\n",mapfile));
+
+       while((s=fgets_slash(buf,sizeof(buf),f))!=NULL) {
+               char *unixname = s;
+               char *dosname = strchr_m(unixname,'=');
+               char **dosuserlist;
+               bool return_if_mapped = False;
+
+               if (!dosname)
+                       continue;
+
+               *dosname++ = 0;
+
+               unixname = skip_space(unixname);
+
+               if ('!' == *unixname) {
+                       return_if_mapped = True;
+                       unixname = skip_space(unixname+1);
+               }
+
+               if (!*unixname || strchr_m("#;",*unixname))
+                       continue;
+
+               {
+                       int l = strlen(unixname);
+                       while (l && isspace((int)unixname[l-1])) {
+                               unixname[l-1] = 0;
+                               l--;
+                       }
+               }
+
+               /* skip lines like 'user = ' */
+
+               dosuserlist = str_list_make_v3(talloc_tos(), dosname, NULL);
+               if (!dosuserlist) {
+                       DEBUG(0,("Bad username map entry.  Unable to build user 
list.  Ignoring.\n"));
+                       continue;
+               }
+
+               if (strchr_m(dosname,'*') ||
+                   user_in_list(user, (const char **)dosuserlist)) {
+                       DEBUG(3,("Mapped user %s to %s\n",user,unixname));
+                       mapped_user = True;
+
+                       set_last_from_to(user, unixname);
+                       store_map_in_gencache(user, unixname);
+                       fstrcpy( user, unixname );
+
+                       if ( return_if_mapped ) {
+                               TALLOC_FREE(dosuserlist);
+                               x_fclose(f);
+                               return True;
+                       }
+               }
+
+               TALLOC_FREE(dosuserlist);
+       }
+
+       x_fclose(f);
+
+       /*
+        * Setup the last_from and last_to as an optimization so
+        * that we don't scan the file again for the same user.
+        */
+
+       set_last_from_to(user, user);
+       store_map_in_gencache(user, user);
+
+       return mapped_user;
+}
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 590f3fb..884ce3f 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -4901,6 +4901,10 @@ NTSTATUS rpc_pipe_open_tcp(TALLOC_CTX *mem_ctx, const 
char *host,
 NTSTATUS rpc_pipe_open_ncalrpc(TALLOC_CTX *mem_ctx, const char *socket_path,
                               const struct ndr_syntax_id *abstract_syntax,
                               struct rpc_pipe_client **presult);
+struct pipes_struct *make_internal_rpc_pipe_p(TALLOC_CTX *mem_ctx,
+                                             const struct ndr_syntax_id 
*syntax,
+                                             const char *client_address,
+                                             struct auth_serversupplied_info 
*server_info);
 NTSTATUS rpc_pipe_open_internal(TALLOC_CTX *mem_ctx, const struct 
ndr_syntax_id *abstract_syntax,
                                NTSTATUS (*dispatch) (struct rpc_pipe_client 
*cli, TALLOC_CTX *mem_ctx, const struct ndr_interface_table *table, uint32_t 
opnum, void *r),
                                struct auth_serversupplied_info 
*serversupplied_info,
diff --git a/source3/rpc_server/rpc_ncacn_np_internal.c 
b/source3/rpc_server/rpc_ncacn_np_internal.c
new file mode 100644
index 0000000..6002489
--- /dev/null
+++ b/source3/rpc_server/rpc_ncacn_np_internal.c
@@ -0,0 +1,242 @@
+/*
+ *  Unix SMB/CIFS implementation.
+ *  RPC Pipe client / server routines
+ *  Copyright (C) Andrew Tridgell              1992-1998,
+ *  Largely re-written : 2005
+ *  Copyright (C) Jeremy Allison               1998 - 2005
+ *
+ *  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"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_RPC_SRV
+
+static int pipes_open;
+
+static pipes_struct *InternalPipes;
+
+/* TODO
+ * the following prototypes are declared here to avoid


-- 
Samba Shared Repository

Reply via email to