📄 ldif.c
字号:
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 + -