/*
FILE
	$Id: tvutentriesfunc.h 4 2005-11-16 23:48:32Z 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
	
TODO
	Allow special error messages for tVUTEntries.cTargetEmail
	(see www.sendmail.org)

 
*/

void tVUTEntriesNavList(void);
void AddVirtualEmail(unsigned uVUTExt);
void ImportVUTEntries(void);
void AddVUTEntries(unsigned uVUT,const char *cVirtualEmail,const char *cTargetEmail);

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

char *cImportVUTEntries=NULL;

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

	register int i;
	for(i=0;i<x;i++)
	{
		if(!strcmp(entries[i].name,"cImportVUTEntries"))
			cImportVUTEntries=entries[i].val;
	}

	if(!strcmp(cVirtualEmail,"default"))
		strcpy(cVirtualEmail,"DEFAULT");

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


void AddVirtualEmail(unsigned uVUTExt)
{
	uVUT=uVUTExt;
	if(uPermLevel>=7)
	{
		mode=2000;
		tVUTEntries(LANG_NB_CONFIRMNEW);
	}
}//void AddVirtualEmail(unsigned uVUTExt)


void CheckVUTEntries(void)
{
	char cDomain[100];
	char *cp;
	char *cp2;

	if(strchr(cVirtualEmail,'@'))
		tVUTEntries("cVirtualEmail must not have domain");
	if(!cVirtualEmail[0])
		tVUTEntries("Must specify cVirtualEmail");
	if(!cTargetEmail[0])
		tVUTEntries("Must specify cTargetEmail");
	if(strchr(cTargetEmail,','))
		tVUTEntries("cTargetEmail must not have ','");
	if(!(cp=strchr(cTargetEmail,'@')))
	{
		MYSQL_RES *res;
		unsigned uServer=0;


		//Allow special error:nouser lines for DEFAULT only
		if(!strcmp(cVirtualEmail,"DEFAULT") && !strncmp(cTargetEmail,"error:nouser",12))
			return;

		sscanf(ForeignKey("tVUT","uServer",uVUT),"%u",&uServer);

		//Check tAliases
		sprintf(query,"SELECT uAlias FROM tAlias WHERE cUser='%s' AND uServer=%u",cTargetEmail,uServer);
        	mysql_query(&mysql,query);
        	if(mysql_errno(&mysql))
			mysqlSendmail(mysql_error(&mysql));
        	res=mysql_store_result(&mysql);
		if(!mysql_num_rows(res))
		{

		//Check tUser
		sprintf(query,"SELECT uUser FROM tUser WHERE cLogin='%s' AND uServer=%u",cTargetEmail,uServer);
        	mysql_query(&mysql,query);
        	if(mysql_errno(&mysql))
			mysqlSendmail(mysql_error(&mysql));
        	res=mysql_store_result(&mysql);
		if(!mysql_num_rows(res))
			tVUTEntries("Local cTargetEmail not in tAlias or tUser.");
		}
	}
	else
	{
		if(strlen(cTargetEmail)<6)
			tVUTEntries("cTargetEmail is too short to be a valid email");
		cp++;
		if(*cp==0)
			tVUTEntries("cTargetEmail must not end with @");
		if(!(cp2=strchr(cp,'.')))
			tVUTEntries("cTargetEmail must have a '.' after the '@'");
		if(strlen(cp)<4)
			tVUTEntries("cTargetEmail after '@' part is too short");
		cp2++;
		if(*cp2==0)
			tVUTEntries("cTargetEmail must not end with .");
		if(strlen(cp2)<2)
			tVUTEntries("cTargetEmail after '@' and '.' part is too short");
	}

	if((cp=strchr(cTargetEmail,'@')))
	{
		strncpy(cDomain,ForeignKey("tVUT","cDomain",uVUT),99);
		cDomain[99]=0;
		if(!strcasecmp(cp+1,cDomain))
			tVUTEntries("cTargetEmail domain must not be tVUT.cDomain");
	}
        else
        {
                MYSQL_RES *res;
                char query[256];

                sprintf(query,"SELECT uUser from tUser WHERE cLogin='%s'",cTargetEmail);
                mysql_query(&mysql,query);
                if(mysql_errno(&mysql))
                        mysqlSendmail(mysql_error(&mysql));
                res=mysql_store_result(&mysql);
                if(!mysql_num_rows(res))
                {

                        sprintf(query,"SELECT uAlias from tAlias WHERE cUser='%s'",cTargetEmail);
                        mysql_query(&mysql,query);
                        if(mysql_errno(&mysql))
                                mysqlSendmail(mysql_error(&mysql));
                        res=mysql_store_result(&mysql);
                        if(!mysql_num_rows(res))
                        {
                                mysql_free_result(res);
                                tVUTEntries("Unexpected error: Missing '@' in cTargetEmail. Or cTargetEmail not in tUser or tAlias");
                        }
                }
                mysql_free_result(res);
        }


}//void CheckVUTEntries(void)


