Annotation of 43BSDReno/contrib/isode-beta/quipu/ds_read.c, revision 1.1.1.1

1.1       root        1: /* ds_read.c - */
                      2: 
                      3: #ifndef lint
                      4: static char *rcsid = "$Header: /f/osi/quipu/RCS/ds_read.c,v 7.1 90/07/09 14:45:48 mrose Exp $";
                      5: #endif
                      6: 
                      7: /*
                      8:  * $Header: /f/osi/quipu/RCS/ds_read.c,v 7.1 90/07/09 14:45:48 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       ds_read.c,v $
                     12:  * Revision 7.1  90/07/09  14:45:48  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.0  89/11/23  22:17:14  mrose
                     16:  * Release 6.0
                     17:  * 
                     18:  */
                     19: 
                     20: /*
                     21:  *                                NOTICE
                     22:  *
                     23:  *    Acquisition, use, and distribution of this module and related
                     24:  *    materials are subject to the restrictions of a license agreement.
                     25:  *    Consult the Preface in the User's Manual for the full terms of
                     26:  *    this agreement.
                     27:  *
                     28:  */
                     29: 
                     30: 
                     31: #include "quipu/util.h"
                     32: #include "quipu/entry.h"
                     33: #include "quipu/read.h"
                     34: 
                     35: extern LLog * log_dsap;
                     36: 
                     37: extern int encode_DAS_ReadArgumentData();
                     38: Attr_Sequence eis_select ();
                     39: static cant_use_cache();
                     40: static attribute_not_cached ();
                     41: extern AttributeType at_control;
                     42: 
                     43: do_ds_read (arg, error, result, binddn, target, di_p, dsp, quipu_ctx)
                     44:     struct ds_read_arg          *arg;
                     45:     struct ds_read_result       *result;
                     46:     struct DSError              *error;
                     47:     DN                          binddn;
                     48:     DN                          target;
                     49:     struct di_block            **di_p;
                     50:     char                       dsp;
                     51:     char                       quipu_ctx;
                     52: {
                     53: Entry  entryptr;
                     54: int retval;
                     55: DN realtarget;
                     56: 
                     57:        DLOG (log_dsap,LLOG_TRACE,("ds_read"));
                     58: 
                     59:        if (!dsp)
                     60:                target = arg->rda_object;
                     61: 
                     62:        if (!dsp && dsa_read_control(arg,result))
                     63:                return (DS_OK);
                     64: 
                     65:        if (target == NULLDN) {
                     66:                /* can't read from the root */
                     67:                error->dse_type = DSE_NAMEERROR;
                     68:                error->ERR_NAME.DSE_na_problem = DSE_NA_NOSUCHOBJECT;
                     69:                error->ERR_NAME.DSE_na_matched = NULLDN;
                     70:                return (DS_ERROR_REMOTE);
                     71:        }
                     72: 
                     73:        switch(find_entry(target,&(arg->rda_common),binddn,NULLDNSEQ,FALSE,&(entryptr), error, di_p))
                     74:        {
                     75:        case DS_OK:
                     76:            /* Filled out entryptr - carry on */
                     77:            break;
                     78:        case DS_CONTINUE:
                     79:            /* Filled out di_p - what do we do with it ?? */
                     80:            return(DS_CONTINUE);
                     81: 
                     82:        case DS_X500_ERROR:
                     83:            /* Filled out error - what do we do with it ?? */
                     84:            return(DS_X500_ERROR);
                     85:        default:
                     86:            /* SCREAM */
                     87:            LLOG(log_dsap, LLOG_EXCEPTIONS, ("do_ds_read() - find_entry failed"));
                     88:            return(DS_ERROR_LOCAL);
                     89:        }
                     90: 
                     91:        realtarget = get_copy_dn (entryptr);
                     92: 
                     93:        /* entry has got a full list of attributes,  eventually
                     94:           select one required */
                     95:        if (check_acl (dsp ? NULLDN : binddn,ACL_READ,entryptr->e_acl->ac_entry, realtarget) == NOTOK) {
                     96:                if (dsp && (check_acl (binddn,ACL_READ,entryptr->e_acl->ac_entry, realtarget) == OK)) {
                     97:                        error->dse_type = DSE_SECURITYERROR;
                     98:                        error->ERR_SECURITY.DSE_sc_problem = DSE_SC_AUTHENTICATION;
                     99:                        dn_free (realtarget);
                    100:                        return (DS_ERROR_REMOTE);
                    101:                } else {
                    102:                        error->dse_type = DSE_SECURITYERROR;
                    103:                        error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS;
                    104:                        dn_free (realtarget);
                    105:                        return (DS_ERROR_REMOTE);
                    106:                }
                    107:        }
                    108: 
                    109:        /* Strong authentication  */
                    110:        if ((retval = check_security_parms((caddr_t) arg,
                    111:                        encode_DAS_ReadArgumentData,
                    112:                        arg->rda_common.ca_security,
                    113:                        arg->rda_common.ca_sig, &binddn)) != 0)
                    114:        {
                    115:                error->dse_type = DSE_SECURITYERROR;
                    116:                error->ERR_SECURITY.DSE_sc_problem = retval;
                    117:                dn_free (realtarget);
                    118:                return (DS_ERROR_REMOTE);
                    119:        }
                    120: 
                    121:        if (cant_use_cache (entryptr,binddn,arg->rda_eis,realtarget)) {
                    122:                int res =  referral_dsa_info(realtarget,NULLDNSEQ,FALSE,entryptr,error,di_p, 
                    123:                        arg->rda_common.ca_servicecontrol.svc_options & SVC_OPT_PREFERCHAIN);
                    124:                dn_free (realtarget);
                    125:                return res;
                    126:        }
                    127:        dn_free (realtarget);
                    128: 
                    129:        if (dsp && (eis_check (arg->rda_eis,entryptr, binddn) != OK)) {
                    130:                /* Can only send public things over DSP - but user is entitled to more */
                    131:                error->dse_type = DSE_SECURITYERROR;
                    132:                error->ERR_SECURITY.DSE_sc_problem = DSE_SC_AUTHENTICATION;
                    133:                return (DS_ERROR_REMOTE);
                    134:        }
                    135:                
                    136:        if ((result->rdr_entry.ent_attr = eis_select (arg->rda_eis,entryptr, dsp ? NULLDN : binddn, quipu_ctx)) == NULLATTR)
                    137:                if (! arg->rda_eis.eis_allattributes) {
                    138:                        error->dse_type = DSE_ATTRIBUTEERROR;
                    139:                         error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (entryptr);
                    140:                         error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what =DSE_AT_NOSUCHATTRIBUTE;
                    141:                        if (arg->rda_eis.eis_select != NULLATTR)
                    142:                                error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = AttrT_cpy(arg->rda_eis.eis_select->attr_type);
                    143:                        else
                    144:                                error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = NULLAttrT;
                    145:                         error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_value = NULLAttrV;
                    146:                         error->ERR_ATTRIBUTE.DSE_at_plist.dse_at_next = DSE_AT_NOPROBLEM;
                    147:                        return (DS_ERROR_REMOTE);
                    148:                }
                    149: 
                    150:        result->rdr_entry.ent_dn = get_copy_dn (entryptr);
                    151: 
                    152:        result->rdr_entry.ent_iscopy = entryptr->e_data;
                    153:        result->rdr_entry.ent_age = (time_t) 0;
                    154:        result->rdr_entry.ent_next = NULLENTRYINFO;
                    155:        result->rdr_common.cr_requestor = NULLDN;
                    156:        /* if no error and NOT SVC_OPT_DONTDEREFERENCEALIASES then */
                    157:        /* the alias will have been derefeferenced -signified by   */
                    158:        /* NO_ERROR !!! */
                    159:        result->rdr_common.cr_aliasdereferenced = (error->dse_type == DSE_NOERROR) ? FALSE : TRUE;
                    160:        return (DS_OK);
                    161: 
                    162: }
                    163: 
                    164: static cant_use_cache (ptr,dn,eis,target)
                    165: Entry ptr;
                    166: DN dn;
                    167: EntryInfoSelection eis;
                    168: DN target;
                    169: {
                    170: register Attr_Sequence as;
                    171: char dfltacl = FALSE;
                    172: 
                    173:        if (dn == NULLDN) 
                    174:                return FALSE;
                    175: 
                    176:        if ((ptr->e_data == E_DATA_MASTER) || (ptr->e_data == E_TYPE_SLAVE))
                    177:                return FALSE;
                    178: 
                    179:        /* see if more than cached data is required */  
                    180: 
                    181:        if (eis.eis_allattributes) {
                    182:                struct acl_attr * aa;
                    183:                struct oid_seq * oidptr;
                    184:                /* look for attr acl */
                    185:                /* see if any attributes use can see */
                    186: 
                    187:                if (check_acl (NULLDN,ACL_READ,ptr->e_acl->ac_default,target) == NOTOK) 
                    188:                        if (check_acl (dn,ACL_READ,ptr->e_acl->ac_default,target) == OK) 
                    189:                                return TRUE;
                    190: 
                    191:                if (ptr->e_acl->ac_attributes == NULLACL_ATTR)
                    192:                        return FALSE;
                    193: 
                    194:                for ( aa = ptr->e_acl->ac_attributes; aa!=NULLACL_ATTR; aa=aa->aa_next)
                    195:                        for ( oidptr=aa->aa_types;oidptr != NULLOIDSEQ; oidptr=oidptr->oid_next)
                    196:                                /* The attribute is in the attribute ACL list */
                    197:                                /* Would a referral help the DUA ? */
                    198:                                if (check_acl (NULLDN,ACL_READ,aa->aa_acl,target) == NOTOK) 
                    199:                                        if (check_acl (dn,ACL_READ,aa->aa_acl,target) == OK) 
                    200:                                                return TRUE;
                    201: 
                    202:        } else {
                    203:                /* for each attribute in eis.eis_select, see is user
                    204:                   entitled to it. */
                    205: 
                    206:                if (check_acl (NULLDN,ACL_READ,ptr->e_acl->ac_default,target) == NOTOK) 
                    207:                        if (check_acl (dn,ACL_READ,ptr->e_acl->ac_default,target) == OK) 
                    208:                                dfltacl = TRUE;
                    209: 
                    210:                for(as=eis.eis_select; as != NULLATTR; as=as->attr_link) {
                    211:                        if (as_find_type (ptr->e_attributes, as->attr_type) == NULLATTR) 
                    212:                                if (attribute_not_cached (ptr,dn,grab_oid(as->attr_type),target,ACL_READ,dfltacl))
                    213:                                        return TRUE;
                    214: 
                    215:                }
                    216:        }
                    217:        return FALSE;
                    218: }
                    219: 
                    220: static attribute_not_cached (ptr,dn,at,target,level,dfltacl)
                    221: Entry ptr;
                    222: DN dn;
                    223: OID at;
                    224: DN target;
                    225: int level;
                    226: char dfltacl;
                    227: {
                    228: register struct acl_attr * aa;
                    229: register struct oid_seq * oidptr;
                    230: 
                    231:        /* see if more than cached data is required */  
                    232:        if (ptr->e_acl->ac_attributes == NULLACL_ATTR)
                    233:                return (dfltacl);
                    234: 
                    235:        for ( aa = ptr->e_acl->ac_attributes; aa!=NULLACL_ATTR; aa=aa->aa_next)
                    236:                for ( oidptr=aa->aa_types;oidptr != NULLOIDSEQ; oidptr=oidptr->oid_next)
                    237:                        if (oid_cmp (oidptr->oid_oid,at) == 0) {
                    238:                                /* The attribute is in the attribute ACL list */
                    239:                                /* Would a referral help the DUA ? */
                    240:                                if (check_acl (NULLDN,level,aa->aa_acl,target) == NOTOK) 
                    241:                                        if (check_acl (dn,level,aa->aa_acl,target) == OK) 
                    242:                                                return TRUE;
                    243:                                return FALSE;
                    244:                        }       
                    245:        return (dfltacl);
                    246: 
                    247: }
                    248: 
                    249: 
                    250: static Attr_Sequence  dsa_control_info()
                    251: {
                    252: extern int slave_edbs;
                    253: extern int master_edbs;
                    254: extern int local_master_size;
                    255: extern int local_slave_size;
                    256: extern int local_cache_size;
                    257: char buffer [LINESIZE];
                    258: Attr_Sequence as;
                    259: 
                    260:        (void) sprintf (buffer,"%d Master entries (in %d EDBs), %d Slave entries (in %d EDBs), %d Cached entries",
                    261:                local_master_size,master_edbs,local_slave_size,slave_edbs,local_cache_size);
                    262: 
                    263:        as=as_comp_alloc();
                    264:        as->attr_acl = NULLACL_INFO;
                    265:        as->attr_type = at_control;
                    266:        as->attr_link = NULLATTR;
                    267:         if ((as->attr_value = str2avs (buffer,as->attr_type)) == NULLAV) {
                    268:                 as_free (as);
                    269:                 return (NULLATTR);
                    270:        }
                    271: 
                    272:        return (as);
                    273: }
                    274: 
                    275: dsa_read_control (arg,result)
                    276:     struct ds_read_arg          *arg;
                    277:     struct ds_read_result       *result;
                    278: {
                    279: extern DN mydsadn;
                    280: 
                    281:        if ((arg->rda_eis.eis_allattributes) || 
                    282:                (arg->rda_eis.eis_infotypes == EIS_ATTRIBUTETYPESONLY))
                    283:                return FALSE;
                    284: 
                    285:        if ((arg->rda_eis.eis_select == NULLATTR)
                    286:           || (arg->rda_eis.eis_select->attr_link != NULLATTR))
                    287:                return FALSE;
                    288: 
                    289:        if (AttrT_cmp (at_control,arg->rda_eis.eis_select->attr_type) != 0)
                    290:                return FALSE;
                    291: 
                    292:        if ((result->rdr_entry.ent_attr = dsa_control_info()) == NULLATTR)
                    293:                return FALSE;
                    294: 
                    295:        /* Fiddle DN - for DUA caching !!! */
                    296:        result->rdr_entry.ent_dn = dn_cpy (mydsadn);
                    297: 
                    298:        result->rdr_entry.ent_iscopy = FALSE;
                    299:        result->rdr_entry.ent_age = (time_t) 0;
                    300:        result->rdr_entry.ent_next = NULLENTRYINFO;
                    301:        result->rdr_common.cr_requestor = NULLDN;
                    302:        result->rdr_common.cr_aliasdereferenced = FALSE;
                    303: 
                    304:        return TRUE;
                    305: }
                    306: 

unix.superglobalmegacorp.com

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