/*
FILE
	tAccess source code of mysqlSendmail.cgi
	(built by mysqlRAD2.cgi (c) Gary Wallis 2001,2002 GPL Licensed)
	$Id: taccess.c 6 2005-11-24 00:02:59Z ggw $
	(tAuthorize.cPasswd template set member)
PURPOSE
*/

#include "mysqlrad.h"

//Table Variables
//uAccess: Primary Key
static unsigned uAccess=0;
//cDomainIP: Domain or IP: Class C class B of full IP
static char cDomainIP[65]={""};
//cRelayAttr: Allow, reject or other error message
static char cRelayAttr[65]={""};
//uServer: Server account is on
static unsigned uServer=0;
static char cuServerPullDown[256]={""};
//uExpireDate: Expire this tAccess entry at this time
static long unsigned uExpireDate=0;
//uSource: Where this record came from
static unsigned uSource=0;
//uOwner: Record owner
static unsigned uOwner=0;
//uCreatedBy: uClient for last insert
static unsigned uCreatedBy=0;
#define ISM3FIELDS
//uCreatedDate: Unix seconds date last insert
static long unsigned uCreatedDate=0;
//uModBy: uClient for last update
static unsigned uModBy=0;
//uModDate: Unix seconds date last update
static long unsigned uModDate=0;




#define VAR_LIST_tAccess "tAccess.uAccess,tAccess.cDomainIP,tAccess.cRelayAttr,tAccess.uServer,tAccess.uExpireDate,tAccess.uSource,tAccess.uOwner,tAccess.uCreatedBy,tAccess.uCreatedDate,tAccess.uModBy,tAccess.uModDate"

 //Local only
void Insert_tAccess(void);
void Update_tAccess(char *rowid);
int InsertUpdate_tAccess(char *cKey);
void ProcesstAccessListVars(pentry entries[], int x);

 //In tAccessfunc.h file included below
void ExtProcesstAccessVars(pentry entries[], int x);
void ExttAccessCommands(pentry entries[], int x);
void ExttAccessButtons(void);
void ExttAccessNavBar(void);
void ExttAccessGetHook(entry gentries[], int x);
void ExttAccessSelect(void);
void ExttAccessSelectRow(void);
void ExttAccessListSelect(void);
void ExttAccessListFilter(void);
void ExttAccessAuxTable(void);

#include "taccessfunc.h"

 //Table Variables Assignment Function
void ProcesstAccessVars(pentry entries[], int x)
{
	register int i;


	for(i=0;i<x;i++)
	{
		if(!strcmp(entries[i].name,"uAccess"))
			sscanf(entries[i].val,"%u",&uAccess);
		else if(!strcmp(entries[i].name,"cDomainIP"))
			sprintf(cDomainIP,"%.64s",entries[i].val);
		else if(!strcmp(entries[i].name,"cRelayAttr"))
			sprintf(cRelayAttr,"%.64s",entries[i].val);
		else if(!strcmp(entries[i].name,"uServer"))
			sscanf(entries[i].val,"%u",&uServer);
		else if(!strcmp(entries[i].name,"cuServerPullDown"))
		{
			sprintf(cuServerPullDown,"%.255s",entries[i].val);
			uServer=ReadPullDown("tServer","cLabel",cuServerPullDown);
		}
		else if(!strcmp(entries[i].name,"uExpireDate"))
			sscanf(entries[i].val,"%lu",&uExpireDate);
		else if(!strcmp(entries[i].name,"uSource"))
			sscanf(entries[i].val,"%u",&uSource);
		else if(!strcmp(entries[i].name,"uOwner"))
			sscanf(entries[i].val,"%u",&uOwner);
		else if(!strcmp(entries[i].name,"uCreatedBy"))
			sscanf(entries[i].val,"%u",&uCreatedBy);
		else if(!strcmp(entries[i].name,"uCreatedDate"))
			sscanf(entries[i].val,"%lu",&uCreatedDate);
		else if(!strcmp(entries[i].name,"uModBy"))
			sscanf(entries[i].val,"%u",&uModBy);
		else if(!strcmp(entries[i].name,"uModDate"))
			sscanf(entries[i].val,"%lu",&uModDate);

	}

	//After so we can overwrite form data if needed.
	ExtProcesstAccessVars(entries,x);

}//ProcesstAccessVars()


