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

📄 login_cache.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
字号:
/*    Unix SMB/CIFS implementation.   SAM_ACCOUNT local cache for    Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2004.         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"#undef DBGC_CLASS#define DBGC_CLASS DBGC_PASSDB#define LOGIN_CACHE_FILE "login_cache.tdb"#define SAM_CACHE_FORMAT "dwwd"static TDB_CONTEXT *cache;BOOL login_cache_init(void){	char* cache_fname = NULL;		/* skip file open if it's already opened */	if (cache) return True;	asprintf(&cache_fname, "%s/%s", lp_lockdir(), LOGIN_CACHE_FILE);	if (cache_fname)		DEBUG(5, ("Opening cache file at %s\n", cache_fname));	else {		DEBUG(0, ("Filename allocation failed.\n"));		return False;	}	cache = tdb_open_log(cache_fname, 0, TDB_DEFAULT,	                     O_RDWR|O_CREAT, 0644);	if (!cache)		DEBUG(5, ("Attempt to open %s failed.\n", cache_fname));	SAFE_FREE(cache_fname);	return (cache ? True : False);}BOOL login_cache_shutdown(void){	/* tdb_close routine returns -1 on error */	if (!cache) return False;	DEBUG(5, ("Closing cache file\n"));	return tdb_close(cache) != -1;}/* if we can't read the cache, oh well, no need to return anything */LOGIN_CACHE * login_cache_read(SAM_ACCOUNT *sampass){	TDB_DATA keybuf, databuf;	LOGIN_CACHE *entry;	if (!login_cache_init())		return NULL;	keybuf.dptr = SMB_STRDUP(pdb_get_nt_username(sampass));	if (!keybuf.dptr || !strlen(keybuf.dptr)) {		SAFE_FREE(keybuf.dptr);		return NULL;	}	keybuf.dsize = strlen(keybuf.dptr) + 1;	DEBUG(7, ("Looking up login cache for user %s\n",		  keybuf.dptr));	databuf = tdb_fetch(cache, keybuf);	SAFE_FREE(keybuf.dptr);	if (!(entry = SMB_MALLOC_P(LOGIN_CACHE))) {		DEBUG(1, ("Unable to allocate cache entry buffer!\n"));		SAFE_FREE(databuf.dptr);		return NULL;	}	if (tdb_unpack (databuf.dptr, databuf.dsize, SAM_CACHE_FORMAT,			&entry->entry_timestamp, &entry->acct_ctrl, 			&entry->bad_password_count, 			&entry->bad_password_time) == -1) {		DEBUG(7, ("No cache entry found\n"));		SAFE_FREE(entry);		SAFE_FREE(databuf.dptr);		return NULL;	}	SAFE_FREE(databuf.dptr);	DEBUG(5, ("Found login cache entry: timestamp %12u, flags 0x%x, count %d, time %12u\n",		  (unsigned int)entry->entry_timestamp, entry->acct_ctrl, 		  entry->bad_password_count, (unsigned int)entry->bad_password_time));	return entry;}BOOL login_cache_write(const SAM_ACCOUNT *sampass, LOGIN_CACHE entry){	TDB_DATA keybuf, databuf;	BOOL ret;	if (!login_cache_init())		return False;	keybuf.dptr = SMB_STRDUP(pdb_get_nt_username(sampass));	if (!keybuf.dptr || !strlen(keybuf.dptr)) {		SAFE_FREE(keybuf.dptr);		return False;	}	keybuf.dsize = strlen(keybuf.dptr) + 1;	entry.entry_timestamp = time(NULL);	databuf.dsize = 		tdb_pack(NULL, 0, SAM_CACHE_FORMAT,			 entry.entry_timestamp,			 entry.acct_ctrl,			 entry.bad_password_count,			 entry.bad_password_time);	databuf.dptr = SMB_MALLOC(databuf.dsize);	if (!databuf.dptr) {		SAFE_FREE(keybuf.dptr);		return False;	}			 	if (tdb_pack(databuf.dptr, databuf.dsize, SAM_CACHE_FORMAT,			 entry.entry_timestamp,			 entry.acct_ctrl,			 entry.bad_password_count,			 entry.bad_password_time)	    != databuf.dsize) {		SAFE_FREE(keybuf.dptr);		SAFE_FREE(databuf.dptr);		return False;	}	ret = tdb_store(cache, keybuf, databuf, 0);	SAFE_FREE(keybuf.dptr);	SAFE_FREE(databuf.dptr);	return ret == 0;}BOOL login_cache_delentry(const SAM_ACCOUNT *sampass){	int ret;	TDB_DATA keybuf;		if (!login_cache_init()) 		return False;		keybuf.dptr = SMB_STRDUP(pdb_get_nt_username(sampass));	if (!keybuf.dptr || !strlen(keybuf.dptr)) {		SAFE_FREE(keybuf.dptr);		return False;	}	keybuf.dsize = strlen(keybuf.dptr) + 1;	DEBUG(9, ("About to delete entry for %s\n", keybuf.dptr));	ret = tdb_delete(cache, keybuf);	DEBUG(9, ("tdb_delete returned %d\n", ret));		SAFE_FREE(keybuf.dptr);	return ret == 0;}

⌨️ 快捷键说明

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