GoAhead2.5 源代码分析
作者:soqsoq
asp.c
cgi.c
ejlex.c
Active server page support
Standard CGI support
Embedded JavaScript lexical analyser
ejparse.c
Embedded JavaScript parser and API
emfdb.c
WebServer database
form.c
In-memory forms processor with GCI support
handler.c
URL handler support
main.c
Main program and startup for operating system
rom.c
ROM Web pages access module when not using a file system.
security.c
Security URL handler. Implements a basic security policy
sock.c
Generic socket support
sockGen.c
platform-independent socket support
user management
primary GoAhead WebServer code. Includes state machine.
um.c
webs.c
一一一一....Um.c((((用户管理
用户管理))))
用户管理用户管理
umconfig.txt
----------------------------------------
TABLE=users
ROW=0
name=admin
password=Uz
group=Administrator
prot=1
disable=0
TABLE=groups
ROW=0
name=Administrator
priv=4
method=3
prot=1
disable=0
TABLE=access
ROW=0
name=/main.html
method=3
secure=0
group=Administrator
-------------------------------------
GoAhead 提供了认证功能:主要是两种认证基本认证和摘要认证。摘要认证比基本认证更
安全些,所以选择摘要认证。
认证功能其实是用户管理功能的一部分。要配置认证功能,需要修改 umconfig.txt 文件,
GoAhead 在启动时会读取该文件,实现认证功能。
文件大概情况如下:
TABLE=users/*用户配置*/
ROW=0
name=raise/*用户名*/
password=Uz/*密码,加密的*/
group=RS/*用户所属的组*/
prot=1/*为 1 表示这个用户受保护不能被删除,0 表示可以删除*/
disable=0/*0 为使能*/
TABLE=groups/*组配置*/
ROW=0
name=RS/*组名*/
priv=4/* 用 户 组 的 访 问 权 限 , 可 以 是 0 , 1 , 2 , 4 分 别 代 表
AM_NONE,AM_READ,AM_WRITE,AM_ADMIN.这之间没有权限大小之分*/
method=3/*密码认证方法,可以是 0,1,2,3。0 什么你都没权访问,1 什么你都有权限。
2 密码与用户名简单加密传输(基本认证),3 密码和用户名经过更安全的加密(摘要认证)。
typedef enum {
AM_NONE = 0,
AM_FULL,
AM_BASIC,
AM_DIGEST,
AM_INVALID
} accessMeth_t;
*/
prot=1/*为 1 表示这个用户受保护不能被删除,0 表示可以删除*/
disable=0/*0 为使能*/
TABLE=access/*访问控制*/
ROW=0
name=/ /*要访问 index.htm,需要输入用户名、密码*/
method=3/*摘要认证*/
secure=0/*页面传输时,是否要加密,0 为不加密,如果不使用 SSL,这项是忽略的*/
group=RS/*可访问该文件的组*/
int umOpen()
功能:在数据库中注册 UM 表
说明:
1. 如果 didUM== -1,注册数据库,包括三个表:用户表、用户组表、访问控制表
2. 如果 saveFilename == NULL,分配一段内存,内存中存放文件名 umconfig.txt。
-----------------------------------------------------------------------------------------------------------------
void umClose()
功能:释放数据库中的 UM 表
说明:
-----------------------------------------------------------------------------------------------------------------
int umCommit(char_t *filename)
功能:将数据库中的 table 保存到文件中
说明:
-----------------------------------------------------------------------------------------------------------------
int umRestore(char_t *filename)
功能:将文件中 table 存放到数据库中
说明:
-----------------------------------------------------------------------------------------------------------------
static int umEncryptString(char_t *textString)
功能:将字符串进行简单加密
说明:
-----------------------------------------------------------------------------------------------------------------
static char_t *umGetFirstRowData(char_t *tableName, char_t *columnName)
功能:获得 table 名字为 tableName,列名为 columnName 的数据
说明:例如,前面的 umconfig.txt, password=Uz 的获得就是 tableName= users,columnName=
password。
-----------------------------------------------------------------------------------------------------------------
static char_t *umGetNextRowData(char_t *tableName, char_t *columnName,
char_t *keyLast)
功能:获得指定的 table 项的下一项。
说明:
-----------------------------------------------------------------------------------------------------------------
int umAddUser(char_t *user, char_t *pass, char_t *group,
bool_t prot, bool_t disabled)
功能:向用户 table 中添加一个用户。
说明:必须确保用户名不重复,用户组是存在的。
-----------------------------------------------------------------------------------------------------------------
int umDeleteUser(char_t *user)
功能:删除一个用户
说明:
-----------------------------------------------------------------------------------------------------------------
char_t *umGetFirstUser()
功能:获得第一个用户名
说明:
-----------------------------------------------------------------------------------------------------------------
char_t *umGetNextUser(char_t *userLast)
功能:获得下一个用户名
说明:
-----------------------------------------------------------------------------------------------------------------
bool_t umUserExists(char_t *user)
功能:判断指定用户是否存在
说明:
-----------------------------------------------------------------------------------------------------------------
char_t *umGetUserPassword(char_t *user)
功能:获得指定用户的密码
说明:
-----------------------------------------------------------------------------------------------------------------
int umSetUserPassword(char_t *user, char_t *pass)
功能:设置用户的密码
说明:
-----------------------------------------------------------------------------------------------------------------
char_t *umGetUserGroup(char_t *user)
功能:获得该用户所在的用户组
说明:
-----------------------------------------------------------------------------------------------------------------
int umSetUserGroup(char_t *user, char_t *group)
功能:设置这个用户的用户组
说明:
-----------------------------------------------------------------------------------------------------------------
umGetUserEnabled(char_t *user)
bool_t
功能:该用是否使能
说明:
-----------------------------------------------------------------------------------------------------------------
int umSetUserEnabled(char_t *user, bool_t enabled)
功能:设置该用户使能
说明:
-----------------------------------------------------------------------------------------------------------------
bool_t umGetUserProtected(char_t *user)
功能:该用户是否被保护,不能删除
说明:
-----------------------------------------------------------------------------------------------------------------
int umSetUserProtected(char_t *user, bool_t protect)
功能:设置该用户被保护
说明:
-----------------------------------------------------------------------------------------------------------------
int umAddGroup(char_t *group, short priv, accessMeth_t am,
bool_t prot, bool_t disabled)
功能:添加一个组 table
说明:
-----------------------------------------------------------------------------------------------------------------
int umDeleteGroup(char_t *group)
功能:删除一个组
说明:
-----------------------------------------------------------------------------------------------------------------
bool_t umGroupExists(char_t *group)
功能:该组是否存在
说明:
-----------------------------------------------------------------------------------------------------------------
bool_t umGetGroupInUse(char_t *group)
功能:该用户是否使能
说明:
-----------------------------------------------------------------------------------------------------------------
char_t *umGetFirstGroup()
功能:获得第一个用户组
说明:
-----------------------------------------------------------------------------------------------------------------
char_t *umGetNextGroup(char_t *groupLast)
功能:获得下一个用户组
说明:
-----------------------------------------------------------------------------------------------------------------
accessMeth_t umGetGroupAccessMethod(char_t *group)
功能:获得用户组的方法
说明:
-----------------------------------------------------------------------------------------------------------------
int umSetGroupAccessMethod(char_t *group, accessMeth_t am)
功能:设置用户组的方法
说明:
-----------------------------------------------------------------------------------------------------------------
short umGetGroupPrivilege(char_t *group)
功能:获得用户组的访问权限
说明:
-----------------------------------------------------------------------------------------------------------------
int umSetGroupPrivilege(char_t *group, short privilege)
功能:设置用户组的访问权限
说明:
-----------------------------------------------------------------------------------------------------------------
bool_t umGetGroupEnabled(char_t *group)
功能:获得用户组是否使能
说明:
-----------------------------------------------------------------------------------------------------------------
int umSetGroupEnabled(char_t *group, bool_t enabled)
功能:设置用户组使能
说明:
-----------------------------------------------------------------------------------------------------------------
bool_t umGetGroupProtected(char_t *group)
功能:获得用户组是否被保护
说明:
-----------------------------------------------------------------------------------------------------------------
int umSetGroupProtected(char_t *group, bool_t protect)
功能:设置用户组被保护
说明:
-----------------------------------------------------------------------------------------------------------------
int umAddAccessLimit(char_t *url, accessMeth_t am, short secure, char_t *group)
功能:添加访问限制,能访问哪个目录或文件
说明:
-----------------------------------------------------------------------------------------------------------------
int umDeleteAccessLimit(char_t *url)
功能:删除访问限制
说明:
-----------------------------------------------------------------------------------------------------------------
char_t *umGetFirstAccessLimit()
功能:获得第一个用户的访问限制路径
说明:
-----------------------------------------------------------------------------------------------------------------
char_t *umGetNextAccessLimit(char_t *urlLast)
功能:获得指定访问限制路径的下一个访问限制路径
说明:
-----------------------------------------------------------------------------------------------------------------
umAccessLimitExists(char_t *url)
bool_t
功能:这个访问限制路径是否存在
说明:
-----------------------------------------------------------------------------------------------------------------
accessMeth_t umGetAccessLimitMethod(char_t *url)
功能:获得这个路径的访问方法
说明:typedef enum {
AM_NONE = 0,
AM_FULL,
AM_BASIC,
AM_DIGEST,
AM_INVALID
} accessMeth_t;
-----------------------------------------------------------------------------------------------------------------
int umSetAccessLimitMethod(char_t *url, accessMeth_t am)
功能:设置这个访问路径的方法
说明:
-----------------------------------------------------------------------------------------------------------------
short umGetAccessLimitSecure(char_t *url)
功能:获得这个访问路径的安全设置
说明:加密还是不加密
-----------------------------------------------------------------------------------------------------------------
int umSetAccessLimitSecure(char_t *url, short secure)
功能:设置访问路径的安全标志
说明:
-----------------------------------------------------------------------------------------------------------------
char_t *umGetAccessLimitGroup(char_t *url)
功能:获得这个访问路径的组
说明:
-----------------------------------------------------------------------------------------------------------------
int umSetAccessLimitGroup(char_t *url, char_t *group)
功能:设置访问路径的组
说明:
-----------------------------------------------------------------------------------------------------------------
char_t *umGetAccessLimit(char_t *url)
功能:获得给定路径的所在的访问限制路径
说明:
-----------------------------------------------------------------------------------------------------------------
accessMeth_t umGetAccessMethodForURL(char_t *url)
功能:获得给定路径的所在的访问限制方法
说明:
-----------------------------------------------------------------------------------------------------------------
bool_t umUserCanAccessURL(char_t *user, char_t *url)
功能:判断这个路径用户是否能够访问
说明:1.用户要在
2.用户要能
3.用户组的权限要足够大,AM_READ,AM_WRITE,AM_ADMIN 都可
4.用户组要使能
5.用户组访问限制的方法必须是 AM_FULL、 AM_BASIC、AM_DIGEST 之一
6.在判断 url 是否属于访问限制路径,如果是,获得这个路径的访问方法和组,然后这个访
问方法不能是 AM_NONE,组必须和 user 的组一样。
-----------------------------------------------------------------------------------------------------------------
static bool_t umCheckName(char_t *name)
功能:检查字符串是否是有效的
说明:
-----------------------------------------------------------------------------------------------------------------