跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

使用 ID Recovery API 实现 Notes ID 自动化管理

通过示例任务程序了解 Lotus Notes/Domino C API 8.0 中新的 ID Recovery API

王 磊建, 软件工程师
王磊建,IBM WPLC Toolkit Team 软件工程师,负责 C API 的相关工作, 电子邮箱:wangleij@cn.ibm.com
Albert Hsieh (hsiehcy@tw.ibm.com), 高级软件工程师
Albert Hsieh,IBM WPLC Toolkit Team Leader,电子邮箱:hsiehcy@tw.ibm.com

简介: 

本文介绍 Notes/Domino C API 8.0 中将要发布的 ID Recovery API。这些 API 的出现将使得合作伙伴以及 Notes 程序开发人员获得通过应用程序来加密、备份以及恢复 Notes ID 的能力,通过一些创造性的应用开发,就可以将繁琐的 ID 管理工作变得简洁而高效。

在本文中,我们将简单回顾 Domino 对于 Notes ID 备份和恢复等管理工作的基本流程,然后对 ID Recovery API 作简单介绍,最后通过一个应用程序实例,将这些 API 融合到一个服务器任务程序,展示了通过创造性的应用,ID Recovery API 将可能为客户带来的效率上的提升和崭新的体验。

发布日期: 2007 年 6 月 28 日
级别: 初级
访问情况 : 1635 次浏览
评论: 


对 Notes ID 备份恢复工作的简单回顾

Notes ID 的重要性是不言自喻的,没有了 Notes ID,将直接导致用户不能访问服务器、邮件以及用 Notes ID 加密过的私有信息。但是一个用户的 Notes ID 存在丢失或者损坏的可能性,更常见的情况是用户忘记了 Notes ID 的密码。为了防止这种危险状态,Domino 制定了一个相应的流程来进行 Notes ID 的备份和恢复。举一个简单的例子,假设有一个 Notes ID,它不含有恢复信息,现在要求为其添加正确的恢复信息,则相关流程如下:

  1. Domino 管理员在服务器端设置恢复信息
    1. 在服务器配置文档中选择 certification 项
    2. 点击“Edit Recovery Information”选项,在弹出的对话框里选择相应的 Server 以及 cert ID,点击确认按钮并输入 cert ID 的密码
    3. 在图 1 所示的对话框中进行相应的配置,包括 RA(Recovery Authority)的人数,恢复密码的长度等。

      图 1. 配置 RA 人数和恢复密码的长度等
      图 1. 配置 RA 人数和恢复密码的长度等

    4. 点击 Export 按钮,在图 2 所示对话框中进行相应的配置,包括目标用户的邮件地址,邮件头和邮件内容等。

      图 2. 配置目标用户的邮件地址,邮件头和邮件内容等
      图 2. 配置目标用户的邮件地址,邮件头和邮件内容等

  2. 用户确认恢复信息

    在上面步骤之后,目标用户将会收到邮件,邮件里面包含最新的 ID 文件的恢复信息,用户选择菜单命令“Accept Recovery Information”就可以将恢复信息添加到自己的 Notes ID 文件当中。

  3. ID 的恢复

    现在我们假设用户突然忘记了密码,于是他向管理员申请密码恢复。

    1. 管理员从 ID 备份库中取得该用户加密过的 Notes ID
    2. 在 Server 配置文件的 certification 项中点击“Extract Recovery Password”
    3. 选择 Notes ID 文件,确认之后,就可以得到对应着该管理员的恢复密码

    由于一个 ID 文件可能有多个 RA,每个 RA 都依次执行上述步骤,用户在获得足够多的 Recovery Password 之后,就可以在客户端登陆要求输入密码的时候选择“cancel”,然后选择“Try to recovery your password”选项,在弹出的对话框中,依次输入恢复密码,确认之后输入新密码,就可以完成密码的恢复工作。

至此,我们完成了整个的 Notes ID 的加密、备份以及恢复的流程。可以看出这个流程虽然完整,但是还是存在如下的缺憾:

  1. 流程比较繁琐,因此也会比较费时,倘若用户丢失 ID,可能导致相当时间不能访问重要信息,这是绝对应该避免的状况。
  2. 设想一下必须对大量的 ID 文件进行这样的操作,对 Domino 管理员来说这简直是一场灾难。

请不必紧张, ID Recovery API 的出现可以使得 Domino 管理员们长吁一口气,通过这些 API,Notes 开发者能够以一种更便捷的方法来进行 Notes ID 的备份和恢复管理工作,下面我们就对这些 API 进行简单的介绍,并将开发一个简单的例子对其使用方法做进一步探讨,作者希望可以抛砖引玉,激发大家更加有创造性的应用。

ID Recovery API 的简单介绍

