⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nt_printing.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* *  Unix SMB/CIFS implementation. *  RPC Pipe client / server routines *  Copyright (C) Andrew Tridgell              1992-2000, *  Copyright (C) Jean François Micouleau      1998-2000. *  Copyright (C) Gerald Carter                2002-2005. * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include "includes.h"extern struct current_user current_user;static TDB_CONTEXT *tdb_forms; /* used for forms files */static TDB_CONTEXT *tdb_drivers; /* used for driver files */static TDB_CONTEXT *tdb_printers; /* used for printers files */#define FORMS_PREFIX "FORMS/"#define DRIVERS_PREFIX "DRIVERS/"#define DRIVER_INIT_PREFIX "DRIVER_INIT/"#define PRINTERS_PREFIX "PRINTERS/"#define SECDESC_PREFIX "SECDESC/"#define GLOBAL_C_SETPRINTER "GLOBALS/c_setprinter" #define NTDRIVERS_DATABASE_VERSION_1 1#define NTDRIVERS_DATABASE_VERSION_2 2#define NTDRIVERS_DATABASE_VERSION_3 3 /* little endian version of v2 */#define NTDRIVERS_DATABASE_VERSION_4 4 /* fix generic bits in security descriptors */#define NTDRIVERS_DATABASE_VERSION_5 5 /* normalize keys in ntprinters.tdb *//* Map generic permissions to printer object specific permissions */GENERIC_MAPPING printer_generic_mapping = {	PRINTER_READ,	PRINTER_WRITE,	PRINTER_EXECUTE,	PRINTER_ALL_ACCESS};STANDARD_MAPPING printer_std_mapping = {	PRINTER_READ,	PRINTER_WRITE,	PRINTER_EXECUTE,	PRINTER_ALL_ACCESS};/* Map generic permissions to print server object specific permissions */GENERIC_MAPPING printserver_generic_mapping = {	SERVER_READ,	SERVER_WRITE,	SERVER_EXECUTE,	SERVER_ALL_ACCESS};STANDARD_MAPPING printserver_std_mapping = {	SERVER_READ,	SERVER_WRITE,	SERVER_EXECUTE,	SERVER_ALL_ACCESS};/* We need one default form to support our default printer. Msoft adds theforms it wants and in the ORDER it wants them (note: DEVMODE papersize is anarray index). Letter is always first, so (for the current code) additionsalways put things in the correct order. */static const nt_forms_struct default_forms[] = {	{"Letter",0x1,0x34b5c,0x44368,0x0,0x0,0x34b5c,0x44368},	{"Letter Small",0x1,0x34b5c,0x44368,0x0,0x0,0x34b5c,0x44368},	{"Tabloid",0x1,0x44368,0x696b8,0x0,0x0,0x44368,0x696b8},	{"Ledger",0x1,0x696b8,0x44368,0x0,0x0,0x696b8,0x44368},	{"Legal",0x1,0x34b5c,0x56d10,0x0,0x0,0x34b5c,0x56d10},	{"Statement",0x1,0x221b4,0x34b5c,0x0,0x0,0x221b4,0x34b5c},	{"Executive",0x1,0x2cf56,0x411cc,0x0,0x0,0x2cf56,0x411cc},	{"A3",0x1,0x48828,0x668a0,0x0,0x0,0x48828,0x668a0},	{"A4",0x1,0x33450,0x48828,0x0,0x0,0x33450,0x48828},	{"A4 Small",0x1,0x33450,0x48828,0x0,0x0,0x33450,0x48828},	{"A5",0x1,0x24220,0x33450,0x0,0x0,0x24220,0x33450},	{"B4 (JIS)",0x1,0x3ebe8,0x58de0,0x0,0x0,0x3ebe8,0x58de0},	{"B5 (JIS)",0x1,0x2c6f0,0x3ebe8,0x0,0x0,0x2c6f0,0x3ebe8},	{"Folio",0x1,0x34b5c,0x509d8,0x0,0x0,0x34b5c,0x509d8},	{"Quarto",0x1,0x347d8,0x43238,0x0,0x0,0x347d8,0x43238},	{"10x14",0x1,0x3e030,0x56d10,0x0,0x0,0x3e030,0x56d10},	{"11x17",0x1,0x44368,0x696b8,0x0,0x0,0x44368,0x696b8},	{"Note",0x1,0x34b5c,0x44368,0x0,0x0,0x34b5c,0x44368},	{"Envelope #9",0x1,0x18079,0x37091,0x0,0x0,0x18079,0x37091},	{"Envelope #10",0x1,0x19947,0x3ae94,0x0,0x0,0x19947,0x3ae94},	{"Envelope #11",0x1,0x1be7c,0x40565,0x0,0x0,0x1be7c,0x40565},	{"Envelope #12",0x1,0x1d74a,0x44368,0x0,0x0,0x1d74a,0x44368},	{"Envelope #14",0x1,0x1f018,0x47504,0x0,0x0,0x1f018,0x47504},	{"C size sheet",0x1,0x696b8,0x886d0,0x0,0x0,0x696b8,0x886d0},	{"D size sheet",0x1,0x886d0,0xd2d70,0x0,0x0,0x886d0,0xd2d70},	{"E size sheet",0x1,0xd2d70,0x110da0,0x0,0x0,0xd2d70,0x110da0},	{"Envelope DL",0x1,0x1adb0,0x35b60,0x0,0x0,0x1adb0,0x35b60},	{"Envelope C5",0x1,0x278d0,0x37e88,0x0,0x0,0x278d0,0x37e88},	{"Envelope C3",0x1,0x4f1a0,0x6fd10,0x0,0x0,0x4f1a0,0x6fd10},	{"Envelope C4",0x1,0x37e88,0x4f1a0,0x0,0x0,0x37e88,0x4f1a0},	{"Envelope C6",0x1,0x1bd50,0x278d0,0x0,0x0,0x1bd50,0x278d0},	{"Envelope C65",0x1,0x1bd50,0x37e88,0x0,0x0,0x1bd50,0x37e88},	{"Envelope B4",0x1,0x3d090,0x562e8,0x0,0x0,0x3d090,0x562e8},	{"Envelope B5",0x1,0x2af80,0x3d090,0x0,0x0,0x2af80,0x3d090},	{"Envelope B6",0x1,0x2af80,0x1e848,0x0,0x0,0x2af80,0x1e848},	{"Envelope",0x1,0x1adb0,0x38270,0x0,0x0,0x1adb0,0x38270},	{"Envelope Monarch",0x1,0x18079,0x2e824,0x0,0x0,0x18079,0x2e824},	{"6 3/4 Envelope",0x1,0x167ab,0x284ec,0x0,0x0,0x167ab,0x284ec},	{"US Std Fanfold",0x1,0x5c3e1,0x44368,0x0,0x0,0x5c3e1,0x44368},	{"German Std Fanfold",0x1,0x34b5c,0x4a6a0,0x0,0x0,0x34b5c,0x4a6a0},	{"German Legal Fanfold",0x1,0x34b5c,0x509d8,0x0,0x0,0x34b5c,0x509d8},	{"B4 (ISO)",0x1,0x3d090,0x562e8,0x0,0x0,0x3d090,0x562e8},	{"Japanese Postcard",0x1,0x186a0,0x24220,0x0,0x0,0x186a0,0x24220},	{"9x11",0x1,0x37cf8,0x44368,0x0,0x0,0x37cf8,0x44368},	{"10x11",0x1,0x3e030,0x44368,0x0,0x0,0x3e030,0x44368},	{"15x11",0x1,0x5d048,0x44368,0x0,0x0,0x5d048,0x44368},	{"Envelope Invite",0x1,0x35b60,0x35b60,0x0,0x0,0x35b60,0x35b60},	{"Reserved48",0x1,0x1,0x1,0x0,0x0,0x1,0x1},	{"Reserved49",0x1,0x1,0x1,0x0,0x0,0x1,0x1},	{"Letter Extra",0x1,0x3ae94,0x4a6a0,0x0,0x0,0x3ae94,0x4a6a0},	{"Legal Extra",0x1,0x3ae94,0x5d048,0x0,0x0,0x3ae94,0x5d048},	{"Tabloid Extra",0x1,0x4a6a0,0x6f9f0,0x0,0x0,0x4a6a0,0x6f9f0},	{"A4 Extra",0x1,0x397c2,0x4eb16,0x0,0x0,0x397c2,0x4eb16},	{"Letter Transverse",0x1,0x34b5c,0x44368,0x0,0x0,0x34b5c,0x44368},	{"A4 Transverse",0x1,0x33450,0x48828,0x0,0x0,0x33450,0x48828},	{"Letter Extra Transverse",0x1,0x3ae94,0x4a6a0,0x0,0x0,0x3ae94,0x4a6a0},	{"Super A",0x1,0x376b8,0x56ea0,0x0,0x0,0x376b8,0x56ea0},	{"Super B",0x1,0x4a768,0x76e58,0x0,0x0,0x4a768,0x76e58},	{"Letter Plus",0x1,0x34b5c,0x4eb16,0x0,0x0,0x34b5c,0x4eb16},	{"A4 Plus",0x1,0x33450,0x50910,0x0,0x0,0x33450,0x50910},	{"A5 Transverse",0x1,0x24220,0x33450,0x0,0x0,0x24220,0x33450},	{"B5 (JIS) Transverse",0x1,0x2c6f0,0x3ebe8,0x0,0x0,0x2c6f0,0x3ebe8},	{"A3 Extra",0x1,0x4e9d0,0x6ca48,0x0,0x0,0x4e9d0,0x6ca48},	{"A5 Extra",0x1,0x2a7b0,0x395f8,0x0,0x0,0x2a7b0,0x395f8},	{"B5 (ISO) Extra",0x1,0x31128,0x43620,0x0,0x0,0x31128,0x43620},	{"A2",0x1,0x668a0,0x91050,0x0,0x0,0x668a0,0x91050},	{"A3 Transverse",0x1,0x48828,0x668a0,0x0,0x0,0x48828,0x668a0},	{"A3 Extra Transverse",0x1,0x4e9d0,0x6ca48,0x0,0x0,0x4e9d0,0x6ca48},	{"Japanese Double Postcard",0x1,0x30d40,0x24220,0x0,0x0,0x30d40,0x24220},	{"A6",0x1,0x19a28,0x24220,0x0,0x0,0x19a28,0x24220},	{"Japanese Envelope Kaku #2",0x1,0x3a980,0x510e0,0x0,0x0,0x3a980,0x510e0},	{"Japanese Envelope Kaku #3",0x1,0x34bc0,0x43a08,0x0,0x0,0x34bc0,0x43a08},	{"Japanese Envelope Chou #3",0x1,0x1d4c0,0x395f8,0x0,0x0,0x1d4c0,0x395f8},	{"Japanese Envelope Chou #4",0x1,0x15f90,0x320c8,0x0,0x0,0x15f90,0x320c8},	{"Letter Rotated",0x1,0x44368,0x34b5c,0x0,0x0,0x44368,0x34b5c},	{"A3 Rotated",0x1,0x668a0,0x48828,0x0,0x0,0x668a0,0x48828},	{"A4 Rotated",0x1,0x48828,0x33450,0x0,0x0,0x48828,0x33450},	{"A5 Rotated",0x1,0x33450,0x24220,0x0,0x0,0x33450,0x24220},	{"B4 (JIS) Rotated",0x1,0x58de0,0x3ebe8,0x0,0x0,0x58de0,0x3ebe8},	{"B5 (JIS) Rotated",0x1,0x3ebe8,0x2c6f0,0x0,0x0,0x3ebe8,0x2c6f0},	{"Japanese Postcard Rotated",0x1,0x24220,0x186a0,0x0,0x0,0x24220,0x186a0},	{"Double Japan Postcard Rotated",0x1,0x24220,0x30d40,0x0,0x0,0x24220,0x30d40},	{"A6 Rotated",0x1,0x24220,0x19a28,0x0,0x0,0x24220,0x19a28},	{"Japan Envelope Kaku #2 Rotated",0x1,0x510e0,0x3a980,0x0,0x0,0x510e0,0x3a980},	{"Japan Envelope Kaku #3 Rotated",0x1,0x43a08,0x34bc0,0x0,0x0,0x43a08, 0x34bc0},	{"Japan Envelope Chou #3 Rotated",0x1,0x395f8,0x1d4c0,0x0,0x0,0x395f8,0x1d4c0},	{"Japan Envelope Chou #4 Rotated",0x1,0x320c8,0x15f90,0x0,0x0,0x320c8,0x15f90},	{"B6 (JIS)",0x1,0x1f400,0x2c6f0,0x0,0x0,0x1f400,0x2c6f0},	{"B6 (JIS) Rotated",0x1,0x2c6f0,0x1f400,0x0,0x0,0x2c6f0,0x1f400},	{"12x11",0x1,0x4a724,0x443e1,0x0,0x0,0x4a724,0x443e1},	{"Japan Envelope You #4",0x1,0x19a28,0x395f8,0x0,0x0,0x19a28,0x395f8},	{"Japan Envelope You #4 Rotated",0x1,0x395f8,0x19a28,0x0,0x0,0x395f8,0x19a28},	{"PRC 16K",0x1,0x2de60,0x3f7a0,0x0,0x0,0x2de60,0x3f7a0},	{"PRC 32K",0x1,0x1fbd0,0x2cec0,0x0,0x0,0x1fbd0,0x2cec0},	{"PRC 32K(Big)",0x1,0x222e0,0x318f8,0x0,0x0,0x222e0,0x318f8},	{"PRC Envelope #1",0x1,0x18e70,0x28488,0x0,0x0,0x18e70,0x28488},	{"PRC Envelope #2",0x1,0x18e70,0x2af80,0x0,0x0,0x18e70,0x2af80},	{"PRC Envelope #3",0x1,0x1e848,0x2af80,0x0,0x0,0x1e848,0x2af80},	{"PRC Envelope #4",0x1,0x1adb0,0x32c80,0x0,0x0,0x1adb0,0x32c80},	{"PRC Envelope #5",0x1,0x1adb0,0x35b60,0x0,0x0,0x1adb0,0x35b60},	{"PRC Envelope #6",0x1,0x1d4c0,0x38270,0x0,0x0,0x1d4c0,0x38270},	{"PRC Envelope #7",0x1,0x27100,0x38270,0x0,0x0,0x27100,0x38270},	{"PRC Envelope #8",0x1,0x1d4c0,0x4b708,0x0,0x0,0x1d4c0,0x4b708},	{"PRC Envelope #9",0x1,0x37e88,0x4f1a0,0x0,0x0,0x37e88,0x4f1a0},	{"PRC Envelope #10",0x1,0x4f1a0,0x6fd10,0x0,0x0,0x4f1a0,0x6fd10},	{"PRC 16K Rotated",0x1,0x3f7a0,0x2de60,0x0,0x0,0x3f7a0,0x2de60},	{"PRC 32K Rotated",0x1,0x2cec0,0x1fbd0,0x0,0x0,0x2cec0,0x1fbd0},	{"PRC 32K(Big) Rotated",0x1,0x318f8,0x222e0,0x0,0x0,0x318f8,0x222e0},	{"PRC Envelope #1 Rotated",0x1,0x28488,0x18e70,0x0,0x0,0x28488,0x18e70},	{"PRC Envelope #2 Rotated",0x1,0x2af80,0x18e70,0x0,0x0,0x2af80,0x18e70},	{"PRC Envelope #3 Rotated",0x1,0x2af80,0x1e848,0x0,0x0,0x2af80,0x1e848},	{"PRC Envelope #4 Rotated",0x1,0x32c80,0x1adb0,0x0,0x0,0x32c80,0x1adb0},	{"PRC Envelope #5 Rotated",0x1,0x35b60,0x1adb0,0x0,0x0,0x35b60,0x1adb0},	{"PRC Envelope #6 Rotated",0x1,0x38270,0x1d4c0,0x0,0x0,0x38270,0x1d4c0},	{"PRC Envelope #7 Rotated",0x1,0x38270,0x27100,0x0,0x0,0x38270,0x27100},	{"PRC Envelope #8 Rotated",0x1,0x4b708,0x1d4c0,0x0,0x0,0x4b708,0x1d4c0},	{"PRC Envelope #9 Rotated",0x1,0x4f1a0,0x37e88,0x0,0x0,0x4f1a0,0x37e88},	{"PRC Envelope #10 Rotated",0x1,0x6fd10,0x4f1a0,0x0,0x0,0x6fd10,0x4f1a0}};struct table_node {	const char 	*long_archi;	const char 	*short_archi;	int	version;}; #define SPL_ARCH_WIN40		"WIN40"#define SPL_ARCH_W32X86		"W32X86"#define SPL_ARCH_W32MIPS	"W32MIPS"#define SPL_ARCH_W32ALPHA	"W32ALPHA"#define SPL_ARCH_W32PPC		"W32PPC"#define SPL_ARCH_IA64		"IA64"#define SPL_ARCH_X64		"x64"static const struct table_node archi_table[]= {	{"Windows 4.0",          SPL_ARCH_WIN40,	0 },	{"Windows NT x86",       SPL_ARCH_W32X86,	2 },	{"Windows NT R4000",     SPL_ARCH_W32MIPS,	2 },	{"Windows NT Alpha_AXP", SPL_ARCH_W32ALPHA,	2 },	{"Windows NT PowerPC",   SPL_ARCH_W32PPC,	2 },	{"Windows IA64",   	 SPL_ARCH_IA64,		3 },	{"Windows x64",   	 SPL_ARCH_X64,		3 },	{NULL,                   "",		-1 }};/**************************************************************************** generate a new TDB_DATA key for storing a printer****************************************************************************/static TDB_DATA make_printer_tdbkey( const char *sharename ){	fstring share;	static pstring keystr;	TDB_DATA key;		fstrcpy( share, sharename );	strlower_m( share );		pstr_sprintf( keystr, "%s%s", PRINTERS_PREFIX, share );		key.dptr = keystr;	key.dsize = strlen(keystr)+1;	return key;}/**************************************************************************** generate a new TDB_DATA key for storing a printer security descriptor****************************************************************************/static char* make_printers_secdesc_tdbkey( const char* sharename  ){	fstring share;	static pstring keystr;		fstrcpy( share, sharename );	strlower_m( share );		pstr_sprintf( keystr, "%s%s", SECDESC_PREFIX, share );	return keystr;}/********************************************************************************************************************************************************/static BOOL upgrade_to_version_3(void){	TDB_DATA kbuf, newkey, dbuf; 	DEBUG(0,("upgrade_to_version_3: upgrading print tdb's to version 3\n")); 	for (kbuf = tdb_firstkey(tdb_drivers); kbuf.dptr;			newkey = tdb_nextkey(tdb_drivers, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {		dbuf = tdb_fetch(tdb_drivers, kbuf);		if (strncmp(kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) == 0) {			DEBUG(0,("upgrade_to_version_3:moving form\n"));			if (tdb_store(tdb_forms, kbuf, dbuf, TDB_REPLACE) != 0) {				SAFE_FREE(dbuf.dptr);				DEBUG(0,("upgrade_to_version_3: failed to move form. Error (%s).\n", tdb_errorstr(tdb_forms)));				return False;			}			if (tdb_delete(tdb_drivers, kbuf) != 0) {				SAFE_FREE(dbuf.dptr);				DEBUG(0,("upgrade_to_version_3: failed to delete form. Error (%s)\n", tdb_errorstr(tdb_drivers)));				return False;			}		} 		if (strncmp(kbuf.dptr, PRINTERS_PREFIX, strlen(PRINTERS_PREFIX)) == 0) {			DEBUG(0,("upgrade_to_version_3:moving printer\n"));			if (tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE) != 0) {				SAFE_FREE(dbuf.dptr);				DEBUG(0,("upgrade_to_version_3: failed to move printer. Error (%s)\n", tdb_errorstr(tdb_printers)));				return False;			}			if (tdb_delete(tdb_drivers, kbuf) != 0) {				SAFE_FREE(dbuf.dptr);				DEBUG(0,("upgrade_to_version_3: failed to delete printer. Error (%s)\n", tdb_errorstr(tdb_drivers)));				return False;			}		} 		if (strncmp(kbuf.dptr, SECDESC_PREFIX, strlen(SECDESC_PREFIX)) == 0) {			DEBUG(0,("upgrade_to_version_3:moving secdesc\n"));			if (tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE) != 0) {				SAFE_FREE(dbuf.dptr);				DEBUG(0,("upgrade_to_version_3: failed to move secdesc. Error (%s)\n", tdb_errorstr(tdb_printers)));				return False;			}			if (tdb_delete(tdb_drivers, kbuf) != 0) {				SAFE_FREE(dbuf.dptr);				DEBUG(0,("upgrade_to_version_3: failed to delete secdesc. Error (%s)\n", tdb_errorstr(tdb_drivers)));				return False;			}		} 		SAFE_FREE(dbuf.dptr);	}	return True;}/******************************************************************* Fix an issue with security descriptors.  Printer sec_desc must  use more than the generic bits that were previously used  in <= 3.0.14a.  They must also have a owner and group SID assigned. Otherwise, any printers than have been migrated to a Windows  host using printmig.exe will not be accessible.*******************************************************************/static int sec_desc_upg_fn( TDB_CONTEXT *the_tdb, TDB_DATA key,                            TDB_DATA data, void *state ){	prs_struct ps;	SEC_DESC_BUF *sd_orig = NULL;	SEC_DESC_BUF *sd_new, *sd_store;	SEC_DESC *sec, *new_sec;	TALLOC_CTX *ctx = state;	int result, i;	uint32 sd_size;	size_t size_new_sec;	DOM_SID sid;	if (!data.dptr || data.dsize == 0)		return 0;	if ( strncmp( key.dptr, SECDESC_PREFIX, strlen(SECDESC_PREFIX) ) != 0 )		return 0;	/* upgrade the security descriptor */	ZERO_STRUCT( ps );	prs_init( &ps, 0, ctx, UNMARSHALL );	prs_give_memory( &ps, data.dptr, data.dsize, True );	if ( !sec_io_desc_buf( "sec_desc_upg_fn", &sd_orig, &ps, 1 ) ) {		/* delete bad entries */		DEBUG(0,("sec_desc_upg_fn: Failed to parse original sec_desc for %si.  Deleting....\n", key.dptr ));		tdb_delete( tdb_printers, key );		return 0;	}	sec = sd_orig->sec;			/* is this even valid? */		if ( !sec->dacl )		return 0;			/* update access masks */		for ( i=0; i<sec->dacl->num_aces; i++ ) {		switch ( sec->dacl->ace[i].info.mask ) {			case (GENERIC_READ_ACCESS | GENERIC_WRITE_ACCESS | GENERIC_EXECUTE_ACCESS):				sec->dacl->ace[i].info.mask = PRINTER_ACE_PRINT;				break;							case GENERIC_ALL_ACCESS:				sec->dacl->ace[i].info.mask = PRINTER_ACE_FULL_CONTROL;				break;							case READ_CONTROL_ACCESS:				sec->dacl->ace[i].info.mask = PRINTER_ACE_MANAGE_DOCUMENTS;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -