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/saved-mbsebbs-code-2/mbsebbs/mbnewusr.c
vbcoen 6a6a253885 Updated mbmon.c & mbsetup.c
Added doc dir. and manual as .pdf
restored deleted files - yep I screwed the pooch.
2015-11-03 20:41:11 +00:00

288 lines
7.6 KiB
C

/*****************************************************************************
*
* $Id: mbnewusr.c,v 1.28 2007/10/14 13:15:34 mbse Exp $
* Purpose ...............: New user registration
*
*****************************************************************************
* Copyright (C) 1997-2007
*
* 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, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*****************************************************************************/
#include "../config.h"
#include "../lib/mbselib.h"
#include "../lib/mbse.h"
#include "../lib/users.h"
#include "mbnewusr.h"
#include "funcs.h"
#include "input.h"
#include "language.h"
#include "misc.h"
#include "timeout.h"
#include "newuser.h"
#include "term.h"
#include "ttyio.h"
#include "openport.h"
extern int do_quiet; /* Logging quiet flag */
time_t t_start;
char *StartTime;
int cols = 80; /* Screen columns */
int rows = 80; /* Screen rows */
#ifdef HAVE_GEOIP_H
extern void _GeoIP_setup_dbfilename(void);
void geoiplookup(GeoIP* gi, char *hostname, int i)
{
const char * country_code;
const char * country_name;
const char * country_continent;
int country_id;
if (GEOIP_COUNTRY_EDITION == i) {
country_id = GeoIP_id_by_name(gi, hostname);
Syslog('b', "geoiplookup '%s', id=%d", hostname, country_id);
country_code = GeoIP_country_code[country_id];
country_name = GeoIP_country_name[country_id];
country_continent = GeoIP_country_continent[country_id];
if (country_code == NULL) {
Syslog('+', "%s: IP Address not found\n", GeoIPDBDescription[i]);
} else {
Syslog('+', "GeoIP location: %s, %s %s\n", country_name, country_code, country_continent);
}
}
}
#endif
int main(int argc, char **argv)
{
char *p, *tty, temp[PATH_MAX];
FILE *pTty;
int i, rc = 0;
struct passwd *pw;
struct winsize ws;
#ifdef HAVE_GEOIP_H
char *hostname;
GeoIP *gi;
#endif
pTTY = calloc(15, sizeof(char));
tty = ttyname(1);
/*
* Get MBSE_ROOT Path and load Config into Memory
*/
FindMBSE();
if (!strlen(CFG.startname)) {
printf("FATAL: No bbs startname, edit mbsetup 1.2.10\n");
exit(MBERR_CONFIG_ERROR);
}
/*
* Set uid and gid to the "mbse" user.
*/
if ((pw = getpwnam((char *)"mbse")) == NULL) {
perror("Can't find user \"mbse\" in /etc/passwd");
exit(MBERR_INIT_ERROR);
}
/*
* Set effective user to mbse.bbs
*/
if ((seteuid(pw->pw_uid) == -1) || (setegid(pw->pw_gid) == -1)) {
perror("Can't seteuid() or setegid() to \"mbse\" user");
exit(MBERR_INIT_ERROR);
}
/*
* Set local time and statistic indexes.
*/
Time_Now = t_start = time(NULL);
l_date = localtime(&Time_Now);
Diw = l_date->tm_wday;
Miy = l_date->tm_mon;
ltime = time(NULL);
/*
* Initialize this client with the server. We don't know
* who is at the other end of the line, so that's what we tell.
*/
do_quiet = TRUE;
InitClient((char *)"Unknown", (char *)"mbnewusr", (char *)"Unknown",
CFG.logfile, CFG.bbs_loglevel, CFG.error_log, CFG.mgrlog, CFG.debuglog);
IsDoing("Loging in");
Syslog(' ', " ");
Syslog(' ', "MBNEWUSR v%s", VERSION);
if (ioctl(1, TIOCGWINSZ, &ws) != -1 && (ws.ws_col > 0) && (ws.ws_row > 0)) {
cols = ws.ws_col;
rows = ws.ws_row;
}
if ((rc = rawport()) != 0) {
WriteError("Unable to set raw mode");
Fast_Bye(MBERR_OK);;
}
Enter(2);
PUTSTR((char *)"Loading MBSE BBS New User Registration ...");
Enter(2);
if ((p = getenv("CONNECT")) != NULL)
Syslog('+', "CONNECT %s", p);
if ((p = getenv("CALLER_ID")) != NULL)
if (strncmp(p, "none", 4))
Syslog('+', "CALLER %s", p);
if ((p = getenv("TERM")) != NULL)
Syslog('+', "TERM=%s %dx%d", p, cols, rows);
else
Syslog('+', "TERM=invalid %dx%d", cols, rows);
sUnixName[0] = '\0';
/*
* Initialize
*/
snprintf(current_language, 10, "%s", CFG.deflang);
InitLanguage();
if ((tty = ttyname(0)) == NULL) {
WriteError("Not at a tty");
Fast_Bye(MBERR_OK);
}
if (strncmp("/dev/", tty, 5) == 0)
snprintf(pTTY, 15, "%s", tty+5);
else if (*tty == '/') {
tty = strrchr(ttyname(0), '/');
++tty;
snprintf(pTTY, 15, "%s", tty);
}
umask(007);
/*
* Trap signals
*/
for (i = 0; i < NSIG; i++) {
if ((i == SIGHUP) || (i == SIGPIPE) || (i == SIGBUS) || (i == SIGILL) || (i == SIGSEGV) || (i == SIGTERM) || (i == SIGIOT))
signal(i, (void (*))die);
else if (i == SIGCHLD)
signal(i, SIG_DFL);
else
signal(i, SIG_IGN);
}
/*
* Now it's time to check if the bbs is open. If not, we
* log the user off.
*/
if (CheckStatus() == FALSE) {
Syslog('+', "Kicking user out, the BBS is closed");
Fast_Bye(MBERR_OK);
}
snprintf(temp, 81, "MBSE BBS v%s (Release: %s) on %s/%s", VERSION, ReleaseDate, OsName(), OsCPU());
poutCR(YELLOW, BLACK, temp);
pout(WHITE, BLACK, (char *)COPYRIGHT);
Enter(2);
if (((p = getenv("REMOTEHOST")) != NULL) || ((p = getenv("SSH_CLIENT")) != NULL)) {
/*
* Network connection, no tty checking but fill a ttyinfo record.
*/
#ifdef HAVE_GEOIP_H
hostname = xstrcpy(p);
_GeoIP_setup_dbfilename();
if (GeoIP_db_avail(GEOIP_COUNTRY_EDITION)) {
if ((gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD)) != NULL) {
geoiplookup(gi, hostname, GEOIP_COUNTRY_EDITION);
}
GeoIP_delete(gi);
}
#endif
memset(&ttyinfo, 0, sizeof(ttyinfo));
snprintf(ttyinfo.comment, 41, "%s", p);
snprintf(ttyinfo.tty, 7, "%s", pTTY);
snprintf(ttyinfo.speed, 21, "10 mbit");
snprintf(ttyinfo.flags, 31, "IBN,IFC,XX");
ttyinfo.type = NETWORK;
ttyinfo.available = TRUE;
ttyinfo.honor_zmh = FALSE;
snprintf(ttyinfo.name, 36, "Network port #%d", iNode);
} else {
/*
* Check if this port is available.
*/
snprintf(temp, PATH_MAX, "%s/etc/ttyinfo.data", getenv("MBSE_ROOT"));
if ((pTty = fopen(temp, "r")) == NULL) {
WriteError("Can't read %s", temp);
} else {
fread(&ttyinfohdr, sizeof(ttyinfohdr), 1, pTty);
while (fread(&ttyinfo, ttyinfohdr.recsize, 1, pTty) == 1) {
if (strcmp(ttyinfo.tty, pTTY) == 0)
break;
}
fclose(pTty);
if ((strcmp(ttyinfo.tty, pTTY) != 0) || (!ttyinfo.available)) {
Syslog('+', "No BBS allowed on port \"%s\"", pTTY);
PUTSTR((char *)"No BBS on this port allowed!");
Enter(2);
Fast_Bye(MBERR_OK);
}
}
}
/*
* Ask whether to display Connect String
*/
if (CFG.iConnectString) {
/* Connected from */
snprintf(temp, 81, "%s\"%s\" ", (char *) Language(348), ttyinfo.comment);
pout(CYAN, BLACK, temp);
/* line */
snprintf(temp, 81, "%s%d ", (char *) Language(31), iNode);
pout(CYAN, BLACK, temp);
/* on */
snprintf(temp, 81, "%s %s", (char *) Language(135), ctime(&ltime));
PUTSTR(temp);
Enter(1);
}
alarm_on();
Pause();
newuser();
Fast_Bye(MBERR_OK);
return 0;
}