From owner-freebsd-security Fri Sep 4 17:05:13 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id RAA01825 for freebsd-security-outgoing; Fri, 4 Sep 1998 17:05:13 -0700 (PDT) (envelope-from owner-freebsd-security@FreeBSD.ORG) Received: from xylan.com (postal.xylan.com [208.8.0.248]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id RAA01802; Fri, 4 Sep 1998 17:05:09 -0700 (PDT) (envelope-from wes@softweyr.com) Received: from mailhub.xylan.com by xylan.com (8.8.7/SMI-SVR4 (xylan-mgw 2.1 [OUT])) id PAA11925; Fri, 4 Sep 1998 15:38:00 -0700 (PDT) Received: from utah.XYLAN.COM by mailhub.xylan.com (SMI-8.6/SMI-SVR4 (mailhub 2.1 [HUB])) id PAA12204; Fri, 4 Sep 1998 15:35:04 -0700 Received: from softweyr.com by utah.XYLAN.COM (SMI-8.6/SMI-SVR4 (xylan utah [SPOOL])) id QAA16261; Fri, 4 Sep 1998 16:35:00 -0600 Message-ID: <35F1BBD9.7E2A42F@softweyr.com> Date: Sat, 05 Sep 1998 16:31:53 -0600 From: Wes Peters Organization: Softweyr LLC X-Mailer: Mozilla 4.04 [en] (X11; I; FreeBSD 2.2.6-RELEASE i386) MIME-Version: 1.0 To: laurens van alphen CC: freebsd-isp@FreeBSD.ORG, freebsd-security@FreeBSD.ORG Subject: Re: small LDA c program requested References: <000501bdd817$1c440870$60e65982@uptight.student.utwente.nl> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Sender: owner-freebsd-security@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org 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 #include #include #include #include #include #include #include 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-security" in the body of the message