summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2000-08-01 00:41:19 +0000
committerJeremy Allison <jra@samba.org>2000-08-01 00:41:19 +0000
commitd95777ac34f68a3525786103b9217f6397d9f1d4 (patch)
tree08979563f948bea642c0afeeea00f79179c4e104 /source3
parent55ff9cb38bbabfaee591f6f5190e57b5564f3942 (diff)
downloadsamba-d95777ac34f68a3525786103b9217f6397d9f1d4.tar.gz
samba-d95777ac34f68a3525786103b9217f6397d9f1d4.tar.bz2
samba-d95777ac34f68a3525786103b9217f6397d9f1d4.zip
Added print job substitutions for %{printername}, %{sharename} and %{portname}
from the NT printer tdb. Also added checks for time restrictions before allowing a job to print. Jeremy. (This used to be commit 8cfb55e81abebf0354e6d470ed68bbac1d6560ad)
Diffstat (limited to 'source3')
-rw-r--r--source3/include/nt_printing.h5
-rw-r--r--source3/include/proto.h2
-rw-r--r--source3/printing/nt_printing.c62
-rw-r--r--source3/printing/printing.c25
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c6
-rw-r--r--source3/smbd/lanman.c30
6 files changed, 93 insertions, 37 deletions
diff --git a/source3/include/nt_printing.h b/source3/include/nt_printing.h
index 04d669f822..e73dabe4e3 100644
--- a/source3/include/nt_printing.h
+++ b/source3/include/nt_printing.h
@@ -285,4 +285,9 @@ typedef struct _form
UNISTR2 name;
} FORM;
*/
+
+#ifndef SAMBA_PRINTER_PORT_NAME
+#define SAMBA_PRINTER_PORT_NAME "Samba Printer Port"
+#endif
+
#endif /* NT_PRINTING_H_ */
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 9b526608f4..85ea676736 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1686,6 +1686,7 @@ BOOL unlink_specific_param_if_exist(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_
NT_DEVICEMODE *construct_nt_devicemode(const fstring default_devicename);
NT_DEVICEMODE *dup_nt_devicemode(NT_DEVICEMODE *nt_devicemode);
void free_nt_devicemode(NT_DEVICEMODE **devmode_ptr);
+void get_printer_subst_params(int snum, fstring *printername, fstring *sharename, fstring *portname);
uint32 add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level);
uint32 get_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, fstring sharename);
uint32 free_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level);
@@ -1701,6 +1702,7 @@ uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr);
BOOL nt_printing_getsec(char *printername, SEC_DESC_BUF **secdesc_ctr);
BOOL print_access_check(struct current_user *user, int snum,
uint32 required_access);
+BOOL print_time_access_check(int snum);
#endif
/*The following definitions come from printing/pcap.c */
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 1b9fe8b15f..0265cf5593 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -1380,7 +1380,7 @@ static uint32 get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstrin
fstrcpy(info.servername, global_myname);
fstrcpy(info.printername, sharename);
- fstrcpy(info.portname, sharename);
+ fstrcpy(info.portname, SAMBA_PRINTER_PORT_NAME);
fstrcpy(info.drivername, lp_printerdriver(snum));
pstrcpy(info.comment, "");
fstrcpy(info.printprocessor, "winprint");
@@ -1398,10 +1398,8 @@ static uint32 get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstrin
if ((info.devmode = construct_nt_devicemode(info.printername)) == NULL)
goto fail;
-#if 1
if (!nt_printing_getsec(sharename, &info.secdesc_buf))
goto fail;
-#endif
*info_ptr = (NT_PRINTER_INFO_LEVEL_2 *)memdup(&info, sizeof(info));
if (! *info_ptr) {
@@ -1438,7 +1436,8 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen
dbuf = tdb_fetch(tdb, kbuf);
#if 1 /* JRATEST */
- if (!dbuf.dptr) return get_a_printer_2_default(info_ptr, sharename);
+ if (!dbuf.dptr)
+ return get_a_printer_2_default(info_ptr, sharename);
#else
if (!dbuf.dptr) return 1;
#endif
@@ -1543,13 +1542,32 @@ static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
return (success);
}
+/****************************************************************************
+ Get the parameters we can substitute in an NT print job.
+****************************************************************************/
+
+void get_printer_subst_params(int snum, fstring *printername, fstring *sharename, fstring *portname)
+{
+ NT_PRINTER_INFO_LEVEL *printer = NULL;
+
+ **printername = **sharename = **portname = '\0';
+
+ if (get_a_printer(&printer, 2, lp_servicename(snum))!=0)
+ return;
+
+ fstrcpy(*printername, printer->info_2->printername);
+ fstrcpy(*sharename, printer->info_2->sharename);
+ fstrcpy(*portname, printer->info_2->portname);
+
+ free_a_printer(&printer, 2);
+}
+
/*
* The function below are the high level ones.
* only those ones must be called from the spoolss code.
* JFM.
*/
-
/****************************************************************************
****************************************************************************/
uint32 add_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
@@ -1827,10 +1845,10 @@ BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,
return (False);
}
-
/****************************************************************************
-store a security desc for a printer
+ Store a security desc for a printer.
****************************************************************************/
+
uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr)
{
SEC_DESC_BUF *new_secdesc_ctr = NULL;
@@ -2160,4 +2178,34 @@ BOOL print_access_check(struct current_user *user, int snum,
return result;
}
+
+/****************************************************************************
+ Check the time parameters allow a print operation.
+*****************************************************************************/
+
+BOOL print_time_access_check(int snum)
+{
+ NT_PRINTER_INFO_LEVEL *printer = NULL;
+ BOOL ok = False;
+ time_t now = time(NULL);
+ struct tm *t;
+ uint32 mins;
+
+ if (get_a_printer(&printer, 2, lp_servicename(snum))!=0)
+ return False;
+
+ if (printer->info_2->starttime == 0 && printer->info_2->untiltime == 0)
+ ok = True;
+
+ t = gmtime(&now);
+ mins = (uint32)t->tm_hour*60 + (uint32)t->tm_min;
+
+ if (mins >= printer->info_2->starttime && mins <= printer->info_2->untiltime)
+ ok = True;
+
+ free_a_printer(&printer, 2);
+
+ return ok;
+}
+
#undef OLD_NTDOMAIN
diff --git a/source3/printing/printing.c b/source3/printing/printing.c
index 64d5a7c4b1..c6252b8fb1 100644
--- a/source3/printing/printing.c
+++ b/source3/printing/printing.c
@@ -716,8 +716,9 @@ int print_job_start(struct current_user *user, int snum, char *jobname)
}
/****************************************************************************
-print a file - called on closing the file. This spools the job
+ Print a file - called on closing the file. This spools the job.
****************************************************************************/
+
BOOL print_job_end(int jobid)
{
struct printjob *pjob = print_job_find(jobid);
@@ -728,13 +729,16 @@ BOOL print_job_end(int jobid)
char *wd, *p;
pstring jobname;
- if (!pjob) return False;
+ if (!pjob)
+ return False;
- if (pjob->spooled || pjob->pid != local_pid) return False;
+ if (pjob->spooled || pjob->pid != local_pid)
+ return False;
snum = print_job_snum(jobid);
- if (sys_fstat(pjob->fd, &sbuf) == 0) pjob->size = sbuf.st_size;
+ if (sys_fstat(pjob->fd, &sbuf) == 0)
+ pjob->size = sbuf.st_size;
close(pjob->fd);
pjob->fd = -1;
@@ -749,14 +753,17 @@ BOOL print_job_end(int jobid)
/* we print from the directory path to give the best chance of
parsing the lpq output */
wd = sys_getwd(current_directory);
- if (!wd) return False;
+ if (!wd)
+ return False;
pstrcpy(print_directory, pjob->filename);
p = strrchr(print_directory,'/');
- if (!p) return False;
+ if (!p)
+ return False;
*p++ = 0;
- if (chdir(print_directory) != 0) return False;
+ if (chdir(print_directory) != 0)
+ return False;
pstrcpy(jobname, pjob->jobname);
pstring_sub(jobname, "'", "_");
@@ -780,10 +787,10 @@ BOOL print_job_end(int jobid)
return True;
}
-
/****************************************************************************
-check if the print queue has been updated recently enough
+ Check if the print queue has been updated recently enough.
****************************************************************************/
+
static BOOL print_cache_expired(int snum)
{
fstring key;
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 47df204ef3..4774375db4 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -28,10 +28,6 @@
extern int DEBUGLEVEL;
extern pstring global_myname;
-#ifndef SAMBA_PRINTER_PORT_NAME
-#define SAMBA_PRINTER_PORT_NAME "Samba Printer Port"
-#endif
-
#ifndef MAX_OPEN_PRINTER_EXS
#define MAX_OPEN_PRINTER_EXS 50
#endif
@@ -3339,7 +3335,7 @@ static void fill_job_info_1(JOB_INFO_1 *job_info, print_queue_struct *queue,
job_info->totalpages=0;
job_info->pagesprinted=0;
- make_systemtime(&(job_info->submitted), t);
+ make_systemtime(&job_info->submitted, t);
}
/****************************************************************************
diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c
index ab2fd4d55d..047212bf9f 100644
--- a/source3/smbd/lanman.c
+++ b/source3/smbd/lanman.c
@@ -707,23 +707,21 @@ static int get_printerdrivernumber(int snum)
} else {
/* didn't find driver in tdb */
- DEBUG(10,("snum: %d\nlp_printerdriver: [%s]\nlp_driverfile: [%s]\n",
+ DEBUG(10,("snum: %d\nlp_printerdriver: [%s]\nlp_driverfile: [%s]\n",
snum, lp_printerdriver(snum), lp_driverfile(snum)));
- lines = file_lines_load(lp_driverfile(snum), NULL);
- if (!lines) {
+ lines = file_lines_load(lp_driverfile(snum), NULL);
+ if (!lines) {
DEBUG(3,("Can't open %s - %s\n", lp_driverfile(snum),strerror(errno)));
- }
- else
- {
+ } else {
/* lookup the long printer driver name in the file description */
- for (i=0;lines[i] && !ok;i++) {
- p = lines[i];
- if (next_token(&p,tok,":",sizeof(tok)) &&
- (strlen(lp_printerdriver(snum)) == strlen(tok)) &&
- (!strncmp(tok,lp_printerdriver(snum),strlen(lp_printerdriver(snum)))))
+ for (i=0;lines[i] && !ok;i++) {
+ p = lines[i];
+ if (next_token(&p,tok,":",sizeof(tok)) &&
+ (strlen(lp_printerdriver(snum)) == strlen(tok)) &&
+ (!strncmp(tok,lp_printerdriver(snum),strlen(lp_printerdriver(snum)))))
ok = True;
- }
+ }
}
}
@@ -741,7 +739,7 @@ static int get_printerdrivernumber(int snum)
i++;
file_lines_free(lines);
- return(i);
+ return(i);
}
err:
@@ -861,10 +859,10 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn,
return(True);
}
-
/****************************************************************************
- view list of all print jobs on all queues
- ****************************************************************************/
+ View list of all print jobs on all queues.
+****************************************************************************/
+
static BOOL api_DosPrintQEnum(connection_struct *conn, uint16 vuid, char* param, char* data,
int mdrcnt, int mprcnt,
char **rdata, char** rparam,