/*
FILE
	$Id: tdulfunc.h 6 2005-11-24 00:02:59Z ggw $
	(tAuthorize.cPasswd template set member)
PURPOSE

AUTHOR
	Template and mysqlRAD2 author: (c) 2001,2002 Gary Wallis.
	GPL License applies, see www.fsf.org for details

 
*/

//ModuleFunctionProtos()


void tDULNavList(void);
void AddRangeListsToAccess(void);
void DelRangeListsToAccess(void);

//Extern
void ScheduleJob(unsigned uUser, unsigned uServer, const char *cJobName, const char *cJobData);

void ExtProcesstDULVars(pentry entries[], int x)
{

	/*
	register int i;
	
	for(i=0;i<x;i++)
	{
	
	}
	*/

}//void ExtProcesstDULVars(pentry entries[], int x)


void ExttDULCommands(pentry entries[], int x)
{
	if(!strcmp(function,"tDULTools"))
	{
		//ModuleFunctionProcess()

		//Default wizard like two step creation and deletion
		if(!strcmp(command,LANG_NB_NEW))
                {
	if(uPermLevel>=8)

			{
                        ProcesstDULVars(entries,x);
			//Check global conditions for new record here
                        mode=2000;
                        tDUL(LANG_NB_CONFIRMNEW);
			}
                }
		else if(!strcmp(command,LANG_NB_CONFIRMNEW))
                {
	if(uPermLevel>=8)

			{
			
                        ProcesstDULVars(entries,x);
			//Check entries here
			uDUL=0;
			uCreatedBy=uLoginClient;
			uOwner=uLoginClient;
			uModBy=0;//Never modified
			uModDate=0;
			NewtDUL(0);
			}
		}
		else if(!strcmp(command,LANG_NB_DELETE))
                {
                        ProcesstDULVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
		if( (uPermLevel>=8 && uOwner==uLoginClient)
			|| (uPermLevel>9 && uOwner!=1)
			|| (uPermLevel>7 && uReseller==uLoginClient) )

			{
                        mode=2001;
                        tDUL(LANG_NB_CONFIRMDEL);
			}
                }
                else if(!strcmp(command,LANG_NB_CONFIRMDEL))
                {
                        ProcesstDULVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
		if( (uPermLevel>=8 && uOwner==uLoginClient)
			|| (uPermLevel>9 && uOwner!=1)
			|| (uPermLevel>7 && uReseller==uLoginClient) )

			{
                        mode=5;
                        DeletetDUL();
			}
                }
		else if(!strcmp(command,LANG_NB_MODIFY))
                {
                        ProcesstDULVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
		if( (uPermLevel>=8 && uOwner==uLoginClient)
			|| (uPermLevel>9 && uOwner!=1)
			|| (uPermLevel>7 && uReseller==uLoginClient) )

			{
                        mode=2002;
                        tDUL(LANG_NB_CONFIRMMOD);
			}
                }
                else if(!strcmp(command,LANG_NB_CONFIRMMOD))
                {
                        ProcesstDULVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
		if( (uPermLevel>=8 && uOwner==uLoginClient)
			|| (uPermLevel>9 && uOwner!=1)
			|| (uPermLevel>7 && uReseller==uLoginClient) )

			{
			uModBy=uLoginClient;
                        ModtDUL();
			}
                }
                else if(!strcmp(command,"Add"))
                {
			if(uPermLevel>8)
				AddRangeListsToAccess();
		}
                else if(!strcmp(command,"Del"))
                {
			if(uPermLevel>8)
				DelRangeListsToAccess();
		}
	}

}//void ExttDULCommands(pentry entries[], int x)


void ExttDULButtons(void)
{
	printf("<table width=260 border=0 bgcolor=#9BC1B3 valign=center>\n");
        printf("<tr><td>");

	printf("<font face=Arial,Helvetica>");
	printf("<font size=2>");

	switch(mode)
        {
                case 2000:
			printf("Enter required data<br>");
                        printf("<font size=1>");
                        printf(LANG_NBB_CONFIRMNEW);
			printf("<br>\n");
                break;

                case 2001:
                        printf("<font size=1>");
                        printf(LANG_NBB_CONFIRMDEL);
			printf("<br>\n");
                break;

                case 2002:
			printf("Review record data<br>");
                        printf("<font size=1>");
                        printf(LANG_NBB_CONFIRMMOD);
			printf("<br>\n");
                break;

	}

	if(uPermLevel>8)
        printf("<font size=1><input type=submit title='Add tDUL.cRange entries into tAccess. Watch while CIDR blocks are expanded just in case it was not what you intended.' type=submit name=command value=Add></font>");
	if(uPermLevel>8)
        printf("<font size=1><input type=submit title='Del tDUL.cRange entries into tAccess. Watch while CIDR blocks are expanded just in case it was not what you intended.' type=submit name=command value=Del></font>");

	printf("<font size=2>");
        printf("<p><u>tDULNavList</u><br>\n");
	tDULNavList();

        printf("</td></tr>\n");
        printf("</table>\n");

}//void ExttDULButtons(void)


void ExttDULAuxTable(void)
{

}//void ExttDULAuxTable(void)


void ExttDULGetHook(entry gentries[], int x)
{
	register int i;

	for(i=0;i<x;i++)
	{
		if(!strcmp(gentries[i].name,"uDUL"))
		{
			sscanf(gentries[i].val,"%u",&uDUL);
			mode=6;
		}
	}
	tDUL("");

}//void ExttDULGetHook(entry gentries[], int x)


void ExttDULSelect(void)
{
        //Set non search query here for tTableName()
	if(uPermLevel>=9)
	sprintf(query,"SELECT %s FROM tDUL ORDER BY\
					uDUL",
					VAR_LIST_tDUL);
	else
	sprintf(query,"SELECT %s FROM tDUL WHERE uOwner=%u ORDER BY\
					uDUL",
					VAR_LIST_tDUL,uLoginClient);

}//void ExttDULSelect(void)


void ExttDULSelectRow(void)
{
	if(uPermLevel<10)
                sprintf(query,"SELECT %s FROM tDUL,tClient \
                                WHERE tDUL.uOwner=tClient.uClient\
                                AND (tClient.uOwner=%u OR tClient.uClient=%u)\
                                AND tDUL.uDUL=%u",
                        		VAR_LIST_tDUL,
					uLoginClient,uLoginClient,uDUL);
	else
                sprintf(query,"SELECT %s FROM tDUL WHERE uDUL=%u",
			VAR_LIST_tDUL,uDUL);

}//void ExttDULSelectRow(void)


void ExttDULListSelect(void)
{
	char cCat[512];

	if(uPermLevel<10)
		sprintf(query,"SELECT %s FROM tDUL,tClient \
		WHERE tDUL.uOwner=tClient.uClient \
		AND (tClient.uOwner=%u OR tClient.uClient=%u)",
				VAR_LIST_tDUL,
				uLoginClient,
				uLoginClient);
	else
                sprintf(query,"SELECT %s FROM tDUL",
				VAR_LIST_tDUL);

	//Changes here must be reflected below in ExttDULListFilter()
        if(!strcmp(filter,"uDUL"))
        {
                sscanf(command,"%u",&uDUL);
		if(uPermLevel<10)
			strcat(query," AND ");
		else
			strcat(query," WHERE ");
		sprintf(cCat,"tDUL.uDUL=%u \
						ORDER BY uDUL",
						uDUL);
		strcat(query,cCat);
        }
        else if(1)
        {
                //None NO FILTER
                strcpy(filter,"None");
		strcat(query," ORDER BY uDUL");
        }

}//void ExttDULListSelect(void)


void ExttDULListFilter(void)
{
        //Filter
        printf("<td align=right >Select ");
        printf("<select name=filter>");
        if(strcmp(filter,"uDUL"))
                printf("<option>uDUL</option>");
        else
                printf("<option selected>uDUL</option>");
        if(strcmp(filter,"None"))
                printf("<option>None</option>");
        else
                printf("<option selected>None</option>");
        printf("</select>");

}//void ExttDULListFilter(void)


void ExttDULNavBar(void)
{
	if(uOwner) GetClientOwner(uOwner,&uReseller);

	printf(LANG_NBB_SKIPFIRST);
	printf(LANG_NBB_SKIPBACK);
	printf(LANG_NBB_SEARCH);

	if(uPermLevel>=8)

	printf(LANG_NBB_NEW);
	//printf(LANG_NBB_NEWREV);

		if( (uPermLevel>=8 && uOwner==uLoginClient)
			|| (uPermLevel>9 && uOwner!=1)
			|| (uPermLevel>7 && uReseller==uLoginClient) )

	printf(LANG_NBB_MODIFY);

		if( (uPermLevel>=8 && uOwner==uLoginClient)
			|| (uPermLevel>9 && uOwner!=1)
			|| (uPermLevel>7 && uReseller==uLoginClient) )

	printf(LANG_NBB_DELETE);

	printf(LANG_NBB_LIST);

	printf(LANG_NBB_SKIPNEXT);
	printf(LANG_NBB_SKIPLAST);

}//void ExttDULNavBar(void)


void tDULNavList(void)
{
        MYSQL_RES *res;
        MYSQL_ROW field;

	if(uPermLevel<10)
		sprintf(query,"SELECT tDUL.uDUL\
				,tDUL.cLabel\
				FROM tDUL,tClient\
                                WHERE tDUL.uOwner=tClient.uClient\
                                AND (tClient.uOwner=%u OR tClient.uClient=%u)",
					uLoginClient,uLoginClient);
	else
	        sprintf(query,"SELECT uDUL,cLabel FROM tDUL");

        mysql_query(&mysql,query);
        if(mysql_errno(&mysql))
        {
                printf("%s",mysql_error(&mysql));
                return;
        }

        res=mysql_store_result(&mysql);
        while((field=mysql_fetch_row(res)))
        {
                printf("<a class=darkLink href=mysqlSendmail.cgi?function=tDUL\
&uDUL=%s>%s</a><br>\n",field[0],field[1]);
        }
        mysql_free_result(res);

}//void tDULNavList(void)


