The branch, master has been updated via 0b2e5de... s3-smb2: fix some c++ warnings. via 7b84d36... s3-spoolss: fix samr_ValidatePassword_Change. via 7277668... spoolss: move up enum spoolss_Build in the IDL. via 2033314... s3-lanman: use spoolss for api_WPrintJobGetInfo(). via 0c80d12... s3-lanman: use spoolss for api_WPrintJobEnumerate(). from 0277143... s3: re-run make samba3-idl.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 0b2e5debb004ed586e0ec7d926311c32a8b8f9e6 Author: Günther Deschner <g...@samba.org> Date: Mon Apr 19 11:53:11 2010 +0200 s3-smb2: fix some c++ warnings. Guenther commit 7b84d36f19a29e33735bde08151e540d4c2b86b1 Author: Günther Deschner <g...@samba.org> Date: Mon Apr 19 11:46:03 2010 +0200 s3-spoolss: fix samr_ValidatePassword_Change. Guenther commit 7277668128e3a8c138e9dc48ce6c2e85d1aac34f Author: Günther Deschner <g...@samba.org> Date: Mon Apr 19 11:45:33 2010 +0200 spoolss: move up enum spoolss_Build in the IDL. Guenther commit 2033314a7ca731e9cea76cb3296c3dc85660ae30 Author: Günther Deschner <g...@samba.org> Date: Sat Apr 10 01:44:08 2010 +0200 s3-lanman: use spoolss for api_WPrintJobGetInfo(). Guenther commit 0c80d12656267c4e932f8e22750e827d53997f07 Author: Günther Deschner <g...@samba.org> Date: Sat Apr 10 01:33:37 2010 +0200 s3-lanman: use spoolss for api_WPrintJobEnumerate(). Guenther ----------------------------------------------------------------------- Summary of changes: librpc/gen_ndr/ndr_spoolss.c | 50 ++++---- librpc/gen_ndr/ndr_spoolss.h | 2 +- librpc/gen_ndr/spoolss.h | 26 ++-- librpc/idl/spoolss.idl | 10 +- source3/rpc_server/srv_samr_nt.c | 2 +- source3/smbd/lanman.c | 228 ++++++++++++++++++++++++++++++++------ source3/smbd/smb2_server.c | 6 +- 7 files changed, 244 insertions(+), 80 deletions(-) Changeset truncated at 500 lines: diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c index a2355b7..552f894 100644 --- a/librpc/gen_ndr/ndr_spoolss.c +++ b/librpc/gen_ndr/ndr_spoolss.c @@ -308,6 +308,31 @@ _PUBLIC_ void ndr_print_spoolss_JobStatus(struct ndr_print *ndr, const char *nam ndr->depth--; } +static enum ndr_err_code ndr_push_spoolss_Build(struct ndr_push *ndr, int ndr_flags, enum spoolss_Build r) +{ + NDR_CHECK(ndr_push_enum_uint32(ndr, NDR_SCALARS, r)); + return NDR_ERR_SUCCESS; +} + +static enum ndr_err_code ndr_pull_spoolss_Build(struct ndr_pull *ndr, int ndr_flags, enum spoolss_Build *r) +{ + uint32_t v; + NDR_CHECK(ndr_pull_enum_uint32(ndr, NDR_SCALARS, &v)); + *r = v; + return NDR_ERR_SUCCESS; +} + +_PUBLIC_ void ndr_print_spoolss_Build(struct ndr_print *ndr, const char *name, enum spoolss_Build r) +{ + const char *val = NULL; + + switch (r) { + case SPOOLSS_DEBUGGING_BUILD: val = "SPOOLSS_DEBUGGING_BUILD"; break; + case SPOOLSS_RELEASE_BUILD: val = "SPOOLSS_RELEASE_BUILD"; break; + } + ndr_print_enum(ndr, name, "ENUM", val, r); +} + _PUBLIC_ enum ndr_err_code ndr_push_spoolss_PrinterInfo0(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrinterInfo0 *r) { if (ndr_flags & NDR_SCALARS) { @@ -6810,31 +6835,6 @@ _PUBLIC_ void ndr_print_spoolss_PrinterControl(struct ndr_print *ndr, const char ndr_print_enum(ndr, name, "ENUM", val, r); } -static enum ndr_err_code ndr_push_spoolss_Build(struct ndr_push *ndr, int ndr_flags, enum spoolss_Build r) -{ - NDR_CHECK(ndr_push_enum_uint32(ndr, NDR_SCALARS, r)); - return NDR_ERR_SUCCESS; -} - -static enum ndr_err_code ndr_pull_spoolss_Build(struct ndr_pull *ndr, int ndr_flags, enum spoolss_Build *r) -{ - uint32_t v; - NDR_CHECK(ndr_pull_enum_uint32(ndr, NDR_SCALARS, &v)); - *r = v; - return NDR_ERR_SUCCESS; -} - -_PUBLIC_ void ndr_print_spoolss_Build(struct ndr_print *ndr, const char *name, enum spoolss_Build r) -{ - const char *val = NULL; - - switch (r) { - case SPOOLSS_DEBUGGING_BUILD: val = "SPOOLSS_DEBUGGING_BUILD"; break; - case SPOOLSS_RELEASE_BUILD: val = "SPOOLSS_RELEASE_BUILD"; break; - } - ndr_print_enum(ndr, name, "ENUM", val, r); -} - static enum ndr_err_code ndr_push_spoolss_SetPrinterInfo0(struct ndr_push *ndr, int ndr_flags, const struct spoolss_SetPrinterInfo0 *r) { if (ndr_flags & NDR_SCALARS) { diff --git a/librpc/gen_ndr/ndr_spoolss.h b/librpc/gen_ndr/ndr_spoolss.h index 2ae3466..2f4411e 100644 --- a/librpc/gen_ndr/ndr_spoolss.h +++ b/librpc/gen_ndr/ndr_spoolss.h @@ -243,6 +243,7 @@ enum ndr_err_code ndr_push_spoolss_PrinterStatus(struct ndr_push *ndr, int ndr_f enum ndr_err_code ndr_pull_spoolss_PrinterStatus(struct ndr_pull *ndr, int ndr_flags, uint32_t *r); void ndr_print_spoolss_PrinterStatus(struct ndr_print *ndr, const char *name, uint32_t r); void ndr_print_spoolss_JobStatus(struct ndr_print *ndr, const char *name, uint32_t r); +void ndr_print_spoolss_Build(struct ndr_print *ndr, const char *name, enum spoolss_Build r); enum ndr_err_code ndr_push_spoolss_PrinterInfo0(struct ndr_push *ndr, int ndr_flags, const struct spoolss_PrinterInfo0 *r); enum ndr_err_code ndr_pull_spoolss_PrinterInfo0(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo0 *r); void ndr_print_spoolss_PrinterInfo0(struct ndr_print *ndr, const char *name, const struct spoolss_PrinterInfo0 *r); @@ -347,7 +348,6 @@ void ndr_print_spoolss_SetJobInfo(struct ndr_print *ndr, const char *name, const void ndr_print_spoolss_JobInfoContainer(struct ndr_print *ndr, const char *name, const struct spoolss_JobInfoContainer *r); void ndr_print_spoolss_JobControl(struct ndr_print *ndr, const char *name, enum spoolss_JobControl r); void ndr_print_spoolss_PrinterControl(struct ndr_print *ndr, const char *name, enum spoolss_PrinterControl r); -void ndr_print_spoolss_Build(struct ndr_print *ndr, const char *name, enum spoolss_Build r); void ndr_print_spoolss_SetPrinterInfo0(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo0 *r); void ndr_print_spoolss_SetPrinterInfo1(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo1 *r); void ndr_print_spoolss_SetPrinterInfo2(struct ndr_print *ndr, const char *name, const struct spoolss_SetPrinterInfo2 *r); diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h index f1f0c4f..9d6fb6d 100644 --- a/librpc/gen_ndr/spoolss.h +++ b/librpc/gen_ndr/spoolss.h @@ -243,6 +243,19 @@ enum spoolss_MinorVersion #define JOB_STATUS_RESTART ( 0x00000800 ) #define JOB_STATUS_COMPLETE ( 0x00001000 ) +enum spoolss_Build +#ifndef USE_UINT_ENUMS + { + SPOOLSS_DEBUGGING_BUILD=(int)(0x00000000), + SPOOLSS_RELEASE_BUILD=(int)(0x00000001) +} +#else + { __donnot_use_enum_spoolss_Build=0x7FFFFFFF} +#define SPOOLSS_DEBUGGING_BUILD ( 0x00000000 ) +#define SPOOLSS_RELEASE_BUILD ( 0x00000001 ) +#endif +; + struct spoolss_PrinterInfo0 { const char * printername;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */ const char * servername;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */ @@ -1467,19 +1480,6 @@ enum spoolss_PrinterControl #endif ; -enum spoolss_Build -#ifndef USE_UINT_ENUMS - { - SPOOLSS_DEBUGGING_BUILD=(int)(0x00000000), - SPOOLSS_RELEASE_BUILD=(int)(0x00000001) -} -#else - { __donnot_use_enum_spoolss_Build=0x7FFFFFFF} -#define SPOOLSS_DEBUGGING_BUILD ( 0x00000000 ) -#define SPOOLSS_RELEASE_BUILD ( 0x00000001 ) -#endif -; - struct spoolss_SetPrinterInfo0 { const char *servername;/* [unique,charset(UTF16)] */ const char *printername;/* [unique,charset(UTF16)] */ diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl index 1e5d1f2..4127ffb 100644 --- a/librpc/idl/spoolss.idl +++ b/librpc/idl/spoolss.idl @@ -119,6 +119,11 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor") JOB_STATUS_COMPLETE = 0x00001000 } spoolss_JobStatus; + typedef [v1_enum] enum { + SPOOLSS_DEBUGGING_BUILD = 0x00000000, + SPOOLSS_RELEASE_BUILD = 0x00000001 + } spoolss_Build; + typedef [public,gensize] struct { [relative] nstring *printername; [relative] nstring *servername; @@ -1146,11 +1151,6 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor") SPOOLSS_PRINTER_CONTROL_SET_STATUS = 4 } spoolss_PrinterControl; - typedef [v1_enum] enum { - SPOOLSS_DEBUGGING_BUILD = 0x00000000, - SPOOLSS_RELEASE_BUILD = 0x00000001 - } spoolss_Build; - typedef struct { [string,charset(UTF16)] uint16 *servername; [string,charset(UTF16)] uint16 *printername; diff --git a/source3/rpc_server/srv_samr_nt.c b/source3/rpc_server/srv_samr_nt.c index 3ebfe39..97ed381 100644 --- a/source3/rpc_server/srv_samr_nt.c +++ b/source3/rpc_server/srv_samr_nt.c @@ -6698,7 +6698,7 @@ static enum samr_ValidationStatus samr_ValidatePassword_Change(TALLOC_CTX *mem_c NTSTATUS status; if (req->password.string == NULL) { - SAMR_VALIDATION_STATUS_SUCCESS; + return SAMR_VALIDATION_STATUS_SUCCESS; } if (strlen(req->password.string) < dom_pw_info->min_password_length) { ZERO_STRUCT(rep->info); diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c index b9d531f..71d1f4d 100644 --- a/source3/smbd/lanman.c +++ b/source3/smbd/lanman.c @@ -547,6 +547,19 @@ static int printj_status(int v) return 0; } +static int printj_spoolss_status(int v) +{ + if (v == JOB_STATUS_QUEUED) + return RAP_JOB_STATUS_QUEUED; + if (v & JOB_STATUS_PAUSED) + return RAP_JOB_STATUS_PAUSED; + if (v & JOB_STATUS_SPOOLING) + return RAP_JOB_STATUS_SPOOLING; + if (v & JOB_STATUS_PRINTING) + return RAP_JOB_STATUS_PRINTING; + return 0; +} + /* turn a print queue status into a on the wire status */ static int printq_status(int v) @@ -618,6 +631,80 @@ static void fill_printjob_info(connection_struct *conn, int snum, int uLevel, } } +static time_t spoolss_Time_to_time_t(const struct spoolss_Time *r) +{ + struct tm unixtime; + + unixtime.tm_year = r->year - 1900; + unixtime.tm_mon = r->month - 1; + unixtime.tm_wday = r->day_of_week; + unixtime.tm_mday = r->day; + unixtime.tm_hour = r->hour; + unixtime.tm_min = r->minute; + unixtime.tm_sec = r->second; + + return mktime(&unixtime); +} + +static void fill_spoolss_printjob_info(int uLevel, + struct pack_desc *desc, + struct spoolss_JobInfo2 *info2, + int n) +{ + time_t t = spoolss_Time_to_time_t(&info2->submitted); + + /* the client expects localtime */ + t -= get_time_zone(t); + + PACKI(desc,"W",pjobid_to_rap(info2->printer_name, info2->job_id)); /* uJobId */ + if (uLevel == 1) { + PACKS(desc,"B21", info2->user_name); /* szUserName */ + PACKS(desc,"B",""); /* pad */ + PACKS(desc,"B16",""); /* szNotifyName */ + PACKS(desc,"B10","PM_Q_RAW"); /* szDataType */ + PACKS(desc,"z",""); /* pszParms */ + PACKI(desc,"W",n+1); /* uPosition */ + PACKI(desc,"W", printj_spoolss_status(info2->status)); /* fsStatus */ + PACKS(desc,"z",""); /* pszStatus */ + PACKI(desc,"D", t); /* ulSubmitted */ + PACKI(desc,"D", info2->size); /* ulSize */ + PACKS(desc,"z", info2->document_name); /* pszComment */ + } + if (uLevel == 2 || uLevel == 3 || uLevel == 4) { + PACKI(desc,"W", info2->priority); /* uPriority */ + PACKS(desc,"z", info2->user_name); /* pszUserName */ + PACKI(desc,"W",n+1); /* uPosition */ + PACKI(desc,"W", printj_spoolss_status(info2->status)); /* fsStatus */ + PACKI(desc,"D",t); /* ulSubmitted */ + PACKI(desc,"D", info2->size); /* ulSize */ + PACKS(desc,"z","Samba"); /* pszComment */ + PACKS(desc,"z", info2->document_name); /* pszDocument */ + if (uLevel == 3) { + PACKS(desc,"z",""); /* pszNotifyName */ + PACKS(desc,"z","PM_Q_RAW"); /* pszDataType */ + PACKS(desc,"z",""); /* pszParms */ + PACKS(desc,"z",""); /* pszStatus */ + PACKS(desc,"z", info2->printer_name); /* pszQueue */ + PACKS(desc,"z","lpd"); /* pszQProcName */ + PACKS(desc,"z",""); /* pszQProcParms */ + PACKS(desc,"z","NULL"); /* pszDriverName */ + PackDriverData(desc); /* pDriverData */ + PACKS(desc,"z",""); /* pszPrinterName */ + } else if (uLevel == 4) { /* OS2 */ + PACKS(desc,"z",""); /* pszSpoolFileName */ + PACKS(desc,"z",""); /* pszPortName */ + PACKS(desc,"z",""); /* pszStatus */ + PACKI(desc,"D",0); /* ulPagesSpooled */ + PACKI(desc,"D",0); /* ulPagesSent */ + PACKI(desc,"D",0); /* ulPagesPrinted */ + PACKI(desc,"D",0); /* ulTimePrinted */ + PACKI(desc,"D",0); /* ulExtendJobStatus */ + PACKI(desc,"D",0); /* ulStartPage */ + PACKI(desc,"D",0); /* ulEndPage */ + } + } +} + /******************************************************************** Return a driver name given an snum. Returns True if from tdb, False otherwise. @@ -4184,16 +4271,19 @@ static bool api_WPrintJobGetInfo(connection_struct *conn, uint16 vuid, char *str2 = skip_string(param,tpscnt,str1); char *p = skip_string(param,tpscnt,str2); int uLevel; - int count; - int i; - int snum; fstring sharename; uint32 jobid; struct pack_desc desc; - print_queue_struct *queue=NULL; - print_status_struct status; char *tmpdata=NULL; + TALLOC_CTX *mem_ctx = talloc_tos(); + WERROR werr; + NTSTATUS status; + struct rpc_pipe_client *cli = NULL; + struct policy_handle handle; + struct spoolss_DevmodeContainer devmode_ctr; + union spoolss_JobInfo info; + if (!str1 || !str2 || !p) { return False; } @@ -4217,16 +4307,45 @@ static bool api_WPrintJobGetInfo(connection_struct *conn, uint16 vuid, return False; } - snum = lp_servicenumber( sharename); - if (snum < 0 || !VALID_SNUM(snum)) { - return(False); + ZERO_STRUCT(handle); + + status = rpc_pipe_open_internal(mem_ctx, &ndr_table_spoolss.syntax_id, + rpc_spoolss_dispatch, conn->server_info, + &cli); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("api_WPrintJobGetInfo: could not connect to spoolss: %s\n", + nt_errstr(status))); + desc.errcode = W_ERROR_V(ntstatus_to_werror(status)); + goto out; } - count = print_queue_status(snum,&queue,&status); - for (i = 0; i < count; i++) { - if (queue[i].job == jobid) { - break; - } + ZERO_STRUCT(devmode_ctr); + + status = rpccli_spoolss_OpenPrinter(cli, mem_ctx, + sharename, + NULL, + devmode_ctr, + SEC_FLAG_MAXIMUM_ALLOWED, + &handle, + &werr); + if (!NT_STATUS_IS_OK(status)) { + desc.errcode = W_ERROR_V(ntstatus_to_werror(status)); + goto out; + } + if (!W_ERROR_IS_OK(werr)) { + desc.errcode = W_ERROR_V(werr); + goto out; + } + + werr = rpccli_spoolss_getjob(cli, mem_ctx, + &handle, + jobid, + 2, /* level */ + 0, /* offered */ + &info); + if (!W_ERROR_IS_OK(werr)) { + desc.errcode = W_ERROR_V(werr); + goto out; } if (mdrcnt > 0) { @@ -4246,13 +4365,15 @@ static bool api_WPrintJobGetInfo(connection_struct *conn, uint16 vuid, } if (init_package(&desc,1,0)) { - if (i < count) { - fill_printjob_info(conn,snum,uLevel,&desc,&queue[i],i); - *rdata_len = desc.usedlen; - } else { - desc.errcode = NERR_JobNotFound; - *rdata_len = 0; - } + fill_spoolss_printjob_info(uLevel, &desc, &info.info2, info.info2.position); + *rdata_len = desc.usedlen; + } else { + desc.errcode = NERR_JobNotFound; + *rdata_len = 0; + } + out: + if (is_valid_policy_hnd(&handle)) { + rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL); } *rparam_len = 6; @@ -4264,7 +4385,6 @@ static bool api_WPrintJobGetInfo(connection_struct *conn, uint16 vuid, SSVAL(*rparam,2,0); SSVAL(*rparam,4,desc.neededlen); - SAFE_FREE(queue); SAFE_FREE(tmpdata); DEBUG(4,("WPrintJobGetInfo: errorcode %d\n",desc.errcode)); @@ -4284,12 +4404,17 @@ static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid, char *p = skip_string(param,tpscnt,str2); char *name = p; int uLevel; - int count; int i, succnt=0; - int snum; struct pack_desc desc; - print_queue_struct *queue=NULL; - print_status_struct status; + + TALLOC_CTX *mem_ctx = talloc_tos(); + WERROR werr; + NTSTATUS status; + struct rpc_pipe_client *cli = NULL; + struct policy_handle handle; + struct spoolss_DevmodeContainer devmode_ctr; + uint32_t count; + union spoolss_JobInfo *info; if (!str1 || !str2 || !p) { return False; @@ -4319,12 +4444,49 @@ static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid, return False; } - snum = find_service(name); - if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) { - return False; + ZERO_STRUCT(handle); + + status = rpc_pipe_open_internal(mem_ctx, &ndr_table_spoolss.syntax_id, + rpc_spoolss_dispatch, conn->server_info, + &cli); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("api_RDosPrintJobDel: could not connect to spoolss: %s\n", + nt_errstr(status))); + desc.errcode = W_ERROR_V(ntstatus_to_werror(status)); + goto out; + } + + ZERO_STRUCT(devmode_ctr); + + status = rpccli_spoolss_OpenPrinter(cli, mem_ctx, + name, + NULL, + devmode_ctr, + SEC_FLAG_MAXIMUM_ALLOWED, + &handle, + &werr); + if (!NT_STATUS_IS_OK(status)) { + desc.errcode = W_ERROR_V(ntstatus_to_werror(status)); + goto out; + } + if (!W_ERROR_IS_OK(werr)) { + desc.errcode = W_ERROR_V(werr); + goto out; + } + + werr = rpccli_spoolss_enumjobs(cli, mem_ctx, + &handle, + 0, /* firstjob */ + 0xff, /* numjobs */ + 2, /* level */ + 0, /* offered */ + &count, + &info); + if (!W_ERROR_IS_OK(werr)) { + desc.errcode = W_ERROR_V(werr); + goto out; } - count = print_queue_status(snum,&queue,&status); if (mdrcnt > 0) { *rdata = smb_realloc_limit(*rdata,mdrcnt); if (!*rdata) { @@ -4337,12 +4499,16 @@ static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid, if (init_package(&desc,count,0)) { succnt = 0; for (i = 0; i < count; i++) { - fill_printjob_info(conn,snum,uLevel,&desc,&queue[i],i); + fill_spoolss_printjob_info(uLevel, &desc, &info[i].info2, i); if (desc.errcode == NERR_Success) { succnt = i+1; } } } + out: + if (is_valid_policy_hnd(&handle)) { + rpccli_spoolss_ClosePrinter(cli, mem_ctx, &handle, NULL); + } *rdata_len = desc.usedlen; @@ -4356,8 +4522,6 @@ static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid, SSVAL(*rparam,4,succnt); SSVAL(*rparam,6,count); - SAFE_FREE(queue); - DEBUG(4,("WPrintJobEnumerate: errorcode %d\n",desc.errcode)); return True; diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c index 0b3222e..55111da 100644 --- a/source3/smbd/smb2_server.c +++ b/source3/smbd/smb2_server.c @@ -558,7 +558,7 @@ static NTSTATUS smb2_send_async_interim_response(const struct smbd_smb2_request /* Step back to the previous reply. */ i = nreq->current_idx - 3; - outhdr = nreq->out.vector[i].iov_base; -- Samba Shared Repository