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

 
*/

static char cSearch[100]={""};
static unsigned uAddAccess=0;
static unsigned uAddLocal=0;
static unsigned uAddVUT=0;
static unsigned uServer=0;
static char cuServerPullDown[256]={""};

void tDomainNavList(void);
void tDomainLocalList(void);
void tDomainAccessList(void);
void tDomainVUTList(void);
void CheckDomain(const char *cDomain,void (*funcTableDialog) (const char *cMsg),
		unsigned uRequire);

void NewAccess(char *cDomain,unsigned uServer);
void NewLocal(char *cDomain, unsigned uServer);
void NewVUT(char *cDomain, unsigned uServer);

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

//Library candidate function
void ExpandcSearchURL(char *cSearch);

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

	register int i;
	
	for(i=0;i<x;i++)
	{
		if(!strcmp(entries[i].name,"cSearch"))
			sprintf(cSearch,"%.99s",entries[i].val);
		else if(!strcmp(entries[i].name,"AddAccess"))
			uAddAccess=1;
		else if(!strcmp(entries[i].name,"AddLocal"))
			uAddLocal=1;
		else if(!strcmp(entries[i].name,"AddVUT"))
			uAddVUT=1;
		else if(!strcmp(entries[i].name,"cuServerPullDown"))
		{
			sprintf(cuServerPullDown,"%.255s",entries[i].val);
			uServer=ReadPullDown("tServer","cLabel",cuServerPullDown);
		}
	}

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


void CheckDomain(const char *cDomain,void (*funcTableDialog) (const char *cMsg),unsigned uRequire)
{
	MYSQL_RES *res;
	char *cp;
	unsigned uFound=0;

	if(strlen(cDomain)<4)
		funcTableDialog("Must provide valid cDomain");

	if((cp=strchr(cDomain,'.')))
	{
		cp++;
		if(strlen(cp)<2)
			funcTableDialog("cDomain after '.' part is too short");
	}
	else
	{
		funcTableDialog("cDomain must have '.' TLD part");
	}

	if(uRequire==2)
sprintf(query,"SELECT uDomain FROM tDomain WHERE cDomain='%s' AND uOwner=%u"
							,cDomain,uLoginClient);
	else
sprintf(query,"SELECT uDomain FROM tDomain WHERE cDomain='%s'",cDomain);
	mysql_query(&mysql,query);
	if(mysql_errno(&mysql))
		funcTableDialog(mysql_error(&mysql));
        res=mysql_store_result(&mysql);
	uFound=mysql_num_rows(res);
        mysql_free_result(res);
	if(uFound && uRequire==1)
		funcTableDialog("Domain already in use");
	if(!uFound && uRequire==2)
		funcTableDialog("Domain you own not in tDomain");

}//void CheckDomain()


void CheckDependency(void)
{
	MYSQL_RES *res;

	//Dependencies?
	sprintf(query,"SELECT uAccess FROM tAccess WHERE cDomainIP='%s'",cDomain);
       	mysql_query(&mysql,query);
       	if(mysql_errno(&mysql))
		mysqlSendmail(mysql_error(&mysql));
       	res=mysql_store_result(&mysql);
	if(mysql_num_rows(res))
		tDomain("tAccess dependencies found. Can't mod/del.");

	sprintf(query,"SELECT uLocal FROM tLocal WHERE cDomain='%s'",cDomain);
       	mysql_query(&mysql,query);
       	if(mysql_errno(&mysql))
		mysqlSendmail(mysql_error(&mysql));
       	res=mysql_store_result(&mysql);
	if(mysql_num_rows(res))
		tDomain("tLocal dependencies found. Can't mod/del.");

	sprintf(query,"SELECT uVUT FROM tVUT WHERE cDomain='%s'",cDomain);
       	mysql_query(&mysql,query);
       	if(mysql_errno(&mysql))
		mysqlSendmail(mysql_error(&mysql));
       	res=mysql_store_result(&mysql);
	if(mysql_num_rows(res))
		tDomain("tVUT dependencies found. Can't mod/del.");
}//void CheckDependency(void)


