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

📄 nmbd_processlogon.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    Unix SMB/CIFS implementation.   NBT netbios routines and daemon - version 2   Copyright (C) Andrew Tridgell 1994-1998   Copyright (C) Luke Kenneth Casson Leighton 1994-1998   Copyright (C) Jeremy Allison 1994-2003   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002      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.      Revision History:*/#include "includes.h"struct sam_database_info {        uint32 index;        uint32 serial_lo, serial_hi;        uint32 date_lo, date_hi;};/****************************************************************************Send a message to smbd to do a sam delta sync**************************************************************************/static void send_repl_message(uint32 low_serial){        TDB_CONTEXT *tdb;        tdb = tdb_open_log(lock_path("connections.tdb"), 0,                           TDB_DEFAULT, O_RDONLY, 0);        if (!tdb) {                DEBUG(3, ("send_repl_message(): failed to open connections "                          "database\n"));                return;        }        DEBUG(3, ("sending replication message, serial = 0x%04x\n",                   low_serial));                message_send_all(tdb, MSG_SMB_SAM_REPL, &low_serial,                         sizeof(low_serial), False, NULL);        tdb_close(tdb);}/****************************************************************************Process a domain logon packet**************************************************************************/void process_logon_packet(struct packet_struct *p, char *buf,int len,                           const char *mailslot){	struct dgram_packet *dgram = &p->packet.dgram;	pstring my_name;	fstring reply_name;	pstring outbuf;	int code;	uint16 token = 0;	uint32 ntversion = 0;	uint16 lmnttoken = 0;	uint16 lm20token = 0;	uint32 domainsidsize;	BOOL short_request = False;	char *getdc;	char *uniuser; /* Unicode user name. */	pstring ascuser;	char *unicomp; /* Unicode computer name. */	memset(outbuf, 0, sizeof(outbuf));	if (!lp_domain_logons()) {		DEBUG(5,("process_logon_packet: Logon packet received from IP %s and domain \logons are not enabled.\n", inet_ntoa(p->ip) ));		return;	}	pstrcpy(my_name, global_myname());	code = SVAL(buf,0);	DEBUG(4,("process_logon_packet: Logon from %s: code = 0x%x\n", inet_ntoa(p->ip), code));	switch (code) {		case 0:    			{				fstring mach_str, user_str, getdc_str;				char *q = buf + 2;				char *machine = q;				char *user = skip_string(machine,1);				if (PTR_DIFF(user, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				getdc = skip_string(user,1);				if (PTR_DIFF(getdc, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				q = skip_string(getdc,1);				if (PTR_DIFF(q + 5, buf) > len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				token = SVAL(q,3);				fstrcpy(reply_name,my_name); 				pull_ascii_fstring(mach_str, machine);				pull_ascii_fstring(user_str, user);				pull_ascii_fstring(getdc_str, getdc);				DEBUG(5,("process_logon_packet: Domain login request from %s at IP %s user=%s token=%x\n",					mach_str,inet_ntoa(p->ip),user_str,token));				q = outbuf;				SSVAL(q, 0, 6);				q += 2;				fstrcpy(reply_name, "\\\\");				fstrcat(reply_name, my_name);				push_ascii_fstring(q, reply_name);				q = skip_string(q, 1); /* PDC name */				SSVAL(q, 0, token);				q += 2;				dump_data(4, outbuf, PTR_DIFF(q, outbuf));				send_mailslot(True, getdc_str, 						outbuf,PTR_DIFF(q,outbuf),						global_myname(), 0x0,						mach_str,						dgram->source_name.name_type,						p->ip, *iface_ip(p->ip), p->port);  				break;			}		case QUERYFORPDC:			{				fstring mach_str, getdc_str;				fstring source_name;				char *q = buf + 2;				char *machine = q;				if (!lp_domain_master()) {  					/* We're not Primary Domain Controller -- ignore this */					return;				}				getdc = skip_string(machine,1);				if (PTR_DIFF(getdc, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				q = skip_string(getdc,1);				if (PTR_DIFF(q, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				q = ALIGN2(q, buf);				/* At this point we can work out if this is a W9X or NT style				   request. Experiments show that the difference is wether the				   packet ends here. For a W9X request we now end with a pair of				   bytes (usually 0xFE 0xFF) whereas with NT we have two further				   strings - the following is a simple way of detecting this */				if (len - PTR_DIFF(q, buf) <= 3) {					short_request = True;				} else {					unicomp = q;					if (PTR_DIFF(q, buf) >= len) {						DEBUG(0,("process_logon_packet: bad packet\n"));						return;					}					/* A full length (NT style) request */					q = skip_unibuf(unicomp, PTR_DIFF(buf + len, unicomp));					if (PTR_DIFF(q, buf) >= len) {						DEBUG(0,("process_logon_packet: bad packet\n"));						return;					}					if (len - PTR_DIFF(q, buf) > 8) {						/* with NT5 clients we can sometimes							get additional data - a length specificed string							containing the domain name, then 16 bytes of							data (no idea what it is) */						int dom_len = CVAL(q, 0);						q++;						if (dom_len != 0) {							q += dom_len + 1;						}						q += 16;					}					if (PTR_DIFF(q + 8, buf) > len) {						DEBUG(0,("process_logon_packet: bad packet\n"));						return;					}					ntversion = IVAL(q, 0);					lmnttoken = SVAL(q, 4);					lm20token = SVAL(q, 6);				}				/* Construct reply. */				q = outbuf;				SSVAL(q, 0, QUERYFORPDC_R);				q += 2;				fstrcpy(reply_name,my_name);				push_ascii_fstring(q, reply_name);				q = skip_string(q, 1); /* PDC name */				/* PDC and domain name */				if (!short_request) {					/* Make a full reply */					q = ALIGN2(q, outbuf);					q += dos_PutUniCode(q, my_name, sizeof(pstring), True); /* PDC name */					q += dos_PutUniCode(q, lp_workgroup(),sizeof(pstring), True); /* Domain name*/					SIVAL(q, 0, 1); /* our nt version */					SSVAL(q, 4, 0xffff); /* our lmnttoken */					SSVAL(q, 6, 0xffff); /* our lm20token */					q += 8;				}				/* RJS, 21-Feb-2000, we send a short reply if the request was short */				pull_ascii_fstring(mach_str, machine);				DEBUG(5,("process_logon_packet: GETDC request from %s at IP %s, \reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",					mach_str,inet_ntoa(p->ip), reply_name, lp_workgroup(),					QUERYFORPDC_R, (uint32)ntversion, (uint32)lmnttoken,					(uint32)lm20token ));				dump_data(4, outbuf, PTR_DIFF(q, outbuf));				pull_ascii_fstring(getdc_str, getdc);				pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);				send_mailslot(True, getdc_str,					outbuf,PTR_DIFF(q,outbuf),					global_myname(), 0x0,					source_name,					dgram->source_name.name_type,					p->ip, *iface_ip(p->ip), p->port);  				return;			}		case SAMLOGON:			{				fstring getdc_str;				fstring source_name;				char *q = buf + 2;				fstring asccomp;				q += 2;				if (PTR_DIFF(q, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				unicomp = q;				uniuser = skip_unibuf(unicomp, PTR_DIFF(buf+len, unicomp));				if (PTR_DIFF(uniuser, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				getdc = skip_unibuf(uniuser,PTR_DIFF(buf+len, uniuser));				if (PTR_DIFF(getdc, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				q = skip_string(getdc,1);				if (PTR_DIFF(q + 8, buf) >= len) {					DEBUG(0,("process_logon_packet: bad packet\n"));					return;				}				q += 4; /* Account Control Bits - indicating username type */				domainsidsize = IVAL(q, 0);

⌨️ 快捷键说明

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