Annotation of 43BSDReno/contrib/isode-beta/doc/ufn/algo.py, revision 1.1.1.1

1.1       root        1: 
                      2: 
                      3: PurportedName ::= SEQUENCE OF String
                      4:                -- simplication, as attribute types can optionally be 
                      5:                -- specified
                      6: 
                      7:                -- Each element of the Purported Name is a string
                      8:                -- which has been parsed from the BNF   
                      9: 
                     10: Attribute ::= SEQUENCE { 
                     11:        type OBJECT IDENTIFIER, 
                     12:        value ANY }
                     13: 
                     14: RDN ::= Attribute -- simplification, as can be multi-value
                     15: 
                     16: DN ::= SEQUENCE OF RDN
                     17: 
                     18: Environment ::= SEQUENCE OF DN
                     19: 
                     20: 
                     21: EnvironmentList ::= SEQUENCE OF SEQUENCE {
                     22:                        lower-bound INTEGER,
                     23:                        upper-bound INTEGER, 
                     24:                        environment Environment }
                     25: 
                     26: 
                     27: friendlyMatch(p: PurportedName; el: EnvironmentList):  SET OF DN 
                     28: {
                     29:                                -- Find correct environment
                     30:                                
                     31:        IF length(el) == 0 THEN return(NULL);
                     32: 
                     33:        IF length(p) <= head(el).upper-bound
                     34:                        && length(p) >= head(el).lower-bound THEN
                     35:                return envMatch (p, head(el).environment);
                     36:        ELSE
                     37:                return(friendlyMatch(p, tail(el));
                     38: }
                     39: 
                     40: 
                     41: envMatch(p: PurportedName; e: Environment):  SET OF DN 
                     42: {
                     43:                                -- Check elements of environment
                     44:                                -- in the defined order
                     45:                                
                     46:        matches: SET OF DN;
                     47:        
                     48:        IF length(e) == 0 THEN return(NULL);
                     49: 
                     50:        matches = purportedMatch(head(el).DN, p)
                     51:        IF matches != NULL THEN 
                     52:                return(matches);
                     53:        ELSE
                     54:                return(envMatch(p, tail(e));
                     55: }
                     56: 
                     57: 
                     58: purportedMatch(base: DN; p: PurportedName): SET OF DN 
                     59: {
                     60:        s: String = head(p);
                     61:        matches: SET OF DN = NULL;
                     62: 
                     63:        IF length(p) == 1 THEN 
                     64:                IF length(base) == 0 THEN
                     65:                        IF (matches = rootSearch(s)) != NULL THEN 
                     66:                                return(matches);
                     67:                        ELSE return(leafSearch(base, s, FALSE);
                     68:                ELSE IF length(base) == 1 THEN
                     69:                        IF (matches = intSearch(base, s)) != NULL THEN
                     70:                                return(matches);
                     71:                        ELSE return(leafSearch(base, s, FALSE);
                     72:                ELSE 
                     73:                        IF (matches = leafSearch(base, s, TRUE)) != NULL THEN
                     74:                                return(matches);
                     75:                        ELSE return(intsearch(base, s);
                     76: 
                     77: 
                     78:        IF length(base) == 0 THEN
                     79:                FOR x IN rootSearch(s) DO
                     80:                        matches += (purportedMatch(x, tail(p));
                     81:        ELSE                    
                     82:                FOR x IN intSearch(base, s) DO
                     83:                        matches += (purportedMatch(x, tail(p));
                     84:        return(matches);
                     85: }                      
                     86: 
                     87: 
                     88: -- General.  Might need to tighten the filter for short strings,
                     89: -- in order to stop being flooded.  Alternatively, this could be 
                     90: -- done if the loose search hists a size limit
                     91:        
                     92: rootSearch(s: String): SET OF DN
                     93: {
                     94:        IF length == 2 THEN
                     95:                return(search(NULL, FALSE, s, {CountryName, 
                     96:                        FriendlyCountryName, OrganizationName},
                     97:                        {exact}, {Country, Organisation}));
                     98:        ELSE
                     99:                return(search(NULL, FALSE, s, {OrganizationName,
                    100:                        FriendlyCountryName}, {substring, approx},
                    101:                        {Country, Organisation}));
                    102: }
                    103:                
                    104: 
                    105: intSearch( base: DN; s: String)
                    106: {
                    107:        IF present(base, OrgUnitName) THEN
                    108:                return(search(base, FALSE, s, {OrgUnitName},
                    109:                        {substring, approx}, {OrgUnit}));
                    110:        ELSE IF present(base, OrganisationName) THEN
                    111:                return(search(base, FALSE, {OrgUnitName,
                    112:                        LocalityName}, {substring, approx},
                    113:                        {Organization, OrgUnit, Locality}));
                    114:        ELSE IF present(base, LocalityName) THEN
                    115:                return(search(base, FALSE, s, {OrganisationName},
                    116:                        {substring, approx}, {Locality});
                    117:        ELSE
                    118:                return(search(base, false, s, {OrganisationName,
                    119:                        LocalityName}, {substring, approx}, 
                    120:                        {Organisation, Locality}));
                    121: }
                    122: 
                    123: 
                    124: present(d: DN; t: AttributeType): BOOLEAN
                    125: {
                    126:        FOR x IN d DO
                    127:                IF x.type == t THEN return(TRUE);
                    128:        return(FALSE);
                    129: }
                    130: 
                    131: leafSearch(base: DN; s: String; subtree: BOOLEAN) 
                    132: {      
                    133:        return(search(base, subtree, s, {CommonName, Surname,
                    134:                UserId}, {substring, approx}));
                    135: }
                    136: 
                    137: 
                    138: search(base: DN; subtrees: BOOLEAN; s: string;
                    139:        alist SET OF AttributeType; matchtypes SET OF MatchType 
                    140:        objectClasses SET OF ObjectClass OPTIONAL): SET OF DN 
                    141: {
                    142:        -- mapped onto Directory Search, with OR conjunction
                    143:        -- of filter items
                    144: 
                    145:        return dNSelect (s, search-results, alist);
                    146: }
                    147: 
                    148: read(base: DN; alist SET OF AttributeType): SET OF Attribute;
                    149: {
                    150:        -- mapped onto Directory Read
                    151:        -- Types repeated to deal with multiple values
                    152:        -- This would be implemented by returning selected info
                    153:        -- with the search operation
                    154: }
                    155: 
                    156: dNSelect(s: String; dlist SET OF DN; alist: SET OF AttributeType): SET OF DN
                    157: {
                    158:        exact, good: SET OF DN;
                    159: 
                    160:        FOR x IN dlist DO
                    161:                IF last(DN).Value == s THEN
                    162:                        exact += x;
                    163:                ELSE IF FOR y IN read(x, alist) DO
                    164:                        IF y.value == s THEN
                    165:                                good += x;
                    166: 
                    167: 
                    168:        IF exact != NULL THEN return(exact);
                    169:        IF good != NULL THEN return(good);
                    170:        return(userQuery(dlist));
                    171: }      
                    172:                                
                    173: 
                    174: userQuery(dlist SET OF DN): SET OF DN
                    175: {
                    176:        -- pass back up for manual checking
                    177:        -- user can strip all matches to force progres....
                    178: }
                    179: 
                    180: 
                    181: head()    -- return first element of list
                    182: tail()    -- return list with first element removed
                    183: length()  -- return size of list
                    184: last()   -- return last element of list

unix.superglobalmegacorp.com

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