home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Chans / lists / dl_permit.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  3.1 KB  |  183 lines

  1. /* dl_permit.c: */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Chans/lists/RCS/dl_permit.c,v 6.0 1991/12/18 20:10:43 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Chans/lists/RCS/dl_permit.c,v 6.0 1991/12/18 20:10:43 jpo Rel $
  9.  *
  10.  * $Log: dl_permit.c,v $
  11.  * Revision 6.0  1991/12/18  20:10:43  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "dlist.h"
  19. #include "adr.h"
  20. #include "or.h"
  21. #include <isode/quipu/attrvalue.h>
  22.  
  23. extern AttributeType at_Permit;
  24. extern AttributeType at_GroupMember;
  25. extern AttributeType at_Member;
  26. extern ORName *addr2orname();
  27.  
  28. static check_group (addr,dn)
  29. ADDR * addr;
  30. DN dn;
  31. {
  32. Attr_Sequence as;
  33. Attr_Sequence tmp;
  34. AV_Sequence avs;
  35. DN ad_dn;
  36.  
  37.     if (! addr->ad_dn)
  38.         return NOTOK;
  39.  
  40.     if (read_group_entry (dn, &as) != OK)
  41.         return NOTOK;
  42.  
  43.     if ((tmp = as_find_type(as,at_GroupMember)) == NULLATTR)
  44.         return NOTOK;
  45.  
  46.     if ((ad_dn = str2dn (addr->ad_dn)) == NULLDN)
  47.         return NOTOK;
  48.  
  49.     for (avs=tmp->attr_value; avs!= NULLAV; avs=avs->avseq_next)
  50.         if (dn_cmp (ad_dn,(DN)avs->avseq_av.av_struct) == 0) {
  51.             dn_free (ad_dn);
  52.             return OK;
  53.         }
  54.  
  55.     dn_free (ad_dn);
  56.     return NOTOK;
  57. }
  58.  
  59. static check_individual (addr,or)
  60. ADDR * addr;
  61. ORName * or;
  62. {
  63. ORName * newor;
  64. int res;
  65.  
  66.     newor = addr2orname (addr);
  67.  
  68.     res = orName_cmp_user (or,newor);
  69.  
  70.     ORName_free (newor);
  71.  
  72.     return res; 
  73. }
  74.  
  75. static check_member (addr,or)
  76. ADDR * addr;
  77. ORName * or;
  78. {
  79. Attr_Sequence tmp;
  80. AV_Sequence avs;
  81. Attr_Sequence as;
  82.  
  83.     if (or->on_dn == NULLDN) 
  84.         return NOTOK;
  85.  
  86.     if (dir_getdl_aux (or->on_dn, &as) != OK)
  87.         return NOTOK;
  88.  
  89.     if ((tmp = as_find_type(as,at_Member)) == NULLATTR)
  90.         return NOTOK;
  91.  
  92.     for (avs=tmp->attr_value; avs!= NULLAV; avs=avs->avseq_next)
  93.         if (check_individual (addr,(ORName *)avs->avseq_av.av_struct) == OK)
  94.             return OK;
  95.  
  96.     return NOTOK;
  97. }
  98.  
  99. static or_cmp_prefix (a,b)
  100. OR_ptr a,b;
  101. {
  102.     for (; (a != NULLOR) && (b != NULLOR); b = b->or_next) {
  103.         if (or_cmp (a,b) == TRUE)
  104.             a = a->or_next;
  105.     }
  106.  
  107.     if (a == NULLOR)
  108.         return OK;
  109.     else
  110.         return NOTOK;
  111. }
  112.  
  113. static check_pattern (addr,or)
  114. ADDR * addr;
  115. ORName * or;
  116. {
  117. ORName * newor;
  118.  
  119.     newor = addr2orname (addr);
  120.  
  121.     if (or->on_dn) {
  122.         if (!newor->on_dn)
  123.             goto out;
  124.         if (dn_cmp_prefix (or->on_dn,newor->on_dn) == NOTOK)
  125.             goto out;
  126.     }
  127.  
  128.     if (or->on_or) {
  129.         if (!newor->on_or)
  130.             goto out;
  131.  
  132.         if (or_cmp_prefix (or->on_or,newor->on_or) == NOTOK)
  133.             goto out;
  134.     }
  135.  
  136.     ORName_free (newor);
  137.     return OK;
  138.  
  139. out:;
  140.     ORName_free (newor);
  141.     return NOTOK;
  142.  
  143.  
  144. }
  145.  
  146. check_dl_permission (addr, as)
  147. ADDR * addr;
  148. Attr_Sequence as;
  149. {
  150. Attr_Sequence tmp;
  151. AV_Sequence loop;
  152. struct dl_permit * ptr;
  153. int res;
  154.  
  155.     if ((tmp = as_find_type (as,at_Permit)) == NULLATTR) 
  156.         return NOTOK;     /* Attribute is mandatory */
  157.  
  158.     for (loop= tmp->attr_value;loop != NULLAV;loop = loop->avseq_next) {
  159.  
  160.         ptr = (struct dl_permit *)loop->avseq_av.av_struct;
  161.  
  162.         switch (ptr->dp_type) {
  163.         case DP_GROUP:
  164.             res = check_group (addr,ptr->dp_dn);
  165.             break;
  166.         case DP_INDIVIDUAL:
  167.             res = check_individual (addr,ptr->dp_or);
  168.             break;
  169.         case DP_MEMBER:
  170.             res = check_member (addr,ptr->dp_or);
  171.             break;
  172.         case DP_PATTERN:
  173.             res = check_pattern (addr,ptr->dp_or);
  174.             break;
  175.         }
  176.  
  177.         if (res == OK)
  178.             return OK;
  179.     }
  180.  
  181.     return NOTOK;
  182. }
  183.