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

📄 ldif.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 3 页
字号:
		else if ( ck->op->ors_scope == LDAP_SCOPE_SUBORDINATE)			ck->op->ors_scope = LDAP_SCOPE_SUBTREE;		while ( ( ptr = list ) ) {			struct berval fpath;			list = ptr->next;			if ( rc == LDAP_SUCCESS ) {				if ( ptr->num.bv_val )					AC_MEMCPY( ptr->bv.bv_val + ptr->off, ptr->num.bv_val,						ptr->num.bv_len );				fullpath( path, &ptr->bv, &fpath );				rc = r_enum_tree(ck, &fpath, &e->e_name, &e->e_nname );				free(fpath.bv_val);			}			if ( ptr->num.bv_val )				free( ptr->num.bv_val );			free(ptr->bv.bv_val);			free(ptr);		}	}done:	if ( fd ) entry_free( e );	return rc;}static intenum_tree(	enumCookie *ck){	struct ldif_info *ni = (struct ldif_info *) ck->op->o_bd->be_private;	struct berval path;	struct berval pdn, pndn;	int rc;	dnParent( &ck->op->o_req_dn, &pdn );	dnParent( &ck->op->o_req_ndn, &pndn );	dn2path( &ck->op->o_req_ndn, &ck->op->o_bd->be_nsuffix[0], &ni->li_base_path, &path);	rc = r_enum_tree(ck, &path, &pdn, &pndn);	ch_free( path.bv_val );	return rc;}/* Get the parent path plus the LDIF suffix */static void get_parent_path(struct berval * dnpath, struct berval *res) {	int dnpathlen = dnpath->bv_len;	int i;		for(i = dnpathlen;i>0;i--) /* find the first path seperator */		if(dnpath->bv_val[i] == LDAP_DIRSEP[0])			break;	res->bv_len = i;	res->bv_val = ch_malloc( res->bv_len + 1 + STRLENOF(LDIF) );	strncpy(res->bv_val, dnpath->bv_val, i);	strcpy(res->bv_val+i, LDIF);	res->bv_val[i] = '\0';}static int apply_modify_to_entry(Entry * entry,				Modifications * modlist,				Operation * op,				SlapReply * rs){	char textbuf[SLAP_TEXT_BUFLEN];	int rc = modlist ? LDAP_UNWILLING_TO_PERFORM : LDAP_SUCCESS;	int is_oc = 0;	Modification *mods = NULL;	if (!acl_check_modlist(op, entry, modlist)) {		return LDAP_INSUFFICIENT_ACCESS;	}	for (; modlist != NULL; modlist = modlist->sml_next) {		mods = &modlist->sml_mod;		if ( mods->sm_desc == slap_schema.si_ad_objectClass ) {			is_oc = 1;		}		switch (mods->sm_op) {		case LDAP_MOD_ADD:			rc = modify_add_values(entry, mods,				   get_permissiveModify(op),				   &rs->sr_text, textbuf,				   sizeof( textbuf ) );			break;						case LDAP_MOD_DELETE:			rc = modify_delete_values(entry, mods,				get_permissiveModify(op),				&rs->sr_text, textbuf,				sizeof( textbuf ) );			break;						case LDAP_MOD_REPLACE:			rc = modify_replace_values(entry, mods,				 get_permissiveModify(op),				 &rs->sr_text, textbuf,				 sizeof( textbuf ) );			break;		case LDAP_MOD_INCREMENT:			rc = modify_increment_values( entry,				mods, get_permissiveModify(op),				&rs->sr_text, textbuf,				sizeof( textbuf ) );			break;			break;		case SLAP_MOD_SOFTADD:			mods->sm_op = LDAP_MOD_ADD;			rc = modify_add_values(entry, mods,				   get_permissiveModify(op),				   &rs->sr_text, textbuf,				   sizeof( textbuf ) );			mods->sm_op = SLAP_MOD_SOFTADD;			if (rc == LDAP_TYPE_OR_VALUE_EXISTS) {				rc = LDAP_SUCCESS;			}			break;		default:			break;		}		if(rc != LDAP_SUCCESS) break;	}		if(rc == LDAP_SUCCESS) {		if ( is_oc ) {			entry->e_ocflags = 0;		}		/* check that the entry still obeys the schema */		rc = entry_schema_check( op, entry, NULL, 0,			  &rs->sr_text, textbuf, sizeof( textbuf ) );	}	return rc;}intldif_back_referrals( Operation *op, SlapReply *rs ){	struct ldif_info	*ni = NULL;	Entry			*entry;	int			rc = LDAP_SUCCESS;#if 0	if ( op->o_tag == LDAP_REQ_SEARCH ) {		/* let search take care of itself */		return rc;	}#endif	if ( get_manageDSAit( op ) ) {		/* let op take care of DSA management */		return rc;	}	ni = (struct ldif_info *)op->o_bd->be_private;	ldap_pvt_thread_rdwr_rlock( &ni->li_rdwr );	entry = (Entry *)get_entry( op, &ni->li_base_path );	/* no object is found for them */	if ( entry == NULL ) {		struct berval	odn = op->o_req_dn;		struct berval	ondn = op->o_req_ndn;		struct berval	pndn = op->o_req_ndn;		for ( ; entry == NULL; ) {			dnParent( &pndn, &pndn );						if ( !dnIsSuffix( &pndn, &op->o_bd->be_nsuffix[0] ) ) {				break;			}			op->o_req_dn = pndn;			op->o_req_ndn = pndn;			entry = (Entry *)get_entry( op, &ni->li_base_path );		}		ldap_pvt_thread_rdwr_runlock( &ni->li_rdwr );		op->o_req_dn = odn;		op->o_req_ndn = ondn;		rc = LDAP_SUCCESS;		rs->sr_matched = NULL;		if ( entry != NULL ) {			Debug( LDAP_DEBUG_TRACE,				"ldif_back_referrals: op=%ld target=\"%s\" matched=\"%s\"\n",				(long) op->o_tag, op->o_req_dn.bv_val, entry->e_name.bv_val );			if ( is_entry_referral( entry ) ) {				rc = LDAP_OTHER;				rs->sr_ref = get_entry_referrals( op, entry );				if ( rs->sr_ref ) {					rs->sr_matched = ber_strdup_x(					entry->e_name.bv_val, op->o_tmpmemctx );				}			}			entry_free(entry);		} else if ( default_referral != NULL ) {			rc = LDAP_OTHER;			rs->sr_ref = referral_rewrite( default_referral,				NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT );		}		if ( rs->sr_ref != NULL ) {			/* send referrals */			rc = rs->sr_err = LDAP_REFERRAL;			send_ldap_result( op, rs );			ber_bvarray_free( rs->sr_ref );			rs->sr_ref = NULL;		} else if ( rc != LDAP_SUCCESS ) {			rs->sr_err = rc;			rs->sr_text = rs->sr_matched ? "bad referral object" : NULL;			send_ldap_result( op, rs );		}		if ( rs->sr_matched ) {			op->o_tmpfree( (char *)rs->sr_matched, op->o_tmpmemctx );			rs->sr_matched = NULL;		}		return rc;	}	ldap_pvt_thread_rdwr_runlock( &ni->li_rdwr );	if ( is_entry_referral( entry ) ) {		/* entry is a referral */		BerVarray refs = get_entry_referrals( op, entry );		rs->sr_ref = referral_rewrite(			refs, &entry->e_name, &op->o_req_dn, LDAP_SCOPE_DEFAULT );		Debug( LDAP_DEBUG_TRACE,			"ldif_back_referrals: op=%ld target=\"%s\" matched=\"%s\"\n",			(long) op->o_tag, op->o_req_dn.bv_val, entry->e_name.bv_val );		rs->sr_matched = entry->e_name.bv_val;		if ( rs->sr_ref != NULL ) {			rc = rs->sr_err = LDAP_REFERRAL;			send_ldap_result( op, rs );			ber_bvarray_free( rs->sr_ref );			rs->sr_ref = NULL;		} else {			send_ldap_error( op, rs, LDAP_OTHER, "bad referral object" );			rc = rs->sr_err;		}		rs->sr_matched = NULL;		ber_bvarray_free( refs );	}	entry_free( entry );	return rc;}static intldif_back_bind( Operation *op, SlapReply *rs ){	struct ldif_info *ni = NULL;	Attribute * a = NULL;	AttributeDescription *password = slap_schema.si_ad_userPassword;	int return_val = 0;	Entry * entry = NULL;	ni = (struct ldif_info *) op->o_bd->be_private;	ldap_pvt_thread_rdwr_rlock(&ni->li_rdwr);	entry = (Entry *) get_entry(op, &ni->li_base_path);	/* no object is found for them */	if(entry == NULL) {		if(be_isroot_pw(op)) {			rs->sr_err = return_val = LDAP_SUCCESS;		} else {			rs->sr_err = return_val = LDAP_INVALID_CREDENTIALS;		}		goto return_result;	}	/* they don't have userpassword */	if((a = attr_find(entry->e_attrs, password)) == NULL) {		rs->sr_err = LDAP_INAPPROPRIATE_AUTH;		return_val = 1;		goto return_result;	}	/* authentication actually failed */	if(slap_passwd_check(op, entry, a, &op->oq_bind.rb_cred,			     &rs->sr_text) != 0) {		rs->sr_err = LDAP_INVALID_CREDENTIALS;		return_val = 1;		goto return_result;	}	/* let the front-end send success */	return_val = 0;	goto return_result; return_result:	ldap_pvt_thread_rdwr_runlock(&ni->li_rdwr);	if(return_val != 0)		send_ldap_result( op, rs );	if(entry != NULL)		entry_free(entry);	return return_val;}static int ldif_back_search(Operation *op, SlapReply *rs){	struct ldif_info *ni = (struct ldif_info *) op->o_bd->be_private;	enumCookie ck = { NULL, NULL, NULL, 0, 0 };	ck.op = op;	ck.rs = rs;	ldap_pvt_thread_rdwr_rlock(&ni->li_rdwr);	rs->sr_err = enum_tree( &ck );	ldap_pvt_thread_rdwr_runlock(&ni->li_rdwr);	send_ldap_result(op, rs);	return rs->sr_err;}static int ldif_back_add(Operation *op, SlapReply *rs) {	struct ldif_info *ni = (struct ldif_info *) op->o_bd->be_private;	Entry * e = op->ora_e;	struct berval dn = e->e_nname;	struct berval leaf_path = BER_BVNULL;	struct stat stats;	int statres;	char textbuf[SLAP_TEXT_BUFLEN];	Debug( LDAP_DEBUG_TRACE, "ldif_back_add: \"%s\"\n", dn.bv_val, 0, 0);	slap_add_opattrs( op, &rs->sr_text, textbuf, sizeof( textbuf ), 1 );	rs->sr_err = entry_schema_check(op, e, NULL, 0,		&rs->sr_text, textbuf, sizeof( textbuf ) );	if ( rs->sr_err != LDAP_SUCCESS ) goto send_res;					ldap_pvt_thread_rdwr_wlock(&ni->li_rdwr);	dn2path(&dn, &op->o_bd->be_nsuffix[0], &ni->li_base_path, &leaf_path);	if(leaf_path.bv_val != NULL) {		struct berval base = BER_BVNULL;		/* build path to container and ldif of container */		get_parent_path(&leaf_path, &base);		statres = stat(base.bv_val, &stats); /* check if container exists */		if(statres == -1 && errno == ENOENT) { /* container missing */			base.bv_val[base.bv_len] = '.';			statres = stat(base.bv_val, &stats); /* check for leaf node */			base.bv_val[base.bv_len] = '\0';			if(statres == -1 && errno == ENOENT) {				rs->sr_err = LDAP_NO_SUCH_OBJECT; /* parent doesn't exist */				rs->sr_text = "Parent does not exist";			}			else if(statres != -1) { /* create parent */				int mkdirres = mkdir(base.bv_val, 0750);				if(mkdirres == -1) {					rs->sr_err = LDAP_UNWILLING_TO_PERFORM;					rs->sr_text = "Could not create parent folder";					Debug( LDAP_DEBUG_ANY, "could not create folder \"%s\": %s\n",						base.bv_val, STRERROR( errno ), 0 );				}			}			else				rs->sr_err = LDAP_UNWILLING_TO_PERFORM;		}/* container was possibly created, move on to add the entry */		if(rs->sr_err == LDAP_SUCCESS) {			statres = stat(leaf_path.bv_val, &stats);			if(statres == -1 && errno == ENOENT) {				ldap_pvt_thread_mutex_lock(&entry2str_mutex);				rs->sr_err = (int) spew_entry(e, &leaf_path);				ldap_pvt_thread_mutex_unlock(&entry2str_mutex);			}			else if ( statres == -1 ) {				rs->sr_err = LDAP_UNWILLING_TO_PERFORM;				Debug( LDAP_DEBUG_ANY, "could not stat file \"%s\": %s\n",					leaf_path.bv_val, STRERROR( errno ), 0 );			}			else /* it already exists */				rs->sr_err = LDAP_ALREADY_EXISTS;		}		SLAP_FREE(base.bv_val);		SLAP_FREE(leaf_path.bv_val);	}	ldap_pvt_thread_rdwr_wunlock(&ni->li_rdwr);send_res:	Debug( LDAP_DEBUG_TRACE, 			"ldif_back_add: err: %d text: %s\n", rs->sr_err, rs->sr_text ?				rs->sr_text : "", 0);	send_ldap_result(op, rs);	slap_graduate_commit_csn( op );	return 0;}static int ldif_back_modify(Operation *op, SlapReply *rs) {	struct ldif_info *ni = (struct ldif_info *) op->o_bd->be_private;	Modifications * modlst = op->orm_modlist;	struct berval path = BER_BVNULL;	Entry * entry = NULL;	int spew_res;	slap_mods_opattrs( op, &op->orm_modlist, 1 );	ldap_pvt_thread_rdwr_wlock(&ni->li_rdwr);	dn2path(&op->o_req_ndn, &op->o_bd->be_nsuffix[0], &ni->li_base_path,		&path);	entry = (Entry *) get_entry(op, &ni->li_base_path);	if(entry != NULL) {		rs->sr_err = apply_modify_to_entry(entry, modlst, op, rs);		if(rs->sr_err == LDAP_SUCCESS) {			int save_errno;			ldap_pvt_thread_mutex_lock(&entry2str_mutex);			spew_res = spew_entry(entry, &path);			save_errno = errno;			ldap_pvt_thread_mutex_unlock(&entry2str_mutex);			if(spew_res == -1) {				Debug( LDAP_DEBUG_ANY,					"%s ldif_back_modify: could not output entry \"%s\": %s\n",					op->o_log_prefix, entry->e_name.bv_val, STRERROR( save_errno ) );				rs->sr_err = LDAP_UNWILLING_TO_PERFORM;			}		}	}	else {		rs->sr_err = LDAP_NO_SUCH_OBJECT;	}		if(entry != NULL)

⌨️ 快捷键说明

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