/* vi: set ts=4 sw=4 ai: */
/*
* email.c
*
* Lotos v1.2.3 : (c) 1999-2003 Pavol Hluchy (Lopo)
* last update : 30.1.2003
* email : lotos@losys.sk
* homepage : lotos.losys.sk
*/
#ifndef __EMAIL_C__
#define __EMAIL_C__ 1
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
#include "define.h"
#include "prototypes.h"
#include "obj_ur.h"
#include "obj_sys.h"
#include "email.h"
/*** check to see if a given email has the correct format ***/
/*** patched by Ardant on October 26th, 2001 ***/
#ifndef NO_EMAIL_PATCH
int validate_email(char *email)
{
int dots;
char *p;
dots=0;
p=email;
if (!*p || strchr(" ;/<\"&`'>",*p)) return 0;
while (*p!='@' && *p)
{
if (!isalnum(*p) && *p!='.' && *p!='_' && *p!='-')
return 0;
p++;
}
if (*p!='@') return 0;
p++;
if (*p==' ' || *p=='.' || *p=='@' || !*p) return 0;
while (*p)
{
while (*p!='.')
{
if (*p==' ' || *p==';' || *p=='/') return 0;
if (!*p)
{
if (!(dots)) return 0;
else return 1;
}
p++;
} /* end while */
dots++;
p++;
if (*p==' ' || *p=='.' || !*p) return 0;
if (!*p) return 1;
} /* end while */
return 1;
}
#else
int validate_email(char *email)
{
int dots=0;
char *p=email;
set_crash();
if (!*p) return 0;
while (*p!='@' && *p) {
if (!isalnum(*p) && *p!='.' && *p!='_' && *p!='-')
return 0;
p++;
}
if (*p!='@') return 0;
p++;
if (*p==' ' || *p=='.' || *p=='@' || !*p)
return 0;
while (*p) {
while (*p!='.') {
if (!*p) {
if (!(dots)) return 0;
else return 1;
}
p++;
} /* end while */
dots++;
p++;
if (*p==' ' || *p=='.' || !*p) return 0;
if (!*p) return 1;
} /* end while */
return 1;
}
#endif
/*** verify user's email when it is set specified ***/
void set_forward_email(UR_OBJECT user)
{
FILE *fp;
char fname[FNAME_LEN];
set_crash();
if (!user->email[0] || !strcmp(user->email,"#UNSET")) {
write_user(user,"Your email address is currently ~FRunset~RS. If you wish to use the\nauto-forwarding function then you must set your email address.\n\n");
user->autofwd=0;
return;
}
if (!amsys->forwarding) {
write_user(user,"Even though you have set your email, the auto-forwarding function is currently unavaliable.\n");
user->mail_verified=0;
user->autofwd=0;
return;
}
user->mail_verified=0;
user->autofwd=0;
/* Let them know by email */
sprintf(fname,"%s/%s.FWD",MAILSPOOL,user->name);
if (!(fp=fopen(fname,"w"))) {
write_syslog(ERRLOG, 1, "Unable to open forward mail file in set_forward_email()\n");
return;
}
sprintf(user->verify_code,"lotos%d",rand()%999);
/* email header */
fprintf(fp,"From: %s\n",reg_sysinfo[TALKERNAME]);
fprintf(fp,"To: %s <%s>\n\n",user->name,user->email);
/* email body */
fprintf(fp,"Hello, %s.\n\n",user->name);
fprintf(fp, vrf_fwd_email, user->verify_code);
fputs(talker_signature,fp);
fclose(fp);
/* send the mail */
send_email(user->email, "Verification of auto-mail", fname);
write_syslog(SYSLOG,1,"%s had mail sent to them by set_forward_email().\n",user->name);
/* Inform them online */
write_user(user,"Now that you have set your email you can use the auto-forward functions.\n");
write_user(user,"You must verify your address with the code you will receive shortly, via email.\n");
write_user(user,"If you do not receive any email, then use ~FTset email <email>~RS again, making\nsure you have the correct address.\n\n");
}
/*** send smail to the email ccount ***/
void forward_email(char *name, char *from, char *message)
{
FILE *fp;
UR_OBJECT u;
char fname[FNAME_LEN];
int on=0;
set_crash();
if (!amsys->forwarding) return;
if ((u=get_user(name))) {
on=1;
goto SKIP;
}
/* Have to create temp user if not logged on to check if email verified, etc */
if ((u=create_user())==NULL) {
write_syslog(ERRLOG,1,"Unable to create temporary user object in forward_email().\n");
return;
}
strcpy(u->name,name);
if (!load_user_details(u)) {
destruct_user(u);
destructed=0;
return;
}
on=0;
SKIP:
if (!u->mail_verified) {
if (!on) {
destruct_user(u);
destructed=0;
}
return;
}
if (!u->autofwd){
if (!on) {
destruct_user(u);
destructed=0;
}
return;
}
sprintf(fname,"%s/%s.FWD",MAILSPOOL,u->name);
if (!(fp=fopen(fname,"w"))) {
write_syslog(SYSLOG,0,"Unable to open forward mail file in set_forward_email()\n");
return;
}
fprintf(fp,"From: %s\n",reg_sysinfo[TALKERNAME]);
fprintf(fp,"To: %s <%s>\n\n",u->name,u->email);
from=colour_com_strip(from);
fputs(from,fp);
fputs("\n",fp);
message=colour_com_strip(message);
fputs(message,fp);
fputs("\n\n",fp);
fputs(talker_signature,fp);
fclose(fp);
send_email(u->email, "Auto-forward of smail", fname);
write_syslog(SYSLOG,1,"%s had mail sent to their email address.\n",u->name);
if (!on) {
destruct_user(u);
destructed=0;
}
return;
}
/*** stop zombie processes ***/
int send_email(char *addr, char *subj, char *fname)
{
set_crash();
switch (double_fork()) {
case -1: unlink(fname); return -1; /* double_fork() failed */
case 0:
if (subj) sprintf(text, "sendmail -s \"%s\" %s < %s", subj, addr, fname);
else sprintf(text, "sendmail %s < %s", addr, fname);
system(text);
unlink(fname);
_exit(1);
break; /* should never get here */
default: break;
}
return 1;
}
#endif /* __EMAIL_C__ */