⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfc1823.txt

📁 最近的中文RFC文档
💻 TXT
📖 第 1 页 / 共 3 页
字号:
           LDAP_NO_MEMORY

   ldap_err2string()用于将数字型的LDAP出错代码(例如ldap_result2error()的返回值,或
任意一同步API操作调用结果)转换为描述该出错信息的字符串。其返回一个指向静态数
据的指针。
   ldap_perror() 用于将ld_errno域中参数msg中包含的信息转换为标准的错误信息。
8.  对查询结果的处理
   下面的函数调用用于分析由ldap_search()及其友员函数返回的结果。这些返回值存放在
一个不透明的结构中,只能通过调用下面这些函数来获得。这些函数可用于处理返回的条目、
条目属性、获得条目名称,以及获得条目中给定属性的属性值。
8.1.  条目结果的处理
   函数ldap_first_entry()和ldap_next_entry()用于处理查询到的条目结果。
   ldap_count_entries() 用于计算返回的条目个数。

           LDAPMesage *ldap_first_entry( LDAP *ld, LDAPMessage *res );

           LDAPMesage *ldap_next_entry( LDAP *ld, LDAPMessage *entry );

           int ldap_count_entries( LDAP *ld, LDAPMessage *res );

   参数:
   ld     连接句柄;

   res    查询结果,由同步查询进程或函数ldap_result()获得;

   entry  函数调用ldap_first_entry()或ldap_next_entry()的返回值;

      当没有条目存在时ldap_first_entry()和ldap_next_entry()将返回NULL。当函数在运行
过程中出错时也会返回NULL,但此时ld连接句柄中的ld_errno域将记录该错误信息。
      ldap_count_entries() 返回在条目链中条目的个数。该函数也可被用于计算在函数调用
ldap_first_entry()或ldap_next_entry()中符合条件的条目的个数。
8.2.  对属性结果的处理
   函数ldap_first_attribute() 和ldap_next_attribute()用于对由某个条目返回的属性结果的处
理。

           char *ldap_first_attribute(
                   LDAP            *ld,
                   LDAPMessage     *entry,
                   void            **ptr
           );
           char *ldap_next_attribute(
                   LDAP            *ld,
                   LDAPMessage     *entry,
                   void            *ptr
           );

   参数:
   ld     连接句柄;

   entry  需处理的属性结果所在的条目,即ldap_first_entry()或ldap_next_entry()的返回值;

   ptr    在函数ldap_first_attribute()中,用于保存当前条目所在位置的地址指针。函数
ldap_next_attribute()所用到的指针为先前调用ldap_first_attribute()获得的返回值。

      当达到最后一个属性时,函数ldap_first_attribute()和ldap_next_attribute()将返回
NULL,由于这个原因,ld句柄中的ld_errno 域将被设置为error。
      两个进程都将返回一个指向包含当前属性名的联接缓冲的指针。这将被当作静态数据
对待。ldap_first_attribute()将定位并返回一个指向BerElement类型的名为ptr的指针,以
保存当前位置的路径。该指针将被后面的调用ldap_next_attribute() 所引用,以获得下一
个条目的属性结果。
      返回的属性名将被ldap_get_values()极其成员函数利用,以获得相关的属性值。
8.3.  获得属性值
   ldap_get_values()和ldap_get_values_len()用于获得条目的属性值。ldap_count_values()
和ldap_count_values_len()用于计算返回值的个数。ldap_value_free()和
ldap_value_free_len()用于释放返回的属性值。

           typedef struct berval {
                   unsigned long   bv_len;
                   char            *bv_val;
           };

           char **ldap_get_values(
                   LDAP            *ld,
                   LDAPMessage     *entry,
                   char            *attr
           );

           struct berval **ldap_get_values_len(
                   LDAP            *ld,
                   LDAPMessage     *entry,
                   char            *attr
           );

           int ldap_count_values( char **vals );

           int ldap_count_values_len( struct berval **vals );

           int ldap_value_free( char **vals );

           int ldap_value_free_len( struct berval **vals );

   参数:

   ld     连接句柄;

   entry  属性所属的条目,即ldap_first_entry()或ldap_next_entry()的返回值;

   attr   返回值的属性,即ldap_first_attribute()或ldap_next_attribute()或一个字符串调用的
返回值(例如,"mail");

   vals   先前调用ldap_get_values()或ldap_get_values_len()的返回值。

   两种不同形式的调用都是有条件的。第一重形式只适用于非二进制的字符串类型数据;
第二种_len形式适用于任何形式的数据。

   注意,返回的值当不再使用时,应调用函数ldap_value_free()或ldap_value_free_len()进行
释放。
8.4.  目录项DN分析处理
   ldap_get_dn() 用于获得条目的dn 。

   ldap_explode_dn() 用于将 dn 中的各字段切开。

 ldap_dn2ufn()  用于将dn 的名字转换成较易读取的名字。

           char *ldap_get_dn( LDAP *ld, LDAPMessage *entry );

           char **ldap_explode_dn( char *dn, int notypes );

           char *ldap_dn2ufn( char *dn );

   参数:

   ld       连接句柄;

   entry    为ldap_first_entry()或ldap_next_entry()返回的搜寻代号;

   dn      可由ldap_get_dn()的返回值得到;

   notypes  布尔型参数,如果非零表明dn的组成部分将只包含属性值,而不包含属性名。         
