⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 auth.c

📁 sip代理服务器源码
💻 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 + -