/*
FILE
	$Id: taliasfunc.h 18 2005-12-14 20:24:21Z 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 "mail.h"

void tAliasNavList(void);
void ImportAliases(void);
void MakeAnnounceList(void);

static char cSearch[100]={""};

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

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

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

void CheckAliasEntries(void)
{
	char *cp;
	char *cp2;

	if(strchr(cLocalUser,'@'))
		tAlias("cUser must not have domain");
	if(!cLocalUser[0])
		tAlias("Must specify cUser");

	if(!cTargetEmail[0])
		tAlias("Must specify cTargetEmail");

	if((cp=strchr(cTargetEmail,'@')))
	{
		if(strlen(cTargetEmail)<6)
			tAlias("cTargetEmail is too short to be a valid email");
		cp++;
		if(*cp==0)
			tAlias("cTargetEmail must not end with @");
		if(!(cp2=strchr(cp,'.')))
			tAlias("cTargetEmail must have a '.' after the '@'");
		if(strlen(cp)<4)
			tAlias("cTargetEmail after '@' part is too short");
		cp2++;
		if(*cp2==0)
			tAlias("cTargetEmail must not end with .");
		if(strlen(cp2)<2)
			tAlias("cTargetEmail after '@' and '.' part is too short");
	}

}//void CheckAliasEntries(void)


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

		//Default wizard like two step creation and deletion
		if(!strcmp(command,LANG_NB_NEW))
                {
			if(uPermLevel>=8)
			{
                        ProcesstAliasVars(entries,x);
			//Check global conditions for new record here
                        mode=2000;
                        tAlias(LANG_NB_CONFIRMNEW);
			}
                }
		else if(!strcmp(command,LANG_NB_CONFIRMNEW))
                {
			if(uPermLevel>=8)
			{
                        ProcesstAliasVars(entries,x);
			if(!uServer)
				tAlias("Must select valid uServer");
                        mode=2000;
			CheckAliasEntries();
                        mode=0;
			uAlias=0;
			uCreatedBy=uLoginClient;
			uOwner=uLoginClient;
			uModBy=0;//Never modified
			uModDate=0;
			ScheduleJob(1,uServer,"NewAlias",cUser);
			NewtAlias(0);
			}
		}
		else if(!strcmp(command,LANG_NB_DELETE))
                {
                        ProcesstAliasVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9 && uOwner!=1)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
                        mode=2001;
                        tAlias(LANG_NB_CONFIRMDEL);
			}
                }
                else if(!strcmp(command,LANG_NB_CONFIRMDEL))
                {
                        ProcesstAliasVars(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,"DelAlias",cUser);
                        DeletetAlias();
			}
                }
		else if(!strcmp(command,LANG_NB_MODIFY))
                {
                        ProcesstAliasVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
                        mode=2002;
                        tAlias(LANG_NB_CONFIRMMOD);
			}
                }
                else if(!strcmp(command,LANG_NB_CONFIRMMOD))
                {
                        ProcesstAliasVars(entries,x);
			if(uOwner) GetClientOwner(uOwner,&uReseller);
			if( (uPermLevel>=8 && uOwner==uLoginClient)
				|| (uPermLevel>9)
				|| (uPermLevel>7 && uReseller==uLoginClient) )
			{
			if(!uServer)
				tAlias("Must select valid uServer");
                        mode=2002;
			CheckAliasEntries();
                        mode=0;
			uModBy=uLoginClient;
			ScheduleJob(1,uServer,"ModAlias",cUser);
                        ModtAlias();
			}
                }
                else if(!strcmp(command,"Import Aliases"))
                {
			if(uPermLevel>=12)
			{
			ImportAliases();
			tAlias("ImportAliases()");
			}
		}
                else if(!strcmp(command,"Make Announce List"))
                {
			MakeAnnounceList();
			tAlias("List created for :include:.../announce.list");
		}
	}

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


void ExttAliasButtons(void)
{
	printf("<table width=260 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 cUser or cTargetEmail 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);
                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);
			printf("<br>\n");
			printf("<p><input class=largeButton title='Create ~openisp/announce.list on localhost' type=submit name=command value='Make Announce List'>\n");
			if(uPermLevel>10)
			printf("<p><input class=lwarnButton title='Import aliases from /etc/aliases file' type=submit name=command value='Import Aliases'>\n");
                break;

	}

	tAliasNavList();

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

}//void ExttAliasButtons(void)


void ExttAliasAuxTable(void)
{

}//void ExttAliasAuxTable(void)


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

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

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


void ExttAliasSelect(void)
{
        //Set non search query here for tTableName()
	if(uPermLevel>=9)
	{
		if(cSearch[0])
	sprintf(query,"SELECT %s FROM tAlias WHERE cUser LIKE '%s%%' OR cTargetEmail LIKE '%s%%' ORDER BY uAlias",VAR_LIST_tAlias,cSearch,cSearch);
		else
	sprintf(query,"SELECT %s FROM tAlias ORDER BY uAlias",VAR_LIST_tAlias);
	}
	else
	{
		if(cSearch[0])
	sprintf(query,"SELECT %s FROM tAlias WHERE uOwner=%u AND ( cUser LIKE '%s%%' OR cTargetEmail LIKE '%s%%') ORDER BY uAlias",VAR_LIST_tAlias,uLoginClient,cSearch,cSearch);
		else
	sprintf(query,"SELECT %s FROM tAlias WHERE uOwner=%u ORDER BY uAlias",VAR_LIST_tAlias,uLoginClient);
	}

}//void ExttAliasSelect(void)


void ExttAliasSelectRow(void)
{
	if(uPermLevel<10)
                sprintf(query,"SELECT %s FROM tAlias,tClient \
                                WHERE tAlias.uOwner=tClient.uClient\
                                AND (tClient.uOwner=%u OR tClient.uClient=%u)\
                                AND tAlias.uAlias=%u",
                        		VAR_LIST_tAlias,
					uLoginClient,uLoginClient,uAlias);
	else
                sprintf(query,"SELECT %s FROM tAlias WHERE uAlias=%u",
			VAR_LIST_tAlias,uAlias);

}//void ExttAliasSelectRow(void)


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

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

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

}//void ExttAliasListSelect(void)


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

}//void ExttAliasListFilter(void)


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


void tAliasNavList(void)
{
        MYSQL_RES *res;
        MYSQL_ROW field;
	register unsigned uCount=0;

	if(uPermLevel<10)
	{
		if(cSearch[0])
		sprintf(query,"SELECT tAlias.uAlias\
				,tAlias.cUser\
				FROM tAlias,tClient\
                                WHERE tAlias.uOwner=tClient.uClient\
				AND ( cUser LIKE '%s%%' OR cTargetEmail LIKE '%s%%' )\
                                AND (tClient.uOwner=%u OR tClient.uClient=%u) ORDER BY cUser",cSearch,cSearch,uLoginClient,uLoginClient);
		else
		sprintf(query,"SELECT tAlias.uAlias\
				,tAlias.cUser\
				FROM tAlias,tClient\
                                WHERE tAlias.uOwner=tClient.uClient\
                                AND (tClient.uOwner=%u OR tClient.uClient=%u) ORDER BY cUser",uLoginClient,uLoginClient);
	}
	else
	{
		if(cSearch[0])
	        sprintf(query,"SELECT uAlias,cUser FROM tAlias WHERE cUser LIKE '%s%%' OR cTargetEmail LIKE '%s%%' ORDER BY cUser",cSearch,cSearch);
		else
	        sprintf(query,"SELECT uAlias,cUser FROM tAlias ORDER BY cUser");
	}

        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>tAliasNavList</u><br>\n");
		while((field=mysql_fetch_row(res)) && uCount<100)
		{
			uCount++;
			printf("<a class=darkLink href=mysqlSendmail.cgi?function=tAlias&uAlias=%s>%s</a><br>\n",field[0],field[1]);
		}
		if(uCount>=100)
			printf("More than 100 records. Only 100 shown<br>");
		if(cSearch[0])
			printf("cSearch resctricted list<br>");
        }
        mysql_free_result(res);

}//void tAliasNavList(void)


void MakeAnnounceList(void)
{
        MYSQL_RES *res;
        MYSQL_ROW field;
	FILE *fp;

	char cAnnounceList[256]={"~openisp/announce.list"};


	GetConfiguration("cAnnounceList",cAnnounceList,1);
	
	if(!(fp=fopen(cAnnounceList,"w")))
		tAlias("Could not open for writing announce.list");

	sprintf(query,"SELECT cLogin FROM tUser WHERE uStatus!=%u AND uStatus!=%u",US_AWAITDEL,US_CANCELLED);

        mysql_query(&mysql,query);
        if(mysql_errno(&mysql))
                mysqlSendmail(mysql_error(&mysql));

        res=mysql_store_result(&mysql);
        while((field=mysql_fetch_row(res)))
                fprintf(fp,"%s\n",field[0]);
	fclose(fp);

        mysql_free_result(res);

}//void MakeAnnounceList(void)


void ImportAliases(void)
{
	FILE *fp;
	char *cp;
	time_t clock;
	
	if(!(fp=fopen("/etc/aliases","r")))
		tAlias("Could not open /etc/aliases");

	Header_ism3("ImportAliases",0);
	printf("</center><pre>\n");
	time(&clock);
	while(fgets(query,1024,fp)!=NULL)
	{
		if(query[0]=='#') continue;

		if((cp=strchr(query,':')))
		{
			char qstr[512];
			char cRhs[256];
			char cRhsFixed[256];
			register int i,j;
			unsigned uLeading=0;

			*cp=0;
			sprintf(cRhs,"%.255s",cp+1);
			cRhs[strlen(cRhs)-1]=0;
			for(i=0,j=0;cRhs[i];i++)
			{
				if(uLeading || ( cRhs[i]!='\t' && cRhs[i]!=' '))
				{
					cRhsFixed[j]=cRhs[i];
					j++;
					uLeading++;
				}
			}
			cRhsFixed[j]=0;
			printf("%s: %s\n",query,cRhsFixed);
sprintf(qstr,"INSERT INTO tAlias SET cUser='%s',cTargetEmail='%s',uServer=1,uOwner=%u,uCreatedBy=%u,uCreatedDate=%lu",query,cRhsFixed,uLoginClient,uLoginClient,(long unsigned)clock);
			mysql_query(&mysql,qstr);
			if(mysql_errno(&mysql))
                		printf("<font color=yellow>%s</font>\n",
								mysql_error(&mysql));

		}
	}
	printf("</pre>\n");
	Footer_ism3();

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