/*
FILE
	$Id: taccessfunc.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

 
*/

#include <ctype.h>

#define ACCESS_SOURCE_WEBCONSOLE 1
#define ACCESS_SOURCE_POPPER 2
#define ACCESS_SOURCE_RADIUSD 3
#define ACCESS_SOURCE_NUKESPAM_MISSES 4
#define ACCESS_SOURCE_NUKESPAM_NSENT 5
#define ACCESS_SOURCE_NUKESPAM_RESERVED 6
#define ACCESS_SOURCE_DUL 7

void CheckAccess(void);
static char cDomainPullDown[256]={""};
static unsigned uDomain=0;

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

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

	register int i;
	for(i=0;i<x;i++)
	{
		if(!strcmp(entries[i].name,"cDomainPullDown"))
		{
			strcpy(cDomainPullDown,entries[i].val);
			uDomain=ReadPullDown("tDomain","cDomain",
					cDomainPullDown);
		}
	
	}

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


void CheckAccess(void)
{
	register int i;
	unsigned a= -1,b= -1,c= -1,d= -1;
	char *cp;

	if(strlen(cDomainIP)<4)
		tAccess("Must specify a valid cDomainIP");
	if(strlen(cRelayAttr)<5)
		tAccess("Must specify a valid cRelayAttr");
	

	if(cDomainIP[strlen(cDomainIP)-1]=='.')
		tAccess("cDomainIP incorrect format, ends with '.'");


	sscanf(cDomainIP,"%u.%u.%u.%u",&a,&b,&c,&d);
	if(a>=0 && a<255 && b>=0 && b<255 && c>=0 && c<255 )
	{
		if(d == -1 )
			sprintf(cDomainIP,"%u.%u.%u",a,b,c);
		else if(d>=0 && d<255)
			sprintf(cDomainIP,"%u.%u.%u.%u",a,b,c,d);
		else if(1)
			tAccess("cDomainIP looks like an IP but is formatted wrong.");
	}
	else
	{
		if((cp=strchr(cDomainIP,'.')))
		{
			cp++;
			if(strlen(cp)<2)
				tAccess("cDomainIP after '.' part is too short");
		}
		else
		{
			tAccess("cDomainIP must have '.' TLD part");
		}
	}
	
	for(i=0;cDomainIP[i] && i<99;i++)
		if(isupper(cDomainIP[i]))
			cDomainIP[i]=tolower(cDomainIP[i]);
	
}//void CheckAccess(void);


void ExttAccessCommands(pentry entries[], int x)
{
	if(!strcmp(function,"tAccessTools"))
	{
		if(!strcmp(command,LANG_NB_NEW))
                {
			if(uPermLevel>=8)
			{
                        	ProcesstAccessVars(entries,x);
				if(uPermLevel<9)
				{
					uServer=1;
					strcpy(cRelayAttr,"RELAY");
				}
				//Check global conditions for new record here
                        	mode=2000;
                        	tAccess(LANG_NB_CONFIRMNEW);
			}
                }
		else if(!strcmp(command,LANG_NB_CONFIRMNEW))
                {
			if(uPermLevel>=8)
			{
                        	ProcesstAccessVars(entries,x);

				if(uPermLevel<9)
				{
					uServer=1;
					strcpy(cRelayAttr,"RELAY");
					strncpy(cDomainIP,cDomainPullDown,63);
					cDomainIP[63]=0;
				}

				if(!uServer)
					tLocal("Must select valid uServer");
                        	mode=2000;
				CheckAccess();

				mode=0;
				uAccess=0;
				uCreatedBy=uLoginClient;
				uOwner=uLoginClient;
				uModBy=0;//Never modified
				uModDate=0;
				uExpireDate=0;//Important see mail.c clean access list
				uSource=ACCESS_SOURCE_WEBCONSOLE;//New via console
				ScheduleJob(1,uServer,"NewAccess",cDomainIP);
				NewtAccess(0);
			}
		}
		else if(!strcmp(command,LANG_NB_DELETE))
                {
                        ProcesstAccessVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
				mode=2001;
				tAccess(LANG_NB_CONFIRMDEL);
			}
                }
                else if(!strcmp(command,LANG_NB_CONFIRMDEL))
                {
                        ProcesstAccessVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
				mode=5;
				ScheduleJob(1,uServer,"DelAccess",cDomainIP);
				DeletetAccess();
			}
                }
		else if(!strcmp(command,LANG_NB_MODIFY))
                {
                        ProcesstAccessVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
				mode=2002;
				tAccess(LANG_NB_CONFIRMMOD);
			}
                }
                else if(!strcmp(command,LANG_NB_CONFIRMMOD))
                {
                        ProcesstAccessVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
				MYSQL_RES *res;

				if(!uServer)
					tLocal("Must select valid uServer");

				mode=2002;
				CheckAccess();
				sprintf(query,"SELECT uAccess FROM tAccess WHERE cDomainIP='%s' AND cRelayAttr='%s' AND uServer=%u",cDomainIP,cRelayAttr,uServer);
				mysql_query(&mysql,query);
				if(mysql_errno(&mysql))
					mysqlSendmail(mysql_error(&mysql));
				res=mysql_store_result(&mysql);
				if(mysql_num_rows(res))
					tAccess("Nothing changed no modification done");
				mode=0;

				ScheduleJob(1,uServer,"ModAccess",cDomainIP);
				uModBy=uLoginClient;
				ModtAccess();
			}
                }
	}

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


void ExttAccessButtons(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:
			if(uPermLevel<10)
			{
				printf("<p><u>Select cDomain</u><br>");
				tTablePullDownOwner("tDomain;cDomainPullDown",
					"cDomain","cDomain",uDomain);
			}
                        printf("<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>Remember that virtual mail may depend on this entry!<br>\n");
                break;

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

	}


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

}//void ExttAccessButtons(void)


void ExttAccessAuxTable(void)
{

}//void ExttAccessAuxTable(void)


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

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

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


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

}//void ExttAccessSelect(void)


void ExttAccessSelectRow(void)
{
	if(uPermLevel<10)
                sprintf(query,"SELECT %s FROM tAccess,tClient \
                                WHERE tAccess.uOwner=tClient.uClient\
                                AND (tClient.uOwner=%u OR tClient.uClient=%u)\
                                AND tAccess.uAccess=%u",
                        		VAR_LIST_tAccess,
					uLoginClient,uLoginClient,uAccess);
	else
                sprintf(query,"SELECT %s FROM tAccess WHERE uAccess=%u",
			VAR_LIST_tAccess,uAccess);

}//void ExttAccessSelectRow(void)


void ExttAccessListSelect(void)
{
	char cCat[512];
	unsigned uNumber=0;

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

	//Changes here must be reflected below in ExttAccessListFilter()
        if(!strcmp(filter,"cDomainIP"))
        {
		if(uPermLevel<10)
			strcat(query," AND ");
		else
			strcat(query," WHERE ");
		sprintf(cCat,"tAccess.cDomainIP LIKE '%s' ORDER BY cDomainIP",command);
		strcat(query,cCat);
        }
	else if(!strcmp(filter,"cRelayAttr"))
        {
		if(uPermLevel<10)
			strcat(query," AND ");
		else
			strcat(query," WHERE ");
		sprintf(cCat,"tAccess.cRelayAttr LIKE '%s' ORDER BY cRelayAttr",command);
		strcat(query,cCat);
        }
	else if(!strcmp(filter,"uSource"))
        {
		sscanf(command,"%u",&uNumber);
		if(uPermLevel<10)
			strcat(query," AND ");
		else
			strcat(query," WHERE ");
		sprintf(cCat,"tAccess.uSource=%u",uNumber);
		strcat(query,cCat);
        }
	else if(!strcmp(filter,"uServer"))
        {
		sscanf(command,"%u",&uNumber);
		if(uPermLevel<10)
			strcat(query," AND ");
		else
			strcat(query," WHERE ");
		sprintf(cCat,"tAccess.uServer=%u",uNumber);
		strcat(query,cCat);
        }
        else if(1)
        {
                //None NO FILTER
                strcpy(filter,"None");
		strcat(query," ORDER BY uAccess");
        }

}//void ExttAccessListSelect(void)


void ExttAccessListFilter(void)
{
        //Filter
        printf("<td align=right >Select ");
        printf("<select name=filter>");

        if(strcmp(filter,"cDomainIP"))
                printf("<option>cDomainIP</option>");
        else
                printf("<option selected>cDomainIP</option>");

        if(strcmp(filter,"cRelayAttr"))
                printf("<option>cRelayAttr</option>");
        else
                printf("<option selected>cRelayAttr</option>");

        if(strcmp(filter,"uSource"))
                printf("<option>uSource</option>");
        else
                printf("<option selected>uSource</option>");

        if(strcmp(filter,"uServer"))
                printf("<option>uServer</option>");
        else
                printf("<option selected>uServer</option>");

        if(strcmp(filter,"None"))
                printf("<option>None</option>");
        else
                printf("<option selected>None</option>");
        printf("</select>");

}//void ExttAccessListFilter(void)


void ExttAccessNavBar(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);

	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 ExttAccessNavBar(void)



//sedall patch1
//sedall patch2
