Updated for the nntp server
This commit is contained in:
parent
3a4f475a3f
commit
3e2f009cb3
@ -18,13 +18,17 @@ v0.51.4 11-Apr-2004
|
|||||||
When a new echomail area is auto created, the creation date and
|
When a new echomail area is auto created, the creation date and
|
||||||
the newsgroup name will be set.
|
the newsgroup name will be set.
|
||||||
|
|
||||||
|
mbnntp:
|
||||||
|
New program, news server to read echomail with a news client.
|
||||||
|
Reading news works, no posts yet.
|
||||||
|
|
||||||
mbsebbs:
|
mbsebbs:
|
||||||
Added loging of virus scanner results.
|
Added loging of virus scanner results.
|
||||||
|
|
||||||
mbsetup:
|
mbsetup:
|
||||||
Added auto setup for message area creation date. Also creates
|
Added auto setup for message area creation date. Also creates
|
||||||
a faked newsgroup name in echomail areas. Both settings are
|
a faked newsgroup name in echomail areas. Both settings are
|
||||||
needed for the (upcoming) newsserver.
|
needed for the newsserver.
|
||||||
|
|
||||||
|
|
||||||
v0.51.3 22-Mar-2003 - 11-Apr-2004
|
v0.51.3 22-Mar-2003 - 11-Apr-2004
|
||||||
|
2
configure
vendored
2
configure
vendored
@ -1270,7 +1270,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
|||||||
|
|
||||||
ac_config_commands="$ac_config_commands default-1"
|
ac_config_commands="$ac_config_commands default-1"
|
||||||
|
|
||||||
SUBDIRS="lib mbcico mbfido mbmon mbsebbs mbtask mbsetup unix lang examples html script"
|
SUBDIRS="lib mbcico mbfido mbmon mbsebbs mbnntp mbtask mbsetup unix lang examples html script"
|
||||||
|
|
||||||
|
|
||||||
PACKAGE="mbsebbs"
|
PACKAGE="mbsebbs"
|
||||||
|
@ -3,7 +3,7 @@ dnl $Id$
|
|||||||
|
|
||||||
AC_INIT(lib/mbselib.h)
|
AC_INIT(lib/mbselib.h)
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
SUBDIRS="lib mbcico mbfido mbmon mbsebbs mbtask mbsetup unix lang examples html script"
|
SUBDIRS="lib mbcico mbfido mbmon mbsebbs mbnntp mbtask mbsetup unix lang examples html script"
|
||||||
AC_SUBST(SUBDIRS)
|
AC_SUBST(SUBDIRS)
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
|
@ -6,7 +6,7 @@ include ../Makefile.global
|
|||||||
SRCS = mbnntp.c openport.c ttyio.c auth.c commands.c
|
SRCS = mbnntp.c openport.c ttyio.c auth.c commands.c
|
||||||
HDRS = mbnntp.h openport.h ttyio.h auth.h commands.h
|
HDRS = mbnntp.h openport.h ttyio.h auth.h commands.h
|
||||||
OBJS = mbnntp.o openport.o ttyio.o auth.o commands.o
|
OBJS = mbnntp.o openport.o ttyio.o auth.o commands.o
|
||||||
LIBS += ../lib/libmbse.a ../lib/libdbase.a ../lib/libmsgbase.a
|
LIBS += ../lib/libmbse.a ../lib/libmsgbase.a ../lib/libdbase.a
|
||||||
OTHER = Makefile
|
OTHER = Makefile
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
@ -55,9 +55,9 @@ depend:
|
|||||||
|
|
||||||
# DO NOT DELETE THIS LINE - MAKE DEPEND RELIES ON IT
|
# DO NOT DELETE THIS LINE - MAKE DEPEND RELIES ON IT
|
||||||
# Dependencies generated by make depend
|
# Dependencies generated by make depend
|
||||||
mbnntp.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/mbsedb.h openport.h ttyio.h auth.h commands.h mbnntp.h
|
mbnntp.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/mbsedb.h ../lib/msg.h openport.h ttyio.h auth.h commands.h mbnntp.h
|
||||||
openport.o: ../config.h ../lib/mbselib.h openport.h
|
openport.o: ../config.h ../lib/mbselib.h openport.h
|
||||||
ttyio.o: ../config.h ../lib/mbselib.h ttyio.h
|
ttyio.o: ../config.h ../lib/mbselib.h ttyio.h
|
||||||
auth.o: ../config.h ../lib/mbselib.h ../lib/users.h mbnntp.h auth.h
|
auth.o: ../config.h ../lib/mbselib.h ../lib/users.h mbnntp.h auth.h
|
||||||
commands.o: ../config.h ../lib/mbselib.h mbnntp.h commands.h
|
commands.o: ../config.h ../lib/mbselib.h ../lib/users.h ../lib/msg.h ../lib/msgtext.h ttyio.h mbnntp.h commands.h
|
||||||
# End of generated dependencies
|
# End of generated dependencies
|
||||||
|
@ -29,29 +29,393 @@
|
|||||||
|
|
||||||
#include "../config.h"
|
#include "../config.h"
|
||||||
#include "../lib/mbselib.h"
|
#include "../lib/mbselib.h"
|
||||||
|
#include "../lib/users.h"
|
||||||
|
#include "../lib/msg.h"
|
||||||
|
#include "../lib/msgtext.h"
|
||||||
|
#include "ttyio.h"
|
||||||
#include "mbnntp.h"
|
#include "mbnntp.h"
|
||||||
#include "commands.h"
|
#include "commands.h"
|
||||||
|
|
||||||
|
|
||||||
void command_list(char *cmd)
|
|
||||||
|
unsigned long article = 0L; /* Current article */
|
||||||
|
char currentgroup[81]; /* Current newsgroup */
|
||||||
|
|
||||||
|
extern unsigned long sentbytes;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Safe sending to the client with charset translation.
|
||||||
|
*/
|
||||||
|
void send_xlat(char *inp)
|
||||||
|
{
|
||||||
|
char *xl, temp[1024];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
memset(&temp, 0, sizeof(temp));
|
||||||
|
|
||||||
|
for (i = 0; i < strlen(inp); i++) {
|
||||||
|
if (inp[i] & 0x80) {
|
||||||
|
if ((xl = charset_map_c(inp[i], FALSE))) {
|
||||||
|
while (*xl) {
|
||||||
|
temp[i] = *xl++;
|
||||||
|
if (*xl)
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
temp[i] = inp[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Syslog('n', "> \"%s\"", printable(temp, 0));
|
||||||
|
PUTSTR(temp);
|
||||||
|
PUTSTR((char *)"\r\n");
|
||||||
|
FLUSHOUT();
|
||||||
|
sentbytes += (strlen(temp) + 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ARTICLE
|
||||||
|
* BODY
|
||||||
|
* HEADER
|
||||||
|
* STAT
|
||||||
|
*/
|
||||||
|
void command_abhs(char *buf)
|
||||||
|
{
|
||||||
|
char *p, *cmd, *opt, dig[128];
|
||||||
|
unsigned long art = 0L;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Syslog('+', "%s", buf);
|
||||||
|
cmd = strtok(buf, " \0");
|
||||||
|
opt = strtok(NULL, " \0");
|
||||||
|
|
||||||
|
IsDoing("Retrieve");
|
||||||
|
|
||||||
|
if (opt == NULL) {
|
||||||
|
send_nntp("420 No current article has been selected");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen(currentgroup) == 0) {
|
||||||
|
send_nntp("412 No newsgroup has been selected");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt[0] == '<') {
|
||||||
|
Syslog('n', "\"%s\"", printable(opt, 0));
|
||||||
|
strcpy(dig, opt+1);
|
||||||
|
Syslog('n', "\"%s\"", printable(dig, 0));
|
||||||
|
for (i = 0; i < strlen(dig); i++) {
|
||||||
|
if (dig[i] == '$') {
|
||||||
|
dig[i] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Syslog('n', "\"%s\"", printable(dig, 0));
|
||||||
|
art = atoi(dig);
|
||||||
|
} else {
|
||||||
|
art = atoi(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
Syslog('n', "Article %lu", art);
|
||||||
|
|
||||||
|
if (art == 0L) {
|
||||||
|
send_nntp("420 No current article has been selected");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! Msg_ReadHeader(art)) {
|
||||||
|
send_nntp("430 No such article found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcasecmp(cmd, "STAT") == 0) {
|
||||||
|
send_nntp("223 %lu <%lu$%s@MBNNTP> Article retrieved", art, art, currentgroup);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup a default translation
|
||||||
|
*/
|
||||||
|
charset_set_in_out((char *)"x-ibmpc", (char *)"iso-8859-1");
|
||||||
|
|
||||||
|
if (Msg_Read(art, 75)) {
|
||||||
|
|
||||||
|
if (strcasecmp(cmd, "ARTICLE") == 0)
|
||||||
|
send_nntp("220 %ld <%ld$%s@MBNNTP> Article retrieved - Head and body follow", art, art, currentgroup);
|
||||||
|
if (strcasecmp(cmd, "HEAD") == 0)
|
||||||
|
send_nntp("221 %ld <%ld$%s@MBNNTP> Article retrieved - Head follows", art, art, currentgroup);
|
||||||
|
if (strcasecmp(cmd, "BODY") == 0)
|
||||||
|
send_nntp("222 %ld <%ld$%s@MBNNTP> Article retrieved - Body follows", art, art, currentgroup);
|
||||||
|
|
||||||
|
if ((strcasecmp(cmd, "ARTICLE") == 0) || (strcasecmp(cmd, "HEAD") == 0)) {
|
||||||
|
|
||||||
|
send_nntp("Path: MBNNTP!not-for-mail");
|
||||||
|
send_nntp("From: %s <%s>", Msg.From, Msg.FromAddress);
|
||||||
|
send_nntp("Newsgroups: %s", currentgroup);
|
||||||
|
send_nntp("Subject: %s", Msg.Subject);
|
||||||
|
send_nntp("Date: %s", rfcdate(Msg.Written));
|
||||||
|
send_nntp("Message-ID: <%lu$%s@MBNNTP>", art, currentgroup);
|
||||||
|
if (Msg.Reply)
|
||||||
|
send_nntp("References: <%lu$%s@MBNNTP>", Msg.Reply, currentgroup);
|
||||||
|
send_nntp("X-JAM-From: %s <%s>", Msg.From, Msg.FromAddress);
|
||||||
|
if (strlen(Msg.To))
|
||||||
|
send_nntp("X-JAM-To: %s", Msg.To);
|
||||||
|
if ((p = (char *)MsgText_First()) != NULL) {
|
||||||
|
do {
|
||||||
|
if ((p[0] == '\001') || (!strncmp(p, "SEEN-BY:", 8)) || (!strncmp(p, "AREA:", 5))) {
|
||||||
|
if (p[0] == '\001') {
|
||||||
|
send_nntp("X-JAM-%s", p+1);
|
||||||
|
} else {
|
||||||
|
send_nntp("X-JAM-%s", p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while ((p = (char *)MsgText_Next()) != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// send_nntp("X-JAM-Attributes:");
|
||||||
|
send_nntp("MIME-Version: 1.0");
|
||||||
|
send_nntp("Content-Type: text/plain; charset=iso-8859-1; format=fixed");
|
||||||
|
send_nntp("Content-Transfer-Encoding: 8bit");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcasecmp(cmd, "ARTICLE") == 0)
|
||||||
|
send_nntp("");
|
||||||
|
|
||||||
|
if ((strcasecmp(cmd, "ARTICLE") == 0) || (strcasecmp(cmd, "BODY") == 0)) {
|
||||||
|
if ((p = (char *)MsgText_First()) != NULL) {
|
||||||
|
do {
|
||||||
|
if ((p[0] == '\001') || (!strncmp(p, "SEEN-BY:", 8)) || (!strncmp(p, "AREA:", 5))) {
|
||||||
|
/*
|
||||||
|
* Kludges, suppress
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
|
if (strcmp(p, ".") == 0) /* Don't send a single dot */
|
||||||
|
send_nntp("..");
|
||||||
|
else
|
||||||
|
send_xlat(p);
|
||||||
|
}
|
||||||
|
} while ((p = (char *)MsgText_Next()) != NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
send_nntp(".");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
send_nntp("503 Could not retrieve message");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GROUP ggg
|
||||||
|
*/
|
||||||
|
void command_group(char *cmd)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
char *temp;
|
char *temp, *opt;
|
||||||
|
|
||||||
|
IsDoing("Group");
|
||||||
|
Syslog('+', "%s", cmd);
|
||||||
|
opt = strtok(cmd, " \0");
|
||||||
|
opt = strtok(NULL, " \0");
|
||||||
|
|
||||||
|
if (opt == NULL) {
|
||||||
|
send_nntp("411 No such news group");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
send_nntp("215 List of newsgroups follows");
|
|
||||||
temp = calloc(PATH_MAX, sizeof(char));
|
temp = calloc(PATH_MAX, sizeof(char));
|
||||||
sprintf(temp, "%s/etc/mareas.data", getenv("MBSE_ROOT"));
|
sprintf(temp, "%s/etc/mareas.data", getenv("MBSE_ROOT"));
|
||||||
if ((fp = fopen(temp, "r"))) {
|
if ((fp = fopen(temp, "r"))) {
|
||||||
fread(&msgshdr, sizeof(msgshdr), 1, fp);
|
fread(&msgshdr, sizeof(msgshdr), 1, fp);
|
||||||
while (fread(&msgs, msgshdr.recsize, 1, fp) == 1) {
|
while (fread(&msgs, msgshdr.recsize, 1, fp) == 1) {
|
||||||
|
if (msgs.Active && ((msgs.Type == ECHOMAIL) || (msgs.Type == NEWS)) && strlen(msgs.Newsgroup) &&
|
||||||
fseek(fp, msgs.syssize, SEEK_CUR);
|
(strcasecmp(opt, msgs.Newsgroup) == 0) && Access(usrconfig.Security, msgs.RDSec)) {
|
||||||
|
Syslog('n', "Found the group");
|
||||||
|
if (Msg_Open(msgs.Base)) {
|
||||||
|
Msg_Number();
|
||||||
|
Msg_Highest();
|
||||||
|
Msg_Lowest();
|
||||||
|
send_nntp("211 %lu %lu %lu %s", MsgBase.Total, MsgBase.Lowest, MsgBase.Highest, msgs.Newsgroup);
|
||||||
|
sprintf(currentgroup, "%s", msgs.Newsgroup);
|
||||||
|
} else {
|
||||||
|
send_nntp("411 No such news group");
|
||||||
}
|
}
|
||||||
|
fclose(fp);
|
||||||
|
free(temp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fseek(fp, msgshdr.syssize, SEEK_CUR);
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
} else {
|
||||||
|
WriteError("$Can't open %s", temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(temp);
|
||||||
|
send_nntp("411 No such news group");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LIST
|
||||||
|
* LIST ACTIVE
|
||||||
|
* LIST NEWSGROUPS
|
||||||
|
* LIST OVERVIEW.FMT
|
||||||
|
*/
|
||||||
|
void command_list(char *cmd)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
char *temp, *opt;
|
||||||
|
int rw;
|
||||||
|
|
||||||
|
IsDoing("List");
|
||||||
|
Syslog('+', "%s", cmd);
|
||||||
|
opt = strtok(cmd, " \0");
|
||||||
|
opt = strtok(NULL, " \0");
|
||||||
|
|
||||||
|
if ((opt == NULL) || (strcasecmp(opt, "ACTIVE") == 0) || (strcasecmp(opt, "NEWSGROUPS") == 0)) {
|
||||||
|
send_nntp("215 Information follows");
|
||||||
|
temp = calloc(PATH_MAX, sizeof(char));
|
||||||
|
sprintf(temp, "%s/etc/mareas.data", getenv("MBSE_ROOT"));
|
||||||
|
if ((fp = fopen(temp, "r"))) {
|
||||||
|
fread(&msgshdr, sizeof(msgshdr), 1, fp);
|
||||||
|
while (fread(&msgs, msgshdr.recsize, 1, fp) == 1) {
|
||||||
|
if (msgs.Active && ((msgs.Type == ECHOMAIL) || (msgs.Type == NEWS)) && strlen(msgs.Newsgroup) &&
|
||||||
|
Access(usrconfig.Security, msgs.RDSec)) {
|
||||||
|
if (Access(usrconfig.Security, msgs.WRSec))
|
||||||
|
rw = 'y';
|
||||||
|
else
|
||||||
|
rw = 'n';
|
||||||
|
if (msgs.MsgKinds == RONLY)
|
||||||
|
rw = 'n';
|
||||||
|
if (Msg_Open(msgs.Base)) {
|
||||||
|
if (opt && (strcasecmp(opt, "NEWSGROUPS") == 0))
|
||||||
|
send_nntp("%s %s", msgs.Newsgroup, msgs.Name);
|
||||||
|
else
|
||||||
|
send_nntp("%s %lu %lu %c", msgs.Newsgroup, Msg_Lowest(), Msg_Highest(), rw);
|
||||||
|
Msg_Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fseek(fp, msgshdr.syssize, SEEK_CUR);
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
} else {
|
} else {
|
||||||
WriteError("$Can't open %s", temp);
|
WriteError("$Can't open %s", temp);
|
||||||
}
|
}
|
||||||
free(temp);
|
free(temp);
|
||||||
send_nntp(".");
|
send_nntp(".");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt && (strcasecmp(opt, "OVERVIEW.FMT") == 0)) {
|
||||||
|
send_nntp("215 Order of fields in overview database");
|
||||||
|
send_nntp("Subject:");
|
||||||
|
send_nntp("From:");
|
||||||
|
send_nntp("Date:");
|
||||||
|
send_nntp("Message-ID:");
|
||||||
|
send_nntp("References:");
|
||||||
|
send_nntp("Bytes:");
|
||||||
|
send_nntp("Lines:");
|
||||||
|
// send_nntp("Xref:full");
|
||||||
|
send_nntp(".");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* No recognized LIST command
|
||||||
|
*/
|
||||||
|
send_nntp("503 Function not available");
|
||||||
|
|
||||||
|
msleep(1); /* For the linker only */
|
||||||
|
colour(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XOVER
|
||||||
|
*/
|
||||||
|
void command_xover(char *cmd)
|
||||||
|
{
|
||||||
|
char *opt, *p, msgid[100], reply[100];
|
||||||
|
unsigned long i, start, end;
|
||||||
|
int refs, bytecount, linecount;
|
||||||
|
|
||||||
|
IsDoing("Xover");
|
||||||
|
opt = strtok(cmd, " \0");
|
||||||
|
opt = strtok(NULL, " \0");
|
||||||
|
|
||||||
|
if (MsgBase.Open == FALSE) {
|
||||||
|
send_nntp("411 No news group current selected");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((opt == NULL) && (article == 0L)) {
|
||||||
|
send_nntp("420 No article selected");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
start = MsgBase.Lowest;
|
||||||
|
end = MsgBase.Highest;
|
||||||
|
|
||||||
|
Syslog('n', "Start %ld, end %ld", start, end);
|
||||||
|
|
||||||
|
if (opt != NULL) {
|
||||||
|
if (strchr(opt, '-')) {
|
||||||
|
/*
|
||||||
|
* We have a dash, format 12- or 12-16
|
||||||
|
*/
|
||||||
|
p = strtok(opt, "-");
|
||||||
|
start = atoi(p);
|
||||||
|
p = strtok(NULL, "\0");
|
||||||
|
if (p != NULL)
|
||||||
|
end = atoi(p);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Must be a single digit
|
||||||
|
*/
|
||||||
|
start = end = atoi(opt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Syslog('n', "Start %ld, end %ld", start, end);
|
||||||
|
|
||||||
|
send_nntp("224 Overview information follows");
|
||||||
|
for (i = start; i <= end; i++) {
|
||||||
|
if (Msg_ReadHeader(i)) {
|
||||||
|
bytecount = linecount = refs = 0;
|
||||||
|
if (Msg.Original)
|
||||||
|
refs++;
|
||||||
|
if (Msg.Reply)
|
||||||
|
refs++;
|
||||||
|
if (Msg_Read(i, 80)) {
|
||||||
|
if ((p = (char *)MsgText_First()) != NULL) {
|
||||||
|
do {
|
||||||
|
if (p[0] != '\001') {
|
||||||
|
linecount++;
|
||||||
|
bytecount += strlen(p);
|
||||||
|
}
|
||||||
|
} while ((p = (char *)MsgText_Next()) != NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sprintf(msgid, "<%ld$%s@MBNNTP>", i, currentgroup);
|
||||||
|
reply[0] = 0;
|
||||||
|
if (Msg.Reply)
|
||||||
|
sprintf(reply, "<%ld$%s@MBNNTP>", Msg.Reply, currentgroup);
|
||||||
|
send_nntp("%lu\t%s\t%s <%s>\t%s\t%s\t%s\t%d\t%d", i, Msg.Subject, Msg.From, Msg.FromAddress,
|
||||||
|
rfcdate(Msg.Written), msgid, reply, bytecount, linecount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
send_nntp(".");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
|
void command_abhs(char *); /* ARTICLE/BODY/HEADER/STAT */
|
||||||
|
void command_group(char *); /* GROUP */
|
||||||
void command_list(char *); /* LIST */
|
void command_list(char *); /* LIST */
|
||||||
|
void command_xover(char *); /* XOVER */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "../lib/mbselib.h"
|
#include "../lib/mbselib.h"
|
||||||
#include "../lib/users.h"
|
#include "../lib/users.h"
|
||||||
#include "../lib/mbsedb.h"
|
#include "../lib/mbsedb.h"
|
||||||
|
#include "../lib/msg.h"
|
||||||
#include "openport.h"
|
#include "openport.h"
|
||||||
#include "ttyio.h"
|
#include "ttyio.h"
|
||||||
#include "auth.h"
|
#include "auth.h"
|
||||||
@ -43,6 +44,8 @@ time_t t_end;
|
|||||||
char *envptr = NULL;
|
char *envptr = NULL;
|
||||||
struct sockaddr_in peeraddr;
|
struct sockaddr_in peeraddr;
|
||||||
pid_t mypid;
|
pid_t mypid;
|
||||||
|
unsigned long rcvdbytes = 0L;
|
||||||
|
unsigned long sentbytes = 0L;
|
||||||
|
|
||||||
extern char *ttystat[];
|
extern char *ttystat[];
|
||||||
extern int authorized;
|
extern int authorized;
|
||||||
@ -52,6 +55,7 @@ void die(int onsig)
|
|||||||
{
|
{
|
||||||
signal(onsig, SIG_IGN);
|
signal(onsig, SIG_IGN);
|
||||||
CloseDupes();
|
CloseDupes();
|
||||||
|
Msg_Close();
|
||||||
|
|
||||||
if (onsig) {
|
if (onsig) {
|
||||||
if (onsig <= NSIG)
|
if (onsig <= NSIG)
|
||||||
@ -61,6 +65,7 @@ void die(int onsig)
|
|||||||
}
|
}
|
||||||
|
|
||||||
t_end = time(NULL);
|
t_end = time(NULL);
|
||||||
|
Syslog('+', "Send [%6lu] Received [%6lu]", sentbytes, rcvdbytes);
|
||||||
Syslog(' ', "MBNNTP finished in %s", t_elapsed(t_start, t_end));
|
Syslog(' ', "MBNNTP finished in %s", t_elapsed(t_start, t_end));
|
||||||
|
|
||||||
if (envptr)
|
if (envptr)
|
||||||
@ -162,8 +167,10 @@ int get_nntp(char *buf, int max)
|
|||||||
Syslog('+', "Receiver status %s", ttystat[- c]);
|
Syslog('+', "Receiver status %s", ttystat[- c]);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
if ((c == '\r') || (c == '\n'))
|
if ((c == '\r') || (c == '\n')) {
|
||||||
|
rcvdbytes += (len + 1);
|
||||||
return len;
|
return len;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
buf[len] = c;
|
buf[len] = c;
|
||||||
len++;
|
len++;
|
||||||
@ -174,6 +181,7 @@ int get_nntp(char *buf, int max)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0; /* Not reached */
|
return 0; /* Not reached */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,6 +201,8 @@ void send_nntp(const char *format, ...)
|
|||||||
Syslog('n', "> \"%s\"", printable(out, 0));
|
Syslog('n', "> \"%s\"", printable(out, 0));
|
||||||
PUTSTR(out);
|
PUTSTR(out);
|
||||||
PUTSTR((char *)"\r\n");
|
PUTSTR((char *)"\r\n");
|
||||||
|
FLUSHOUT();
|
||||||
|
sentbytes += (strlen(out) + 2);
|
||||||
free(out);
|
free(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,16 +215,18 @@ void nntp(void)
|
|||||||
|
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
|
|
||||||
|
IsDoing("Waiting");
|
||||||
len = get_nntp(buf, sizeof(buf) -1);
|
len = get_nntp(buf, sizeof(buf) -1);
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
return;
|
return;
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
Syslog('n', "< \"%s\"", printable(buf, 0));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process received command
|
* Process received command
|
||||||
*/
|
*/
|
||||||
Syslog('n', "< \"%s\"", printable(buf, 0));
|
|
||||||
if (strncasecmp(buf, "QUIT", 4) == 0) {
|
if (strncasecmp(buf, "QUIT", 4) == 0) {
|
||||||
send_nntp("205 Goodbye\r\n");
|
send_nntp("205 Goodbye\r\n");
|
||||||
return;
|
return;
|
||||||
@ -222,9 +234,21 @@ void nntp(void)
|
|||||||
auth_user(buf);
|
auth_user(buf);
|
||||||
} else if (strncasecmp(buf, "AUTHINFO PASS", 13) == 0) {
|
} else if (strncasecmp(buf, "AUTHINFO PASS", 13) == 0) {
|
||||||
auth_pass(buf);
|
auth_pass(buf);
|
||||||
|
} else if (strncasecmp(buf, "ARTICLE", 7) == 0) {
|
||||||
|
if (check_auth(buf))
|
||||||
|
command_abhs(buf);
|
||||||
|
} else if (strncasecmp(buf, "BODY", 4) == 0) {
|
||||||
|
if (check_auth(buf))
|
||||||
|
command_abhs(buf);
|
||||||
} else if (strncasecmp(buf, "LIST", 4) == 0) {
|
} else if (strncasecmp(buf, "LIST", 4) == 0) {
|
||||||
if (check_auth(buf))
|
if (check_auth(buf))
|
||||||
command_list(buf);
|
command_list(buf);
|
||||||
|
} else if (strncasecmp(buf, "GROUP", 5) == 0) {
|
||||||
|
if (check_auth(buf))
|
||||||
|
command_group(buf);
|
||||||
|
} else if (strncasecmp(buf, "HEAD", 4) == 0) {
|
||||||
|
if (check_auth(buf))
|
||||||
|
command_abhs(buf);
|
||||||
} else if (strncasecmp(buf, "IHAVE", 5) == 0) {
|
} else if (strncasecmp(buf, "IHAVE", 5) == 0) {
|
||||||
send_nntp("435 Article not wanted - do not send it");
|
send_nntp("435 Article not wanted - do not send it");
|
||||||
} else if (strncasecmp(buf, "NEWGROUPS", 9) == 0) {
|
} else if (strncasecmp(buf, "NEWGROUPS", 9) == 0) {
|
||||||
@ -235,22 +259,34 @@ void nntp(void)
|
|||||||
send_nntp(".");
|
send_nntp(".");
|
||||||
} else if (strncasecmp(buf, "SLAVE", 5) == 0) {
|
} else if (strncasecmp(buf, "SLAVE", 5) == 0) {
|
||||||
send_nntp("202 Slave status noted");
|
send_nntp("202 Slave status noted");
|
||||||
|
} else if (strncasecmp(buf, "STAT", 4) == 0) {
|
||||||
|
if (check_auth(buf))
|
||||||
|
command_abhs(buf);
|
||||||
} else if (strncasecmp(buf, "MODE READER", 11) == 0) {
|
} else if (strncasecmp(buf, "MODE READER", 11) == 0) {
|
||||||
if (authorized)
|
if (authorized)
|
||||||
send_nntp("200 Server ready, posting allowed");
|
send_nntp("200 Server ready, posting allowed");
|
||||||
else
|
else
|
||||||
send_nntp("201 Server ready, no posting allowed");
|
send_nntp("201 Server ready, no posting allowed");
|
||||||
|
} else if (strncasecmp(buf, "XOVER", 5) == 0) {
|
||||||
|
if (check_auth(buf))
|
||||||
|
command_xover(buf);
|
||||||
} else if (strncasecmp(buf, "HELP", 4) == 0) {
|
} else if (strncasecmp(buf, "HELP", 4) == 0) {
|
||||||
send_nntp("100 Help text follows");
|
send_nntp("100 Help text follows");
|
||||||
send_nntp("Recognized commands:");
|
send_nntp("Recognized commands:");
|
||||||
send_nntp("");
|
send_nntp("");
|
||||||
|
send_nntp("ARTICLE");
|
||||||
send_nntp("AUTHINFO");
|
send_nntp("AUTHINFO");
|
||||||
|
send_nntp("BODY");
|
||||||
|
send_nntp("GROUP");
|
||||||
|
send_nntp("HEAD");
|
||||||
send_nntp("IHAVE (not implemented, messages are always rejected)");
|
send_nntp("IHAVE (not implemented, messages are always rejected)");
|
||||||
send_nntp("LIST");
|
send_nntp("LIST");
|
||||||
send_nntp("NEWGROUPS (not implemented, always returns an empty list)");
|
send_nntp("NEWGROUPS (not implemented, always returns an empty list)");
|
||||||
send_nntp("NEWNEWS (not implemented, always returns an empty list)");
|
send_nntp("NEWNEWS (not implemented, always returns an empty list)");
|
||||||
send_nntp("QUIT");
|
send_nntp("QUIT");
|
||||||
send_nntp("SLAVE (has no effect)");
|
send_nntp("SLAVE (has no effect)");
|
||||||
|
send_nntp("STAT");
|
||||||
|
send_nntp("XOVER");
|
||||||
send_nntp("");
|
send_nntp("");
|
||||||
send_nntp("MBNNTP supports most of RFC-977 and also has support for AUTHINFO and");
|
send_nntp("MBNNTP supports most of RFC-977 and also has support for AUTHINFO and");
|
||||||
send_nntp("limited XOVER support (RFC-2980)");
|
send_nntp("limited XOVER support (RFC-2980)");
|
||||||
|
@ -75,7 +75,7 @@ grlist.o: ../config.h ../lib/mbselib.h screen.h grlist.h ledit.h
|
|||||||
m_domain.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h m_global.h m_menu.h m_domain.h
|
m_domain.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h m_global.h m_menu.h m_domain.h
|
||||||
m_fgroup.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h m_global.h m_node.h m_archive.h m_ngroup.h m_ticarea.h m_fgroup.h
|
m_fgroup.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h m_global.h m_node.h m_archive.h m_ngroup.h m_ticarea.h m_fgroup.h
|
||||||
m_lang.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h m_global.h m_lang.h
|
m_lang.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h m_global.h m_lang.h
|
||||||
m_marea.o: ../config.h ../lib/mbselib.h ../lib/msg.h ../lib/mbsedb.h screen.h mutil.h ledit.h grlist.h m_global.h m_node.h m_mgroup.h m_marea.h
|
m_marea.o: ../config.h ../lib/mbselib.h ../lib/msg.h ../lib/users.h ../lib/mbsedb.h screen.h mutil.h ledit.h grlist.h m_global.h m_node.h m_mgroup.h m_marea.h
|
||||||
m_new.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h m_global.h grlist.h m_new.h m_lang.h m_marea.h m_ngroup.h
|
m_new.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h m_global.h grlist.h m_new.h m_lang.h m_marea.h m_ngroup.h
|
||||||
m_protocol.o: ../config.h ../lib/mbselib.h ../paths.h screen.h mutil.h ledit.h stlist.h m_global.h m_protocol.h
|
m_protocol.o: ../config.h ../lib/mbselib.h ../paths.h screen.h mutil.h ledit.h stlist.h m_global.h m_protocol.h
|
||||||
m_ticarea.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h grlist.h m_global.h m_node.h m_fgroup.h m_farea.h m_archive.h m_ticarea.h
|
m_ticarea.o: ../config.h ../lib/mbselib.h screen.h mutil.h ledit.h stlist.h grlist.h m_global.h m_node.h m_fgroup.h m_farea.h m_archive.h m_ticarea.h
|
||||||
|
Reference in New Issue
Block a user