diff options
author | David Disseldorp <ddiss@suse.de> | 2011-03-02 14:34:28 +0100 |
---|---|---|
committer | Andreas Schneider <asn@samba.org> | 2011-03-04 15:46:14 +0100 |
commit | 61bf4699f0f8b353272c060b8309f339ed2a0f88 (patch) | |
tree | 12a22e9df8b0b99ad6db4539ef04565c7ba9db4b /source3/printing | |
parent | b0c6899973d3e0e5d4dbd2590157f7200c20f8ff (diff) | |
download | samba-61bf4699f0f8b353272c060b8309f339ed2a0f88.tar.gz samba-61bf4699f0f8b353272c060b8309f339ed2a0f88.tar.bz2 samba-61bf4699f0f8b353272c060b8309f339ed2a0f88.zip |
s3-printing: follow force user/group for driver IO
Configuring force user/group settings for the print$ share currently has
unexpected results, this is explained by how the driver upload/add
process takes place. Consider the following example:
[print$]
path = /print-drv
write list = $DRIVER_UPLOAD_USER
force group = ntadmin
- the client connects to the [print$] share and uploads all driver
files to the /print-drv/W32X86 directory.
- This is permitted, as /print-drv/W32X86 is owned by group ntadmin, and
the "force group = ntadmin" takes effect for the [print$] session.
- Once all files are uploaded, the client connects to the [ipc$]
share and issues an AddPrinterDriverEx spoolss request.
- In handling this request move_driver_to_download_area() is called,
which attempts to create the directory /print-drv/W32X86/3
- The create directory fails, as it is done as the user connected to
the [ipc$] share which does not have permission to write to the driver
directory. The [print$] "force group = ntadmin" has no effect.
This is a regression from previous behaviour prior to the commit:
783ab04 Convert move_driver_to_download_area to use create_conn_struct.
https://bugzilla.samba.org/show_bug.cgi?id=7921
Signed-off-by: Andreas Schneider <asn@samba.org>
Diffstat (limited to 'source3/printing')
-rw-r--r-- | source3/printing/nt_printing.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index d77320cf02..1d075e794e 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -625,6 +625,19 @@ static uint32 get_correct_cversion(struct pipes_struct *p, return -1; } + nt_status = set_conn_force_user_group(conn, printdollar_snum); + if (!NT_STATUS_IS_OK(nt_status)) { + DEBUG(0, ("failed set force user / group\n")); + *perr = ntstatus_to_werror(nt_status); + goto error_free_conn; + } + + if (!become_user(conn, get_current_vuid(conn))) { + DEBUG(0, ("failed to become user\n")); + *perr = WERR_ACCESS_DENIED; + goto error_free_conn; + } + /* Open the driver file (Portable Executable format) and determine the * deriver the cversion. */ driverpath = talloc_asprintf(talloc_tos(), @@ -720,6 +733,8 @@ static uint32 get_correct_cversion(struct pipes_struct *p, *perr = WERR_OK; error_exit: + unbecome_user(); + error_free_conn: TALLOC_FREE(smb_fname); if (fsp != NULL) { close_file(NULL, fsp, NORMAL_CLOSE); @@ -993,6 +1008,19 @@ WERROR move_driver_to_download_area(struct pipes_struct *p, return err; } + nt_status = set_conn_force_user_group(conn, printdollar_snum); + if (!NT_STATUS_IS_OK(nt_status)) { + DEBUG(0, ("failed set force user / group\n")); + err = ntstatus_to_werror(nt_status); + goto err_free_conn; + } + + if (!become_user(conn, get_current_vuid(conn))) { + DEBUG(0, ("failed to become user\n")); + err = WERR_ACCESS_DENIED; + goto err_free_conn; + } + new_dir = talloc_asprintf(ctx, "%s/%d", short_architecture, @@ -1126,7 +1154,9 @@ WERROR move_driver_to_download_area(struct pipes_struct *p, } err = WERR_OK; - err_exit: + err_exit: + unbecome_user(); + err_free_conn: TALLOC_FREE(smb_dname); if (conn != NULL) { @@ -1907,6 +1937,19 @@ bool delete_driver_files(const struct auth_serversupplied_info *session_info, return false; } + nt_status = set_conn_force_user_group(conn, printdollar_snum); + if (!NT_STATUS_IS_OK(nt_status)) { + DEBUG(0, ("failed set force user / group\n")); + ret = false; + goto err_free_conn; + } + + if (!become_user(conn, get_current_vuid(conn))) { + DEBUG(0, ("failed to become user\n")); + ret = false; + goto err_free_conn; + } + if ( !CAN_WRITE(conn) ) { DEBUG(3,("delete_driver_files: Cannot delete print driver when [print$] is read-only\n")); ret = false; @@ -1968,6 +2011,8 @@ bool delete_driver_files(const struct auth_serversupplied_info *session_info, ret = true; err_out: + unbecome_user(); + err_free_conn: if (conn != NULL) { vfs_ChDir(conn, oldcwd); SMB_VFS_DISCONNECT(conn); |