Annotation of 43BSDReno/contrib/isode-beta/quipu/attribute.c, revision 1.1

1.1     ! root        1: /* attribute.c - */
        !             2: 
        !             3: #ifndef lint
        !             4: static char *rcsid = "$Header: /f/osi/quipu/RCS/attribute.c,v 7.3 90/04/18 08:49:44 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/quipu/RCS/attribute.c,v 7.3 90/04/18 08:49:44 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       attribute.c,v $
        !            12:  * Revision 7.3  90/04/18  08:49:44  mrose
        !            13:  * 6.2
        !            14:  * 
        !            15:  * Revision 7.2  90/01/11  23:55:49  mrose
        !            16:  * lint
        !            17:  * 
        !            18:  * Revision 7.1  90/01/11  18:37:17  mrose
        !            19:  * real-sync
        !            20:  * 
        !            21:  * Revision 7.0  89/11/23  22:16:38  mrose
        !            22:  * Release 6.0
        !            23:  * 
        !            24:  */
        !            25: 
        !            26: /*
        !            27:  *                                NOTICE
        !            28:  *
        !            29:  *    Acquisition, use, and distribution of this module and related
        !            30:  *    materials are subject to the restrictions of a license agreement.
        !            31:  *    Consult the Preface in the User's Manual for the full terms of
        !            32:  *    this agreement.
        !            33:  *
        !            34:  */
        !            35: 
        !            36: 
        !            37: #include "quipu/util.h"
        !            38: #include "quipu/entry.h"
        !            39: #include "quipu/ds_error.h"
        !            40: #include "quipu/oid.h"
        !            41: #include "quipu/malloc.h"
        !            42: 
        !            43: AttributeType at_certificate;
        !            44: AttributeType at_p_password;
        !            45: AttributeType at_password;
        !            46: AttributeType at_acl;
        !            47: AttributeType at_control;
        !            48: AttributeType at_schema;
        !            49: AttributeType at_applctx;
        !            50: oid_table_attr * tab_applctx;
        !            51: oid_table_attr * tab_password;
        !            52: oid_table_attr * tab_acl;
        !            53: oid_table_attr * tab_schema;
        !            54: oid_table_attr * tab_edbinfo;
        !            55: oid_table_attr * tab_masterdsa;
        !            56: oid_table_attr * tab_slavedsa;
        !            57: oid_table_attr * tab_dsaaddress;
        !            58: oid_table_attr * tab_version;
        !            59: OID alias_oc;
        !            60: OID quipu_dsa_oid;
        !            61: 
        !            62: extern oid_table_attr * tab_objectclass;
        !            63: extern oid_table_attr * tab_alias;
        !            64: extern LLog * log_dsap;
        !            65: 
        !            66: check_dsa_known_oids ()
        !            67: {
        !            68:        /* for efficiency yacc has knowledge of certain oid built in
        !            69:                   check these are in current table  */
        !            70: 
        !            71:        check_known_oids ();
        !            72: 
        !            73:        at_password = AttrT_new (PASSWORD_OID);
        !            74:        if (at_password == NULLAttrT)
        !            75:                fatal (-21,"userPassword attribute type missing - check oidtables");
        !            76:        tab_password = at_password;
        !            77: 
        !            78:        at_control = AttrT_new (CONTROL_OID);
        !            79:        if (at_control == NULLAttrT)
        !            80:                fatal (-22,"control attribute type missing - check oidtables");
        !            81: 
        !            82:        at_acl = AttrT_new (ACL_OID);
        !            83:        if ( at_acl == NULLAttrT)
        !            84:                fatal (-23,"acl attribute type missing - check oidtables");
        !            85:        tab_acl = at_acl;
        !            86: 
        !            87:        at_applctx = AttrT_new (APPLCTX_OID);
        !            88:        if ( at_applctx == NULLAttrT)
        !            89:                fatal (-23,"supported application context attribute type missing - check oidtables");
        !            90: 
        !            91:        at_schema = AttrT_new (SCHEMA_OID);
        !            92:        if ( at_schema == NULLAttrT)
        !            93:                fatal (-24,"treeStructure attribute type missing - check oidtables");
        !            94:        tab_schema = at_schema;
        !            95: 
        !            96:        if ( (tab_edbinfo = name2attr (EDBINFO_OID)) == NULLTABLE_ATTR)
        !            97:                fatal (-25,"edbinfo attribute type missing - check oidtables");
        !            98: 
        !            99:        if ( (tab_masterdsa = name2attr (MASTERDSA_OID)) == NULLTABLE_ATTR)
        !           100:                fatal (-26,"masterDSA attribute type missing - check oidtables");
        !           101: 
        !           102:        if ( (tab_slavedsa = name2attr (SLAVEDSA_OID)) == NULLTABLE_ATTR)
        !           103:                fatal (-27,"slaveDSA attribute type missing - check oidtables");
        !           104: 
        !           105:        if ( (tab_dsaaddress = name2attr (DSAADDRESS_OID)) == NULLTABLE_ATTR)
        !           106:                fatal (-28,"dsaAddress attribute type missing - check oidtables");
        !           107: 
        !           108:        if ( (tab_version = name2attr (VERSION_OID)) == NULLTABLE_ATTR)
        !           109:                fatal (-31,"version attribute type missing - check oidtables");
        !           110: 
        !           111:        if ( ( alias_oc = str2oid (ALIAS_OC)) == NULLOID)
        !           112:                fatal (-32, "alias objectclass missing");
        !           113: 
        !           114:        alias_oc = oid_cpy (alias_oc);
        !           115:        quipu_dsa_oid = oid_cpy (str2oid(QUIPU_DSA));
        !           116: 
        !           117:        if ( (at_p_password = AttrT_new(PROTECTED_OID)) == NULLAttrT)
        !           118:                fatal (-33, "protectedPassword attribute type missing - check oidtables");
        !           119: 
        !           120:        if ( (at_certificate = AttrT_new(CERTIFICATE_OID)) == NULLAttrT)
        !           121:                fatal (-34, "userCertificate attribute type missing - check oidtables");
        !           122: }
        !           123: 
        !           124: real_unravel_attribute (eptr,error)
        !           125: Entry eptr;
        !           126: struct DSError * error;
        !           127: {
        !           128: register Attr_Sequence as;
        !           129: RDN new_rdn, rdn_test;
        !           130: AttributeType at;
        !           131: AV_Sequence   avs;
        !           132: struct acl * acl = (struct acl *) NULL;
        !           133: extern oid_cmp ();
        !           134: char * dsa_version = NULLCP;
        !           135: char oc_found = FALSE;
        !           136: int rdn_print();
        !           137: 
        !           138:        DLOG (log_dsap,LLOG_TRACE,("unravel_attributes"));
        !           139: 
        !           140:        /* take rdn's and make sure an attribute, if not add it in */
        !           141:     for (new_rdn = eptr->e_name; new_rdn != NULLRDN; new_rdn = new_rdn->rdn_next) {
        !           142:        if (new_rdn->rdn_at != NULLTABLE_ATTR)
        !           143:                new_rdn->rdn_av.av_syntax = new_rdn->rdn_at->oa_syntax;
        !           144: 
        !           145:        if (new_rdn->rdn_av.av_syntax == 0) {
        !           146:                /* Check we know about local RDNs syntax */
        !           147:                if (eptr->e_data == E_DATA_MASTER) {
        !           148:                        LLOG (log_dsap, LLOG_EXCEPTIONS, ("RDN of unknown attribute type"));
        !           149:                        error->dse_type = DSE_UPDATEERROR;
        !           150:                        error->ERR_UPDATE.DSE_up_problem = DSE_UP_NAMINGVIOLATION;
        !           151:                        return NOTOK;
        !           152:                }
        !           153:        }
        !           154: 
        !           155:        for (rdn_test = eptr->e_name; rdn_test != new_rdn; rdn_test = rdn_test->rdn_next)
        !           156:                /* check for repeated attribute in RDN */
        !           157:                if (AttrT_cmp (new_rdn->rdn_at, rdn_test->rdn_at) == 0) {
        !           158:                        LLOG (log_dsap, LLOG_EXCEPTIONS, ("RDN with two AVAs of same attribute type"));
        !           159:                        error->dse_type = DSE_UPDATEERROR;
        !           160:                        error->ERR_UPDATE.DSE_up_problem = DSE_UP_NAMINGVIOLATION;
        !           161:                        return NOTOK;
        !           162:                }
        !           163:                        
        !           164:        if ((as = as_find_type (eptr->e_attributes,new_rdn->rdn_at)) == NULLATTR) {
        !           165:                SET_HEAP (new_rdn->rdn_at);
        !           166:                at  = AttrT_cpy (new_rdn->rdn_at);
        !           167:                avs = avs_comp_new (AttrV_cpy(&new_rdn->rdn_av));
        !           168:                as  = as_comp_new (at, avs, NULLACL_INFO);
        !           169:                eptr->e_attributes = as_merge (eptr->e_attributes,as);
        !           170:                RESTORE_HEAP;
        !           171:        } else {
        !           172:                for (avs=as->attr_value; avs!=NULLAV; avs=avs->avseq_next) 
        !           173:                        if (AttrV_cmp (&new_rdn->rdn_av,&avs->avseq_av) == 0)
        !           174:                                break;
        !           175:                if (avs == NULLAV) {
        !           176:                        SET_HEAP (new_rdn->rdn_at);
        !           177:                        avs = avs_comp_new (AttrV_cpy(&new_rdn->rdn_av));
        !           178:                        as->attr_value = avs_merge (as->attr_value,avs);
        !           179:                        RESTORE_HEAP;
        !           180:                }
        !           181:        }
        !           182:     }
        !           183: 
        !           184:        /* now get special attributes into structure */
        !           185:        /* first reset pointerss - incase deleted. */
        !           186: 
        !           187:        eptr->e_alias = NULLDN;
        !           188:        eptr->e_dsainfo = NULLDSA;
        !           189:        eptr->e_master = NULLAV;
        !           190:        eptr->e_slave = NULLAV;
        !           191: 
        !           192:        for ( as = eptr->e_attributes; as != NULLATTR; as = as->attr_link) {
        !           193:                if (as->attr_type == NULLTABLE_ATTR) {
        !           194:                        error->dse_type = DSE_ATTRIBUTEERROR;
        !           195:                        error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (eptr);
        !           196:                        error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what = DSE_AT_UNDEFINEDATTRIBUTETYPE;
        !           197:                        error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = NULLAttrT;
        !           198:                        error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_value = NULLAttrV;
        !           199:                        error->ERR_ATTRIBUTE.DSE_at_plist.dse_at_next = DSE_AT_NOPROBLEM;
        !           200:                        return (NOTOK);
        !           201:                }
        !           202:                
        !           203:                if (as->attr_type == tab_acl) {
        !           204:                        eptr->e_acl = (struct acl *) as->attr_value->avseq_av.av_struct;
        !           205:                        acl = eptr->e_acl;
        !           206:                        if (acl->ac_child == NULLACL_INFO)
        !           207:                                acl->ac_child = acl_default ();
        !           208:                        if (acl->ac_entry == NULLACL_INFO)
        !           209:                                acl->ac_entry = acl_default ();
        !           210:                        if (acl->ac_default == NULLACL_INFO)
        !           211:                                acl->ac_default = acl_default ();
        !           212:                }
        !           213: 
        !           214:                else if (as->attr_type == tab_edbinfo) {
        !           215:                        if (eptr->e_dsainfo == NULLDSA) {
        !           216:                                eptr->e_dsainfo = (struct dsa_info *) smalloc (sizeof (struct dsa_info));
        !           217:                                bzero ((char *)eptr->e_dsainfo,sizeof (struct dsa_info));
        !           218:                        }
        !           219:                        eptr->e_dsainfo->dsa_attr = as->attr_value;
        !           220:                }
        !           221: 
        !           222:                else if (as->attr_type == tab_masterdsa) {
        !           223:                        eptr->e_master = as->attr_value;
        !           224:                        eptr->e_leaf = FALSE;
        !           225:                }
        !           226: 
        !           227:                else if (as->attr_type == tab_slavedsa) {
        !           228:                        eptr->e_slave = as->attr_value;
        !           229:                        eptr->e_leaf = FALSE;
        !           230:                }
        !           231: 
        !           232:                else if (as->attr_type == tab_dsaaddress) {
        !           233:                        if (eptr->e_dsainfo == NULLDSA) {
        !           234:                                eptr->e_dsainfo = (struct dsa_info *) smalloc (sizeof (struct dsa_info));
        !           235:                                bzero ((char *)eptr->e_dsainfo,sizeof (struct dsa_info));
        !           236:                        }
        !           237:                        eptr->e_dsainfo->dsa_addr = (struct PSAPaddr *) as->attr_value->avseq_av.av_struct;
        !           238:                }
        !           239: 
        !           240:                else if (as->attr_type == tab_alias)
        !           241:                        eptr->e_alias = (DN) as->attr_value->avseq_av.av_struct;
        !           242: 
        !           243:                else if (as->attr_type == tab_version)
        !           244:                        dsa_version = (char *) as->attr_value->avseq_av.av_struct;
        !           245: 
        !           246:                else if (as->attr_type == tab_objectclass) 
        !           247:                        oc_found = TRUE;
        !           248: 
        !           249:        }
        !           250: 
        !           251:        if ((eptr->e_master == NULLAV) && (eptr->e_slave == NULLAV))
        !           252:                /* May need a stronger test here */
        !           253:                eptr->e_leaf = TRUE;
        !           254: 
        !           255:        if (eptr->e_dsainfo != NULLDSA) /* set version number */
        !           256:                eptr->e_dsainfo->dsa_version = dsa_version;
        !           257: 
        !           258:        if (oc_found != TRUE) {
        !           259:                LLOG (log_dsap, LLOG_EXCEPTIONS, ("Object class attribute missing"));
        !           260:                error->dse_type = DSE_UPDATEERROR;
        !           261:                error->ERR_UPDATE.DSE_up_problem = DSE_UP_OBJECTCLASSVIOLATION;
        !           262:                return (NOTOK);
        !           263:        }
        !           264:        /* Make sure acl attribute exists */
        !           265:        if (eptr->e_acl == (struct acl *) NULL) {
        !           266:                Attr_Sequence as1;
        !           267:                AV_Sequence avs1;
        !           268:                AttributeValue av;
        !           269: 
        !           270:                SET_HEAP (at_acl);
        !           271: 
        !           272:                acl = acl_alloc();
        !           273:                eptr->e_acl = acl;
        !           274:                acl->ac_child = acl_default ();
        !           275:                acl->ac_entry = acl_default ();
        !           276:                acl->ac_default = acl_default ();
        !           277:                acl->ac_attributes = NULLACL_ATTR;
        !           278:                av = AttrV_alloc();
        !           279:                av->av_syntax = str2syntax ("acl");
        !           280:                av->av_struct = (caddr_t) acl;
        !           281:                avs1 = avs_comp_new (av);
        !           282:                as1 = as_comp_new (AttrT_cpy(at_acl),avs1,NULLACL_INFO);
        !           283:                eptr->e_attributes = as_merge(eptr->e_attributes,as1);
        !           284: 
        !           285:                RESTORE_HEAP;
        !           286:        }
        !           287: 
        !           288:        /* now do the attribute acl */
        !           289:        /* first of all create and oid_seq of all attribute, and point them to */
        !           290:        /* the default.  */
        !           291:        if (acl->ac_attributes == NULLACL_ATTR) {
        !           292:                /* the easy case !!! - set every attribute to ac_default */
        !           293:                for ( as = eptr->e_attributes; as != NULLATTR; as = as->attr_link) 
        !           294:                        as->attr_acl = acl->ac_default;
        !           295:        } else {
        !           296:                register struct acl_attr * aa;
        !           297:                struct acl_attr * found_aa;
        !           298:                register struct oid_seq * oidptr;
        !           299:                char once;
        !           300: 
        !           301:                /* The following is probably in efficient */
        !           302:                /* There must be a better way of setting these pointers */
        !           303:                for ( as = eptr->e_attributes; as != NULLATTR; as = as->attr_link) {
        !           304:                        found_aa = NULLACL_ATTR;
        !           305:                        once = FALSE;
        !           306: 
        !           307:                        for ( aa = acl->ac_attributes; aa!=NULLACL_ATTR; aa=aa->aa_next) {
        !           308:                                for ( oidptr=aa->aa_types;oidptr != NULLOIDSEQ; oidptr=oidptr->oid_next) {
        !           309:                                        if (oid_cmp (oidptr->oid_oid,grab_oid(as->attr_type)) == 0) {
        !           310:                                                if (once == TRUE)
        !           311:                                                        pslog (log_dsap,LLOG_EXCEPTIONS,
        !           312:                                                                "WARNING Inconsistent ACL in entry",
        !           313:                                                                rdn_print,
        !           314:                                                                (caddr_t)eptr->e_name);
        !           315:                                                else
        !           316:                                                        once = TRUE;
        !           317:                                                found_aa = aa;
        !           318:                                        }
        !           319:                                }
        !           320:                        }
        !           321: 
        !           322:                        if (found_aa != NULLACL_ATTR) 
        !           323:                                /* found the apprioriate acl - add oid to it */
        !           324:                                as->attr_acl = found_aa->aa_acl;
        !           325:                        else
        !           326:                                as->attr_acl = acl->ac_default;
        !           327:                }
        !           328:        }
        !           329:        return (OK);
        !           330: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.