close
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] else if ((src[x]>='a')&&(src[x] else if ((src[x]>='0')&&(src[x] else if (src[x]=='+') val=62;
else if (src[x]=='-') val=63;
else
val=-1;
if (val>=0)
{
bitval=bitval 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 k = 0;
len -= c;
while(c--)
k = (k
*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
這三個檔案可去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] else if ((src[x]>='a')&&(src[x] else if ((src[x]>='0')&&(src[x] else if (src[x]=='+') val=62;
else if (src[x]=='-') val=63;
else
val=-1;
if (val>=0)
{
bitval=bitval 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 k = 0;
len -= c;
while(c--)
k = (k
*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
全站熱搜