在 Notes/Domino C API 8.0 中,将发布六个与 ID Recovery 相关的 API,关于这些 API 的详细介绍,请读者查阅 API 用户手册,本节只对它们作一个概括性的介绍:

  • SECBuildEncryptedBackupIDFile

    输入某 ID 文件的位置以及其密码,该 API 对指定的 ID 文件进行加密,并保存到指定位置。在用户要求的情况下,也可以返回 Domino Server 配置中指定的接收 ID 文件的邮件数据库的地址。

  • SECMailRecoveryID

    输入某 ID 文件的位置以及其密码,该 API 会从指定的 ID 文件中抽取其中的 ID 恢复信息,然后创建一个 ID 备份文件,接着在指定的邮件数据库或者 mail.box 数据库中创建一个 mail note,将 ID 备份文件附着到 mail note 中,并发送邮件到 Domino Server 配置中指定的接收 ID 文件的邮件数据库。

  • SECGetRecoveryInfo

    如果输入 certifier ID 的句柄,该 API 会从 certifier ID 中抽取 ID 恢复信息并保存到 RECOVERY_INFO 数据结构中;如果输入保存有 certifier 记录的 note 句柄,该 API 会从此 note 的 ITEM_RECOVERY_INFO 域中抽取恢复信息并保存到 RECOVERY_INFO 数据结构中。

    RECOVERY_INFO 的定义如下:

     typedef 	 struct { 
    		 WORD 		 Quorum; 
    		 WORD 		 NumberOfRAs; 		 // RA 的个数(最多八个)
    		 WORD 		 RALength[8]; 		 // RA 的长度
    		 char 		 RAs[8][MAXUSERNAME+1]; //RA 的名字
    		 WORD 		 RecoveryPasswordLength; // 恢复密码的长度
    		 Char 		 MailAddress[MAXPATH+1]; // 接收 ID 文件的邮件数据库
    		 char 		 CustomMsg[MAX_IDRecovery_CustomMessage]; // 定制的邮件体内容
     } RECOVERY_INFO; 
    	

  • SECImportRecoveryInfo

    将从 SECGetRecoveryInfo 函数中得到的恢复信息导入到指定的 Notes ID 文件中去。

  • SECExtractRecoveryPassword

    根据输入的 RA(Recovery Authority)和加密过的 ID 备份文件,该 API 会从 ID 备份文件中获取相应的恢复密码。

  • SECRecoverIDFile

    根据输入的多个 ID 恢复密码,恢复指定 ID 并为其设置新的指定密码。

现在我们已经了解了 ID Recovery API 的基本功能,接下来,我们就用一个简单的例子来看看这样的 API 可以为我们带来什么样的工作效率上的提升以及应用上的创新。

ID Recovery API 应用的简单例子

首先假设由于某些原因,某公司需要对大量的 Notes ID 进行加密备份,如果采用本文第一部分介绍的手工管理的方式,必然耗费大量的时间。现在我们使用 ID Recovery API 来设计一个简单的应用,来实现这个流程的程序化和自动化。为了使本例尽量简单,我们对一些问题进行了简化和省略,在真正的系统实现的时候,还有许多其它的工作要做,譬如说对 notes ID 的密码进行加密保护以及解密等。

整个系统的架构如图 3 所示:


图 3. 系统架构
图 3. 系统架构

系统设计思想如下:

  1. 首先创建一个 NSF 数据库 IDStore.nsf,并设计表单如下图所示:

    图 4. 设计表单
    图 4. 设计表单

    表单设计说明:

    • 用户 ID:Composite 域,用户将 ID 文件 attach 到这个域中;
    • 加密后的 ID 名字:文本域,用户输入加密后 Notes ID 的名字;
    • ID 密码:文本域,用户输入 Notes ID 的密码;
    • 处理状态:文本域,非用户输入(实际应用中可设计为隐藏域),代表文档处理状态,服务器任务程序在处理完文档之后会修改域的状态,并据此判断本文档是否已经被处理。
  2. 没有 ID 加密备份文件的用户可以登陆本数据库,并将相关的信息写入数据库中。
  3. 生成的文档都会出现在 IDWaitProcess 视图之中。
  4. 设计一个服务器任务程序 processid.exe,该程序在运行期间,会不断查询 IDStore.nsf 数据库中的文档,并从中取出未处理文档中附有的 ID 文件以及相应密码,置于本地保存,然后修改文档的状态为“已处理”,最后调用 ID Recovery API 中的 SECBuildEncryptedBackupIDFile函数对 ID 文件进行加密备份。加密之后的备份文件,可以保存到安全的地方,以备不测之需。
  5. 本实例程序的验证步骤如下:
    • 创建 NSF 数据库 IDStore.nsf,表单和视图的具体设计如上所述。
    • 用户登陆 IDStore.nsf 数据库,并填入正确的信息。
    • 编译附件中的程序 processid.cpp,生成 processid.exe 程序。
    • 将 processid.exe 程序拷贝到 domino 安装目录下。
    • 在 domino 控制台运行命令“load processid”。
    • 可以看到用户在数据库中添加的 ID 文件会被加密并备份到 D 盘根目录下(本实例程序仅适用于 Windows 系统)。

有关 Domino 任务程序的编程规范以及其它相关信息,请参考 Notes/Domino C API 的参考文档以及随 API Toolkit 一起发布的程序示例。本实例中的任务程序的设计结构可以参考如下代码:

