diff --git a/docs-xml/smbdotconf/printing/lppausecommand.xml b/docs-xml/smbdotconf/printing/lppausecommand.xml index 3aa134c4377..f2518d3def0 100644 --- a/docs-xml/smbdotconf/printing/lppausecommand.xml +++ b/docs-xml/smbdotconf/printing/lppausecommand.xml @@ -1,6 +1,7 @@ This parameter specifies the command to be diff --git a/docs-xml/smbdotconf/printing/lpqcommand.xml b/docs-xml/smbdotconf/printing/lpqcommand.xml index f3c17f286d1..f0161f3448d 100644 --- a/docs-xml/smbdotconf/printing/lpqcommand.xml +++ b/docs-xml/smbdotconf/printing/lpqcommand.xml @@ -1,6 +1,7 @@ This parameter specifies the command to be diff --git a/docs-xml/smbdotconf/printing/lpresumecommand.xml b/docs-xml/smbdotconf/printing/lpresumecommand.xml index 153ba76a693..2cee574bd73 100644 --- a/docs-xml/smbdotconf/printing/lpresumecommand.xml +++ b/docs-xml/smbdotconf/printing/lpresumecommand.xml @@ -1,6 +1,7 @@ This parameter specifies the command to be diff --git a/docs-xml/smbdotconf/printing/lprmcommand.xml b/docs-xml/smbdotconf/printing/lprmcommand.xml index 4b7f3dd75c3..a595c1225c0 100644 --- a/docs-xml/smbdotconf/printing/lprmcommand.xml +++ b/docs-xml/smbdotconf/printing/lprmcommand.xml @@ -1,6 +1,7 @@ This parameter specifies the command to be diff --git a/docs-xml/smbdotconf/printing/printcommand.xml b/docs-xml/smbdotconf/printing/printcommand.xml index c84e45f404d..42a7188cb9a 100644 --- a/docs-xml/smbdotconf/printing/printcommand.xml +++ b/docs-xml/smbdotconf/printing/printcommand.xml @@ -1,6 +1,7 @@ After a print job has finished spooling to diff --git a/docs-xml/smbdotconf/printing/queuepausecommand.xml b/docs-xml/smbdotconf/printing/queuepausecommand.xml index 5dca45657cc..600a2baa621 100644 --- a/docs-xml/smbdotconf/printing/queuepausecommand.xml +++ b/docs-xml/smbdotconf/printing/queuepausecommand.xml @@ -1,6 +1,7 @@ This parameter specifies the command to be diff --git a/docs-xml/smbdotconf/printing/queueresumecommand.xml b/docs-xml/smbdotconf/printing/queueresumecommand.xml index 4a573330048..431295a804e 100644 --- a/docs-xml/smbdotconf/printing/queueresumecommand.xml +++ b/docs-xml/smbdotconf/printing/queueresumecommand.xml @@ -1,6 +1,7 @@ This parameter specifies the command to be diff --git a/source3/include/proto.h b/source3/include/proto.h index ad6f3bbf9c3..dd4aba34fed 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -180,15 +180,16 @@ char *talloc_sub_specified(TALLOC_CTX *mem_ctx, const char *domain, uid_t uid, gid_t gid); +char *talloc_sub_advanced_only(TALLOC_CTX *mem_ctx, + const char *servicename, const char *user, + const char *connectpath, gid_t gid, + const char *smb_name, const char *domain_name, + const char *str); char *talloc_sub_advanced(TALLOC_CTX *mem_ctx, const char *servicename, const char *user, const char *connectpath, gid_t gid, const char *smb_name, const char *domain_name, const char *str); -void standard_sub_advanced(const char *servicename, const char *user, - const char *connectpath, gid_t gid, - const char *smb_name, const char *domain_name, - char *str, size_t len); /* The following definitions come from lib/sysquotas.c */ diff --git a/source3/lib/substitute.c b/source3/lib/substitute.c index ea227c5ab68..c1bc05b9c15 100644 --- a/source3/lib/substitute.c +++ b/source3/lib/substitute.c @@ -790,7 +790,7 @@ char *talloc_sub_specified(TALLOC_CTX *mem_ctx, /**************************************************************************** ****************************************************************************/ -char *talloc_sub_advanced(TALLOC_CTX *ctx, +char *talloc_sub_advanced_only(TALLOC_CTX *ctx, const char *servicename, const char *user, const char *connectpath, @@ -799,12 +799,12 @@ char *talloc_sub_advanced(TALLOC_CTX *ctx, const char *domain_name, const char *str) { - char *a_string, *ret_string; + char *a_string; char *b, *p, *s; a_string = talloc_strdup(talloc_tos(), str); if (a_string == NULL) { - DEBUG(0, ("talloc_sub_advanced: Out of memory!\n")); + DEBUG(0, ("talloc_sub_advanced_only: Out of memory!\n")); return NULL; } @@ -858,25 +858,29 @@ char *talloc_sub_advanced(TALLOC_CTX *ctx, } } - ret_string = talloc_sub_basic(ctx, smb_name, domain_name, a_string); - TALLOC_FREE(a_string); - return ret_string; + return a_string; } -void standard_sub_advanced(const char *servicename, const char *user, - const char *connectpath, gid_t gid, - const char *smb_name, const char *domain_name, - char *str, size_t len) +char *talloc_sub_advanced(TALLOC_CTX *ctx, + const char *servicename, + const char *user, + const char *connectpath, + gid_t gid, + const char *smb_name, + const char *domain_name, + const char *str) { - char *s = talloc_sub_advanced(talloc_tos(), - servicename, user, connectpath, - gid, smb_name, domain_name, str); + char *a_string, *ret_string; - if (!s) { - return; + a_string = talloc_sub_advanced_only(ctx, servicename, user, connectpath, + gid, smb_name, domain_name, str); + if (a_string == NULL) { + return NULL; } - strlcpy( str, s, len ); - TALLOC_FREE( s ); + + ret_string = talloc_sub_basic(ctx, smb_name, domain_name, a_string); + TALLOC_FREE(a_string); + return ret_string; } /****************************************************************************** diff --git a/source3/printing/print_generic.c b/source3/printing/print_generic.c index b6b50062caf..c58f8ddce0b 100644 --- a/source3/printing/print_generic.c +++ b/source3/printing/print_generic.c @@ -56,6 +56,8 @@ static int print_run_command(int snum, const char* printername, bool do_sub, return -1; } + DEBUG(3, ("Incoming command '%s'\n", syscmd)); + while ((arg = va_arg(ap, char *))) { char *value = va_arg(ap,char *); syscmd = talloc_string_sub(ctx, syscmd, arg, value); @@ -71,6 +73,11 @@ static int print_run_command(int snum, const char* printername, bool do_sub, return -1; } + syscmd = lp_string(ctx, syscmd); + if (!syscmd) { + return -1; + } + if (do_sub && snum != -1) { syscmd = talloc_sub_advanced(ctx, lp_servicename(talloc_tos(), snum), @@ -118,7 +125,7 @@ static int generic_job_pause(int snum, struct printjob *pjob) /* need to pause the spooled entry */ slprintf(jobstr, sizeof(jobstr)-1, "%d", pjob->sysjob); return print_run_command(snum, lp_printername(talloc_tos(), snum), True, - lp_lppause_command(talloc_tos(), snum), NULL, + lp_lppause_command(snum), NULL, "%j", jobstr, NULL); } @@ -133,7 +140,7 @@ static int generic_job_resume(int snum, struct printjob *pjob) /* need to pause the spooled entry */ slprintf(jobstr, sizeof(jobstr)-1, "%d", pjob->sysjob); return print_run_command(snum, lp_printername(talloc_tos(), snum), True, - lp_lpresume_command(talloc_tos(), snum), NULL, + lp_lpresume_command(snum), NULL, "%j", jobstr, NULL); } @@ -255,7 +262,7 @@ static int generic_job_submit(int snum, struct printjob *pjob, /* send it to the system spooler */ ret = print_run_command(snum, lp_printername(talloc_tos(), snum), True, - lp_print_command(talloc_tos(), snum), NULL, + lp_print_command(snum), NULL, "%s", p, "%J", jobname, "%f", p, @@ -308,7 +315,7 @@ static int generic_job_submit(int snum, struct printjob *pjob, static int generic_queue_pause(int snum) { return print_run_command(snum, lp_printername(talloc_tos(), snum), True, - lp_queuepause_command(talloc_tos(), snum), NULL, NULL); + lp_queuepause_command(snum), NULL, NULL); } /**************************************************************************** @@ -317,7 +324,7 @@ static int generic_queue_pause(int snum) static int generic_queue_resume(int snum) { return print_run_command(snum, lp_printername(talloc_tos(), snum), True, - lp_queueresume_command(talloc_tos(), snum), NULL, NULL); + lp_queueresume_command(snum), NULL, NULL); } /**************************************************************************** diff --git a/source3/printing/printing.c b/source3/printing/printing.c index e6caaa1222f..a50567037b1 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -1717,14 +1717,14 @@ static void print_queue_update(struct messaging_context *msg_ctx, /* don't strip out characters like '$' from the printername */ lpqcommand = talloc_string_sub2(ctx, - lp_lpq_command(talloc_tos(), snum), + lp_lpq_command(snum), "%p", lp_printername(talloc_tos(), snum), false, false, false); if (!lpqcommand) { return; } - lpqcommand = talloc_sub_advanced(ctx, + lpqcommand = talloc_sub_advanced_only(ctx, lp_servicename(talloc_tos(), snum), current_user_info.unix_name, "", @@ -1737,14 +1737,14 @@ static void print_queue_update(struct messaging_context *msg_ctx, } lprmcommand = talloc_string_sub2(ctx, - lp_lprm_command(talloc_tos(), snum), + lp_lprm_command(snum), "%p", lp_printername(talloc_tos(), snum), false, false, false); if (!lprmcommand) { return; } - lprmcommand = talloc_sub_advanced(ctx, + lprmcommand = talloc_sub_advanced_only(ctx, lp_servicename(talloc_tos(), snum), current_user_info.unix_name, "", @@ -2199,7 +2199,7 @@ static bool print_job_delete1(struct tevent_context *ev, { result = (*(current_printif->job_delete))( lp_printername(talloc_tos(), snum), - lp_lprm_command(talloc_tos(), snum), + lp_lprm_command(snum), pjob); /* Delete the tdb entry if the delete succeeded or the job hasn't @@ -2819,7 +2819,7 @@ WERROR print_job_start(const struct auth_session_info *server_info, struct spoolss_DeviceMode *devmode, uint32_t *_jobid) { uint32_t jobid; - char *path; + char *path, *userstr; struct printjob pjob; const char *sharename = lp_const_servicename(snum); struct tdb_print_db *pdb = get_print_db_byname(sharename); @@ -2866,12 +2866,17 @@ WERROR print_job_start(const struct auth_session_info *server_info, fstrcpy(pjob.clientmachine, clientmachine); - fstrcpy(pjob.user, lp_printjob_username(snum)); - standard_sub_advanced(sharename, server_info->unix_info->sanitized_username, + userstr = talloc_sub_advanced(talloc_tos(), sharename, server_info->unix_info->sanitized_username, path, server_info->unix_token->gid, server_info->unix_info->sanitized_username, server_info->info->domain_name, - pjob.user, sizeof(pjob.user)); + lp_printjob_username(snum)); + if (userstr == NULL) { + fstrcpy(pjob.user, lp_printjob_username(snum)); + } else { + strlcpy(pjob.user, userstr, sizeof(pjob.user)); + TALLOC_FREE(userstr); + } fstrcpy(pjob.queuename, lp_const_servicename(snum)); @@ -3020,7 +3025,7 @@ NTSTATUS print_job_end(struct messaging_context *msg_ctx, int snum, /* don't strip out characters like '$' from the printername */ lpq_cmd = talloc_string_sub2(tmp_ctx, - lp_lpq_command(talloc_tos(), snum), + lp_lpq_command(snum), "%p", lp_printername(talloc_tos(), snum), false, false, false); @@ -3028,7 +3033,7 @@ NTSTATUS print_job_end(struct messaging_context *msg_ctx, int snum, status = NT_STATUS_PRINT_CANCELLED; goto fail; } - lpq_cmd = talloc_sub_advanced(tmp_ctx, + lpq_cmd = talloc_sub_advanced_only(tmp_ctx, lp_servicename(talloc_tos(), snum), current_user_info.unix_name, "", diff --git a/source3/utils/testparm.c b/source3/utils/testparm.c index efa58a6a417..a2eabaf33e4 100644 --- a/source3/utils/testparm.c +++ b/source3/utils/testparm.c @@ -611,7 +611,7 @@ static void do_per_share_checks(int s) "excludes octal 010 (S_IXGRP).\n\n", lp_servicename(talloc_tos(), s)); } - if (lp_printing(s) == PRINT_CUPS && *(lp_print_command(talloc_tos(), s)) != '\0') { + if (lp_printing(s) == PRINT_CUPS && *(lp_print_command(s)) != '\0') { fprintf(stderr, "Warning: Service %s defines a print command, but " "parameter is ignored when using CUPS libraries.\n\n",