Changeset 134 for branches/samba-3.0/source/printing
- Timestamp:
- May 23, 2008, 6:56:41 AM (17 years ago)
- Location:
- branches/samba-3.0/source/printing
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/samba-3.0/source/printing/nt_printing.c
r39 r134 72 72 SERVER_EXECUTE, 73 73 SERVER_ALL_ACCESS 74 }; 75 76 /* Map generic permissions to job object specific permissions */ 77 78 GENERIC_MAPPING job_generic_mapping = { 79 JOB_READ, 80 JOB_WRITE, 81 JOB_EXECUTE, 82 JOB_ALL_ACCESS 74 83 }; 75 84 … … 3744 3753 Get a default printer info 2 struct. 3745 3754 ****************************************************************************/ 3746 static WERROR get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 *info, const char *servername, const char* sharename) 3755 3756 static WERROR get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 *info, 3757 const char *servername, 3758 const char* sharename, 3759 BOOL get_loc_com) 3747 3760 { 3748 3761 int snum = lp_servicenumber(sharename); … … 3771 3784 3772 3785 #ifdef HAVE_CUPS 3773 if ( (enum printing_types)lp_printing(snum) == PRINT_CUPS ) {3786 if (get_loc_com && (enum printing_types)lp_printing(snum) == PRINT_CUPS ) { 3774 3787 /* Pull the location and comment strings from cups if we don't 3775 3788 already have one */ … … 3820 3833 /**************************************************************************** 3821 3834 ****************************************************************************/ 3822 static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info, const char *servername, const char *sharename) 3835 3836 static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info, 3837 const char *servername, 3838 const char *sharename, 3839 BOOL get_loc_com) 3823 3840 { 3824 3841 int len = 0; … … 3832 3849 dbuf = tdb_fetch(tdb_printers, kbuf); 3833 3850 if (!dbuf.dptr) { 3834 return get_a_printer_2_default(info, servername, sharename); 3851 return get_a_printer_2_default(info, servername, 3852 sharename, get_loc_com); 3835 3853 } 3836 3854 … … 3875 3893 3876 3894 #ifdef HAVE_CUPS 3877 if ( (enum printing_types)lp_printing(snum) == PRINT_CUPS ) {3895 if (get_loc_com && (enum printing_types)lp_printing(snum) == PRINT_CUPS ) { 3878 3896 /* Pull the location and comment strings from cups if we don't 3879 3897 already have one */ … … 4449 4467 ****************************************************************************/ 4450 4468 4451 WERROR get_a_printer( Printer_entry *print_hnd, NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level,4452 const char *sharename )4469 static WERROR get_a_printer_internal( Printer_entry *print_hnd, NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, 4470 const char *sharename, BOOL get_loc_com) 4453 4471 { 4454 4472 WERROR result; … … 4478 4496 } 4479 4497 4480 result = get_a_printer_2( (*pp_printer)->info_2, servername, sharename ); 4498 result = get_a_printer_2( (*pp_printer)->info_2, 4499 servername, 4500 sharename, 4501 get_loc_com); 4481 4502 4482 4503 … … 4500 4521 4501 4522 return WERR_OK; 4523 } 4524 4525 WERROR get_a_printer( Printer_entry *print_hnd, NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, 4526 const char *sharename) 4527 { 4528 return get_a_printer_internal(print_hnd, pp_printer, level, 4529 sharename, True); 4530 } 4531 4532 WERROR get_a_printer_search( Printer_entry *print_hnd, NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, 4533 const char *sharename) 4534 { 4535 return get_a_printer_internal(print_hnd, pp_printer, level, 4536 sharename, False); 4502 4537 } 4503 4538 … … 4720 4755 { 4721 4756 int i = 0; 4722 4757 4723 4758 if ( !info ) 4724 4759 return False; 4725 4760 4761 /* mz: skip files that are in the list but already deleted */ 4762 if (!file || !file[0]) { 4763 return false; 4764 } 4765 4726 4766 if ( strequal(file, info->driverpath) ) 4727 4767 return True; … … 4836 4876 Upon return, *info has been modified to only contain the driver files 4837 4877 which are not in use 4878 4879 Fix from mz: 4880 4881 This needs to check all drivers to ensure that all files in use 4882 have been removed from *info, not just the ones in the first 4883 match. 4838 4884 ****************************************************************************/ 4839 4885 … … 4845 4891 fstring *list = NULL; 4846 4892 NT_PRINTER_DRIVER_INFO_LEVEL driver; 4847 4893 BOOL in_use = False; 4894 4848 4895 if ( !info ) 4849 4896 return False; … … 4880 4927 if ( !strequal(info->name, driver.info_3->name) ) { 4881 4928 if ( trim_overlap_drv_files(info, driver.info_3) ) { 4882 free_a_printer_driver(driver, 3); 4883 SAFE_FREE( list ); 4884 return True; 4929 /* mz: Do not instantly return - 4930 * we need to ensure this file isn't 4931 * also in use by other drivers. */ 4932 in_use = True; 4885 4933 } 4886 4934 } … … 4898 4946 dump_a_printer_driver( driver, 3 ); 4899 4947 4900 return False;4948 return in_use; 4901 4949 } 4902 4950 … … 5425 5473 } 5426 5474 5475 void map_job_permissions(SEC_DESC *sd) 5476 { 5477 int i; 5478 5479 for (i = 0; sd->dacl && i < sd->dacl->num_aces; i++) { 5480 se_map_generic(&sd->dacl->aces[i].access_mask, 5481 &job_generic_mapping); 5482 } 5483 } 5484 5485 5427 5486 /**************************************************************************** 5428 5487 Check a user has permissions to perform the given operation. We use the … … 5506 5565 } 5507 5566 5508 /* Now this is the bit that really confuses me. The access 5509 type needs to be changed from JOB_ACCESS_ADMINISTER to 5510 PRINTER_ACCESS_ADMINISTER for this to work. Something 5511 to do with the child (job) object becoming like a 5512 printer?? -tpot */ 5513 5514 access_type = PRINTER_ACCESS_ADMINISTER; 5515 } 5516 5567 map_job_permissions(secdesc->sec); 5568 } else { 5569 map_printer_permissions(secdesc->sec); 5570 } 5571 5517 5572 /* Check access */ 5518 5519 map_printer_permissions(secdesc->sec);5520 5521 5573 result = se_access_check(secdesc->sec, user->nt_user_token, access_type, 5522 5574 &access_granted, &status); -
branches/samba-3.0/source/printing/printing.c
r1 r134 2526 2526 goto fail; 2527 2527 2528 /* The print job has been suc essfully handed over to the back-end */2528 /* The print job has been successfully handed over to the back-end */ 2529 2529 2530 2530 pjob->spooled = True; … … 2540 2540 fail: 2541 2541 2542 /* The print job was not succes fully started. Cleanup */2542 /* The print job was not successfully started. Cleanup */ 2543 2543 /* Still need to add proper error return propagation! 010122:JRR */ 2544 2544 unlink(pjob->filename);
Note:
See TracChangeset
for help on using the changeset viewer.