📄 rfc1484.txt
字号:
Whilst the intention of the notation is to allow for specification of alternate values, it inherently allows for ambiguous names to be specified. It needs to be demonstrated that problems of this characteristic are outweighed by other benefits of the notation. Utility Determine that the specification is being implemented and used.Hardcastle-Kille [Page 19]RFC 1484 User Friendly Naming July 1993 Performance Measurements on the performance implications of using this approach should be made. Alogrithm The utility of the algorithm, and possible variants, should be investigated. This format, and the procedures for resolving purported names, should be evolved. The syntax can be expected to be stable. In light of experience, the algorithm for resolving purported names may be changed.11. References [CCI88] The Directory --- overview of concepts, models and services, December 1988. CCITT X.500 Series Recommendations. [HK93] S.E. Hardcastle-Kille. A string representation of distinguished names. RFC 1485, Department of Computer Science, University College London, July 1993. [Kil89a] S.E. Kille. New name forms, May 1989. ISO/IEC/JTC 21/ WG4/N797 UK National Body Contribution to the Oslo Directory Meeting. [Kil89b] S.E. Kille. The THORN large scale pilot exercise. Computer Networks and ISDN Systems, 16(1):143--145, January 1989. [Kil90] S.E. Kille. Using the OSI directory to achieve user friendly naming. Research Note RN/20/29, Department of Computer Science, University College London, February 1990. [KRRT90] S.E. Kille, C.J. Robbins, M. Roe, and A. Turland. The ISO development environment: User's manual (version 6.0), January 1990. Volume 5: QUIPU. [Neu89] G.W. Neufeld. Descriptive names in X.500. In SIGCOMM 89 Symposiun Communications Architectures and Protocols, pages 64--71, September 1989. [Pet88] L.L. Petersen. The profile naming service. ACM Transactions on Computing Systems, 6(4):341--364, November 1988.Hardcastle-Kille [Page 20]RFC 1484 User Friendly Naming July 1993 [Ros90] M.T. Rose. Realizing the White Pages using the OSI Directory Service. Technical Report 90--05--10--1, Performance Systems International, Inc., May 1990.12. Security Considerations Security issues are not discussed in this memo.13. Author's Address Steve Hardcastle-Kille ISODE Consortium P.O. Box 505 London SW11 1DX England Phone:+44-71-223-4062 EMail: S.Kille@ISODE.COM DN: CN=Steve Hardcastle-Kille, O=ISODE Consortium, C=GB UFN: S. Hardcastle-Kille, ISODE Consortium, GBA. 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 { 10 type OBJECT IDENTIFIER, value ANY }RDN ::= Attribute -- simplification, as can be multi-valueDN ::= SEQUENCE OF RDNHardcastle-Kille [Page 21]RFC 1484 User Friendly Naming July 1993Environment ::= SEQUENCE OF DN 20EnvironmentList ::= SEQUENCE OF SEQUENCE { lower-bound INTEGER, upper-bound INTEGER, environment Environment }friendlyMatch(p: PurportedName; el: EnvironmentList): SET OF DN{ -- Find correct environment 30 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));} 40envMatch(p: PurportedName; e: Environment): SET OF DN{ -- Check elements of environment -- in the defined order matches: SET OF DN; IF length(e) == 0 THEN return(NULL); matches = purportedMatch(head(e).DN, p) 50 IF matches != NULL THEN return(matches); ELSE return(envMatch(p, tail(e));}purportedMatch(base: DN; p: PurportedName): SET OF DN{ s: String = head(p); 60 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 THENHardcastle-Kille [Page 22]RFC 1484 User Friendly Naming July 1993 IF (matches = intSearch(base, s)) != NULL THEN return(matches); 70 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)); 80 ELSE FOR x IN intSearch(base, s) DO matches += (purportedMatch(x, tail(p)); return(matches);}-- 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 hists a size limit 90rootSearch(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 100 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}, 110 {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});Hardcastle-Kille [Page 23]RFC 1484 User Friendly Naming July 1993 ELSE return(search(base, one-level, s, {OrganisationName,120 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); 130}SearchScope := ENUMERATED (base-object, one-level, subtree)leafSearch(base: DN; s: String; search-scope: SearchScope){ return(search(base, search-scope, s, {CommonName, Surname, UserId}, {substring, approx}));} 140search(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);} 150read(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; 170Hardcastle-Kille [Page 24]RFC 1484 User Friendly Naming July 1993 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 180 -- user can strip all matches to force progres....}head() -- return first element of listtail() -- return list with first element removedlength() -- return size of listlast() -- return last element of list Figure 2: Matching Algorithm______________________________________________________________________Hardcastle-Kille [Page 25]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -