原文地址:http://blog.csdn.net/llcwzg/article/details/5705825
BOA (发音bo-wa)是一款优秀的单进程Web server,占用资源特别小,支持CGI,很适合嵌入式系统,但是官方版本不支持用户验证,似乎有好几年没更新了,0.94.14rc21是最新的release,网上有一些文章讨论了如何实现boa下的http验证,但是都基于uclinux里的0.93.15版本,为了在0.94.14里增加用户验证,你需要完成几个简单的工作就可以了。
1 将uclinux的/usr/boa/src/auth.c 拷贝到0.94的src下。
2 在config.c的ccomand clist[]里加上
#ifdef USE_AUTH
{ "Auth", S2A, c_add_auth, NULL },
#endif
然后在下面加上
void c_add_auth(char *v1, char *v2, void *t)
{
#ifdef USE_AUTH
auth_add(v1,v2);
#endif
}
3 在boa.h里加上
/* auth */
#ifdef USE_AUTH
void auth_add(char *directory,char *file);
int auth_authorize(request * req);
void auth_check();
#endif
4 在request.c里process_header_end下加上
#ifdef USE_AUTH
if (!auth_authorize(req))
return 0;
#endif
在process_option_line里的switch(line[0]){ 改写
case 'A':
if (!memcmp(line, "ACCEPT", 7)) {
#ifdef ACCEPT_ON
add_accept_header(req, value);
#endif
return 1;
} else if (!memcmp(line,"AUTHORIZATION",14) && !req->authorization) {
req->authorization = value;
return 1;
}
break;
5 在util.c里加上
/*
* Name: base64decode
*
* Description: Decodes BASE-64 encoded string
*/
int base64decode(void *dst,char *src,int maxlen)
{
int bitval,bits;
int val;
int len,x,y;
len = strlen(src);
bitval=0;
bits=0;
y=0;
for(x=0;x<len;x++)
{
if ((src[x]>='A')&&(src[x]<='Z')) val=src[x]-'A'; else
if ((src[x]>='a')&&(src[x]<='z')) val=src[x]-'a'+26; else
if ((src[x]>='0')&&(src[x]<='9')) val=src[x]-'0'+52; else
if (src[x]=='+') val=62; else
if (src[x]=='-') val=63; else
val=-1;
if (val>=0)
{
bitval=bitval<<6;
bitval+=val;
bits+=6;
while (bits>=8)
{
if (y<maxlen)
((char *)dst)[y++]=(bitval>>(bits-8))&0xFF;
bits-=8;
bitval &= (1<<bits)-1;
}
}
}
if (y<maxlen)
((char *)dst)[y++]=0;
return y;
}
6 在global.h里的request结构加上
#ifdef USE_AUTH
char *authorization;
#endif
7 在 defines.h加上
/****** Authorization ******************************************************/
#define USE_AUTH 1
8 如果你不喜欢MD5加密,那么在auth.c的auth_check_userpass修改如下
char temps[0x100],*pwd;
fseek(authfile,0,SEEK_SET);
while (fgets(temps,0x100,authfile))
{
if (temps[strlen(temps)-1]=='/n')
temps[strlen(temps)-1] = 0;
pwd = strchr(temps,':');
if (pwd)
{
*pwd++=0;
if (!strcmp(temps,user))
{
if (!strcmp(pwd,crypt(pass, pwd)))
return 0;
}
}
}
return 1;
用DES加密更适合嵌入式系统的口令保存。
最后别忘了在Makefile里加上-lcrypt,我没有用EMBED,运行良好,如果还有其他问题,检查一下源码,自己动手就够了,很容易。
在目标板的/etc/boa.conf里别忘了加上这行 Auth /cgi-bin /etc/my.passwd
你可以修改/cgi-bin为其他虚拟目录,my.passwd是密码文件,里面格式是user:passwd, 例如 admin:m2e7kWi6fdixg
这里密码是m2为salt的DES密文。