1.首先在Boa官網下載的 boa-0.94.14rc21 解壓縮目錄中加入 auth.c, md5.h, md5.c 三個檔案
這三個檔案可去sourceforge uclinux下載

2.接著在 src/config.c 中 struct ccommand clist[] 底下加入
    #ifdef USER_AUTH
        {"Auth", S2A, c_add_auth, NULL },
    #endif  
然後再入一個 static function
    static void c_add_auth(char *v1, char *v2, void *t)
    {
    #ifdef USER_AUTH
          auth_add(v1,v2);
    #endif
    }

3.接下來在 src/boa.h 中加入
    /* auth */
    #ifdef USER_AUTH
    void auth_add(char *directory,char *file); 
    int auth_authorize(request * req); 
    void auth_check();
    void dump_auth(void);
    #endif
 編譯出現找不到 DBG 錯誤需再加入
    #ifdef DEBUG
    #define DBG(x) x
    #else
    #define DBG(x)
    #endif 

4.在 util.c 加入

static char base64chars[64] = "abcdefghijklmnopqrstuvwxyz"
                              "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";
 /*
 * 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
    {
         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
  ((char *)dst)[y++]=(bitval>>(bits-8))&0xFF;
                bits-=8;
                bitval &= (1<
            }
         }
    }
    if (y
    ((char *)dst)[y++]=0;
    return y;
}
/*
 * Name: base64encode()
 * Description: Encodes a buffer using BASE64.
 * Used by auth.c
 */
void base64encode(unsigned char *from, char *to, int len)
{
        while(len) {
                unsigned long k;
                int c;


                c = (len < 3) ? len : 3;
                k = 0;
                len -= c;
                while(c--)
                        k = (k << 8) | *from++;

                *to++ = base64chars[ (k >> 18) & 0x3f ];
                *to++ = base64chars[ (k >> 12) & 0x3f ];
                *to++ = base64chars[ (k >> 6) & 0x3f ];
                *to++ = base64chars[ k & 0x3f ];
        }
        *to++ = 0;
}

5.在 request.c 中 process_header_end function 中加入
#ifdef USE_AUTH
    if (!auth_authorize(req))
        return 0;
#endif
 
另外在 process_option_line function 中 switch(line[0]) case 'A': 加入else if 
else if (!memcmp(line,"AUTHORIZATION",14) && !req->authorization) { 
     req->authorization = value; 
    return 1;
}
 
如果要加入 cgi env 則改成以下
else if (!memcmp(line,"AUTHORIZATION",14) && !req->authorization) {
            char *user;
            char *pwd;
            req->authorization = value;
            if (!add_cgi_env(req, line, value, 1)){
                /* errors already logged */
                return 0;
            }
            // accept Basic authorization only
            if (strncasecmp(req->authorization,"Basic ",6))
return 0;
            base64decode(req->auth_userpass,req->authorization+6,0x100);
            user = strtok(req->auth_userpass,":");
            pwd = strtok(NULL ,":");
            req->auth_type = value;
            add_cgi_env(req, "AUTH_TYPE", value, 1);
            req->auth_user = user;
            add_cgi_env(req, "AUTH_USER", user, 1);
            req->auth_pass = pwd;
            add_cgi_env(req, "AUTH_PASSWORD", pwd, 1);
            return 1;
        } 

6. 在 globals.h 中 request struct 底下加入
char *authorization;    /* env variable */

如果要加入 cgi env 則再加入以下 
char *auth_type; /* env variable */
char *auth_user; /* env variable */
char *auth_pass; /* env variable */
char auth_userpass[0x80];    /* user's login name + password*/

option 
如果要加入 cgi env 則在 cgi.c 中 complete_env function 加入
// custom add CGI env varibles
    if (req->authorization) {
        my_add_cgi_env(req, "AUTH_TYPE", req->auth_type);
        my_add_cgi_env(req, "AUTH_USER", req->auth_user);
        my_add_cgi_env(req, "AUTH_PASSWORD", req->auth_pass);
    }
    // end 

7.最後就 make 吧
看有啥錯誤就看一下少加了什麼
之後要使用authorization還需要在 boa.conf 中加入 Auth /cgi-bin/auth  /etc/boa/my.passwd
然後設定一下 my.passwd 就完成了
 
 
參考資料1 

參考資料2 


arrow
arrow
    全站熱搜

    JohnDX 發表在 痞客邦 留言(0) 人氣()