初识GoAhead

本文详细描述了在使用GoAhead Web Server版本2.5时遇到的配置问题,包括用户登录验证功能的实现及后续调试过程。通过修改配置文件、宏定义和源代码,最终成功解决了在加载配置文件时出现的崩溃问题,并实现了用户登录验证功能。文章还涉及到用户验证代码的调试和优化,以及如何正确配置认证方法和权限管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<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 */

修改后登录图片为









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值