📄 auth.c
字号:
/***********************************************************************\ SIP Server Date Ver Author MemoRandom Jul 3,2002 1.0 Hiroaki Hata Created (C) 2002 All Copyrights reserved. *************************************************************************/#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include "sipd.h"#include "udp.h"#define DEBUG if(debug==1){#define DBGstatic int authenticate_process(MESSAGE *mes,int fd,char *passwd);static int authenticate_process(MESSAGE *mes,int fd,char *passwd){ CONTAINER container; PAUTH *authrz; int n; char host[SCLEN]; int port; char sbuff[MAX_BUFF]; int ret; MESSAGE *ack; //科プロセスからの弹瓢钓材を略つ *container.mes='\0'; n=read(fd,&container,sizeof(CONTAINER)); if(n != 4|| strcmp(container.mes,"GOGO")!=0){ return NG; } strcpy(host,mes->to_ip); port=mes->to_port; //INVITEを流り叫す-------------------------------------------- mes->header.cseq.seq--;//エラ〖を袋略して刀Cseqを烧涂する ret=MakeSendBuffer(mes,sbuff); if(ret!=OK){ sprintf(sbuff,"Send:Make buffer error(Coprocess)=%d",ret); logging(2,sbuff); return ret; }DEBUG printf("--------------浩菇喇バッファ( INVITE 灰プロセス) ---------\n"); printf("%s\n",sbuff); printf("--------------啪流黎------------------------------\n"); printf("Recv from IP:%s\n",mes->ip); printf("Sent to IP:%s(%d)\n",host,port);DEND#ifndef EMULATION SendData(host, port, sbuff,strlen(sbuff));#endif //407を袋略して略つ--------------------------------------------- n=read(fd,&container,sizeof(CONTAINER)); if(n != sizeof(CONTAINER)){ return NG; } //ACKを流る---------------------------------------------------- ack=(MESSAGE *)malloc(sizeof(MESSAGE)); if(ack==NULL){ logging(2,"Memory shortage for ACK"); return NG; } //INVITEを亏房にしてACKを侯る memcpy(ack,mes,sizeof(MESSAGE)); strcpy(ack->start.method,"ACK"); strcpy(ack->header.cseq.method,"ACK"); ack->header.expires=-1; ack->header.contact=NULL; ack->header.general=NULL; ack->header.contentType[0]='\0'; ack->header.contentLength=0; ack->contents=NULL; //Toは407のTAGを烧裁する memcpy(&ack->header.to,&container.to,sizeof(URI)); ret=MakeSendBuffer(ack,sbuff); if(ret!=OK){ sprintf(sbuff,"Send:Make buffer error(Coprocess ACK)=%d",ret); logging(2,sbuff); free(ack); return ret; }DEBUG printf("--------------浩菇喇バッファ(ACK 灰プロセス) ---------\n"); printf("%s\n",sbuff); printf("--------------啪流黎------------------------------\n"); printf("Recv from IP:%s\n",mes->ip); printf("Sent to IP:%s(%d)\n",host,port);DEND#ifndef EMULATION SendData(host, port, sbuff,strlen(sbuff));//Hata 0530#endif free(ack); //nonceを艰り叫してresponseを纷换する--------------------------- authrz=(PAUTH *)malloc(sizeof(PAUTH)); if(authrz == NULL){ logging(2,"Memory shortage for auth header"); return NG; } //--Authrorizationヘッダに涩妥灌誊を肋年する memcpy(authrz,&container.auth,sizeof(PAUTH)); mes->header.authrz=authrz; //uri MakeURItoASC(&mes->header.to,sbuff,0); strcpy(authrz->uri,sbuff); //nc strcpy(authrz->nc,"00000001"); //cnonce sprintf(authrz->cnonce,"%d",rand()); //username strcpy(authrz->username,mes->header.from.username); strcpy(authrz->username,"");//Hata Test //passwd strcpy(authrz->passwd,passwd); //method strcpy(authrz->method,mes->header.cseq.method); ret=CalcResponse(authrz); if(ret!=OK){ logging(2,"Calc Digest Response Failed"); return NG; } //Responseつきで浩刨流り叫す------------------------------------ mes->header.cseq.seq++;//喇根を袋略してCseqを傅に提す ret=MakeSendBuffer(mes,sbuff); if(ret!=OK){ sprintf(sbuff,"Send:Make buffer error(Coprocess)=%d",ret); logging(2,sbuff); return ret; }DEBUG printf("--------浩菇喇バッファ(灰プロセスINVITE浩流) ---------\n"); printf("%s\n",sbuff); printf("--------啪流黎------------------------------\n"); printf("Recv from IP:%s\n",mes->ip); printf("Sent to IP:%s(%d)\n",host,port);DEND#ifndef EMULATION SendData(host, port, sbuff,strlen(sbuff));#endif return OK;}int GetAuthentication(MESSAGE *mes,char *passwd){ int fd[2]; char hash[HASH_LEN]; int ret; pid_t pid; //プロセス粗奶慨脱のパイプを栏喇する if(pipe(fd) <0){ logging(2,"pipe creation failed"); return NG; } //灰プロセスを栏喇する if((pid=fork()) <0){ logging(2,"fork() failed"); return NG; }else if(pid > 0 ){ //科プロセス //プロセス瓷妄モジュ〖ルに灰プロセスを判峡する close(fd[0]); ret=CalcHash(mes,hash); if(ret!=OK){ write(fd[1],"STOP",4); close(fd[1]); return NG; } //プロセステ〖ブルに灰プロセスを判峡する ret=RegisterProcess(pid,fd[1],mes->header.to.username,hash); if(ret!=OK){ //灰プロセスに匿贿炭吾を券乖する write(fd[1],"STOP",4); close(fd[1]); return NG; }else{ //灰プロセスに瓢侯钓材を券乖する write(fd[1],"GOGO",4); } }else{ //灰プロセス //今き哈み脱パイプを誓じる close(fd[1]); ret=authenticate_process(mes,fd[0],passwd); free_message_buffer(mes); close(fd[0]); exit(ret); } return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -