支持HTTP验证的BOA源码0.94.14rc21 (转载)

原文地址: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密文。

 

你可能感兴趣的:(支持HTTP验证的BOA源码0.94.14rc21 (转载))