Date: Sat, 05 Sep 1998 16:31:53 -0600 From: Wes Peters <wes@softweyr.com> To: laurens van alphen <lva@dds.nl> Cc: freebsd-isp@FreeBSD.ORG, freebsd-security@FreeBSD.ORG Subject: Re: small LDA c program requested Message-ID: <35F1BBD9.7E2A42F@softweyr.com> References: <000501bdd817$1c440870$60e65982@uptight.student.utwente.nl>
next in thread | previous in thread | raw e-mail | index | archive | help
laurens van alphen wrote:
>
> hi all,
>
> working with cucipop-1.31 and the new vpop features. there are numerous bugs
> in the implementation that i basically fixed.
>
> my next move was a LDA that will deliver the way cucipop wants it:
> /var/mail/domain/user:
>
> #!/bin/sh
> umask 077
> cat - >> /var/mail/${1}/${2}
>
> this indeed works. all i need now i a port to c for speed and security.
> things that need to be added are:
OK, I've hacked up a quick little program to do this. The error checking
is fairly good, but it could use some logging capabilities. I've attached
a Berkeley-style copyright, so you're free to extend it if you wish. If
this is something that is of general interest to cucipop users, let me
know so I can send it to Mr. van den Berg, or at least to the FreeBSD
port maintainer.
> - regex $1 and $2 to match a-z and - and .
Got that -- I didn't use regex, it's too expensive in this simple case.
I assumed you meant A-Z a-z . - for domain and user names. If not,
remove the uppercase characters from the string validChars in function
invalidName.
> - check $1 (directory) exists, if not bail
Got that, too. I didn't check for writability, since that will happen
when we try to open() the file anyhow.
> - check symlinks in $1 and $2 probably?
I can add that, if you can tell me what you want. What I have here will
work fine even if both the domain directory and the user file are
symlinks; it is symlink-unaware.
> suggestions welcome
No suggestions, just code. ;^)
> -- the information contained in this communication is confidential and
> may be legally privileged. it is intended solely for the use of the
> individual or entity to whom it is addressed and others authorised to
> receive it. if you are not the intended recipient you are hereby notified
> that any disclosure, copying, distribution or taking any action in
> reliance of the contents of this information is strictly prohibited and
> may be unlawful. craxx is either liable for the proper and complete
> transmission of the information contained in this communication nor
> for any delay in its receipt.
This has got to be the most draconian .sig I've ever seen. What, precisely,
do you expect to accomplish with this? ;^)
Here's the program, for your compiling enjoyment:
/*================================================================
*
* LDA: a small Local Delivery Agent for email.
*
*----------------------------------------------------------------
*
* Copyright 1998 Softweyr LLC, South Jordan Utah USA.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY SOFTWEYR LLC ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*----------------------------------------------------------------
*
* Author: Wes Peters, wes@softweyr.com
* Date: 3 Sept 1998
*
*================================================================*/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/syslimits.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
char *programName;
void
abort(char *why, ...)
{
va_list ap;
fprintf(stderr, "%s: ", programName);
va_start(ap, why);
vfprintf(stderr, why, ap);
va_end(ap);
exit(-1);
}
int
invalidName(char *name)
{
static char *validChars =
"ABCDEFGHIJKLMNOPQRSTUVWXYSabcdefghijklmnopqrstuvwxyz-.";
if (strlen(name) > NAME_MAX)
{
return 1;
}
return strcspn(name, validChars);
}
int
main(int argc, char *argv[])
{
char *domain, *user;
int fd, nbytes;
struct stat S;
char mailbox[PATH_MAX + 1];
char buffer[BUFSIZ];
programName = argv[0];
domain = argv[1];
user = argv[2];
/*
* Verify we have two arguments, and that they are valid domain/user
* names.
*/
if (argc != 3)
{
abort("wrong number of arguments.\nusage: %s domain-name user-name",
programName);
}
if (invalidName(argv[1]))
{
abort("incorrect domain name \"%s\".\n", domain);
}
if (invalidName(user))
{
abort("incorrect user name \"%s\".\n", user);
}
/*
* Make sure the domain directory exists and is writable.
*/
snprintf(mailbox, PATH_MAX, "/var/mail/%s", domain);
if (stat(mailbox, &S) == -1)
{
abort("Cannot stat domain directory \"%s\".\n", mailbox);
}
if (!S_ISDIR(S.st_mode))
{
abort("Domain directory \"%s\" is NOT a directory.\n", mailbox);
}
/*
* Create the file and prepare to write.
*/
snprintf(mailbox, PATH_MAX, "/var/mail/%s/%s", domain, user);
if ((fd = open(mailbox, O_WRONLY | O_APPEND | O_CREAT, 0600)) < 0)
{
abort("Cannot open user mailbox \"%s\" for appending.\n", mailbox);
}
/*
* OK, copy stdin until exhausted.
*/
while ((nbytes = read(STDIN_FILENO, buffer, BUFSIZ)) > 0)
{
if (write(fd, buffer, nbytes) != nbytes)
{
abort("Error writing mailbox \"%s\".\n", mailbox);
}
}
close(fd);
return 0;
}
--
Where am I, and what am I doing in this handbasket?
Wes Peters +1.801.915.2061
Softweyr LLC wes@softweyr.com
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-isp" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?35F1BBD9.7E2A42F>
