作者gaod.bbs@cpu.tfcis.org (嘎噢大大......|||) 看板: plan
標題Re: [問題] 身分證認證機制撰寫 (未完成)
時間動力核心 (2006/03/02 Thu 23:09:43) Updated: 2006/03/02
※ 引述《guessi.bbs@bbs.wretch.cc (沒)》之銘言:
> 站上希望有身份證認證 即使用者提供身分證資料
> 再由站長做身分證字號的確認 若正確則給予權限
> 以下是我寫的部份.... 僅完成身分證編碼的確認
> 希望能在確認身分證編碼正確後給於PERM_VALID權限(基本權限)
> 但由於對於acct的操作不熟析 這部份不知該如何下手 請教各位
> 以下為程式碼擷取部份
: src/menu.c:menu_admin[] 放置於Admin選單 僅SYSOP可使用
"bin/admutil.so:a_check_idnum", PERM_SYSOP, - M_SYSTEM,
"CheckID 身分證認證 ",
: src/so/admutil.c 新增函式於 a_register()之前
/*********************************/
/* 060301.guessi 身分證認證機制 */
/*********************************/
#if 0
A=10 台北市 J=18 新竹縣 S=26 高雄縣
B=11 台中市 K=19 苗栗縣 T=27 屏東縣
C=12 基隆市 L=20 台中縣 U=28 花蓮縣
D=13 台南市 M=21 南投縣 V=29 台東縣
E=14 高雄市 N=22 彰化縣 W=32 金門縣
F=15 台北縣 O=35 新竹市 X=30 澎湖縣
G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山
H=17 桃園縣 Q=24 嘉義縣 Z=33 連江縣
I=34 嘉義市 R=25 台南縣
X123456789 將第一個英文字轉換成為數字
abcdefghjklmnpqrstuvxywzio 分別對應 10 ~ 35
將轉換後數值 十位數 = X1 個位數 = X2
其餘末九碼分別對應 D1 ~ D9 套入以下公式得Y
Y = X1 + 9*X2
+ 8*D1 + 7*D2 + 6*D3 + 5*D4
+ 4*D5 + 3*D6 + 2*D7 + 1*D8 + D9
若Y可被10整除 => 正確
#endif
static int
CheckID(s)
char *s;
{
char *p, *LEAD="ABCDEFGHJKLMNPQRSTUVXYWZIO";
int x, i;
if (strlen(s) != 10 || !(p = strchr(LEAD, toupper(*s))))
return 0;
x = p - LEAD;
x = x / 10 + x % 10 * 9;
p = s + 1;
if (*p != '1' && *p != '2')
return 0;
for (i = 1; i < 9; i++)
{
if (isdigit(*p))
x += (*p++ - '0') * (9 - i);
else
return 0;
}
x = 9 - x % 10;
return (x == *p - '0');
}
int
a_check_idnum()
{
char idnum[11], buf[80];
ACCT acct;
HDR hdr;
if (acct_get(msg_uid, &acct) > 0 &&
vget(b_lines, 0, "請輸入身分證字號:", idnum, 11, DOECHO) &&
CheckID(idnum))
{
time(&acct.tvalid);
/* itoc.041025: 這個 acct_setperm() 並沒有緊跟在 acct_get() 後面,中間
隔了一個 vgets(),這可能造成拿舊 acct 去覆蓋新 .ACCT 的問題。不過因
為是站長才有的權限,所以就不改了 */
acct_setperm(&acct, PERM_VALID, 0);
/* 寄信給使用者 */
usr_fpath(buf, acct.userid, fn_dir);
hdr_stamp(buf, HDR_LINK, &fhdr, FN_ETC_JUSTIFIED);
strcpy(hdr.title, msg_reg_valid);
strcpy(hdr.owner, str_sysop);
rec_add(buf, &hdr, sizeof(HDR));
m_biff(acct.userno);
sprintf(buf, "IDnum: %s by %s", idnum, cuser.userid);
justify_log(acct.userid, buf);
}
return 0;
}
--
好想要和你一起看月亮
靠在你肩上 情話慢慢講...
▁▂▄▅▃▂▁ ‧ ●
﹋ ▲‧ . ‧﹊‧﹊ ﹊﹊
﹋ ﹋ ◢◣ . ●●ˊ
--
=[﹎:�摃�◣��:﹎ Origin ]|[ ���O���� cpu.tfcis.org ]|[�搟說�﹎:]=
=[﹊:�摃�╱��:﹊ Author ]|[ 140.138.237.77 ]|[���插�﹊:]=