void ProcesstAccessListVars(pentry entries[], int x)
{
        register int i;

        for(i=0;i<x;i++)
        {
                if(!strncmp(entries[i].name,"ED",2))
                {
                        sscanf(entries[i].name+2,"%u",&uAccess);
                        mode=6;
                        tAccess("");
                }
        }
}//void ProcesstAccessListVars(pentry entries[], int x)


int tAccessCommands(pentry entries[], int x)
{
	ProcessControlVars(entries,x);

	ExttAccessCommands(entries,x);

	if(!strcmp(function,"tAccessTools"))
	{
		if(!strcmp(find,LANG_NB_LIST))
		{
			tAccessList();
		}

		//Default
		ProcesstAccessVars(entries,x);
		tAccess("");
	}
	else if(!strcmp(function,"tAccessList"))
	{
		ProcessControlVars(entries,x);
		ProcesstAccessListVars(entries,x);
		tAccessList();
	}

	return(0);

}//tAccessCommands()


void tAccess(const char *result)
{
	MYSQL_RES *res;
	MYSQL_RES *res2;
	MYSQL_ROW field;

	//Internal skip reloading
	if(!result[0])
	{
		if(mode)
			ExttAccessSelectRow();
		else
			ExttAccessSelect();

		mysql_query(&mysql,query);
		if(mysql_errno(&mysql))
        	{
			if(strstr(mysql_error(&mysql)," doesn't exist"))
                	{
				CreatetAccess();
				mysqlSendmail("New tAccess table created");
                	}
			else
			{
				mysqlSendmail(mysql_error(&mysql));
			}
        	}

		res=mysql_store_result(&mysql);
		if((i=mysql_num_rows(res)))
		{
			if(mode==6)
			{
			sprintf(query,"SELECT _rowid FROM tAccess WHERE uAccess=%u"
						,uAccess);
			mysql_query(&mysql,query);
			res2=mysql_store_result(&mysql);
			field=mysql_fetch_row(res2);
			sscanf(field[0],"%lu",&rowid);
			rowid++;
			}
			PageMachine("",0,"");
			if(!mode) mysql_data_seek(res,rowid-1);
			field=mysql_fetch_row(res);
		sscanf(field[0],"%u",&uAccess);
		sprintf(cDomainIP,"%.64s",field[1]);
		sprintf(cRelayAttr,"%.64s",field[2]);
		sscanf(field[3],"%u",&uServer);
		sscanf(field[4],"%lu",&uExpireDate);
		sscanf(field[5],"%u",&uSource);
		sscanf(field[6],"%u",&uOwner);
		sscanf(field[7],"%u",&uCreatedBy);
		sscanf(field[8],"%lu",&uCreatedDate);
		sscanf(field[9],"%u",&uModBy);
		sscanf(field[10],"%lu",&uModDate);

		}

	}//Internal Skip

	Header_ism3(":: tAccess",0);
	printf("<form action=mysqlSendmail.cgi method=post >\n");
	printf("<table width=900 border=0 bgcolor=#A9BEC0 valign=center>\n");
	printf("<tr><td colspan=2><font face=Arial,Helvetica size=2>");


	ExttAccessNavBar();

	printf("<input type=hidden name=function value=tAccessTools>");
	printf("<input type=hidden name=rowid value=%lu>",rowid);
	if(i)
	{
		printf(" <font color=blue >");
		if(mode==6)
			//printf(" Found");
			printf(LANG_NBR_FOUND);
		else if(mode==5)
			//printf(" Modified");
			printf(LANG_NBR_MODIFIED);
		else if(mode==4)
			//printf(" New");
			printf(LANG_NBR_NEW);
		printf(LANG_NBRF_SHOWING,rowid,i);
	}
	else
	{
		if(!result[0])
		//printf(" No records found");
		printf(LANG_NBR_NORECS);
	}
	if(result[0]) printf(" <b> %s",result);
	printf("</td></tr>");
	printf("<tr><td valign=top>");

        ExttAccessButtons();

        printf("</td><td valign=top>");
	printf("<table width=630 border=0 bgcolor=#9BC1B3 valign=center>\n");

	if(mode==2000 || mode==2002)
		tAccessInputContent();
	else
		tAccessContent();

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

	//Bottom table
        ExttAccessAuxTable();

	printf("</font></form>\n");
	Footer_ism3();

}//end of tAccess();


void tAccessContent(void)
{

	OpenRow(LANG_FL_tAccess_uAccess,"white");
	printf("%u<input type=hidden name=uAccess value=%u >\n",uAccess,uAccess);
	printf("&nbsp;&nbsp;");
	OpenRow(LANG_FL_tAccess_cDomainIP,EmptyString(cDomainIP));
	printf("%s<input type=hidden name=cDomainIP value=\"%s\">",cDomainIP,EncodeDoubleQuotes(cDomainIP));
	printf("&nbsp;&nbsp;");
	OpenRow(LANG_FL_tAccess_cRelayAttr,EmptyString(cRelayAttr));
	printf("%s<input type=hidden name=cRelayAttr value=\"%s\">",cRelayAttr,EncodeDoubleQuotes(cRelayAttr));
	printf("&nbsp;&nbsp;");
	OpenRow(LANG_FL_tAccess_uServer,IsZero(uServer));
	tTablePullDownReadOnly("tServer;cuServerPullDown","cLabel","cLabel",uServer);
	printf("&nbsp;&nbsp;");
	OpenRow(LANG_FL_tAccess_uExpireDate,"white");
	if(uExpireDate)
		printf("%s\n\n",ctime((time_t *)&uExpireDate));
	else
		printf("---\n\n");
	printf("<input type=hidden name=uExpireDate value=%lu >\n",uExpireDate);
	printf("&nbsp;&nbsp;");
	OpenRow(LANG_FL_tAccess_uSource,"white");
	printf("%u<input type=hidden name=uSource value=%u >\n",uSource,uSource);
	printf("&nbsp;&nbsp;");
	OpenRow(LANG_FL_tAccess_uOwner,"white");
	printf("%s<input type=hidden name=uOwner value=%u >\n",ForeignKey("tClient","cLabel",uOwner),uOwner);
	printf("&nbsp;&nbsp;");
	OpenRow(LANG_FL_tAccess_uCreatedBy,"white");
	printf("%s<input type=hidden name=uCreatedBy value=%u >\n",ForeignKey("tClient","cLabel",uCreatedBy),uCreatedBy);
	printf("&nbsp;&nbsp;");
	OpenRow(LANG_FL_tAccess_uCreatedDate,"white");
	if(uCreatedDate)
		printf("%s\n\n",ctime((time_t *)&uCreatedDate));
	else
		printf("---\n\n");
	printf("<input type=hidden name=uCreatedDate value=%lu >\n",uCreatedDate);
	printf("&nbsp;&nbsp;");
	OpenRow(LANG_FL_tAccess_uModBy,"white");
	printf("%s<input type=hidden name=uModBy value=%u >\n",ForeignKey("tClient","cLabel",uModBy),uModBy);
	printf("&nbsp;&nbsp;");
	OpenRow(LANG_FL_tAccess_uModDate,"white");
	if(uModDate)
		printf("%s\n\n",ctime((time_t *)&uModDate));
	else
		printf("---\n\n");
	printf("<input type=hidden name=uModDate value=%lu >\n",uModDate);
	printf("&nbsp;&nbsp;");
	printf("</tr>\n");



}//tAccessContent()


void tAccessInputContent(void)
{

	OpenRow(LANG_FL_tAccess_uAccess,"white");
	if(uPermLevel>=20)
		printf("<input title='%s' type=text name=uAccess value=%u size=16 maxlength=10>\n",LANG_FT_tAccess_uAccess,uAccess);
	else
		printf("%u<input type=hidden name=uAccess value=%u >\n",uAccess,uAccess);
	OpenRow(LANG_FL_tAccess_cDomainIP,EmptyString(cDomainIP));
	if(uPermLevel>9)
		printf("<input title='%s' type=text name=cDomainIP value=\"%s\" size=40 maxlength=64>\n",LANG_FT_tAccess_cDomainIP,EncodeDoubleQuotes(cDomainIP));
	else
		printf("%s<input type=hidden name=cDomainIP value=\"%s\">",cDomainIP,EncodeDoubleQuotes(cDomainIP));
	OpenRow(LANG_FL_tAccess_cRelayAttr,EmptyString(cRelayAttr));
	if(uPermLevel>9)
		printf("<input title='%s' type=text name=cRelayAttr value=\"%s\" size=40 maxlength=64>\n",LANG_FT_tAccess_cRelayAttr,EncodeDoubleQuotes(cRelayAttr));
	else
		printf("%s<input type=hidden name=cRelayAttr value=\"%s\">",cRelayAttr,EncodeDoubleQuotes(cRelayAttr));
	OpenRow(LANG_FL_tAccess_uServer,IsZero(uServer));
	if(uPermLevel>9)
		tTablePullDown("tServer;cuServerPullDown","cLabel","cLabel",uServer);
	else
	{
		tTablePullDownReadOnly("tServer;cuServerPullDown","cLabel","cLabel",uServer);
	}
	OpenRow(LANG_FL_tAccess_uExpireDate,"white");
	if(uExpireDate)
		printf("%s\n\n",ctime((time_t *)&uExpireDate));
	else
		printf("---\n\n");
	printf("<input type=hidden name=uExpireDate value=%lu >\n",uExpireDate);
	OpenRow(LANG_FL_tAccess_uSource,"white");
	if(uPermLevel>=20)
		printf("<input title='%s' type=text name=uSource value=%u size=16 maxlength=10>\n",LANG_FT_tAccess_uSource,uSource);
	else
		printf("%u<input type=hidden name=uSource value=%u >\n",uSource,uSource);
	OpenRow(LANG_FL_tAccess_uOwner,"white");
	printf("%s<input type=hidden name=uOwner value=%u >\n",ForeignKey("tClient","cLabel",uOwner),uOwner);
	OpenRow(LANG_FL_tAccess_uCreatedBy,"white");
	printf("%s<input type=hidden name=uCreatedBy value=%u >\n",ForeignKey("tClient","cLabel",uCreatedBy),uCreatedBy);
	OpenRow(LANG_FL_tAccess_uCreatedDate,"white");
	if(uCreatedDate)
		printf("%s\n\n",ctime((time_t *)&uCreatedDate));
	else
		printf("---\n\n");
	printf("<input type=hidden name=uCreatedDate value=%lu >\n",uCreatedDate);
	OpenRow(LANG_FL_tAccess_uModBy,"white");
	printf("%s<input type=hidden name=uModBy value=%u >\n",ForeignKey("tClient","cLabel",uModBy),uModBy);
	OpenRow(LANG_FL_tAccess_uModDate,"white");
	if(uModDate)
		printf("%s\n\n",ctime((time_t *)&uModDate));
	else
		printf("---\n\n");
	printf("<input type=hidden name=uModDate value=%lu >\n",uModDate);
	printf("</tr>\n");



}//void tAccessInputContent(void)


void NewtAccess(unsigned uMode)
{
	register int i=0;
	MYSQL_RES *res;

	//New select
	sprintf(query,"SELECT uAccess FROM tAccess\
				WHERE uAccess=%u"
							,uAccess);
	mysql_query(&mysql,query);
	if(mysql_errno(&mysql)) mysqlSendmail(mysql_error(&mysql));
	res=mysql_store_result(&mysql);
	i=mysql_num_rows(res);

	if(i) 
		//tAccess("<blink>Record already exists");
		tAccess(LANG_NBR_RECEXISTS);

	//insert query
	Insert_tAccess();
	if(mysql_errno(&mysql)) mysqlSendmail(mysql_error(&mysql));
	//sprintf(query,"New record %u added");
	uAccess=mysql_insert_id(&mysql);

	if(!uMode)
	{
	sprintf(query,LANG_NBR_NEWRECADDED,uAccess);
	tAccess(query);
	}

}//NewtAccess(unsigned uMode)


void DeletetAccess(void)
{
#ifdef ISM3FIELDS
	sprintf(query,"DELETE FROM tAccess WHERE uAccess=%u AND ( uOwner=%u OR %u>9 )"
					,uAccess,uLoginClient,uPermLevel);
#else
	sprintf(query,"DELETE FROM tAccess WHERE uAccess=%u"
					,uAccess);
#endif
	mysql_query(&mysql,query);
	if(mysql_errno(&mysql)) mysqlSendmail(mysql_error(&mysql));

	//tAccess("Record Deleted");
	if(mysql_affected_rows(&mysql)>0)
		tAccess(LANG_NBR_RECDELETED);
	else
		tAccess(LANG_NBR_RECNOTDELETED);

}//void DeletetAccess(void)


void Insert_tAccess(void)
{

#ifdef ISM3FIELDS
	time_t clock;

        time(&clock);
#endif

	//insert query

	//insert query
	sprintf(query,"INSERT INTO tAccess SET  uAccess=%u, cDomainIP='%s', cRelayAttr='%s', uServer=%u, uExpireDate=%lu, uSource=%u, uOwner=%u, uCreatedBy=%u, uCreatedDate=%lu, uModBy=%u, uModDate=0",
			uAccess
			,TextAreaSave(cDomainIP)
			,TextAreaSave(cRelayAttr)
			,uServer
			,uExpireDate
			,uSource
			,uOwner
			,uCreatedBy
			,(long unsigned)clock
			,uModBy
			);


	mysql_query(&mysql,query);
#ifdef ISM3FIELDS
	uCreatedDate=clock;
#endif

}//void Insert_tAccess(void)


void Update_tAccess(char *rowid)
{
#ifdef ISM3FIELDS
	time_t clock;

        time(&clock);
#endif

	//update query

	//update query
	sprintf(query,"UPDATE tAccess SET uAccess=%u,cDomainIP='%s',cRelayAttr='%s',uServer=%u,uExpireDate=%lu,uSource=%u,uModBy=%u,uModDate=%lu WHERE _rowid=%s",
			uAccess
			,TextAreaSave(cDomainIP)
			,TextAreaSave(cRelayAttr)
			,uServer
			,uExpireDate
			,uSource
			,uModBy
			,(long unsigned)clock
			,rowid);


	mysql_query(&mysql,query);

#ifdef ISM3FIELDS
	uModDate=clock;
#endif

}//void Update_tAccess(void)


void ModtAccess(void)
{
	register int i=0;
	MYSQL_RES *res;
	MYSQL_ROW field;
#ifdef ISM3FIELDS
	unsigned uPreModDate=0;

	//Mod select query
	if(uPermLevel<10)
	sprintf(query,"SELECT tAccess.uAccess,\
				tAccess.uModDate\
				FROM tAccess,tClient\
				WHERE tAccess.uAccess=%u\
				AND tAccess.uOwner=tClient.uClient\
				AND (tClient.uOwner=%u OR tClient.uClient=%u)"
			,uAccess,uLoginClient,uLoginClient);
	else
	sprintf(query,"SELECT uAccess,uModDate FROM tAccess\
				WHERE uAccess=%u"
						,uAccess);
#else
	sprintf(query,"SELECT uAccess FROM tAccess\
				WHERE uAccess=%u"
						,uAccess);
#endif

	mysql_query(&mysql,query);
	if(mysql_errno(&mysql)) mysqlSendmail(mysql_error(&mysql));
	res=mysql_store_result(&mysql);
	i=mysql_num_rows(res);

	//if(i<1) tAccess("<blink>Record does not exist");
	if(i<1) tAccess(LANG_NBR_RECNOTEXIST);
	//if(i>1) tAccess("<blink>Multiple rows!");
	if(i>1) tAccess(LANG_NBR_MULTRECS);

	field=mysql_fetch_row(res);
#ifdef ISM3FIELDS
	sscanf(field[1],"%u",&uPreModDate);
	if(uPreModDate!=uModDate) tAccess(LANG_NBR_EXTMOD);
#endif

	Update_tAccess(field[0]);
	if(mysql_errno(&mysql)) mysqlSendmail(mysql_error(&mysql));
	//sprintf(query,"record %s modified",field[0]);
	sprintf(query,LANG_NBRF_REC_MODIFIED,field[0]);
	tAccess(query);

}//ModtAccess(void)


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

	unsigned long uExpireDate=0;
	unsigned long uCreatedDate=0;
	unsigned long uModDate=0;

	char cExpireDate[33]={""};
	char cCreatedDate[33]={""};
	char cModDate[33]={""};

	ExttAccessListSelect();

	mysql_query(&mysql,query);
	if(mysql_error(&mysql)[0]) mysqlSendmail(mysql_error(&mysql));
	res=mysql_store_result(&mysql);
	i=mysql_num_rows(res);

	PageMachine("tAccessList",1,"");//1 is auto header list mode. Opens table!

	//Filter select drop down
	ExttAccessListFilter();

	printf("<input type=text size=16 name=command maxlength=98 value=\"%s\" >",command);

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

	printf("<table bgcolor=#9BC1B3 border=0 width=900>\n");
	printf("<tr bgcolor=black><td><font face=arial,helvetica color=white>uAccess<td><font face=arial,helvetica color=white>cDomainIP<td><font face=arial,helvetica color=white>cRelayAttr<td><font face=arial,helvetica color=white>uServer<td><font face=arial,helvetica color=white>uExpireDate<td><font face=arial,helvetica color=white>uSource<td><font face=arial,helvetica color=white>uOwner<td><font face=arial,helvetica color=white>uCreatedBy<td><font face=arial,helvetica color=white>uCreatedDate<td><font face=arial,helvetica color=white>uModBy<td><font face=arial,helvetica color=white>uModDate</tr>");

	mysql_data_seek(res,start-1);

	for(n=0;n<(end-start+1);n++)
	{
		field=mysql_fetch_row(res);
		if(!field)
		{
			printf("<tr><td><font face=arial,helvetica>End of data</table>");
			Footer_ism3();
		}
			sscanf(field[4],"%lu",&uExpireDate);
			sscanf(field[8],"%lu",&uCreatedDate);
			sscanf(field[10],"%lu",&uModDate);

			if(uExpireDate)
				sprintf(cExpireDate,"%.32s",ctime((time_t *)&uExpireDate));
			else
				strcpy(cExpireDate,"0");
			if(uCreatedDate)
				sprintf(cCreatedDate,"%.32s",ctime((time_t *)&uCreatedDate));
			else
				strcpy(cCreatedDate,"0");
			if(uModDate)
				sprintf(cModDate,"%.32s",ctime((time_t *)&uModDate));
			else
				strcpy(cModDate,"0");

			if(n % 2)
				printf("<tr bgcolor=#BBE1D3>");
			else
				printf("<tr>");
		printf("<td><font face=arial,helvetica size=1><input type=submit name=ED%s value=Edit></font> %s<td>%s<td>%s<td>%s<td>%s<td>%s<td>%s<td>%s<td>%s<td>%s<td>%s</tr>"
			,field[0]
			,field[0]
			,field[1]
			,field[2]
			,field[3]
			,cExpireDate
			,field[5]
			,field[6]
			,field[7]
			,cCreatedDate
			,field[9]
			,cModDate
				);

	}

	printf("</table></form>\n");
	Footer_ism3();

}//tAccessList()


void CreatetAccess(void)
{
	sprintf(query,"CREATE TABLE tAccess ( uAccess int unsigned PRIMARY KEY AUTO_INCREMENT, cDomainIP varchar(64) NOT NULL DEFAULT '',unique (cDomainIP,uServer), uOwner int unsigned NOT NULL DEFAULT 0,index (uOwner), uCreatedBy int unsigned NOT NULL DEFAULT 0, uCreatedDate int unsigned NOT NULL DEFAULT 0, uModBy int unsigned NOT NULL DEFAULT 0, uModDate int unsigned NOT NULL DEFAULT 0, uServer int unsigned NOT NULL DEFAULT 0,index (uServer), cRelayAttr varchar(64) NOT NULL DEFAULT '', uExpireDate int unsigned NOT NULL DEFAULT 0, uSource int unsigned NOT NULL DEFAULT 0 )");
	mysql_query(&mysql,qstr);
	if(mysql_errno(&mysql))
		mysqlSendmail(mysql_error(&mysql));
}//CreatetAccess()

//sedall patch1
