接下來,將介紹 Extension Manager 的一個工程實例,並希冀由這個工程實例對 Lotus C API 應用程式開發者在使用 Extension Manager 實現定製應用程式時給予一定的啟發和指導。
1)工程背景
某客戶為了加強內部辦公環境的管理,需要強制用戶加入 Windows 特定域。客戶希望採取綁定郵件系統訪問的方式:即限制用戶只有登錄 Windows 域後才可以訪問郵件系統。
2)工程設計
為實現客戶需求,我們可以構想在客戶端部署一個 EM 程式。該客戶端 EM 程式註冊 EM_GETPASSWORD 事件,在Notes彈出密碼輸入對話框之前判斷當前 Windows 用戶是否在域中,如果不在域中就返回 ERR_BSAFE_USER_ABORT,這樣可以阻止 Notes 客戶端連線 Domino Server。程式片斷請參考 Extension Manager 程式結構示例。
一切進行的很順利,似乎工作到此已經萬事大吉了。然而且慢,如果仔細考慮一下,這種方案是不可取的,如果客戶端不安裝這個EM程式怎么辦?或者如果用戶卸載這個 EM 程式的話怎么辦?這樣的話客戶端完全可以繞開認證過程。
所以我們必須考慮在伺服器端進行統一的控制,這就需要在伺服器端也部署一個 EM 程式。該伺服器 EM 程式註冊 EM_SECAUTHENTICATION 事件,對每位向郵件伺服器傳送訪問請求的用戶進行實時授權鑑別,只有在客戶端登錄 Windows 域的情況下,伺服器端 EM 進程才開啟該用戶訪問郵件伺服器的限制。
現在的問題是伺服器端 EM 程式如何鑑別來訪客戶端是否在 Windows 域中?答案是 Socket 通信方法:客戶端 EM 程式在經過相關判斷之後,把 Notes 用戶的信息寫入到安裝 Domino Server 的伺服器的某個檔案(如Info.DAT)中,伺服器端 EM 程式在認證來訪 Notes 用戶的時候查詢該檔案,如果發現來訪 Notes 用戶信息在 Info.DAT 檔案中存在,則授權該用戶訪問郵件伺服器,否則則拒絕其訪問。
3)模組設計與實現
系統分為三個組件,分別是:Notes 、客戶端和EM 組件。
Notes 客戶端 EM 組件
功能說明:負責判斷當前 Notes 用戶的 Windows 域信息,並把相關信息傳送給通信伺服器,在接收到通信伺服器的確認信息之後,更新登入時間窗信息。(時間窗是一個時間段,某 Notes 客戶端在域中登入 Domino Server 之後,允許在時間窗內該 Notes 客戶端不登入域也能訪問郵件伺服器)
算法如下:
I. 捕獲 EM_GETPASSWORD 訊息
II. 讀取註冊表的內容,取得當前時間跟註冊表中上一次登記的時間做比較,判斷時間窗是否過期。
III. 如果時間窗未過期,即該 Notes 客戶端已經在指定時間段內向 Server 註冊過了,則直接返回 ERR_EM_CONTINUE. 把控制權交給 Notes,允許其連線郵件伺服器。
IV. 如果時間窗過期,判斷當前 Windows 用戶否在域中,如果在域中,從註冊表中讀取通信伺服器的 IP 和連線埠,把 Notes User 的信息傳送過去,然後等待 Server 的回響。如果收到 Server 的回響,那么更新註冊表中日期表項
V. 如果當前 Windows 用戶不在域中,說明在時間窗之內沒有人在域中登入過 Domino Server,返回 ERR_BSAFE_USER_ABORT 阻止 Notes 連線郵件伺服器。