Remove some references to get_current_username() and current_user_info
[samba.git] / source3 / modules / vfs_expand_msdfs.c
index 7176c11e4abd11b81cc64d31a1689ea764930cd6..9b85ad2dda486a0b935cb185738a9244f48e0b74 100644 (file)
@@ -5,7 +5,7 @@
  *
  * 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 2 of the License, or
+ * 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,
@@ -14,8 +14,7 @@
  * 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "includes.h"
@@ -38,24 +37,25 @@ extern userdom_struct current_user_info;
   This is to redirect a DFS client to a host close to it.
 ***********************************************************/
 
-static BOOL read_target_host(const char *mapfile, pstring targethost)
+static char *read_target_host(TALLOC_CTX *ctx, const char *mapfile)
 {
        XFILE *f;
-       pstring buf;
+       char buf[1024];
        char *space = buf;
-       BOOL found = False;
-       
+       bool found = false;
+
        f = x_fopen(mapfile, O_RDONLY, 0);
 
        if (f == NULL) {
                DEBUG(0,("can't open IP map %s. Error %s\n",
                         mapfile, strerror(errno) ));
-               return False;
+               return NULL;
        }
 
        DEBUG(10, ("Scanning mapfile [%s]\n", mapfile));
 
        while (x_fgets(buf, sizeof(buf), f) != NULL) {
+               char addr[INET6_ADDRSTRLEN];
 
                if ((strlen(buf) > 0) && (buf[strlen(buf)-1] == '\n'))
                        buf[strlen(buf)-1] = '\0';
@@ -71,24 +71,25 @@ static BOOL read_target_host(const char *mapfile, pstring targethost)
 
                *space = '\0';
 
-               if (strncmp(client_addr(), buf, strlen(buf)) == 0) {
-                       found = True;
+               if (strncmp(client_addr(get_client_fd(),addr,sizeof(addr)),
+                               buf, strlen(buf)) == 0) {
+                       found = true;
                        break;
                }
        }
 
        x_fclose(f);
 
-       if (!found)
-               return False;
+       if (!found) {
+               return NULL;
+       }
 
        space += 1;
 
        while (isspace(*space))
                space += 1;
 
-       pstrcpy(targethost, space);
-       return True;
+       return talloc_strdup(ctx, space);
 }
 
 /**********************************************************
@@ -104,65 +105,83 @@ static BOOL read_target_host(const char *mapfile, pstring targethost)
 
 ***********************************************************/
 
-static BOOL expand_msdfs_target(connection_struct* conn, pstring target)
+static char *expand_msdfs_target(TALLOC_CTX *ctx,
+                               connection_struct *conn,
+                               char *target)
 {
-       pstring mapfilename;
+       char *mapfilename = NULL;
        char *filename_start = strchr_m(target, '@');
-       char *filename_end;
-       int filename_len;
-       pstring targethost;
-       pstring new_target;
+       char *filename_end = NULL;
+       int filename_len = 0;
+       char *targethost = NULL;
+       char *new_target = NULL;
 
        if (filename_start == NULL) {
                DEBUG(10, ("No filename start in %s\n", target));
-               return False;
+               return NULL;
        }
 
        filename_end = strchr_m(filename_start+1, '@');
 
        if (filename_end == NULL) {
                DEBUG(10, ("No filename end in %s\n", target));
-               return False;
+               return NULL;
        }
 
        filename_len = PTR_DIFF(filename_end, filename_start+1);
-       pstrcpy(mapfilename, filename_start+1);
+       mapfilename = talloc_strdup(ctx, filename_start+1);
+       if (!mapfilename) {
+               return NULL;
+       }
        mapfilename[filename_len] = '\0';
 
        DEBUG(10, ("Expanding from table [%s]\n", mapfilename));
 
-       if (!read_target_host(mapfilename, targethost)) {
+       if ((targethost = read_target_host(ctx, mapfilename)) == NULL) {
                DEBUG(1, ("Could not expand target host from file %s\n",
                          mapfilename));
-               return False;
+               return NULL;
        }
 
-       standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user,
-                             conn->connectpath, conn->gid,
-                             get_current_username(),
-                             current_user_info.domain,
-                             mapfilename, sizeof(mapfilename));
+       targethost = talloc_sub_advanced(ctx,
+                               lp_servicename(SNUM(conn)),
+                               conn->server_info->unix_name,
+                               conn->connectpath,
+                               conn->server_info->gid,
+                               conn->server_info->sanitized_username,
+                               current_user_info.domain,
+                               targethost);
 
        DEBUG(10, ("Expanded targethost to %s\n", targethost));
 
+       /* Replace the part between '@...@' */
        *filename_start = '\0';
-       pstrcpy(new_target, target);
-       pstrcat(new_target, targethost);
-       pstrcat(new_target, filename_end+1);
+       new_target = talloc_asprintf(ctx,
+                               "%s%s%s",
+                               target,
+                               targethost,
+                               filename_end+1);
+       if (!new_target) {
+               return NULL;
+       }
 
        DEBUG(10, ("New DFS target: %s\n", new_target));
-       pstrcpy(target, new_target);
-       return True;
+       return new_target;
 }
 
 static int expand_msdfs_readlink(struct vfs_handle_struct *handle,
                                 const char *path, char *buf, size_t bufsiz)
 {
-       pstring target;
+       TALLOC_CTX *ctx = talloc_tos();
        int result;
+       char *target = TALLOC_ARRAY(ctx, char, PATH_MAX+1);
 
+       if (!target) {
+               errno = ENOMEM;
+               return -1;
+       }
        result = SMB_VFS_NEXT_READLINK(handle, path, target,
-                                      sizeof(target));
+                                      PATH_MAX);
 
        if (result < 0)
                return result;
@@ -171,7 +190,8 @@ static int expand_msdfs_readlink(struct vfs_handle_struct *handle,
 
        if ((strncmp(target, "msdfs:", strlen("msdfs:")) == 0) &&
            (strchr_m(target, '@') != NULL)) {
-               if (!expand_msdfs_target(handle->conn, target)) {
+               target = expand_msdfs_target(ctx, handle->conn, target);
+               if (!target) {
                        errno = ENOENT;
                        return -1;
                }
@@ -183,7 +203,7 @@ static int expand_msdfs_readlink(struct vfs_handle_struct *handle,
 
 /* VFS operations structure */
 
-static vfs_op_tuple expand_msdfs_ops[] = {     
+static vfs_op_tuple expand_msdfs_ops[] = {
        {SMB_VFS_OP(expand_msdfs_readlink), SMB_VFS_OP_READLINK,
         SMB_VFS_LAYER_TRANSPARENT},
        {SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP}