diff -Naur cups-1.1.20/conf/cupsd.conf.in cups-1.1.20.new/conf/cupsd.conf.in --- cups-1.1.20/conf/cupsd.conf.in 2004-02-10 16:36:34 +0300 +++ cups-1.1.20.new/conf/cupsd.conf.in 2004-02-10 16:25:27 +0300 @@ -352,6 +352,15 @@ Group @CUPS_GROUP@ # +# Izvrat Mode options +# RunAsUser - always run CUPS under yser +# NoIzvrat - turn on classic CUPS mode +# + +#RunAsUser no +#NoIzvrat yes + +# # RIPCache: the amount of memory that each RIP should use to cache # bitmaps. The value can be any real number followed by "k" for # kilobytes, "m" for megabytes, "g" for gigabytes, or "t" for tiles diff -Naur cups-1.1.20/scheduler/conf.c cups-1.1.20.new/scheduler/conf.c --- cups-1.1.20/scheduler/conf.c 2003-11-07 22:41:25 +0300 +++ cups-1.1.20.new/scheduler/conf.c 2004-02-10 16:26:53 +0300 @@ -128,6 +128,7 @@ { "RequestRoot", &RequestRoot, VAR_STRING }, { "RIPCache", &RIPCache, VAR_STRING }, { "RunAsUser", &RunAsUser, VAR_BOOLEAN }, + { "NoIzvrat", &NoIzvrat, VAR_BOOLEAN }, { "RootCertDuration", &RootCertDuration, VAR_INTEGER }, { "ServerAdmin", &ServerAdmin, VAR_STRING }, { "ServerBin", &ServerBin, VAR_STRING }, @@ -355,7 +356,8 @@ MaxPrinterHistory = 10; MaxRequestSize = 0; RootCertDuration = 300; - RunAsUser = FALSE; +// RunAsUser = FALSE; + NoIzvrat = FALSE; Timeout = DEFAULT_TIMEOUT; BrowseInterval = DEFAULT_INTERVAL; diff -Naur cups-1.1.20/scheduler/conf.h cups-1.1.20.new/scheduler/conf.h --- cups-1.1.20/scheduler/conf.h 2003-10-09 23:13:30 +0400 +++ cups-1.1.20.new/scheduler/conf.h 2004-02-10 16:25:27 +0300 @@ -150,6 +150,8 @@ /* Root certificate update interval */ RunAsUser VALUE(FALSE), /* Run as unpriviledged user? */ + NoIzvrat VALUE(FALSE), + /* Izvrat ALT's mode? */ PrintcapFormat VALUE(PRINTCAP_BSD); /* Format of printcap file? */ VAR cups_file_t *AccessFile VALUE(NULL), diff -Naur cups-1.1.20/scheduler/ipp.c cups-1.1.20.new/scheduler/ipp.c --- cups-1.1.20/scheduler/ipp.c 2003-10-22 18:21:36 +0400 +++ cups-1.1.20.new/scheduler/ipp.c 2004-02-10 16:25:27 +0300 @@ -334,7 +334,210 @@ /* * Then try processing the operation... */ - + /* + *Operations splitted into administrator and user tasks + */ + { + int need_default = 1; + /*global switch*/ + switch(con->request->request.op.operation_id){/*we allow get methods to all type of users*/ + case IPP_GET_JOB_ATTRIBUTES : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 16"); + get_job_attrs(con, uri); + need_default = 0; + break; + + case IPP_GET_JOBS : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 17"); + get_jobs(con, uri); + need_default = 0; + break; + + case IPP_GET_PRINTER_ATTRIBUTES : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 18"); + get_printer_attrs(con, uri); + need_default = 0; + break; + + case CUPS_GET_DEFAULT : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 23"); + get_default(con); + need_default = 0; + break; + + case CUPS_GET_PRINTERS : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 24"); + get_printers(con, 0); + need_default = 0; + break; + + case CUPS_GET_CLASSES : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 25"); + get_printers(con, CUPS_PRINTER_CLASS); + need_default = 0; + break; + + case CUPS_GET_DEVICES : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 26"); + get_devices(con); + need_default = 0; + break; + + case CUPS_GET_PPDS : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 27"); + get_ppds(con); + need_default = 0; + break; + default: + break; + + } + if (!RunAsUser || NoIzvrat) + {/*administrator tasks*/ + LogMessage(L_DEBUG2, "ProcessIPPRequest: process administrator tasks only"); + switch(con->request->request.op.operation_id){ + case IPP_PAUSE_PRINTER : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 1"); + stop_printer(con, uri); + need_default = 0; + break; + + case IPP_RESUME_PRINTER : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 2"); + start_printer(con, uri); + need_default = 0; + break; + + case IPP_PURGE_JOBS : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 3"); + cancel_all_jobs(con, uri); + need_default = 0; + break; + + case CUPS_ADD_PRINTER : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 4"); + add_printer(con, uri); + need_default = 0; + break; + + case CUPS_DELETE_PRINTER : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 5"); + delete_printer(con, uri); + need_default = 0; + break; + + case CUPS_ADD_CLASS : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 6"); + add_class(con, uri); + need_default = 0; + break; + + case CUPS_DELETE_CLASS : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 7"); + delete_printer(con, uri); + need_default = 0; + break; + + case CUPS_ACCEPT_JOBS : + case IPP_ENABLE_PRINTER : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 8"); + accept_jobs(con, uri); + need_default = 0; + break; + + case CUPS_REJECT_JOBS : + case IPP_DISABLE_PRINTER : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 9"); + reject_jobs(con, uri); + need_default = 0; + break; + + case CUPS_SET_DEFAULT : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 10"); + set_default(con, uri); + need_default = 0; + break; + + default: + break; + + } + } + if (RunAsUser || NoIzvrat){/*user tasks*/ + LogMessage(L_DEBUG2, "ProcessIPPRequest: process user tasks only"); + switch(con->request->request.op.operation_id){ + case IPP_PRINT_JOB : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 11"); + print_job(con, uri); + need_default = 0; + break; + + case IPP_VALIDATE_JOB : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 12"); + validate_job(con, uri); + need_default = 0; + break; + + case IPP_CREATE_JOB : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 13"); + create_job(con, uri); + need_default = 0; + break; + + case IPP_SEND_DOCUMENT : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 14"); + send_document(con, uri); + need_default = 0; + break; + + case IPP_CANCEL_JOB : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 15"); + cancel_job(con, uri); + need_default = 0; + break; + + + case IPP_HOLD_JOB : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 19"); + hold_job(con, uri); + need_default = 0; + break; + + case IPP_RELEASE_JOB : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 20"); + release_job(con, uri); + need_default = 0; + break; + + case IPP_RESTART_JOB : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 21"); + restart_job(con, uri); + need_default = 0; + break; + + case IPP_SET_JOB_ATTRIBUTES : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 22"); + set_job_attrs(con, uri); + need_default = 0; + break; + + + case CUPS_MOVE_JOB : + LogMessage(L_DEBUG2, "ProcessIPPRequest: 28"); + move_job(con, uri); + need_default = 0; + break; + + default: + break; + + } + } + if (need_default){ + send_ipp_error(con, IPP_OPERATION_NOT_SUPPORTED); + } + } +/* switch (con->request->request.op.operation_id) { case IPP_PRINT_JOB : @@ -454,6 +657,7 @@ default : send_ipp_error(con, IPP_OPERATION_NOT_SUPPORTED); } + */ } } } diff -Naur cups-1.1.20/scheduler/main.c cups-1.1.20.new/scheduler/main.c --- cups-1.1.20/scheduler/main.c 2003-11-19 19:52:14 +0300 +++ cups-1.1.20.new/scheduler/main.c 2004-02-10 16:25:27 +0300 @@ -117,6 +117,7 @@ */ fg = 0; + RunAsUser = FALSE; for (i = 1; i < argc; i ++) if (argv[i][0] == '-') @@ -157,7 +158,9 @@ case 'F' : /* Run in foreground, but still disconnect from terminal... */ fg = -1; break; - + case 'u' : /* Run as user... */ + RunAsUser = TRUE; + break; default : /* Unknown option */ fprintf(stderr, "cupsd: Unknown option \'%c\' - aborting!\n", *opt); usage();