The TIP Project 使用者帳號的資料規格

Date: 2001/4/5
Preceding press: 2001/3/31

1.關於資料儲存方式

使用者帳號資料以使用者識別代號(userid)做為鍵值,透過一定的資料庫存取 介面,存於代稱為 PASSFILE 的資料庫中。

1.1

應透過 bbslib 2 的 db_i 介面存取。

1.2

資料內容應存於符號 PASSFILE 所設定的檔案中。

2.USERID/Password

每個使用者都必須有一個使用者識別代號,稱作 userid ,且是唯一的;而 使用時,則不區分 userid 的大小寫。

2.1

userid 的合法格式以 REGEX 表示為 "[A-Za-z][A-Za-z0-9]+" ;且其長度 最短為 3 個字元,最長為 IDLEN-1 個字元。

userid 不等於使用者名稱,且多數網路應用協定對於 userid 的內容亦多有限制,因 此不應使用其他字元組之字元於 userid 中。 故只使用 ASCII 中的字元 A-Z, a-z 及 0-9 。

2.2

每個使用者,也都具有一個密碼 (password) ,和 userid 搭配用於身份認證。 基於習慣用法, password 的欄位名稱是 "passwd" 。

密碼可接受由任何字元所組成的任意長度字串,但有兩個字串被視為特殊密碼。 其一是 "*" ,這個密碼表示此帳號不可簽入; 其二為 "" (空白字串) ,這個密碼表示此帳號不需密碼即可簽入, 由於這個密碼嚴重影嚮安全性,一般只有 guest 這個特別帳號使用此密碼, 而在實作帳號管理工具時,通常不允許使用者輸入空白字串做為密碼。

3.鍵值(key)

key 的內容是全以小寫表示的 userid ,並包含字串結尾的 null 字元。
-> strlen(lower_case(userid))+1

4.資料記錄

使用者帳號的資料內容,應以 markup language 的方式表示。
-> <userid>userid</userid>

4.1

以下欄位名稱,為系統所使用,並有特殊意義:
userid, username, passwd, level, group 。

4.2

每筆資料得有不定數目的欄位,但不得省略 userid 欄位。

4.3

應用程式開發者得自定欄位名稱及用途。

4.4

欄位名稱得使用 ASCII 字碼以外的字元組;但必須自行處理字元組識別的問題。

字元組識別的問題:若一欄位名稱使用 Big5 碼,而另一欄位名稱使用 GB 碼,則應 用程式開發者必須自行處理判定欄位名稱是用什麼字元組的問題,以及潛在的內碼衝突。

4.5

若欄位名稱所用之字元組,有大小寫之分,為便於使用及辨識,欄位名稱應 全為小寫。

5.符號定義值

PASSFILE 慣例設為 ".PASSWDS" 。

IDLEN 建議長度為 80 個字元 (含結尾字元)。合宜的長度介於 32 到 256 間。

5.1 bbslib 2

bbslib 2 將 PASSFILE 定義在 userec.h 中,而 IDLEN 定義在 bbsdefs.h 中。

6.範例

Rule_4:
user_data = 
"<userid>userid</userid>
<username>User name</username>
<passwd>XXXXXXXX</passwd>"

userid = get_field(user_data, "userid");

Rule_2:
if( strlen(userid) < 3 ||
    strlen(userid) >= IDLEN ||
    strcmp_regex(userid, "^[A-Za-z][A-Za-z0-9]+") != 0 )
{
	invalid userid;
}

Rule_3:
userid = lower_case(userid);
key.data = userid;
key.size = strlen(userid)+1;

data.data = user_data;
data.size = strlen(user_data)+1;

Rule_1:
userdb = dbi_open(PASSFILE, DBI_WRITER);
dbi_put(userdb, key, data);
dbi_close(userdb);