📄 rfc1781.txt
字号:
[8] L.L. Petersen. The profile naming service. ACM Transactions on Computing Systems, 6(4):341--364, November 1988. [9] M.T. Rose. Realizing the White Pages using the OSI Directory Service. Technical Report 90--05--10--1, Performance Systems International, Inc., May 1990.Kille [Page 20]RFC 1781 User Friendly Naming March 199512. Security Considerations Security issues are not discussed in this memo.13. Author's Address Steve Kille ISODE Consortium The Dome The Square Richmond, Surrey TW9 1DT England Phone:+44-181-332-9091 EMail: S.Kille@ISODE.COM DN: CN=Steve Kille, O=ISODE Consortium, C=GB UFN: S. Kille, ISODE Consortium, GBKille [Page 21]RFC 1781 User Friendly Naming March 1995A. Pseudo-code for the matching algorithm The following pseudo-code is intended to clarify the matching algorithm. The language uses ASN.1 data types, with flow control "C"-like, but with keywords upper-cased.PurportedName ::= SEQUENCE OF String -- simplication, as attribute types can optionally be -- specified -- Each element of the Purported Name is a string -- which has been parsed from the BNFAttribute ::= SEQUENCE { type OBJECT IDENTIFIER, value ANY }RDN ::= Attribute -- simplification, as can be multi-valueDN ::= SEQUENCE OF RDNEnvironment ::= SEQUENCE OF DNEnvironmentList ::= SEQUENCE OF SEQUENCE { lower-bound INTEGER, upper-bound INTEGER, environment Environment }friendlyMatch(p: PurportedName; el: EnvironmentList): SET OF DN{ -- Find correct environment IF length(el) == 0 THEN return(NULL); IF length(p) <= head(el).upper-bound && length(p) >= head(el).lower-bound THEN return envMatch (p, head(el).environment); ELSE return(friendlyMatch(p, tail(el));}envMatch(p: PurportedName; e: Environment): SET OF DN{ -- Check elements of environment -- in the defined order matches: SET OF DN;Kille [Page 22]RFC 1781 User Friendly Naming March 1995 IF length(e) == 0 THEN return(NULL); matches = purportedMatch(head(e).DN, p) IF matches != NULL THEN return(matches); ELSE return(envMatch(p, tail(e));}purportedMatch(base: DN; p: PurportedName): SET OF DN{ s: String = head(p); matches: SET OF DN = NULL; IF length(p) == 1 THEN IF length(base) == 0 THEN IF (matches = rootSearch(s)) != NULL THEN return(matches); ELSE return(leafSearch(base, s, one-level); ELSE IF length(base) == 1 THEN IF (matches = intSearch(base, s)) != NULL THEN return(matches); ELSE return(leafSearch(base, s, one-level); ELSE IF (matches = leafSearch(base, s, subtree)) != NULL THEN return(matches); ELSE return(intsearch(base, s); IF length(base) == 0 THEN FOR x IN rootSearch(s) DO matches += (purportedMatch(x, tail(p)); ELSE FOR x IN intSearch(base, s) DO matches += (purportedMatch(x, tail(p)); return(matches);}Kille [Page 23]RFC 1781 User Friendly Naming March 1995-- General. Might need to tighten the filter for short strings,-- in order to stop being flooded. Alternatively, this could be-- done if the loose search hits a size limitrootSearch(s: String): SET OF DN{ IF length(s) == 2 THEN return(search(NULL, one-level, s, {CountryName, FriendlyCountryName, OrganizationName}, {exact}, {Country, Organisation})); -- test exact match only -- probably a country code ELSE return(search(NULL, one-level, s, {OrganizationName, FriendlyCountryName}, {substring, approx}, {Country, Organisation}));}intSearch( base: DN; s: String){ IF present(base, OrgUnitName) THEN return(search(base, one-level, s, {OrgUnitName}, {substring, approx}, {OrgUnit})); ELSE IF present(base, OrganisationName) THEN return(search(base, one-level, s, {OrgUnitName, LocalityName}, {substring, approx}, {Organization, OrgUnit, Locality})); ELSE IF present(base, LocalityName) THEN return(search(base, one-level, s, {OrganisationName}, {substring, approx}, {Locality}); ELSE return(search(base, one-level, s, {OrganisationName, LocalityName}, {substring, approx}, {Organisation, Locality}));}present(d: DN; t: AttributeType): BOOLEAN{ FOR x IN d DO IF x.type == t THEN return(TRUE); return(FALSE);}SearchScope := ENUMERATED (base-object, one-level, subtree)leafSearch(base: DN; s: String; search-scope: SearchScope)Kille [Page 24]RFC 1781 User Friendly Naming March 1995{ return(search(base, search-scope, s, {CommonName, Surname, UserId}, {substring, approx}));}search(base: DN; search-scope: SearchScope; s: string; alist SET OF AttributeType; matchtypes SET OF MatchType objectClasses SET OF ObjectClass OPTIONAL): SET OF DN{ -- mapped onto Directory Search, with OR conjunction -- of filter items return dNSelect (s, search-results, alist);}read(base: DN; alist SET OF AttributeType): SET OF Attribute;{ -- mapped onto Directory Read -- Types repeated to deal with multiple values -- This would be implemented by returning selected info -- with the search operation}dNSelect(s: String; dlist SET OF DN; alist: SET OF AttributeType):16SET0OF DN{ exact, good: SET OF DN; FOR x IN dlist DO IF last(DN).Value == s THEN exact += x; ELSE IF FOR y IN read(x, alist) DO IF y.value == s THEN good += x; IF exact != NULL THEN return(exact); IF good != NULL THEN return(good); return(userQuery(dlist));}userQuery(dlist SET OF DN): SET OF DN{ -- pass back up for manual checking -- user can strip all matches to force progres....}head() -- return first element of listtail() -- return list with first element removedKille [Page 25]RFC 1781 User Friendly Naming March 1995length() -- return size of listlast() -- return last element of list Figure 2: Matching AlgorithmKille [Page 26]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -