Annotation of 43BSDReno/contrib/isode-beta/quipu/attribute.c, revision 1.1.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.