#include <math.h>
//From old ism|2 tNASPool stuff 
void AddRangeListsToAccess(void)
{
        MYSQL_RES *res;
        MYSQL_ROW field;
	char cClassc[16]={"0.0.0"};
	char cDomainIPEtc[100];
	time_t clock;
	unsigned uServer=0;

	time(&clock);

	sprintf(query,"SELECT uProviderID,cRangeList,uServer FROM tDUL WHERE uStatus=1 ORDER BY uProviderID");
	mysql_query(&mysql,query);
        if(mysql_errno(&mysql))
                tDUL(mysql_error(&mysql));

	Header_ism3("tDUL.Add()",0);

        res=mysql_store_result(&mysql);
        while((field=mysql_fetch_row(res)))
	{
		char *cp;
		register int o;
		int a,b,c,d,e;
		char cPrevCustId[99]={""};
		
		cDomainIPEtc[99]=0;//Safety first

		sscanf(field[2],"%u",&uServer);
		
		printf("</center><pre>Expanding dialup Pool CIDR blocks into tAccess table for RELAY. Grouped by uProvider.\n\n");

		if(strcmp(field[0],cPrevCustId))
		{
			printf("<u>uProvideID:%s uServer:%s</u>\n\n",field[0],field[2]);
			strcpy(cPrevCustId,field[0]);
		}

		cp=field[1];	
		while(*cp)
		{
			//This parsing code has got to be checked for better faster way
			o=0;
			while(*cp && *cp!='\n' 
					&& *cp!=13 && o<98)
				cDomainIPEtc[o++]= (*(cp++));
			cDomainIPEtc[o]=0;
			cp++;

			//Skip comments
			if(cDomainIPEtc[0]=='#')
				continue;
				
			//Process line for expansion into class c's
			//Expansion rule 1: CIDR BLOCK
			//216.2.96.0/21 RELAY=
			a=0;b=0;c=999;d=999;e=0;
			sscanf(cDomainIPEtc,"%d.%d.%d.%d/%d",&a,&b,&c,&d,&e);
			if(     a>0 && a<255
				&& b>=0 && b<255
				&& c>=0 && c<255
				&& d==0
				&& e>14 && e<25 )
			{
				register int i,ncc=0;

				ncc = pow( (double) 2.0,
					   (double)(24.0 - (double)e));
				
				printf("\t<u>%s</u>\n\n",cDomainIPEtc);
				for(i=0;i<ncc;i++)
				{
					
				sprintf(cClassc,"%d.%d.%d",a,b,c++);
				printf("\t\t%s\n",cClassc);

sprintf(query,"REPLACE INTO tAccess SET cDomainIP='%s', uServer=%s, cRelayAttr='RELAY', uOwner=%u, uCreatedBy=%u, uCreatedDate=%lu, uSource=7",cClassc,field[2],uLoginClient,uLoginClient,(long unsigned)clock);
				mysql_query(&mysql,query);
        			if(mysql_errno(&mysql)) printf("%s\n",(mysql_error(&mysql)));

				}
printf("\n");
			}
			//rule 2 class B a>1 hack...fix parser above
			else if( a>1 && a<255 && b>=0 && b<255 && c==999 && d==999 && e==0 )
			{
				sprintf(cClassc,"%d.%d",a,b);
				printf("\t<u>%s</u>\n\n",cDomainIPEtc);
				printf("\t\t%s\n\n",cClassc);

sprintf(query,"REPLACE INTO tAccess SET cDomainIP='%s', uServer=%s, cRelayAttr='RELAY', uOwner=%u, uCreatedBy=%u, uCreatedDate=%lu, uSource=7" ,cClassc,field[2],uLoginClient,uLoginClient,(long unsigned)clock);
				mysql_query(&mysql,query);
        			if(mysql_errno(&mysql)) printf("%s\n",(mysql_error(&mysql)));
			}
			//Rule 3 216.2.103 RELAY
			else if( a>2 && a<255 && b>=0 && b<255 && c>=0 && d==999 && e==0 )
			{
				sprintf(cClassc,"%d.%d.%d",a,b,c);
				printf("\t<u>%s</u>\n\n",cDomainIPEtc);
				printf("\t\t%s\n\n",cClassc);

sprintf(query,"REPLACE INTO tAccess SET cDomainIP='%s', uServer=%s, cRelayAttr='RELAY', uOwner=%u, uCreatedBy=%u, uCreatedDate=%lu, uSource=7" ,cClassc,field[2],uLoginClient,uLoginClient,(long unsigned)clock);
				mysql_query(&mysql,query);
        			if(mysql_errno(&mysql)) printf("%s\n",(mysql_error(&mysql)));
			}

		
		}//end of while line (ctrl-m or \n line in tDUL.cRangeList)

	}//end of tDUL data
	
	printf("</pre>");
	ScheduleJob(1,uServer,"NewAccess",cClassc);

	Footer_ism3();

}//void AddRangeListsToAccess(void)


void DelRangeListsToAccess(void)
{
        MYSQL_RES *res;
        MYSQL_ROW field;
	char cClassc[16]={"0.0.0"};
	char cDomainIPEtc[100];
	time_t clock;
	unsigned uServer=0;

	time(&clock);

	sprintf(query,"SELECT uProviderID,cRangeList,uServer FROM tDUL WHERE uStatus=1 ORDER BY uProviderID");
	mysql_query(&mysql,query);
        if(mysql_errno(&mysql))
                tDUL(mysql_error(&mysql));

	Header_ism3("tDUL.Del()",0);

        res=mysql_store_result(&mysql);
        while((field=mysql_fetch_row(res)))
	{
		char *cp;
		register int o;
		int a,b,c,d,e;
		char cPrevCustId[99]={""};
		
		cDomainIPEtc[99]=0;//Safety first

		sscanf(field[2],"%u",&uServer);
		
		printf("</center><pre>Removing dialup Pool CIDR blocks from tAccess table for RELAY. Grouped by uProvider.\n\n");

		if(strcmp(field[0],cPrevCustId))
		{
			printf("<u>uProvideID:%s uServer:%s</u>\n\n",field[0],field[2]);
			strcpy(cPrevCustId,field[0]);
		}

		cp=field[1];	
		while(*cp)
		{
			//This parsing code has got to be checked for better faster way
			o=0;
			while(*cp && *cp!='\n' 
					&& *cp!=13 && o<98)
				cDomainIPEtc[o++]= (*(cp++));
			cDomainIPEtc[o]=0;
			cp++;

			//Skip comments
			if(cDomainIPEtc[0]=='#')
				continue;
				
			//Expansion rule 1: CIDR BLOCK
			//216.2.96.0/21 RELAY=
			a=0;b=0;c=999;d=999;e=0;
			sscanf(cDomainIPEtc,"%d.%d.%d.%d/%d",&a,&b,&c,&d,&e);
			if(     a>0 && a<255
				&& b>=0 && b<255
				&& c>=0 && c<255
				&& d==0
				&& e>14 && e<25 )
			{
				register int i,ncc=0;

				ncc = pow( (double) 2.0,
					   (double)(24.0 - (double)e));
				
				printf("\t<u>%s</u>\n\n",cDomainIPEtc);
				for(i=0;i<ncc;i++)
				{
					
				sprintf(cClassc,"%d.%d.%d",a,b,c++);
				printf("\t\t%s\n",cClassc);

				if(uPermLevel>9)
sprintf(query,"DELETE FROM tAccess WHERE cDomainIP='%s' AND  uServer=%s AND  cRelayAttr='RELAY' AND uSource=7"
					,cClassc,field[2]);
				else
sprintf(query,"DELETE FROM tAccess WHERE cDomainIP='%s' AND  uServer=%s AND  cRelayAttr='RELAY' AND  uOwner=%u AND uSource=7",cClassc,field[2],uLoginClient);
				mysql_query(&mysql,query);
        			if(mysql_errno(&mysql)) printf("%s\n",(mysql_error(&mysql)));

				}
printf("\n");
			}
			//rule 2 class B a>1 hack...fix parser above
			else if( a>1 && a<255 && b>=0 && b<255 && c==999 && d==999 && e==0 )
			{

				sprintf(cClassc,"%d.%d",a,b);
				printf("\t<u>%s</u>\n\n",cDomainIPEtc);
				printf("\t\t%s\n\n",cClassc);

				if(uPermLevel>9)
sprintf(query,"DELETE FROM tAccess WHERE cDomainIP='%s' AND  uServer=%s AND  cRelayAttr='RELAY' AND uSource=7"
					,cClassc,field[2]);
				else
sprintf(query,"DELETE FROM tAccess WHERE cDomainIP='%s' AND  uServer=%s AND  cRelayAttr='RELAY' AND  uOwner=%u AND uSource=7",cClassc,field[2],uLoginClient);
				mysql_query(&mysql,query);
        			if(mysql_errno(&mysql)) printf("%s\n",(mysql_error(&mysql)));

			}
			//Rule 3 216.2.103 RELAY
			else if( a>2 && a<255 && b>=0 && b<255 && c>=0 && d==999 && e==0 )
			{
				sprintf(cClassc,"%d.%d.%d",a,b,c);
				printf("\t<u>%s</u>\n\n",cDomainIPEtc);
				printf("\t\t%s\n\n",cClassc);

				if(uPermLevel>9)
sprintf(query,"DELETE FROM tAccess WHERE cDomainIP='%s' AND  uServer=%s AND  cRelayAttr='RELAY' AND uSource=7"
					,cClassc,field[2]);
				else
sprintf(query,"DELETE FROM tAccess WHERE cDomainIP='%s' AND  uServer=%s AND  cRelayAttr='RELAY' AND  uOwner=%u AND uSource=7",cClassc,field[2],uLoginClient);
				mysql_query(&mysql,query);
        			if(mysql_errno(&mysql)) printf("%s\n",(mysql_error(&mysql)));
			}

		

		
		}//end of while line (ctrl-m or \n line in tDUL.cRangeList)

	}//end of tDUL data
	
	printf("</pre>");
	ScheduleJob(1,uServer,"DelAccess",cClassc);

	Footer_ism3();

}//void DelRangeListsToAccess(void)
//sedall patch1
//sedall patch2
