This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
deb-mbse/mbsebbs/user.c

531 lines
14 KiB
C
Raw Normal View History

2001-08-17 05:46:24 +00:00
/*****************************************************************************
*
2001-11-08 22:45:15 +00:00
* $Id$
2001-08-17 05:46:24 +00:00
* Purpose ...............: Main user login procedure. Checks for limits,
* new ratio's cats all the welcome screens, and
* does a lot of checking in general.
*
*****************************************************************************
2002-01-07 19:16:03 +00:00
* Copyright (C) 1997-2002
2001-08-17 05:46:24 +00:00
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
* 1971 BV IJmuiden
* the Netherlands
*
* This file is part of MBSE BBS.
*
* This BBS is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* MBSE BBS is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MBSE BBS; see the file COPYING. If not, write to the Free
* Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*****************************************************************************/
2002-06-30 12:48:44 +00:00
#include "../config.h"
2001-08-17 05:46:24 +00:00
#include "../lib/libs.h"
2002-06-30 12:48:44 +00:00
#include "../lib/memwatch.h"
2001-08-17 05:46:24 +00:00
#include "../lib/mbse.h"
#include "../lib/structs.h"
2002-01-07 19:16:03 +00:00
#include "../lib/users.h"
2001-08-17 05:46:24 +00:00
#include "../lib/records.h"
#include "../lib/common.h"
#include "../lib/clcomm.h"
2002-10-20 20:58:55 +00:00
#include "../lib/mberrors.h"
2001-08-17 05:46:24 +00:00
#include "timeout.h"
#include "user.h"
#include "dispfile.h"
2001-11-12 21:42:17 +00:00
#include "funcs.h"
#include "input.h"
2001-08-17 05:46:24 +00:00
#include "misc.h"
#include "bye.h"
#include "file.h"
#include "mail.h"
#include "change.h"
#include "menu.h"
#include "exitinfo.h"
#include "language.h"
#include "offline.h"
#include "email.h"
2001-08-17 05:46:24 +00:00
extern int sock;
extern pid_t mypid;
2001-11-02 22:08:33 +00:00
char *StartTime;
2001-08-17 05:46:24 +00:00
/*
* Non global function prototypes
2001-08-17 05:46:24 +00:00
*/
void SwapDate(char *, char *); /* Swap two Date strings around */
2001-08-17 05:46:24 +00:00
2001-11-12 21:42:17 +00:00
void GetLastUser(void);
void GetLastUser(void)
{
FILE *pCallerLog;
char *sDataFile;
sDataFile = calloc(PATH_MAX, sizeof(char));
sprintf(sDataFile, "%s/etc/sysinfo.data", getenv("MBSE_ROOT"));
/*
* Fix security in case it is wrong.
*/
chmod(sDataFile, 0660);
2001-11-12 21:42:17 +00:00
if((pCallerLog = fopen(sDataFile, "r+")) == NULL)
WriteError("GetLastUser: Can't open file: %s", sDataFile);
else {
fread(&SYSINFO, sizeof(SYSINFO), 1, pCallerLog);
/* Get lastcaller in memory */
strcpy(LastCaller, SYSINFO.LastCaller);
LastCallerTime = SYSINFO.LastTime;
/* Set next lastcaller (this user) */
if (!usrconfig.Hidden) {
strcpy(SYSINFO.LastCaller,exitinfo.sUserName);
SYSINFO.LastTime = time(NULL);
}
SYSINFO.SystemCalls++;
switch(ttyinfo.type) {
case POTS:
SYSINFO.Pots++;
break;
case ISDN:
SYSINFO.ISDN++;
break;
case NETWORK:
SYSINFO.Network++;
break;
case LOCAL:
SYSINFO.Local++;
break;
}
rewind(pCallerLog);
fwrite(&SYSINFO, sizeof(SYSINFO), 1, pCallerLog);
fclose(pCallerLog);
}
free(sDataFile);
}
2001-08-17 05:46:24 +00:00
/*
* Function will take two date strings in the following format DD-MM-YYYY and
* swap them around in the following format YYYYMMDD
* ie. 01-02-1995 will become 19950201 so that the leading Zeros are not in
* the beginning as leading Zeros will fall away if you try compare the
* two with a if statement (Millenium proof).
2001-08-17 05:46:24 +00:00
*/
void SwapDate(char *Date3, char *Date4)
2001-08-17 05:46:24 +00:00
{
char *temp2, *temp3;
temp2 = calloc(10, sizeof(char));
temp3 = calloc(10, sizeof(char));
Date1 = calloc(10, sizeof(char));
Date2 = calloc(10, sizeof(char));
temp2[0] = Date3[6];
temp2[1] = Date3[7];
temp2[2] = Date3[8];
temp2[3] = Date3[9];
temp2[4] = Date3[3];
temp2[5] = Date3[4];
temp2[6] = Date3[0];
temp2[7] = Date3[1];
temp2[8] = '\0';
temp3[0] = Date4[6];
temp3[1] = Date4[7];
temp3[2] = Date4[8];
temp3[3] = Date4[9];
temp3[4] = Date4[3];
temp3[5] = Date4[4];
temp3[6] = Date4[0];
temp3[7] = Date4[1];
temp3[8] = '\0';
strcpy(Date1, temp2);
strcpy(Date2, temp3);
free(temp2);
free(temp3);
2001-08-17 05:46:24 +00:00
}
void user()
{
FILE *pUsrConfig, *pLimits;
int i, x;
2001-08-17 05:46:24 +00:00
int FoundName = FALSE, iFoundLimit = FALSE;
long l1, l2;
char *token;
char temp[PATH_MAX];
char temp1[84];
time_t LastLogin;
struct stat st;
2001-11-11 12:07:39 +00:00
char UserName[37];
2001-08-17 05:46:24 +00:00
int IsNew = FALSE;
2001-11-11 12:07:39 +00:00
grecno = 0;
Syslog('+', "Unixmode login: %s", sUnixName);
2001-08-17 05:46:24 +00:00
2001-11-11 12:07:39 +00:00
sprintf(temp, "%s/etc/users.data", getenv("MBSE_ROOT"));
if ((pUsrConfig = fopen(temp,"r+b")) == NULL) {
/*
* This should not happen.
*/
WriteError("$Can't open %s", temp);
printf("Can't open userfile, run \"newuser\" first");
2002-10-20 20:58:55 +00:00
ExitClient(MBERR_OK);
2001-08-17 05:46:24 +00:00
}
2001-11-11 12:07:39 +00:00
fread(&usrconfighdr, sizeof(usrconfighdr), 1, pUsrConfig);
while (fread(&usrconfig, usrconfighdr.recsize, 1, pUsrConfig) == 1) {
if (strcmp(usrconfig.Name, sUnixName) == 0) {
FoundName = TRUE;
break;
} else
grecno++;
}
if (!FoundName) {
printf("Unknown username: %s\n", sUnixName);
/* FATAL ERROR: You are not in the BBS users file.*/
printf("%s\n", (char *) Language(389));
/* Please run 'newuser' to create an account */
printf("%s\n", (char *) Language(390));
Syslog('?', "FATAL: Could not find user in BBS users file.");
Syslog('?', " and system is using unix accounts\n");
2002-10-20 20:58:55 +00:00
ExitClient(MBERR_OK);
2001-11-11 12:07:39 +00:00
}
2001-08-17 05:46:24 +00:00
/*
* Copy username, split first and lastname.
*/
2001-11-11 12:07:39 +00:00
strcpy(UserName, usrconfig.sUserName);
if ((strchr(UserName,' ') == NULL && !CFG.iOneName)) {
token = strtok(UserName, " ");
2001-08-17 05:46:24 +00:00
strcpy(FirstName, token);
token = strtok(NULL, "\0");
i = strlen(token);
for(x = 2; x < i; x++) {
if(token[x] == ' ')
token[x] = '\0';
}
strcpy(LastName, token);
} else
2001-11-11 12:07:39 +00:00
strcpy(FirstName, UserName);
strcpy(UserName, usrconfig.sUserName);
2001-08-17 05:46:24 +00:00
Syslog('+', "%s On-Line at %s", UserName, ttyinfo.comment);
2001-11-11 12:07:39 +00:00
IsDoing("Just Logged In");
2001-08-17 05:46:24 +00:00
/*
* Check some essential files, create them if they don't exist.
*/
ChkFiles();
/*
* Setup users favourite language.
*/
Set_Language(usrconfig.iLanguage);
Free_Language();
InitLanguage();
/*
2002-04-30 12:09:03 +00:00
* User logged in, tell it to the server. Check if a location is
* set, if Ask User location for new users is off, this field is
* empty but we have to send something to the server.
2001-08-17 05:46:24 +00:00
*/
2002-04-30 12:09:03 +00:00
if (strlen(usrconfig.sLocation))
UserCity(mypid, usrconfig.sUserName, usrconfig.sLocation);
else
UserCity(mypid, usrconfig.sUserName, (char *)"N/A");
2001-08-17 05:46:24 +00:00
/*
* See if this user is the Sysop.
*/
strcpy(temp, UserName);
strcpy(temp1, CFG.sysop_name);
2001-11-11 12:07:39 +00:00
if ((strcasecmp(CFG.sysop_name, UserName)) == 0) {
/*
* If login name is sysop, set SYSOP true
*/
SYSOP = TRUE;
Syslog('+', "Sysop is online");
}
2001-08-17 05:46:24 +00:00
/*
* Is this a new user?
*/
if (usrconfig.iTotalCalls == 0)
IsNew = TRUE;
2001-08-17 05:46:24 +00:00
TermInit(usrconfig.GraphMode);
2001-11-11 12:07:39 +00:00
/*
* Pause after logo screen.
*/
alarm_on();
Pause();
2001-08-17 05:46:24 +00:00
if (usrconfig.Archiver[0] == '\0') {
usrconfig.Archiver[0] = 'Z';
usrconfig.Archiver[1] = 'I';
usrconfig.Archiver[2] = 'P';
Syslog('+', "Setup default archiver ZIP");
}
/*
* Check users date format. We do it strict as we
* need this to be good for several other purposes.
* If it is correct, the users age is set in UserAge
*/
if (!Test_DOB(usrconfig.sDateOfBirth)) {
Syslog('!', "Error in Date of Birth");
Chg_DOB();
strcpy(usrconfig.sDateOfBirth, exitinfo.sDateOfBirth);
}
/*
* Check to see if user must expire
*/
sprintf(temp,"%s", (char *) GetDateDMY());
SwapDate(temp, usrconfig.sExpiryDate);
2001-08-17 05:46:24 +00:00
/* Convert Date1 & Date2 to longs for compare */
l1 = atol(Date1);
l2 = atol(Date2);
2001-11-11 12:07:39 +00:00
if (l1 >= l2 && l2 != 0) {
/*
* If Expiry Date is the same as today expire to
* Expire Sec level
*/
usrconfig.Security = usrconfig.ExpirySec;
Syslog('!', "User is expired, resetting level");
2001-08-17 05:46:24 +00:00
/*
* Show texfile to user telling him about this.
2001-08-17 05:46:24 +00:00
*/
DisplayFile((char *)"expired");
}
2001-08-17 05:46:24 +00:00
free(Date1);
free(Date2);
2001-08-17 05:46:24 +00:00
/*
* Copy limits.data into memory
*/
2001-11-11 12:07:39 +00:00
sprintf(temp, "%s/etc/limits.data", getenv("MBSE_ROOT"));
2001-08-17 05:46:24 +00:00
2001-11-11 12:07:39 +00:00
if ((pLimits = fopen(temp,"rb")) == NULL) {
WriteError("$Can't open %s", temp);
} else {
fread(&LIMIThdr, sizeof(LIMIThdr), 1, pLimits);
2001-08-17 05:46:24 +00:00
while (fread(&LIMIT, sizeof(LIMIT), 1, pLimits) == 1) {
if (LIMIT.Security == usrconfig.Security.level) {
iFoundLimit = TRUE;
break;
2001-11-11 12:07:39 +00:00
}
2001-08-17 05:46:24 +00:00
}
fclose(pLimits);
}
2001-08-17 05:46:24 +00:00
2001-11-11 12:07:39 +00:00
if (!iFoundLimit) {
WriteError("Unknown Security Level in limits.data");
usrconfig.iTimeLeft = 0; /* Could not find limit, so set to Zero */
usrconfig.iTimeUsed = 0; /* Set to Zero as well */
} else {
/*
* Give user new time limit everyday, also new users get a new limit.
*/
sprintf(temp,"%s", (char *) GetDateDMY());
if (((strcmp(StrDateDMY(usrconfig.tLastLoginDate), temp)) != 0) || IsNew) {
2001-08-17 05:46:24 +00:00
/*
* If no timelimit set give user 24 hours.
2001-08-17 05:46:24 +00:00
*/
if (LIMIT.Time)
usrconfig.iTimeLeft = LIMIT.Time;
else
usrconfig.iTimeLeft = 86400;
usrconfig.iTimeUsed = 0; /* Set time used today to Zero */
usrconfig.iConnectTime = 0; /* Set connect time to Zero */
2001-08-17 05:46:24 +00:00
/*
* Give user new bytes and files every day if needed.
*/
if (LIMIT.DownK && LIMIT.DownF) {
usrconfig.DownloadKToday = LIMIT.DownK;
usrconfig.DownloadsToday = LIMIT.DownF;
2001-08-17 05:46:24 +00:00
}
}
} /* End of else */
2001-08-17 05:46:24 +00:00
usrconfig.iConnectTime = 0;
2001-08-17 05:46:24 +00:00
/* Copy Users Protocol into Memory */
Set_Protocol(usrconfig.sProtocol);
tlf(usrconfig.sProtocol);
2001-08-17 05:46:24 +00:00
/*
* Set last login Date and Time, copy previous session
* values in memory.
*/
sprintf(LastLoginDate, "%s", StrDateDMY(usrconfig.tLastLoginDate));
sprintf(LastLoginTime, "%s", StrTimeHMS(usrconfig.tLastLoginDate));
LastLogin = usrconfig.tLastLoginDate;
usrconfig.tLastLoginDate = ltime; /* Set current login to current date */
usrconfig.iTotalCalls++;
2001-08-17 05:46:24 +00:00
/*
* Update user record.
*/
2001-11-11 12:07:39 +00:00
if (fseek(pUsrConfig, usrconfighdr.hdrsize + (grecno * usrconfighdr.recsize), 0) != 0) {
WriteError("Can't seek in %s/etc/users.data", getenv("MBSE_ROOT"));
} else {
fwrite(&usrconfig, sizeof(usrconfig), 1, pUsrConfig);
fclose(pUsrConfig);
}
2001-08-17 05:46:24 +00:00
/*
2001-11-12 21:42:17 +00:00
* Write users structure to tmp file in ~/home/unixname/exitinfo
2001-11-11 12:07:39 +00:00
* A copy of the userrecord is also in the variable exitinfo.
*/
2001-11-11 12:07:39 +00:00
if (! InitExitinfo())
2002-10-20 20:58:55 +00:00
Good_Bye(MBERR_INIT_ERROR);
2001-11-11 12:07:39 +00:00
GetLastUser();
StartTime = xstrcpy(GetLocalHM());
ChangeHomeDir(exitinfo.Name, exitinfo.Email);
2001-08-17 05:46:24 +00:00
Syslog('+', "User successfully logged into BBS");
Syslog('+', "Level %d (%s), %d mins. left, port %s",
usrconfig.Security.level, LIMIT.Description, usrconfig.iTimeLeft, pTTY);
2001-12-23 16:44:18 +00:00
Time2Go = time(NULL);
Time2Go += usrconfig.iTimeLeft * 60;
2001-11-11 12:07:39 +00:00
iUserTimeLeft = exitinfo.iTimeLeft;
2001-08-17 05:46:24 +00:00
DisplayFile((char *)"mainlogo");
DisplayFile((char *)"welcome");
2001-08-17 05:46:24 +00:00
/*
* The following files are only displayed if the user has
* turned the Bulletins on.
*/
if (exitinfo.ieNEWS) {
DisplayFile((char *)"welcome1");
DisplayFile((char *)"welcome2");
DisplayFile((char *)"welcome3");
DisplayFile((char *)"welcome4");
DisplayFile((char *)"welcome5");
DisplayFile((char *)"welcome6");
DisplayFile((char *)"welcome7");
DisplayFile((char *)"welcome8");
DisplayFile((char *)"welcome9");
sprintf(temp, "%s", (char *) GetDateDMY() );
2001-11-11 12:07:39 +00:00
if ((strcmp(exitinfo.sDateOfBirth, temp)) == 0)
DisplayFile((char *)"birthday");
2001-08-17 05:46:24 +00:00
/*
* Displays file if it exists DD-MM.A??
2001-08-17 05:46:24 +00:00
*/
sprintf(temp, "%s", (char *) GetDateDMY());
strcpy(temp1, "");
strncat(temp1, temp, 5);
sprintf(temp, "%s", temp1);
DisplayFile(temp);
2001-08-17 05:46:24 +00:00
/*
* Displays users security file if it exists
*/
2001-11-11 12:07:39 +00:00
sprintf(temp, "sec%d", exitinfo.Security.level);
DisplayFile(temp);
2001-08-17 05:46:24 +00:00
/*
* Display News file
2001-08-17 05:46:24 +00:00
*/
DisplayFile((char *)"news");
}
/*
* Display Onceonly file, first get the date of that
* file, search order is the same as in DisplayFile()
*/
st.st_mtime = 0;
2001-11-11 12:07:39 +00:00
if (exitinfo.GraphMode) {
sprintf(temp, "%s/onceonly.ans", lang.TextPath);
stat(temp, &st);
if (st.st_mtime == 0) {
sprintf(temp, "%s/onceonly.ans", CFG.bbs_txtfiles);
2001-08-17 05:46:24 +00:00
stat(temp, &st);
}
}
if (st.st_mtime == 0) {
sprintf(temp, "%s/onceonly.asc", lang.TextPath);
stat(temp, &st);
2001-08-17 05:46:24 +00:00
if (st.st_mtime == 0) {
sprintf(temp, "%s/onceonly.asc", CFG.bbs_txtfiles);
2001-08-17 05:46:24 +00:00
stat(temp, &st);
}
}
2001-08-17 05:46:24 +00:00
if ((st.st_mtime != 0) && (LastLogin < st.st_mtime))
DisplayFile((char *)"onceonly");
2001-08-17 05:46:24 +00:00
OLR_SyncTags();
2001-08-17 05:46:24 +00:00
2001-11-11 12:07:39 +00:00
if (exitinfo.MailScan)
CheckMail();
2001-08-17 05:46:24 +00:00
/*
2001-11-11 12:07:39 +00:00
* We don't show new files to new users.
*/
2001-11-11 12:07:39 +00:00
if (exitinfo.ieFILE && (!IsNew))
NewfileScan(FALSE);
2001-08-17 05:46:24 +00:00
/*
* Copy last file Area in to current Area
*/
2001-11-11 12:07:39 +00:00
SetFileArea(exitinfo.iLastFileArea);
2001-08-17 05:46:24 +00:00
/*
* Copy Last Message Area in to Current Msg Area
*/
SetMsgArea(usrconfig.iLastMsgArea);
SetEmailArea((char *)"mailbox");
2001-08-17 05:46:24 +00:00
/*
* Set or Reset the DoNotDisturb flag, now is the time
* we may be interrupted.
*/
UserSilent(usrconfig.DoNotDisturb);
2001-08-17 05:46:24 +00:00
/*
2001-11-11 12:07:39 +00:00
* Start the menu.
*/
menu();
2001-08-17 05:46:24 +00:00
}