void ExttVUTEntriesCommands(pentry entries[], int x)
{
	if(!strcmp(function,"tVUTEntriesTools"))
	{
		unsigned uServer;

		if(!strcmp(command,LANG_NB_NEW))
                {
			if(uPermLevel>=7)
			{
                        	ProcesstVUTEntriesVars(entries,x);
				if(!uVUT)
					tVUTEntries("Must use a valid uVUT. Hint: Start at tVUT");
                        	mode=2000;
                        	tVUTEntries(LANG_NB_CONFIRMNEW);
			}
                }
		else if(!strcmp(command,LANG_NB_CONFIRMNEW))
                {
			if(uPermLevel>=7)
			{
                        	ProcesstVUTEntriesVars(entries,x);
				if(!uVUT)
					tVUTEntries("Must use a valid uVUT. Hint: Start at tVUT");
                        	mode=2000;
				CheckVUTEntries();
				mode=0;
			
				uVUTEntries=0;
				uCreatedBy=uLoginClient;
				uOwner=uLoginClient;
				uModBy=0;//Never modified
				uModDate=0;
				sscanf(ForeignKey("tVUT","uServer",uVUT),"%u",&uServer);
				ScheduleJob(1,uServer,"NewVUTEntry",cVirtualEmail);
				NewtVUTEntries(0);
			}
		}
		else if(!strcmp(command,LANG_NB_DELETE))
                {
                        ProcesstVUTEntriesVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=7 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
                        	mode=2001;
                        	tVUTEntries(LANG_NB_CONFIRMDEL);
			}
                }
                else if(!strcmp(command,LANG_NB_CONFIRMDEL))
                {
                        ProcesstVUTEntriesVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=7 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
                        	mode=5;
				sscanf(ForeignKey("tVUT","uServer",uVUT),"%u",&uServer);
				ScheduleJob(1,uServer,"DeleteVUTEntry",cVirtualEmail);
                        	DeletetVUTEntries();
			}
                }
		else if(!strcmp(command,LANG_NB_MODIFY))
                {
                        ProcesstVUTEntriesVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=7 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
                        	mode=2002;
                        	tVUTEntries(LANG_NB_CONFIRMMOD);
			}
                }
                else if(!strcmp(command,LANG_NB_CONFIRMMOD))
                {
                        ProcesstVUTEntriesVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=7 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )

			{
				MYSQL_RES *res;
                        	mode=2002;
				CheckVUTEntries();
			
sprintf(query,"SELECT uVUTEntries FROM tVUTEntries WHERE cVirtualEmail='%s' AND cTargetEmail='%s' AND uVUT=%u",cVirtualEmail,cTargetEmail,uVUT);
	        		mysql_query(&mysql,query);
				if(mysql_errno(&mysql))
					mysqlSendmail(mysql_error(&mysql));
				res=mysql_store_result(&mysql);
				if(mysql_num_rows(res))
					tVUTEntries("Nothing changed no modification done");
				mysql_free_result(res);
				mode=0;
				uModBy=uLoginClient;
				sscanf(ForeignKey("tVUT","uServer",uVUT),"%u",&uServer);
				ScheduleJob(1,uServer,"ModVUTEntry",cVirtualEmail);
				ModtVUTEntries();
			}
                }
                else if(!strcmp(command,"ImportVUTEntries"))
                {
                        ProcesstVUTEntriesVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( uPermLevel>=10 )
			{
				char cDomain[100];

				Header_ism3("",0);
				printf("<form action=mysqlSendmail.cgi method=post>");
				printf("<table width=900>");
				printf("<tr><td valign=top><font face=arial>");
				printf("<input type=hidden name=function value=tVUTEntriesTools>\n");
				printf("<input type=hidden name=uVUT value=%u>\n",uVUT);
				sprintf(cDomain,"%.99s",ForeignKey("tVUT","cDomain",uVUT));
				printf("Enter properly formatted tVUTEntries data for cDomain=%s",cDomain);
				printf("<p><input title='Enter block of VUT records for this domain'\
						type=submit name=command value='Confirm ImportVUTEntries' ></td>\n");
				printf("<td><font face=arial><textarea cols=80 rows=20 name=cImportVUTEntries>");
				printf("</textarea></td></tr>");
				printf("</table>");
				printf("</form>");
				Footer_ism3();
			}
		}
                else if(!strcmp(command,"Confirm ImportVUTEntries"))
                {
                        ProcesstVUTEntriesVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( uPermLevel>=10 )
			{
				ImportVUTEntries();
			}
		}
	}

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


