|
// 登录处理
static int loginProc(GDA *ctx,struct login_s *logrec,DEV_SHIFT_s *dshift,char *tmp1)
{
char stmt[4096],tmp[1024];
int ret;
TUXDEV_s tdev;
TUXUSER_s tuser;
char bc[30];
INT4 crc;
char md5[16];
DAU dev_DAU,ctx_DAU;
INT64 now;
memset(ctx->contex.userid,0,sizeof(ctx->contex.userid));
now=ctx->contex.last_oper;
DAU_init(&dev_DAU,ctx->SQL_Connect,"TUXDEV",&tdev,TUXDEV_type);
strcpy(tdev.devid,logrec->devid); //检索条件
again:
ret=getDevShift(&dev_DAU,stmt); //DAO
if(ret <=0 ) {
DAU_free(&dev_DAU);
if(ctx->SQL_Connect->Errno==3114||ctx->SQL_Connect->Errno==-30001) { //数据库没打开
___SQL_CloseDatabase__(ctx->SQL_Connect);
ret=db_open(ctx->SQL_Connect);
if(!ret) goto again;
}
sprintf(tmp1,"%s:该设备不存在!err=%d,%s",logrec->devid,
ctx->SQL_Connect->Errno,
ctx->SQL_Connect->ErrMsg);
return -1;
}
DAU_next(&dev_DAU);
/*****************************************************************
* tdev.clid存在,说明这个终端没有正常终止,应该向TUXEDO咨询一下,
* 其clid是否能查询到状态,是否在线?
******************************************************************/
DAU_init(&ctx_DAU,ctx->SQL_Connect,"TUXCONTEX",&ctx->contex,TUXCONTEX_type);
if(tdev.clid) { // 只写日志
ShowLog(1,"登录冲突,该设备先前的登录作业未完成!");
//是否释放先前占用的席位?
if(tdev.devtype&1) {
}
//删除状态,这有点问题,将来WEB服务器是允许一个设备多个连接的
ret=deleteTuxcontex(&ctx_DAU,tdev.clid,stmt);
ShowLog(5,"logProc:删除未结束状态,%s,ret=%d",stmt,ret);
if(ret != 1) {
ShowLog(1,"删除该设备先前的状态失败, %s,err=%d,%s",
stmt,ctx->SQL_Connect->Errno,
ctx->SQL_Connect->ErrMsg);
}
}
//检查一下该CA存在否?
MD5(logrec->CA,(long)strlen(logrec->CA),md5);
if(!*tdev.devca) { //CA不存在,加入
byte_a64(tdev.devca,md5,sizeof(md5));
} else { //CA存在,核对CA
byte_a64(tmp,md5,sizeof(md5));
if(strcmp(tmp,tdev.devca)) {
sprintf(tmp1,"CA 错误,nowdevice=%s:%s,db=%s",tmp,logrec->CA,tdev.devca);
DAU_free(&dev_DAU);
DAU_free(&ctx_DAU);
return -4;
}
}
// 登录状态写入tuxdev
tdev.last_log=now;
tdev.clid=ctx->contex.clid;
ret= updateDevBill(&dev_DAU,stmt); //DAO
ShowLog(5,"%s,ret=%d",stmt,ret);
if(ret!=1) {//有人问如何得到update的条数,好像还挺麻烦的,我这里立刻就告诉你。
DAU_free(&dev_DAU);
DAU_free(&ctx_DAU);
sprintf(tmp1,"loginProc:setCA %s",stmt);
return -2;
}
ret=DAU_copy(&ctx_DAU,&dev_DAU,0); //dev同名字段->ctx,将来还可以在tuxdev和tuxcontex添点什么,跟我没关系,copy过去就是。
// 认证用户
DAU_init(&dev_DAU,0,"TUXUSER",&tuser,TUXUSER_type);//重用DAU
strcpy(tuser.userid,logrec->uid);
ret=getUser(&dev_DAU,stmt);//DAO
ShowLog(5,"%s,ret=%d",stmt,ret);
if(ret <=0 ) {
sprintf(tmp1,"%s:该用户不存在!err=%d,%s",logrec->uid,
ctx->SQL_Connect->Errno,
ctx->SQL_Connect->ErrMsg);
DAU_free(&ctx_DAU);
DAU_free(&dev_DAU);
return -3;
}
DAU_next(&dev_DAU);
if(!*tuser.password) { // 建立新口令
sprintf(tmp,"%lld%ld",now,tdev.clid);
crc=ssh_crc32(tmp,strlen(tmp));
tmp[0]=(crc&0x3f)+0x21;
crc >>= 6;
tmp[1]=(crc & 0x3f)+0x21;
des_fcrypt(logrec->pwd,tmp,tuser.password);
} else { //核对口令
des_fcrypt(logrec->pwd,tuser.password,tmp);
if(strcmp(tuser.password,tmp)) {
sprintf(tmp1,"口令错!");
DAU_free(&ctx_DAU);
DAU_free(&dev_DAU);
return -4;
}
}
tuser.last_log=now;
ret=updateUser(&dev_DAU,stmt);//DAO
ShowLog(5,"%s,ret=%d",stmt,ret);
if(ret!=1) {
sprintf(tmp1,"loginProc:setuser %s err=%d,%s",stmt);
DAU_free(&dev_DAU);
DAU_free(&ctx_DAU);
return -5;
}
DAU_free(&dev_DAU);
//班次计算
bcjs(bc,(int)(now/60),tdev.atime,1440-tdev.ptime-15);
//班次中的统计日期截取到contex
stptok(bc,ctx->contex.stat_date,sizeof(ctx->contex.stat_date)," ");
// 建立 tuxcontex
strcpy(ctx->contex.username,tuser.username);
strcpy(ctx->contex.userid,logrec->uid);
if(tdev.devtype & 2) { //是帐务终端
ret=shiftProc(ctx,dshift,bc,tmp1);//班次和票据的设定,还要往ctx添点东西。
if(ret) {
DAU_free(&ctx_DAU);
return ret;
}
}
ret=DAU_insert(&ctx_DAU,tmp1);//我怎么看也比insert一大堆列省事。
DAU_free(&ctx_DAU);
// ShowLog(5,"%s,ret=%d",tmp,ret);
if(ret) {
strsubst(tmp1,0,"loginProc:登录失败,不能建立客户状态:");
sprintf(tmp1+strlen(tmp1),",err=%d,%s",
ctx->SQL_Connect->Errno,
ctx->SQL_Connect->ErrMsg);
}
else sprintf(tmp1,"%s",tdev.devname);
return ret;
}
不指望谁能用存储过程干这个活,大家看看,剥离了访问逻辑的纯业务逻辑是否好懂?
[ 本帖最后由 yulihua49 于 2008-12-8 17:05 编辑 ] |
|