<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">使用的goAhead webserver版本为2.5</span>
在Windows下解压后文件为webs-2-5
很容易看到WIN的目录,然后能在WIN目录下找到webs.sln解决方案,打开解决方案
可知道这是一个vs2010下的解决方案。
打开webs.sln解决方案,找到main文件,尝试编译运行,发现能够正常编译运行,网页打开正常。
然后在main.c能够发现一段代码
#ifdef USER_MANAGEMENT_SUPPORT
#include "../um.h"
void formDefineUserMgmt(void);
#endif
初步判断应该是用户登录用的,于是在这段代码前添加一个宏定义#define USER_MANAGEMENT_SUPPORT 1
增加一个umconfig.txt文件
TABLE=users//用户表
ROW=0//第0条数据
name=root//用户名
password=Uk//密码
group=administrator//所属用户组
prot=1//是否能删除,1不能删除,0能够删除
disable=0//用户是否使能,0可用
TABLE=groups//用户组表
ROW=0//第0条数据
name=administrator//用户组名
priv=4//用户组的访问权限,可以是0,1,2,4分别代表AM_NONE,AM_READ,AM_WRITE,AM_ADMIN.这之间没有权限大小之分
method=3//密码认证方法,可以是0,1,2,3。0什么你都没权访问,1什么你都有权限;2密码与用户名简单加密传输(基本认证);3密码和用户名经过更安全的加密(摘要认证)
prot=1//是否能删除,1不能删除,0能够删除
disable=0//用户组是否使能,0可用
TABLE=access//页面权限表
ROW=0//第0条数据
name=/home.htm//要访问/home.htm,需要输入用户名、密码
method=3
secure=0//页面传输时,是否要加密,0为不加密,如果不使用SSL,这项是忽略的
group=administrator//可访问该文件的组
编译运行发现程序会出现崩溃,错误为Expression:((pmode&(~_S_IREAD|_S_IWRITE)))==0)
单步调试发现错误发生在initWebs(int demo)调用umRestore(T("umconfig.txt"))时,也就是在加载umconfig.txt文件出错,单步进去能发现错误出现在emfdb.c的int dbLoad(int did, char_t *filename, int flags)的_sopen_s(&fd, path, O_RDONLY | O_BINARY, _SH_DENYNO, 0666)
在此函数调用0666应该改为_S_IREAD | _S_IWRITE,除此处外还有int dbSave(int did, char_t *filename, int flags)的_sopen_s处也需要修改。
修改这编译运行,发现并没有,打开/home.htm发现并没有要输入密码登录,于是查找了一下webs-2-5的源码发现用户验证在文件security.c,单步调试发现如下代码总是返回0x00000000
/*
* Get the access limit for the URL. Exit if none found.
*/
accessLimit = umGetAccessLimit(path);
if (accessLimit == NULL) {
return 0;
}
于是找到文件umGetAccessLimit的定义在security.c
#ifndef USER_MANAGEMENT_SUPPORT
#define umGetAccessMethodForURL(url) AM_FULL
#define umUserExists(userid) 0
#define umUserCanAccessURL(userid, url) 1
#define umGetUserPassword(userid) websGetPassword()
#define umGetAccessLimitSecure(accessLimit) 0
#define umGetAccessLimit(url) NULL
#endif
在main.c中定义的#define USER_MANAGEMENT_SUPPORT 1并没有起作用,于是将USER_MANAGEMENT_SUPPORT的定义放到文件wsIntrn.h中,编译运行,发现在打开页面/home.htm需要输入用户和密码登录
登录时服务器提示显示的是GoAhead,一般使用时这个是需要修改的,只需要修改webs.c的
static char_t websRealm[64] = T("GoAhead"); /* Realm name */
修改为
static char_t websRealm[64] = T("User And Password"); /* Realm name */
修改后登录图片为