void ExttVUTEntriesButtons(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");
			if(uPermLevel>=10)
				printf("<input class=lwarnButton title='Enter block of VUT records for this domain'\
						type=submit name=command value=ImportVUTEntries ><br>\n");

                break;

	}

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

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

}//void ExttVUTEntriesButtons(void)


void ExttVUTEntriesAuxTable(void)
{

}//void ExttVUTEntriesAuxTable(void)


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

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

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


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

}//void ExttVUTEntriesSelect(void)


void ExttVUTEntriesSelectRow(void)
{
	if(uPermLevel<10)
                sprintf(query,"SELECT %s FROM tVUTEntries,tClient \
                                WHERE tVUTEntries.uOwner=tClient.uClient\
                                AND (tClient.uOwner=%u OR tClient.uClient=%u)\
                                AND tVUTEntries.uVUTEntries=%u",
                        		VAR_LIST_tVUTEntries,
					uLoginClient,uLoginClient,uVUTEntries);
	else
                sprintf(query,"SELECT %s FROM tVUTEntries WHERE uVUTEntries=%u",
			VAR_LIST_tVUTEntries,uVUTEntries);

}//void ExttVUTEntriesSelectRow(void)


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

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

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

}//void ExttVUTEntriesListSelect(void)


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

}//void ExttVUTEntriesListFilter(void)


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

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

	if(uPermLevel>=7)
		printf(LANG_NBB_NEW);

	if( (uPermLevel>=7 && uOwner==uLoginClient)
			|| (uPermLevel>9 && uOwner!=1)
			|| (uPermLevel>7 && uReseller==uLoginClient) )
		printf(LANG_NBB_MODIFY);

	if( (uPermLevel>=7 && 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 ExttVUTEntriesNavBar(void)


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

	if(uPermLevel<10)
		sprintf(query,"SELECT tVUTEntries.uVUTEntries,tVUT.cDomain,\
				tVUTEntries.cVirtualEmail,tVUTEntries.cTargetEmail\
				FROM tVUTEntries,tClient,tVUT\
                                WHERE tVUTEntries.uOwner=tClient.uClient\
                                AND tVUTEntries.uVUT=tVUT.uVUT\
                                AND tVUTEntries.uVUT=%u\
                                AND (tClient.uOwner=%u OR tClient.uClient=%u)",
					uVUT,uLoginClient,uLoginClient);
	else
	        sprintf(query,"SELECT tVUTEntries.uVUTEntries,tVUTEntries.cVirtualEmail,tVUT.cDomain,tVUTEntries.cTargetEmail FROM tVUTEntries,tVUT WHERE tVUTEntries.uVUT=tVUT.uVUT AND tVUT.uVUT=%u",uVUT);

        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=tVUTEntries\
&uVUTEntries=%s>%s@%s:%s</a><br>\n",field[0],field[1],field[2],field[3]);
        }
        mysql_free_result(res);

}//void tVUTEntriesNavList(void)