void ExttDomainCommands(pentry entries[], int x)
{
	if(!strcmp(function,"tDomainTools"))
	{
		ExtProcesstDomainVars(entries,x);

		if(!strcmp(command,LANG_NB_NEW))
                {
			if(uPermLevel>=8)
			{
				ProcesstDomainVars(entries,x);
				mode=2000;
				tDomain(LANG_NB_CONFIRMNEW);
			}
                }
		else if(!strcmp(command,LANG_NB_CONFIRMNEW))
                {
			if(uPermLevel>=8)
			{
				ProcesstDomainVars(entries,x);

				mode=2000;
				CheckDomain(cDomain,tDomain,1);
				mode=0;


				if(uAddAccess && uServer)
					NewAccess(cDomain,uServer);
				if(uAddLocal && uServer)
					NewLocal(cDomain,uServer);
				if(uAddVUT && uServer)
					NewVUT(cDomain,uServer);

				uDomain=0;
				uCreatedBy=uLoginClient;
				uOwner=uLoginClient;
				uModBy=0;//Never modified
				uModDate=0;
				NewtDomain(0);
			}
		}
		else if(!strcmp(command,LANG_NB_DELETE))
                {
                        ProcesstDomainVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
				mode=2001;
				tDomain(LANG_NB_CONFIRMDEL);
			}
                }
                else if(!strcmp(command,LANG_NB_CONFIRMDEL))
                {
                        ProcesstDomainVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
				CheckDependency();
				mode=5;
				DeletetDomain();
			}
                }
		else if(!strcmp(command,LANG_NB_MODIFY))
                {
                        ProcesstDomainVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
				mode=2002;
				tDomain(LANG_NB_CONFIRMMOD);
			}
                }
                else if(!strcmp(command,LANG_NB_CONFIRMMOD))
                {
                        ProcesstDomainVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
				MYSQL_RES *res;

				mode=2002;

				CheckDomain(cDomain,tDomain,1);
		
				CheckDependency();

				//Did Something actually change?
sprintf(query,"SELECT uDomain FROM tDomain WHERE cDomain='%s' AND uDomain=%u",cDomain,uDomain);
				mysql_query(&mysql,query);
				if(mysql_errno(&mysql))
					mysqlSendmail(mysql_error(&mysql));
				res=mysql_store_result(&mysql);
				if(mysql_num_rows(res))
					tDomain("Nothing changed no modification done");

				mode=0;

				uModBy=uLoginClient;
				ModtDomain();
			}
                }
	}

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


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

	printf("<font face=Arial,Helvetica>");
	printf("<font size=2>");
        printf("<u>Search Tools</u><br>\n");
        printf("<input title='Enter cLogin search pattern. Can be partial. You can also use advanced _ and %% pattern matching' type=text name=cSearch value='%s'>\n",cSearch);

	switch(mode)
        {
                case 2000:
			printf("<p><u>Enter required data</u><br>");
                        printf("<font size=1>");
                        printf(LANG_NBB_CONFIRMNEW);
                        printf("<p> Optional domain add for server:<br>");
			tTablePullDown("tServer;cuServerPullDown","cLabel","cLabel",uServer);
                        printf("<br>and tables: tAccess<input type=checkbox name=AddAccess>&nbsp; tLocal<input type=checkbox name=AddLocal> &nbsp;tVUT<input type=checkbox name=AddVUT>\n");
                break;

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

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

	}

	tDomainVUTList();
	tDomainLocalList();
	tDomainAccessList();
	printf("<font size=2>");
        printf("<p><u>tDomainNavList</u><br>\n");
	tDomainNavList();

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

}//void ExttDomainButtons(void)


void ExttDomainAuxTable(void)
{

}//void ExttDomainAuxTable(void)


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

	for(i=0;i<x;i++)
	{
		if(!strcmp(gentries[i].name,"uDomain"))
		{
			sscanf(gentries[i].val,"%u",&uDomain);
			mode=6;
		}
		else if(!strcmp(gentries[i].name,"cSearch"))
		{
			sprintf(cSearch,"%.99s",gentries[i].val);
		}
	}
	tDomain("");

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


void ExttDomainSelect(void)
{
        //Set non search query here for tTableName()
	if(uPermLevel>=9)
	{
		if(cSearch[0])
	sprintf(query,"SELECT %s FROM tDomain WHERE cDomain LIKE '%s%%' ORDER BY uDomain",VAR_LIST_tDomain,cSearch);
		else
	sprintf(query,"SELECT %s FROM tDomain ORDER BY uDomain",VAR_LIST_tDomain);
	}
	else
	{
		if(cSearch[0])
	sprintf(query,"SELECT %s FROM tDomain WHERE uOwner=%u AND cDomain LIKE '%s%%' ORDER BY uDomain",VAR_LIST_tDomain,uLoginClient,cSearch);
		else
	sprintf(query,"SELECT %s FROM tDomain WHERE uOwner=%u ORDER BY uDomain",
					VAR_LIST_tDomain,uLoginClient);
	}

}//void ExttDomainSelect(void)


void ExttDomainSelectRow(void)
{
	if(uPermLevel<10)
                sprintf(query,"SELECT %s FROM tDomain,tClient \
                                WHERE tDomain.uOwner=tClient.uClient\
                                AND (tClient.uOwner=%u OR tClient.uClient=%u)\
                                AND tDomain.uDomain=%u",
                        		VAR_LIST_tDomain,
					uLoginClient,uLoginClient,uDomain);
	else
                sprintf(query,"SELECT %s FROM tDomain WHERE uDomain=%u",
			VAR_LIST_tDomain,uDomain);

}//void ExttDomainSelectRow(void)


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

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

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

}//void ExttDomainListSelect(void)


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

}//void ExttDomainListFilter(void)


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


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

	if(!cSearch[0])
	{
		printf("(No search pattern provided)\n");
		return;
	}

	if(uPermLevel<10)
	{
		sprintf(query,"SELECT tDomain.uDomain\
				,tDomain.cDomain\
				FROM tDomain,tClient\
                                WHERE tDomain.uOwner=tClient.uClient\
                                AND tDomain.cDomain LIKE '%s%%'\
                                AND (tClient.uOwner=%u OR tClient.uClient=%u) ORDER BY cDomain",
					cSearch,uLoginClient,uLoginClient);
	}
	else
	{
	        sprintf(query,"SELECT uDomain,cDomain FROM tDomain WHERE cDomain LIKE '%s%%' ORDER BY cDomain",cSearch);
	}

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

        res=mysql_store_result(&mysql);
	if(mysql_num_rows(res))
	{
		if(strchr(cSearch,'%'))
			ExpandcSearchURL(cSearch);
        	while((field=mysql_fetch_row(res)))
			printf("<a class=darkLink href=mysqlSendmail.cgi?function=tDomain&uDomain=%s&cSearch=%s>%s</a><br>\n",field[0],cSearch,field[1]);
	}
	else
	{
		printf("(No results for search pattern (%s) provided)\n",cSearch);
	}
        mysql_free_result(res);


}//void tDomainNavList(void)


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

	sprintf(query,"SELECT uAccess,cDomainIP FROM tAccess WHERE cDomainIP='%s'"
						,cDomain);

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

        res=mysql_store_result(&mysql);
        if(mysql_num_rows(res))
	{
	printf("<font size=2>");
        printf("<p><u>tDomainAccessList</u><br>\n");
        while((field=mysql_fetch_row(res)))
        {
                printf("<a class=darkLink href=mysqlSendmail.cgi?function=tAccess\
&uAccess=%s>%s</a><br>\n",field[0],field[1]);
        }
	}
        mysql_free_result(res);

}//void tDomainAccessList(void)


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

	sprintf(query,"SELECT uLocal,cDomain FROM tLocal WHERE cDomain='%s'"
						,cDomain);

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

        res=mysql_store_result(&mysql);
        if(mysql_num_rows(res))
	{
	printf("<font size=2>");
        printf("<p><u>tDomainLocalList</u><br>\n");
        while((field=mysql_fetch_row(res)))
        {
                printf("<a class=darkLink href=mysqlSendmail.cgi?function=tLocal\
&uLocal=%s>%s</a><br>\n",field[0],field[1]);
        }
	}
        mysql_free_result(res);

}//void tDomainLocalList(void)



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

	sprintf(query,"SELECT uVUT,cDomain FROM tVUT WHERE cDomain='%s'"
						,cDomain);

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

        res=mysql_store_result(&mysql);
        if(mysql_num_rows(res))
	{
	printf("<font size=2>");
        printf("<p><u>tDomainVUTList</u><br>\n");
        while((field=mysql_fetch_row(res)))
        {
                printf("<a class=darkLink href=mysqlSendmail.cgi?function=tVUT&uVUT=%s>%s</a><br>\n",field[0],field[1]);
        }
	}
        mysql_free_result(res);

}//void tDomainVUTList(void)


//Designed for speed and gcc optimization. Not for cleverness or obfuscation factor...lol
//Try that in perl..you perl weenies you :)
void ExpandcSearchURL(char *cSearch)
{
	register unsigned i=0,j=0;
	char cCopy[300]={""};

	while(cSearch[j])
	{
		if(cSearch[j]=='%')
		{
			cCopy[i]='%';
			cCopy[i+1]='2';
			cCopy[i+2]='5';
			i+=3;
		}
		else
		{
			cCopy[i++]=cSearch[j];
		}
		j++;
	}
	cCopy[i]=0;
	strncpy(cSearch,cCopy,99);
	cSearch[99]=0;

}//void ExpandcSearchURL(char *cSearch)
//sedall patch1
//sedall patch2


void NewAccess(char *cDomain, unsigned uServer)
{
	MYSQL_RES *res;

	sprintf(query,"SELECT uAccess FROM tAccess WHERE cDomainIP='%s'",cDomain);
	mysql_query(&mysql,query);
       	if(mysql_errno(&mysql))
		tDomain(mysql_error(&mysql));
	res=mysql_store_result(&mysql);
	if(!mysql_num_rows(res))
	{
		sprintf(query,"INSERT INTO tAccess SET cDomainIP='%s',cRelayAttr='RELAY',uServer=%u,uSource=%u,uOwner=%u,uCreatedBy=%u,uCreatedDate=UNIX_TIMESTAMP(NOW())",TextAreaSave(cDomain),uServer
			,ACCESS_SOURCE_WEBCONSOLE
			,uLoginClient
			,uLoginClient);
		mysql_query(&mysql,query);
       		if(mysql_errno(&mysql))
			tDomain(mysql_error(&mysql));

		ScheduleJob(1,uServer,"NewAccess",cDomain);
	}
	mysql_free_result(res);

}//void NewAccess(char *cDomain, unsigned uServer)


void NewLocal(char *cDomain, unsigned uServer)
{
	MYSQL_RES *res;

	sprintf(query,"SELECT uLocal FROM tLocal WHERE cDomain='%s'",cDomain);
	mysql_query(&mysql,query);
       	if(mysql_errno(&mysql))
		tDomain(mysql_error(&mysql));
	res=mysql_store_result(&mysql);
	if(!mysql_num_rows(res))
	{

		sprintf(query,"INSERT INTO tLocal SET cDomain='%s',uOwner=%u,uCreatedBy=%u,uCreatedDate=UNIX_TIMESTAMP(NOW()),uServer=%u",TextAreaSave(cDomain),uLoginClient,uLoginClient,uServer);
		mysql_query(&mysql,query);
       		if(mysql_errno(&mysql))
			tDomain(mysql_error(&mysql));

		ScheduleJob(1,uServer,"NewLocal",cDomain);
	}
	mysql_free_result(res);

}//void NewLocal(char *cDomain, unsigned uServer)


void NewVUT(char *cDomain, unsigned uServer)
{
	MYSQL_RES *res;

	sprintf(query,"SELECT uVUT FROM tVUT WHERE cDomain='%s'",cDomain);
	mysql_query(&mysql,query);
       	if(mysql_errno(&mysql))
		tDomain(mysql_error(&mysql));
	res=mysql_store_result(&mysql);
	if(!mysql_num_rows(res))
	{

		sprintf(query,"INSERT INTO tVUT SET cDomain='%s',uOwner=%u,uCreatedBy=%u,uCreatedDate=UNIX_TIMESTAMP(NOW()),uServer=%u",TextAreaSave(cDomain),uLoginClient,uLoginClient,uServer);
		mysql_query(&mysql,query);
       		if(mysql_errno(&mysql))
			tDomain(mysql_error(&mysql));

	}
	mysql_free_result(res);

}//void NewVUT(char *cDomain, unsigned uServer)
