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

📄 pdb_tdb.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;	struct tdbsam_privates *tdb_state = (struct tdbsam_privates *)my_methods->private_data;	TDB_CONTEXT 		*pwd_tdb;	TDB_DATA 		data, key;	fstring 		keystr;	fstring			name;		if (user==NULL) {		DEBUG(0,("pdb_getsampwrid: SAM_ACCOUNT is NULL.\n"));		return nt_status;	}	/* set search key */	slprintf(keystr, sizeof(keystr)-1, "%s%.8x", RIDPREFIX, rid);	key.dptr = keystr;	key.dsize = strlen (keystr) + 1;	/* open the accounts TDB */	if (!(pwd_tdb = tdbsam_tdbopen(tdb_state->tdbsam_location, O_RDONLY))) {		DEBUG(0, ("pdb_getsampwrid: Unable to open TDB rid database!\n"));		return nt_status;	}	/* get the record */	data = tdb_fetch (pwd_tdb, key);	if (!data.dptr) {		DEBUG(5,("pdb_getsampwrid (TDB): error looking up RID %d by key %s.\n", rid, keystr));		DEBUGADD(5, (" Error: %s\n", tdb_errorstr(pwd_tdb)));		tdb_close (pwd_tdb);		return nt_status;	}	fstrcpy(name, data.dptr);	SAFE_FREE(data.dptr);		tdb_close (pwd_tdb);		return tdbsam_getsampwnam (my_methods, user, name);}static NTSTATUS tdbsam_getsampwsid(struct pdb_methods *my_methods, SAM_ACCOUNT * user, const DOM_SID *sid){	uint32 rid;	if (!sid_peek_check_rid(get_global_sam_sid(), sid, &rid))		return NT_STATUS_UNSUCCESSFUL;	return tdbsam_getsampwrid(my_methods, user, rid);}static BOOL tdb_delete_samacct_only(TDB_CONTEXT *pwd_tdb,				    struct pdb_methods *my_methods,				    SAM_ACCOUNT *sam_pass){	TDB_DATA 	key;	fstring 	keystr;	fstring		name;	fstrcpy(name, pdb_get_username(sam_pass));	strlower_m(name);	  	/* set the search key */	slprintf(keystr, sizeof(keystr)-1, "%s%s", USERPREFIX, name);	key.dptr = keystr;	key.dsize = strlen (keystr) + 1;		/* it's outaa here!  8^) */	if (tdb_delete(pwd_tdb, key) != TDB_SUCCESS) {		DEBUG(5, ("Error deleting entry from tdb passwd database!\n"));		DEBUGADD(5, (" Error: %s\n", tdb_errorstr(pwd_tdb)));		tdb_close(pwd_tdb); 		return False;	}	return True;}/*************************************************************************** Delete a SAM_ACCOUNT****************************************************************************/static NTSTATUS tdbsam_delete_sam_account(struct pdb_methods *my_methods, SAM_ACCOUNT *sam_pass){	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;	struct tdbsam_privates *tdb_state = (struct tdbsam_privates *)my_methods->private_data;	TDB_CONTEXT 	*pwd_tdb;	TDB_DATA 	key;	fstring 	keystr;	uint32		rid;	fstring		name;		fstrcpy(name, pdb_get_username(sam_pass));	strlower_m(name);		/* open the TDB */	if (!(pwd_tdb = tdbsam_tdbopen(tdb_state->tdbsam_location, O_RDWR))) {		DEBUG(0, ("Unable to open TDB passwd!"));		return nt_status;	}    	/* set the search key */	slprintf(keystr, sizeof(keystr)-1, "%s%s", USERPREFIX, name);	key.dptr = keystr;	key.dsize = strlen (keystr) + 1;		rid = pdb_get_user_rid(sam_pass);	/* it's outaa here!  8^) */	if (tdb_delete(pwd_tdb, key) != TDB_SUCCESS) {		DEBUG(5, ("Error deleting entry from tdb passwd database!\n"));		DEBUGADD(5, (" Error: %s\n", tdb_errorstr(pwd_tdb)));		tdb_close(pwd_tdb); 		return nt_status;	}		/* delete also the RID key */  	/* set the search key */	slprintf(keystr, sizeof(keystr)-1, "%s%.8x", RIDPREFIX, rid);	key.dptr = keystr;	key.dsize = strlen (keystr) + 1;	/* it's outaa here!  8^) */	if (tdb_delete(pwd_tdb, key) != TDB_SUCCESS) {		DEBUG(5, ("Error deleting entry from tdb rid database!\n"));		DEBUGADD(5, (" Error: %s\n", tdb_errorstr(pwd_tdb)));		tdb_close(pwd_tdb); 		return nt_status;	}		tdb_close(pwd_tdb);		return NT_STATUS_OK;}/*************************************************************************** Update the TDB SAM account record only****************************************************************************/static BOOL tdb_update_samacct_only(TDB_CONTEXT *pwd_tdb, 				    struct pdb_methods *my_methods, 				    SAM_ACCOUNT* newpwd, int flag){	TDB_DATA 	key, data;	uint8		*buf = NULL;	fstring 	keystr;	fstring		name;	BOOL		ret = True;	/* copy the SAM_ACCOUNT struct into a BYTE buffer for storage */	if ((data.dsize=init_buffer_from_sam (&buf, newpwd, False)) == -1) {		DEBUG(0,("tdb_update_sam: ERROR - Unable to copy SAM_ACCOUNT info BYTE buffer!\n"));		ret = False;		goto done;	}	data.dptr = (char *)buf;	fstrcpy(name, pdb_get_username(newpwd));	strlower_m(name);		DEBUG(5, ("Storing %saccount %s with RID %d\n", 		  flag == TDB_INSERT ? "(new) " : "", name, 		  pdb_get_user_rid(newpwd)));  	/* setup the USER index key */	slprintf(keystr, sizeof(keystr)-1, "%s%s", USERPREFIX, name);	key.dptr = keystr;	key.dsize = strlen(keystr) + 1;	/* add the account */	if (tdb_store(pwd_tdb, key, data, flag) != TDB_SUCCESS) {		DEBUG(0, ("Unable to modify passwd TDB!"));		DEBUGADD(0, (" Error: %s", tdb_errorstr(pwd_tdb)));		DEBUGADD(0, (" occured while storing the main record (%s)\n",			     keystr));		ret = False;		goto done;	}done:		/* cleanup */	SAFE_FREE(buf);		return (ret);}/*************************************************************************** Update the TDB SAM RID record only****************************************************************************/static BOOL tdb_update_ridrec_only(TDB_CONTEXT *pwd_tdb, 				   struct pdb_methods *my_methods, 				   SAM_ACCOUNT* newpwd, int flag){	TDB_DATA 	key, data;	fstring 	keystr;	fstring		name;	fstrcpy(name, pdb_get_username(newpwd));	strlower_m(name);	/* setup RID data */	data.dsize = strlen(name) + 1;	data.dptr = name;	/* setup the RID index key */	slprintf(keystr, sizeof(keystr)-1, "%s%.8x", RIDPREFIX, 		 pdb_get_user_rid(newpwd));	key.dptr = keystr;	key.dsize = strlen (keystr) + 1;		/* add the reference */	if (tdb_store(pwd_tdb, key, data, flag) != TDB_SUCCESS) {		DEBUG(0, ("Unable to modify TDB passwd !"));		DEBUGADD(0, (" Error: %s\n", tdb_errorstr(pwd_tdb)));		DEBUGADD(0, (" occured while storing the RID index (%s)\n", keystr));		return False;	}	return True;}/*************************************************************************** Update the TDB SAM****************************************************************************/static BOOL tdb_update_sam(struct pdb_methods *my_methods, SAM_ACCOUNT* newpwd, int flag){	struct tdbsam_privates *tdb_state = (struct tdbsam_privates *)my_methods->private_data;	TDB_CONTEXT 	*pwd_tdb = NULL;	BOOL		ret = True;	uint32		user_rid;	/* invalidate the existing TDB iterator if it is open */		if (tdb_state->passwd_tdb) {		tdb_close(tdb_state->passwd_tdb);		tdb_state->passwd_tdb = NULL;	} 	/* open the account TDB passwd*/		pwd_tdb = tdbsam_tdbopen(tdb_state->tdbsam_location, O_RDWR | O_CREAT);	  	if (!pwd_tdb) {		DEBUG(0, ("tdb_update_sam: Unable to open TDB passwd (%s)!\n", 			tdb_state->tdbsam_location));		return False;	}	if (!pdb_get_group_rid(newpwd)) {		DEBUG (0,("tdb_update_sam: Failing to store a SAM_ACCOUNT for [%s] without a primary group RID\n",			pdb_get_username(newpwd)));		ret = False;		goto done;	}	if ( !(user_rid = pdb_get_user_rid(newpwd)) ) {		DEBUG(0,("tdb_update_sam: SAM_ACCOUNT (%s) with no RID!\n", pdb_get_username(newpwd)));		ret = False;		goto done;	}	if (!tdb_update_samacct_only(pwd_tdb, my_methods, newpwd, flag) ||	    !tdb_update_ridrec_only(pwd_tdb, my_methods, newpwd, flag)) {		ret = False;		goto done;	}done:		/* cleanup */	tdb_close (pwd_tdb);		return (ret);	}/*************************************************************************** Modifies an existing SAM_ACCOUNT****************************************************************************/static NTSTATUS tdbsam_update_sam_account (struct pdb_methods *my_methods, SAM_ACCOUNT *newpwd){	if (tdb_update_sam(my_methods, newpwd, TDB_MODIFY))		return NT_STATUS_OK;	else		return NT_STATUS_UNSUCCESSFUL;}/*************************************************************************** Adds an existing SAM_ACCOUNT****************************************************************************/static NTSTATUS tdbsam_add_sam_account (struct pdb_methods *my_methods, SAM_ACCOUNT *newpwd){	if (tdb_update_sam(my_methods, newpwd, TDB_INSERT))		return NT_STATUS_OK;	else		return NT_STATUS_UNSUCCESSFUL;}/*************************************************************************** Renames a SAM_ACCOUNT - check for the posix user/rename user script - Add and lock the new user record - rename the posix user - rewrite the rid->username record - delete the old user - unlock the new user record***************************************************************************/static NTSTATUS tdbsam_rename_sam_account(struct pdb_methods *my_methods,					  SAM_ACCOUNT *old_acct, 					  const char *newname){	struct tdbsam_privates *tdb_state = 		(struct tdbsam_privates *)my_methods->private_data;	SAM_ACCOUNT *new_acct = NULL;	pstring rename_script;	TDB_CONTEXT 	*pwd_tdb = NULL;	NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;	BOOL interim_account = False;	if (!*(lp_renameuser_script()))		goto done;	if (!pdb_copy_sam_account(old_acct, &new_acct) ||	    !pdb_set_username(new_acct, newname, PDB_CHANGED))		goto done;	/* invalidate the existing TDB iterator if it is open */		if (tdb_state->passwd_tdb) {		tdb_close(tdb_state->passwd_tdb);		tdb_state->passwd_tdb = NULL;	} 	/* open the account TDB passwd */		pwd_tdb = tdbsam_tdbopen(tdb_state->tdbsam_location, O_RDWR | O_CREAT);	  	if (!pwd_tdb) {		DEBUG(0, ("tdb_update_sam: Unable to open TDB passwd (%s)!\n", 			tdb_state->tdbsam_location));		goto done;	}	/* add the new account and lock it */	if (!tdb_update_samacct_only(pwd_tdb, my_methods, new_acct, 				     TDB_INSERT))		goto done;	interim_account = True;	if (tdb_lock_bystring(pwd_tdb, newname, 30) == -1) {		goto done;	}	/* rename the posix user */	pstrcpy(rename_script, lp_renameuser_script());	if (*rename_script) {	        int rename_ret;		pstring_sub(rename_script, "%unew", newname);		pstring_sub(rename_script, "%uold", 			    pdb_get_username(old_acct));		rename_ret = smbrun(rename_script, NULL);		DEBUG(rename_ret ? 0 : 3,("Running the command `%s' gave %d\n", rename_script, rename_ret));		if (rename_ret) 			goto done;         } else {		goto done;	}	/* rewrite the rid->username record */	if (!tdb_update_ridrec_only(pwd_tdb, my_methods, new_acct, TDB_MODIFY))		goto done;	interim_account = False;	tdb_unlock_bystring(pwd_tdb, newname);	tdb_delete_samacct_only(pwd_tdb, my_methods, old_acct);	ret = NT_STATUS_OK;done:		/* cleanup */	if (interim_account) {		tdb_unlock_bystring(pwd_tdb, newname);		tdb_delete_samacct_only(pwd_tdb, my_methods, new_acct);	}	if (pwd_tdb)		tdb_close (pwd_tdb);	if (new_acct)		pdb_free_sam(&new_acct);		return (ret);	}	static void free_private_data(void **vp) {	struct tdbsam_privates **tdb_state = (struct tdbsam_privates **)vp;	tdbsam_tdbclose(*tdb_state);	*tdb_state = NULL;	/* No need to free any further, as it is talloc()ed */}/** * Init tdbsam backend * * @param pdb_context initialised passdb context * @param pdb_method backend methods structure to be filled with function pointers * @param location the backend tdb file location * * @return nt_status code **/static NTSTATUS pdb_init_tdbsam(PDB_CONTEXT *pdb_context, PDB_METHODS **pdb_method, const char *location){	NTSTATUS nt_status;	struct tdbsam_privates *tdb_state;	if (!NT_STATUS_IS_OK(nt_status = make_pdb_methods(pdb_context->mem_ctx, pdb_method))) {		return nt_status;	}	(*pdb_method)->name = "tdbsam";	(*pdb_method)->setsampwent = tdbsam_setsampwent;	(*pdb_method)->endsampwent = tdbsam_endsampwent;	(*pdb_method)->getsampwent = tdbsam_getsampwent;	(*pdb_method)->getsampwnam = tdbsam_getsampwnam;	(*pdb_method)->getsampwsid = tdbsam_getsampwsid;	(*pdb_method)->add_sam_account = tdbsam_add_sam_account;	(*pdb_method)->update_sam_account = tdbsam_update_sam_account;	(*pdb_method)->delete_sam_account = tdbsam_delete_sam_account;	(*pdb_method)->rename_sam_account = tdbsam_rename_sam_account;	tdb_state = TALLOC_ZERO_P(pdb_context->mem_ctx, struct tdbsam_privates);	if (!tdb_state) {		DEBUG(0, ("talloc() failed for tdbsam private_data!\n"));		return NT_STATUS_NO_MEMORY;	}	if (location) {		tdb_state->tdbsam_location = talloc_strdup(pdb_context->mem_ctx, location);	} else {		pstring tdbfile;		get_private_directory(tdbfile);		pstrcat(tdbfile, "/");		pstrcat(tdbfile, PASSDB_FILE_NAME);		tdb_state->tdbsam_location = talloc_strdup(pdb_context->mem_ctx, tdbfile);	}	(*pdb_method)->private_data = tdb_state;	(*pdb_method)->free_private_data = free_private_data;	return NT_STATUS_OK;}NTSTATUS pdb_tdbsam_init(void){	return smb_register_passdb(PASSDB_INTERFACE_VERSION, "tdbsam", pdb_init_tdbsam);}

⌨️ 快捷键说明

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