void ImportVUTEntries(void)
{
	register int i=0,j=0;
	char cLine[256];
	char cVirtualEmail[100];
	char cTargetEmail[100];
	char cDomain[100];
	char *cp=NULL;

	Header_ism3("",0);

	printf("<table width=900>");
	printf("<tr><td><pre>%s</pre></td></tr>",cImportVUTEntries);
	printf("<tr><td><pre>");
	sprintf(cDomain,"%.99s",ForeignKey("tVUT","cDomain",uVUT));
	printf("tVUT.cDomain(%u):%s\n",uVUT,cDomain);
	while(cImportVUTEntries[i])
	{
		if(cImportVUTEntries[i]==13)
		{

			cImportVUTEntries[i]=0;
			sprintf(cLine,"%.255s",cImportVUTEntries+j);
			cImportVUTEntries[i]=13;
			j=i+2;
			i++;

			cp=NULL;
			if((cp=strchr(cLine,':')))
			{
				*cp=0;
				sprintf(cVirtualEmail,"%.99s",cLine);
				sprintf(cTargetEmail,"%.99s",cp+1);
				printf("%s:%s\n",cVirtualEmail,cTargetEmail);
				AddVUTEntries(uVUT,cVirtualEmail,cTargetEmail);
			}

		}
		i++;
	}
	cp=NULL;
	if((cp=strchr(cLine,':')))
	{
		*cp=0;
		sprintf(cVirtualEmail,"%.99s",cLine);
		sprintf(cTargetEmail,"%.99s",cp+1);
		printf("%s:%s\n",cVirtualEmail,cTargetEmail);
		AddVUTEntries(uVUT,cVirtualEmail,cTargetEmail);
	}
	printf("</pre></td></tr>");
	printf("</table>");
	Footer_ism3();

}//void ImportVUTEntries(void)

void AddVUTEntries(unsigned uVUT,const char *cVirtualEmail,const char *cTargetEmail)
{
	MYSQL_RES *res;
        MYSQL_ROW field;
	time_t luClock;
	char *cp=NULL;

	//Fast chop
	if((cp=strchr(cVirtualEmail,'@'))) *cp=0;

        time(&luClock);

	unsigned uVUTEntries=0;

	sprintf(query,"SELECT cVirtualEmail,uVUTEntries FROM tVUTEntries WHERE cVirtualEmail='%s' AND uVUT=%u",
						cVirtualEmail,uVUT);
        mysql_query(&mysql,query);
        if(mysql_errno(&mysql))
		printf("%s\n",mysql_error(&mysql));
        res=mysql_store_result(&mysql);
        if((field=mysql_fetch_row(res)))
        {

		sscanf(field[1],"%u",&uVUTEntries);
		sprintf(query,"UPDATE tVUTEntries SET cTargetEmail='%s',uModBy=%u,uModDate=%lu WHERE uVUTEntries=%u",
						cTargetEmail,uLoginClient,luClock,uVUTEntries);
        	mysql_query(&mysql,query);
        	if(mysql_errno(&mysql))
			printf("%s\n",mysql_error(&mysql));
	}
	else
	{
		sprintf(query,"INSERT INTO tVUTEntries SET cVirtualEmail='%s',cTargetEmail='%s',uCreatedBy=%u,\
					uCreatedDate=%lu,uVUT=%u,uOwner=%u",
					cVirtualEmail,cTargetEmail,uLoginClient,luClock,uVUT,uLoginClient);
        	mysql_query(&mysql,query);
        	if(mysql_errno(&mysql))
			printf("%s\n",mysql_error(&mysql));
	}

}//void AddVUTEntries(unsigned uVUT,const char *cVirtualEmail,const char *cTargetEmail)


//sedall patch1
//sedall patch2