// 包含 C 头文件
……………………
 // 包含 Notes C API 头文件
……………………
 char *DB_NAME="IDStore.nsf"; 
 char *view_name = "IDWaitProcess"; 

 STATUS doJob(char *); 
 void printAPIError(STATUS error); 

 STATUS LNPUBLIC note_action(VOID *db_handle, 
	 SEARCH_MATCH far *pSearchMatch, ITEM_TABLE *summary_info); 

 // Server Task 入口点
 STATUS LNPUBLIC  AddInMain (HMODULE hModule, int argc, char *argv[])
 { 
    /* 局部变量声明 . */ 
    STATUS     error = 0;           /* return code from API calls */ 
    HANDLE     hOldStatusLine;  /* handle to initial default status line*/ 
    HANDLE     hStatusLineDesc; /* handle to new default status line */ 
    HMODULE    hMod;            /* add-in task's module handle */ 
 char 	 statusline[] =  "Build encrypted back up ID file from IDStire.nsf"; 

	 // 服务器任务初始化
 AddInQueryDefaults (&hMod, &hOldStatusLine); 
    AddInDeleteStatusLine (hOldStatusLine); 
    hStatusLineDesc = AddInCreateStatusLine(statusline); 
    AddInSetDefaults (hMod, hStatusLineDesc); 
    
	
	 /* 开始循环,当 AddInIdle 函数返回 TRUE 时,退出循环 */ 
    while (!AddInIdle()) { 
	  /* For non-preemptive operating systems, give up control to other tasks.
 OSPreemptOccasionally will do nothing in preemptive operating systems. */ 
        OSPreemptOccasionally(); 

        /* 每隔三分钟检查 IDStore.nsf 数据库,查看是否有新的未处理文档出现 */ 
        if (AddInMinutesHaveElapsed(3))  { 
			 doJob(DB_NAME); 
        } 
    }   /* 结束循环 */ 
    return (NOERROR); 
 } 

 // 执行任务
 STATUS doJob(char *db_name){ 
	 DBHANDLE db_handle; 
	 NOTEHANDLE note_handle; 
	 NOTEID 	 view_id; 
	 STATUS error = 0; 
	
	 // 打开 "IDStore.nsf" 数据库
	 if (error = NSFDbOpen(db_name, &db_handle)) { 
		 printAPIError(error); 
	 } 
	 // 搜索 IDStore.nsf 数据库,如果有新的未处理文档出现,采取行动处理它
	 if (error = NSFSearch ( 
		 db_handle, 				 /* database handle */ 
		 NULL, 					 /* selection formula */ 
		 view_name, 				 /* title of view in selection formula */
		 0, 						 /* search flags */ 
		 NOTE_CLASS_DOCUMENT, 	 /* note class to find */ 
		 NULL, 					 /* starting date (unused) */ 
           note_action, 			 /* action routine for notes found */ 
		 &db_handle, 				 /* parameter to action routine */ 
      	 NULL)) 					 /* returned ending date (unused) */ 
	 { 
		 printAPIError(error); 
	 } 

 NSFDbClose(db_handle); 
	 return error; 
 } 

 // 打印 API 函数返回的错误值对应的文本信息
 void printAPIError(STATUS error){ 
	 WORD 	 len = 0; 
	 char 	 msgtxt[MAXUSERNAME] = {0}; 
	 len = OSLoadString(NULL, error, msgtxt, MAXUSERNAME-1); 
	 AddInLogMessageText(msgtxt, NOERROR); 
 } 

 //NSFSearch 的回调函数,处理找到的文档
 STATUS LNPUBLIC note_action(VOID *db_handle, 
						 SEARCH_MATCH far *pSearchMatch, 
						 ITEM_TABLE *summary_info){ 
	 STATUS err = NOERROR; 
	 /* 对于新的未处理文档采取如下动作
	 1) 提取 ID 文件
	 2) 得到 ID 文件的密码
	 3) 调用 ID recovery API 来创建加密备份文件,并加以保存
	 4) 修改当前处理文档的状态
	 */ 
	 // 具体的代码请参考附件 processid.cpp 
	 return err; 
 }

总结

本文介绍了在 Notes/Domino C API 8.0 中将要发布的 ID Recovery API,并且用一个简单的应用实例展示了这些 API 可能带来的效率和效益上的提升,我们希望读者能从本文中有所收获,并根据现实中的具体问题实现更有创造性的应用。



下载

名字大小下载方法
processid.zip3 KBHTTP

关于下载方法的信息


参考资料

学习

获得产品和技术

讨论

作者简介

王磊建,IBM WPLC Toolkit Team 软件工程师,负责 C API 的相关工作, 电子邮箱:wangleij@cn.ibm.com

Albert Hsieh,IBM WPLC Toolkit Team Leader,电子邮箱:hsiehcy@tw.ibm.com

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Lotus
ArticleID=239318
ArticleTitle=使用 ID Recovery API 实现 Notes ID 自动化管理
publish-date=06282007
author1-email=wangleij@cn.ibm.com
author1-email-cc=
author2-email=hsiehcy@tw.ibm.com
author2-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。