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

📄 pdb_xml.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * XML password backend for samba * Copyright (C) Jelmer Vernooij 2002 * Some parts based on the libxml gjobread example by Daniel Veillard *  * 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. *//* FIXME:  * - Support stdin input by using '-' * - Be faster. Don't rewrite the whole file when adding a user, but store it in the memory and save it when exiting. Requires changes to samba source. * - Gives the ability to read/write to standard input/output * - Do locking! * - Better names! */#define XML_URL "http://samba.org/samba/DTD/passdb"#include "includes.h"#include <libxml/xmlmemory.h>#include <libxml/parser.h>static int xmlsam_debug_level = DBGC_ALL;#undef DBGC_CLASS#define DBGC_CLASS xmlsam_debug_level/* Helper utilities for charset conversion */static xmlNodePtr smbXmlNewChild(xmlNodePtr prnt, xmlNsPtr ns, const xmlChar *name, const char *content){	char *string_utf8;	xmlNodePtr ret;	if(!content) return xmlNewChild(prnt, ns, name, NULL);		if(push_utf8_allocate(&string_utf8,content) == (size_t)-1)       return NULL;	ret = xmlNewTextChild(prnt, ns, name, string_utf8);	SAFE_FREE(string_utf8);	return ret;}static char * iota(int a) {	static char tmp[10];	snprintf(tmp, 9, "%d", a);	return tmp;}static BOOL parsePass(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SAM_ACCOUNT * u){	pstring temp;	cur = cur->xmlChildrenNode;	while (cur != NULL) {		if (strcmp(cur->name, "crypt"))			DEBUG(0, ("Unknown element %s\n", cur->name));		else {			if (!strcmp(xmlGetProp(cur, "type"), "nt")				&&				pdb_gethexpwd(xmlNodeListGetString							  (doc, cur->xmlChildrenNode, 1), temp))				pdb_set_nt_passwd(u, temp, PDB_SET);			else if (!strcmp(xmlGetProp(cur, "type"), "lanman")					 &&					 pdb_gethexpwd(xmlNodeListGetString								   (doc, cur->xmlChildrenNode, 1), temp))				pdb_set_lanman_passwd(u, temp, PDB_SET);			else				DEBUG(0,					  ("Unknown crypt type: %s\n",					   xmlGetProp(cur, "type")));		}		cur = cur->next;	}	return True;}static BOOL parseUser(xmlDocPtr doc, xmlNsPtr ns, xmlNodePtr cur, SAM_ACCOUNT * u){	char *tmp;	DOM_SID sid;	tmp = xmlGetProp(cur, "sid");	if (tmp){		string_to_sid(&sid, tmp);		pdb_set_user_sid(u, &sid, PDB_SET);	}	pdb_set_username(u, xmlGetProp(cur, "name"), PDB_SET);	/* We don't care what the top level element name is */	cur = cur->xmlChildrenNode;	while (cur != NULL) {		if ((!strcmp(cur->name, "group")) && (cur->ns == ns)) {			tmp = xmlGetProp(cur, "sid");			if (tmp){				string_to_sid(&sid, tmp);				pdb_set_group_sid(u, &sid, PDB_SET);			}		}		else if ((!strcmp(cur->name, "domain")) && (cur->ns == ns))			pdb_set_domain(u,						   xmlNodeListGetString(doc, cur->xmlChildrenNode,												1), PDB_SET);		else if (!strcmp(cur->name, "fullname") && cur->ns == ns)			pdb_set_fullname(u,							 xmlNodeListGetString(doc,												  cur->xmlChildrenNode,												  1), PDB_SET);		else if (!strcmp(cur->name, "nt_username") && cur->ns == ns)			pdb_set_nt_username(u,								xmlNodeListGetString(doc,													 cur->xmlChildrenNode,													 1), PDB_SET);		else if (!strcmp(cur->name, "logon_script") && cur->ns == ns)			pdb_set_logon_script(u,								 xmlNodeListGetString(doc,													  cur->xmlChildrenNode,													  1), PDB_SET);		else if (!strcmp(cur->name, "profile_path") && cur->ns == ns)			pdb_set_profile_path(u,								 xmlNodeListGetString(doc,													  cur->xmlChildrenNode,													  1), PDB_SET);		else if (!strcmp(cur->name, "logon_time") && cur->ns == ns)			pdb_set_logon_time(u,							   atol(xmlNodeListGetString									(doc, cur->xmlChildrenNode, 1)), PDB_SET);		else if (!strcmp(cur->name, "logoff_time") && cur->ns == ns)			pdb_set_logoff_time(u,								atol(xmlNodeListGetString									 (doc, cur->xmlChildrenNode, 1)),								PDB_SET);		else if (!strcmp(cur->name, "kickoff_time") && cur->ns == ns)			pdb_set_kickoff_time(u,								 atol(xmlNodeListGetString									  (doc, cur->xmlChildrenNode, 1)),								 PDB_SET);		else if (!strcmp(cur->name, "logon_divs") && cur->ns == ns)			pdb_set_logon_divs(u,							   atol(xmlNodeListGetString									(doc, cur->xmlChildrenNode, 1)), PDB_SET);		else if (!strcmp(cur->name, "hours_len") && cur->ns == ns)			pdb_set_hours_len(u,							  atol(xmlNodeListGetString								   (doc, cur->xmlChildrenNode, 1)), PDB_SET);		else if (!strcmp(cur->name, "bad_password_count") && cur->ns == ns)			pdb_set_bad_password_count(u,							  atol(xmlNodeListGetString								   (doc, cur->xmlChildrenNode, 1)), PDB_SET);		else if (!strcmp(cur->name, "logon_count") && cur->ns == ns)			pdb_set_logon_count(u,							  atol(xmlNodeListGetString								   (doc, cur->xmlChildrenNode, 1)), PDB_SET);		else if (!strcmp(cur->name, "unknown_6") && cur->ns == ns)			pdb_set_unknown_6(u,							  atol(xmlNodeListGetString								   (doc, cur->xmlChildrenNode, 1)), PDB_SET);		else if (!strcmp(cur->name, "homedir") && cur->ns == ns)			pdb_set_homedir(u,							xmlNodeListGetString(doc, cur->xmlChildrenNode,												 1), PDB_SET);		else if (!strcmp(cur->name, "unknown_str") && cur->ns == ns)			pdb_set_unknown_str(u,								xmlNodeListGetString(doc,													 cur->xmlChildrenNode,													 1), PDB_SET);		else if (!strcmp(cur->name, "dir_drive") && cur->ns == ns)			pdb_set_dir_drive(u,							  xmlNodeListGetString(doc,												   cur->xmlChildrenNode,												   1), PDB_SET);		else if (!strcmp(cur->name, "munged_dial") && cur->ns == ns)			pdb_set_munged_dial(u,								xmlNodeListGetString(doc,													 cur->xmlChildrenNode,													 1), PDB_SET);		else if (!strcmp(cur->name, "acct_desc") && cur->ns == ns)			pdb_set_acct_desc(u,							  xmlNodeListGetString(doc,												   cur->xmlChildrenNode,												   1), PDB_SET);		else if (!strcmp(cur->name, "acct_ctrl") && cur->ns == ns)			pdb_set_acct_ctrl(u,							  atol(xmlNodeListGetString								   (doc, cur->xmlChildrenNode, 1)), PDB_SET);		else if (!strcmp(cur->name, "workstations") && cur->ns == ns)			pdb_set_workstations(u,								 xmlNodeListGetString(doc,													  cur->xmlChildrenNode,													  1), PDB_SET);		else if ((!strcmp(cur->name, "password")) && (cur->ns == ns)) {			tmp = xmlGetProp(cur, "last_set");			if (tmp)				pdb_set_pass_last_set_time(u, atol(tmp), PDB_SET);			tmp = xmlGetProp(cur, "must_change");			if (tmp)				pdb_set_pass_must_change_time(u, atol(tmp), PDB_SET);			tmp = xmlGetProp(cur, "can_change");			if (tmp)				pdb_set_pass_can_change_time(u, atol(tmp), PDB_SET);			parsePass(doc, ns, cur, u);		}		else			DEBUG(0, ("Unknown element %s\n", cur->name));		cur = cur->next;	}	return True;}typedef struct pdb_xml {	char *location;	char written;	xmlDocPtr doc;	xmlNodePtr users;	xmlNodePtr pwent;	xmlNsPtr ns;} pdb_xml;static xmlNodePtr parseSambaXMLFile(struct pdb_xml *data){	xmlNodePtr cur;	data->doc = xmlParseFile(data->location);	if (data->doc == NULL)		return NULL;	cur = xmlDocGetRootElement(data->doc);	if (!cur) {		DEBUG(0, ("empty document\n"));		xmlFreeDoc(data->doc);		return NULL;	}	data->ns = xmlSearchNsByHref(data->doc, cur, XML_URL);	if (!data->ns) {		DEBUG(0,			  ("document of the wrong type, samba user namespace not found\n"));		xmlFreeDoc(data->doc);		return NULL;	}	if (strcmp(cur->name, "samba")) {		DEBUG(0, ("document of the wrong type, root node != samba"));		xmlFreeDoc(data->doc);		return NULL;	}	cur = cur->xmlChildrenNode;	while (cur && xmlIsBlankNode(cur)) {

⌨️ 快捷键说明

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