(例如,"cn=Babs"将变为"Babs")。

   ldap_get_dn() 当dn分析错误时返回NULL,为ld连接句柄设置ld_errno以指明错误。
它返回一个指向预分配空间的指针,当此空间不再被使用时,调用free() 进行空间释放。这
些DN的返回格式在[4]中有所描述。

   ldap_explode_dn() 返回一个指针数组,该数组包含提供给DN的RDN部分。并通过
notypes参数标识是否包含类型。当不再使用该数组返回值时,可调用ldap_value_free()进行
资源释放。

   ldap_dn2ufn() 将DN转换成较易读取的名字(User Friendly Name),描述参见[5]。UFN将
返回值到预分配的空间,当此空间不再使用时,可调用free() 函数释放。
9.  安全考虑
   LDAP支持联结鉴别时的少量安全。
10.  鸣谢
   这篇材料基于国家科学中心授权的No. NCR-9416667的大力支持。
11.  参考书目
   [1] The Directory: Selected Attribute Syntaxes.  CCITT,
       Recommendation X.520.

   [2] Howes, T., Kille, S., Yeong, W., and C. Robbins, "The String
       Representation of Standard Attribute Syntaxes", University of
       Michigan, ISODE Consortium, Performance Systems International,
       NeXor Ltd., RFC 1778, March 1995.

   [3] Howes, T., "A String Representation of LDAP Search Filters", RFC
       1558, University of Michigan, December 1993.

   [4] Kille, S., "A String Representation of Distinguished Names", RFC
       1779, ISODE Consortium, March 1995.

   [5] Kille, S., "Using the OSI Directory to Achieve User Friendly
       Naming",  RFC 1781, ISODE Consortium, March 1995.

   [6] S.P. Miller, B.C. Neuman, J.I. Schiller, J.H. Saltzer, "Kerberos
       Authentication and Authorization System", MIT Project Athena
       Documentation Section  E.2.1, December 1987

   [7] Yeong, W., Howes, T., and S. Kille, "Lightweight Directory Access
       Protocol," RFC 1777, Performance Systems International,
       University of Michigan, ISODE Consortium, March 1995.
12.  作者地址
       Tim Howes
       University of Michigan
       ITD Research Systems
       535 W William St.
       Ann Arbor, MI 48103-4943
       USA

       Phone: +1 313 747-4454
       EMail: tim@umich.edu

       Mark Smith
       University of Michigan
       ITD Research Systems
       535 W William St.
       Ann Arbor, MI 48103-4943
       USA

       Phone: +1 313 764-2277
       EMail: mcs@umich.edu
13.  附: 一个简单的LDAP API代码
   #include <ldap.h>

   main()
   {
           LDAP            *ld;
           LDAPMessage     *res, *e;
           int             i;
           char            *a, *dn;
           void            *ptr;
           char            **vals;

           /* 打开一个连接 */
           if ( (ld = ldap_open( "dotted.host.name", LDAP_PORT ))
                   == NULL )
                   exit( 1 );

           /* 匿名登陆 */
           if ( ldap_simple_bind_s( ld, NULL, NULL ) != LDAP_SUCCESS ) {
                   ldap_perror( ld, "ldap_simple_bind_s" );
                   exit( 1 );
           }

           /* 查询cn="Babs Jensen"的条目,并返回所有属性 */
           if ( ldap_search_s( ld, "o=University of Michigan, c=US",
               LDAP_SCOPE_SUBTREE, "(cn=Babs Jensen)", NULL, 0, &res )
               != LDAP_SUCCESS ) {
                   ldap_perror( ld, "ldap_search_s" );
                   exit( 1 );
           }

           /* 分析每个返回的条目 */
           for ( e = ldap_first_entry( ld, res ); e != NULL;
               e = ldap_next_entry( ld, e ) ) {
                   /* 打印对象的dn */
                   dn = ldap_get_dn( ld, e );
                   printf( "dn: %s0, dn );
                   free( dn );

                   /* 打印每个属性 */
                   for ( a = ldap_first_attribute( ld, e, &ptr );
                           a != NULL;
                       a = ldap_next_attribute( ld, e, ptr ) ) {
                           printf( "attribute: %s0, a );

                           /* 打印每个属性值 */

                           vals = ldap_get_values( ld, e, a );
                           for ( i = 0; vals[i] != NULL; i++ ) {
                                   printf( "value: %s0, vals[i] );
                           }
                           ldap_value_free( vals );
                   }
           }
           /* 释放查询结果 */
           ldap_msgfree( res );

           /* 关闭资源连接 */
           ldap_unbind( ld );
   }

RFC1823——The LDAP Application Program Interface         LDAP应用程序接口


19
RFC文档中文翻译计划

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -