回精華區
作者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 ]|[  Ocpu.tfcis.org  ]|[�搟說:]=
=[:摃�╱�:Author ]|[      140.138.237.77      ]|[�:]=
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