diff options
| author | erdgeist <erdgeist@bauklotz.local> | 2015-08-16 16:38:25 +0200 |
|---|---|---|
| committer | erdgeist <erdgeist@bauklotz.local> | 2015-08-16 16:38:25 +0200 |
| commit | 23f0e1561767dd8a396188e317bae5920d171ea8 (patch) | |
| tree | a67f44e39ad8a45e42d60634488a65c37f3ad432 /files/arts/software/Code | |
Initial import of my nikola website
Diffstat (limited to 'files/arts/software/Code')
| -rw-r--r-- | files/arts/software/Code/elektropost/auth.patch.diff-tls | 141 | ||||
| -rw-r--r-- | files/arts/software/Code/elektropost/maildroprc | 21 | ||||
| -rwxr-xr-x | files/arts/software/Code/elektropost/mkvalidrcptto | 826 | ||||
| -rw-r--r-- | files/arts/software/Code/elektropost/qmail-smtpd.c.force.tls.patch | 42 | ||||
| -rw-r--r-- | files/arts/software/Code/elektropost/qmail-smtpd.c.privacy.patch | 31 | ||||
| -rw-r--r-- | files/arts/software/Code/elektropost/tcp.smtp | 14 | ||||
| -rw-r--r-- | files/arts/software/Code/elektropost/validrcptto.cdb.patch.new | 153 | ||||
| -rwxr-xr-x | files/arts/software/Code/vchat-client | bin | 0 -> 1922072 bytes |
8 files changed, 1228 insertions, 0 deletions
diff --git a/files/arts/software/Code/elektropost/auth.patch.diff-tls b/files/arts/software/Code/elektropost/auth.patch.diff-tls new file mode 100644 index 0000000..2960def --- /dev/null +++ b/files/arts/software/Code/elektropost/auth.patch.diff-tls | |||
| @@ -0,0 +1,141 @@ | |||
| 1 | *** auth.patch.orig Fri May 10 07:41:20 2002 | ||
| 2 | --- auth.patch Thu Jan 9 15:22:06 2014 | ||
| 3 | *************** | ||
| 4 | *** 14,42 **** | ||
| 5 | binm1.sh conf-qmail | ||
| 6 | cat binm1.sh \ | ||
| 7 | *************** | ||
| 8 | ! *** 1536,1547 **** | ||
| 9 | timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o received.o \ | ||
| 10 | date822fmt.o now.o qmail.o cdb.a fd.a wait.a datetime.a getln.a \ | ||
| 11 | open.a sig.a case.a env.a stralloc.a alloc.a substdio.a error.a str.a \ | ||
| 12 | ! fs.a auto_qmail.o socket.lib | ||
| 13 | ./load qmail-smtpd rcpthosts.o commands.o timeoutread.o \ | ||
| 14 | timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o \ | ||
| 15 | received.o date822fmt.o now.o qmail.o cdb.a fd.a wait.a \ | ||
| 16 | datetime.a getln.a open.a sig.a case.a env.a stralloc.a \ | ||
| 17 | ! alloc.a substdio.a error.a str.a fs.a auto_qmail.o `cat \ | ||
| 18 | socket.lib` | ||
| 19 | |||
| 20 | qmail-smtpd.0: \ | ||
| 21 | ! --- 1540,1551 ---- | ||
| 22 | timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o received.o \ | ||
| 23 | date822fmt.o now.o qmail.o cdb.a fd.a wait.a datetime.a getln.a \ | ||
| 24 | open.a sig.a case.a env.a stralloc.a alloc.a substdio.a error.a str.a \ | ||
| 25 | ! fs.a auto_qmail.o base64.o socket.lib | ||
| 26 | ./load qmail-smtpd rcpthosts.o commands.o timeoutread.o \ | ||
| 27 | timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o \ | ||
| 28 | received.o date822fmt.o now.o qmail.o cdb.a fd.a wait.a \ | ||
| 29 | datetime.a getln.a open.a sig.a case.a env.a stralloc.a \ | ||
| 30 | ! ! alloc.a substdio.a error.a str.a fs.a auto_qmail.o base64.o `cat \ | ||
| 31 | socket.lib` | ||
| 32 | |||
| 33 | qmail-smtpd.0: \ | ||
| 34 | --- 14,44 ---- | ||
| 35 | binm1.sh conf-qmail | ||
| 36 | cat binm1.sh \ | ||
| 37 | *************** | ||
| 38 | ! *** 1537,1549 **** | ||
| 39 | timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o received.o \ | ||
| 40 | date822fmt.o now.o qmail.o cdb.a fd.a wait.a datetime.a getln.a \ | ||
| 41 | open.a sig.a case.a env.a stralloc.a alloc.a substdio.a error.a str.a \ | ||
| 42 | ! fs.a auto_qmail.o socket.lib | ||
| 43 | ./load qmail-smtpd rcpthosts.o commands.o timeoutread.o \ | ||
| 44 | timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o \ | ||
| 45 | + tls.o ssl_timeoutio.o ndelay.a -L/usr/local/ssl/lib -lssl -lcrypto \ | ||
| 46 | received.o date822fmt.o now.o qmail.o cdb.a fd.a wait.a \ | ||
| 47 | datetime.a getln.a open.a sig.a case.a env.a stralloc.a \ | ||
| 48 | ! alloc.a substdio.a error.a str.a fs.a auto_qmail.o `cat \ | ||
| 49 | socket.lib` | ||
| 50 | |||
| 51 | qmail-smtpd.0: \ | ||
| 52 | ! --- 1541,1553 ---- | ||
| 53 | timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o received.o \ | ||
| 54 | date822fmt.o now.o qmail.o cdb.a fd.a wait.a datetime.a getln.a \ | ||
| 55 | open.a sig.a case.a env.a stralloc.a alloc.a substdio.a error.a str.a \ | ||
| 56 | ! fs.a auto_qmail.o base64.o socket.lib | ||
| 57 | ./load qmail-smtpd rcpthosts.o commands.o timeoutread.o \ | ||
| 58 | timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o \ | ||
| 59 | + tls.o ssl_timeoutio.o ndelay.a -L/usr/local/ssl/lib -lssl -lcrypto \ | ||
| 60 | received.o date822fmt.o now.o qmail.o cdb.a fd.a wait.a \ | ||
| 61 | datetime.a getln.a open.a sig.a case.a env.a stralloc.a \ | ||
| 62 | ! ! alloc.a substdio.a error.a str.a fs.a auto_qmail.o base64.o `cat \ | ||
| 63 | socket.lib` | ||
| 64 | |||
| 65 | qmail-smtpd.0: \ | ||
| 66 | *************** | ||
| 67 | *** 174,203 **** | ||
| 68 | stralloc greeting = {0}; | ||
| 69 | |||
| 70 | *************** | ||
| 71 | ! *** 229,235 **** | ||
| 72 | ! } | ||
| 73 | void smtp_ehlo(arg) char *arg; | ||
| 74 | { | ||
| 75 | ! ! smtp_greet("250-"); out("\r\n250-PIPELINING\r\n250 8BITMIME\r\n"); | ||
| 76 | seenmail = 0; dohelo(arg); | ||
| 77 | ! } | ||
| 78 | ! void smtp_rset() | ||
| 79 | ! --- 241,255 ---- | ||
| 80 | ! } | ||
| 81 | void smtp_ehlo(arg) char *arg; | ||
| 82 | { | ||
| 83 | ! ! smtp_greet("250-"); | ||
| 84 | ! ! #ifdef AUTHCRAM | ||
| 85 | ! out("\r\n250-AUTH LOGIN CRAM-MD5 PLAIN"); | ||
| 86 | ! out("\r\n250-AUTH=LOGIN CRAM-MD5 PLAIN"); | ||
| 87 | ! #else | ||
| 88 | ! out("\r\n250-AUTH LOGIN PLAIN"); | ||
| 89 | ! out("\r\n250-AUTH=LOGIN PLAIN"); | ||
| 90 | ! #endif | ||
| 91 | ! ! out("\r\n250-PIPELINING\r\n250 8BITMIME\r\n"); | ||
| 92 | seenmail = 0; dohelo(arg); | ||
| 93 | - } | ||
| 94 | - void smtp_rset() | ||
| 95 | *************** | ||
| 96 | *** 394,403 **** | ||
| 97 | --- 414,639 ---- | ||
| 98 | --- 176,218 ---- | ||
| 99 | stralloc greeting = {0}; | ||
| 100 | |||
| 101 | *************** | ||
| 102 | ! *** 265,273 **** | ||
| 103 | void smtp_ehlo(arg) char *arg; | ||
| 104 | { | ||
| 105 | ! smtp_greet("250-"); | ||
| 106 | ! #ifdef TLS | ||
| 107 | ! ! if (!ssl && (stat("control/servercert.pem",&st) == 0)) | ||
| 108 | ! ! out("\r\n250-STARTTLS"); | ||
| 109 | ! #endif | ||
| 110 | ! out("\r\n250-PIPELINING\r\n250 8BITMIME\r\n"); | ||
| 111 | seenmail = 0; dohelo(arg); | ||
| 112 | ! --- 277,302 ---- | ||
| 113 | void smtp_ehlo(arg) char *arg; | ||
| 114 | { | ||
| 115 | ! smtp_greet("250-"); | ||
| 116 | ! + #ifdef AUTHCRAM | ||
| 117 | ! #ifdef TLS | ||
| 118 | ! ! out("\r\n250-AUTH LOGIN CRAM-MD5 PLAIN"); | ||
| 119 | ! ! out("\r\n250-AUTH=LOGIN CRAM-MD5 PLAIN"); | ||
| 120 | ! ! if (!ssl && (stat("control/servercert.pem",&st) == 0)) | ||
| 121 | ! ! out("\r\n250-STARTTLS"); | ||
| 122 | ! ! #else | ||
| 123 | ! out("\r\n250-AUTH LOGIN CRAM-MD5 PLAIN"); | ||
| 124 | ! out("\r\n250-AUTH=LOGIN CRAM-MD5 PLAIN"); | ||
| 125 | + ! #endif | ||
| 126 | + ! #else | ||
| 127 | + ! #ifdef TLS | ||
| 128 | + ! out("\r\n250-AUTH LOGIN PLAIN"); | ||
| 129 | + ! out("\r\n250-AUTH=LOGIN PLAIN"); | ||
| 130 | + ! if (!ssl && (stat("control/servercert.pem",&st) == 0)) | ||
| 131 | + ! out("\r\n250-STARTTLS"); | ||
| 132 | ! #else | ||
| 133 | ! out("\r\n250-AUTH LOGIN PLAIN"); | ||
| 134 | ! out("\r\n250-AUTH=LOGIN PLAIN"); | ||
| 135 | ! #endif | ||
| 136 | ! #endif | ||
| 137 | ! out("\r\n250-PIPELINING\r\n250 8BITMIME\r\n"); | ||
| 138 | seenmail = 0; dohelo(arg); | ||
| 139 | *************** | ||
| 140 | *** 394,403 **** | ||
| 141 | --- 414,639 ---- | ||
diff --git a/files/arts/software/Code/elektropost/maildroprc b/files/arts/software/Code/elektropost/maildroprc new file mode 100644 index 0000000..5d07a7c --- /dev/null +++ b/files/arts/software/Code/elektropost/maildroprc | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | import EXT | ||
| 2 | import HOST | ||
| 3 | |||
| 4 | #This just bloody won't work for me.. don't know why | ||
| 5 | VHOME=`/usr/local/vpopmail/bin/vuserinfo -d $EXT@$HOST` | ||
| 6 | #VHOME=/usr/local/vpopmail/domains/$HOST/$EXT | ||
| 7 | |||
| 8 | if (/^X-Spam-Flag: *YES/) | ||
| 9 | { | ||
| 10 | exception { | ||
| 11 | TMP=`if [ ! -d $VHOME/Maildir/.Junk ]; then /usr/local/bin/maildirmake -f Junk $VHOME/Maildir/; fi` | ||
| 12 | TMP=`if ! grep -q ^Junk$ $VHOME/Maildir/.subscriptions; then echo Junk >> $VHOME/Maildir/.subscriptions; fi` | ||
| 13 | to "$VHOME/Maildir/.Junk/" | ||
| 14 | } | ||
| 15 | } | ||
| 16 | else | ||
| 17 | { | ||
| 18 | exception { | ||
| 19 | to "$VHOME/Maildir/" | ||
| 20 | } | ||
| 21 | } | ||
diff --git a/files/arts/software/Code/elektropost/mkvalidrcptto b/files/arts/software/Code/elektropost/mkvalidrcptto new file mode 100755 index 0000000..5b03fbb --- /dev/null +++ b/files/arts/software/Code/elektropost/mkvalidrcptto | |||
| @@ -0,0 +1,826 @@ | |||
| 1 | #!/usr/bin/perl -w | ||
| 2 | # | ||
| 3 | # mkvalidrcptto | ||
| 4 | # John Simpson <jms1@jms1.net> 2005-04-20 | ||
| 5 | # | ||
| 6 | # reads qmail control files and builds a list of all valid email addresses | ||
| 7 | # on the system. | ||
| 8 | # | ||
| 9 | # 2005-05-04 jms1 - cleaned up the code a little bit. holding the output in | ||
| 10 | # memory until the whole thing is done so that partial output doesn't | ||
| 11 | # become an issue. it also makes it possible to create a cdb file directly, | ||
| 12 | # but i don't think i'm going to do that- i like the "chaining" approach | ||
| 13 | # better, piping this script's output through "cdbmake-12" to produce the | ||
| 14 | # cdb file. | ||
| 15 | # | ||
| 16 | # 2005-05-09 jms1 - changing the vpopmail user info process. instead of | ||
| 17 | # reading vpasswd.cdb, using "vuserinfo -D {domain}" and parsing that | ||
| 18 | # output. this should include mysql user information for people who are | ||
| 19 | # using vpopmail with mysql. Thanks to Roman Volf on the qmailrocks | ||
| 20 | # mailing list for pointing this out. | ||
| 21 | # | ||
| 22 | # 2005-06-09 jms1 - adding support for "fastforward" aliases. | ||
| 23 | # | ||
| 24 | # 2005-06-18 jms1 - finishing support for .qmail-* files in local user home | ||
| 25 | # directories... i don't ever use local users for mailboxes myself, so it | ||
| 26 | # wasn't an issue for me, but somebody out there may be doing it, so... | ||
| 27 | # | ||
| 28 | # 2005-06-23 jms1 - changed the search pattern when reading "vuserinfo -D" | ||
| 29 | # to get a vpopmail domain's mailbox list, instead of recognizing \w+ | ||
| 30 | # it now uses \S+ which should allow "." in mailbox names | ||
| 31 | # | ||
| 32 | # 2005-06-29 jms1 - translating ":" to "." in .qmail-* filenames... i forgot | ||
| 33 | # that qmail-local does this. somebody emailed me to remind me about this, | ||
| 34 | # but i can't find the email so i don't know who to thank for reminding me | ||
| 35 | # about this... | ||
| 36 | # | ||
| 37 | # 2005-06-30 jms1 - when vpopmail stores everything in a mysql database, | ||
| 38 | # aliases are apparently not represented by .qmail files at all. it looks | ||
| 39 | # like we have no choice but to use the vpopmail command-line tools to | ||
| 40 | # get the lists of mailboxes and aliases in the domain. thanks to Rob Pitt | ||
| 41 | # for telling me that this wasn't working (i don't use vpopmail with mysql | ||
| 42 | # so i had no way to know that this would be a problem.) | ||
| 43 | # | ||
| 44 | # 2005-07-17 jms1 - domains listed in smtproutes are currently listed as | ||
| 45 | # just "@domain", meaning the entire domain is accepted without any checks | ||
| 46 | # done for individual userid's. adding code so that you can create a | ||
| 47 | # directory full of files named for the domains, containing userid's | ||
| 48 | # which exist in that domain. thanks to roman volf for the suggestion. | ||
| 49 | # | ||
| 50 | # 2005-08-03 jms1 - turns out if vpopmail is compiled with support for mysql, | ||
| 51 | # the "valias -s" command doesn't list aliases which exist by virtue of | ||
| 52 | # .qmail-blah files... which rather sucks, because this is how ezmlm sets | ||
| 53 | # up the aliases it needs, by creating .qmail-blah files. thanks again to | ||
| 54 | # Roman Volf for pointing this out. | ||
| 55 | # | ||
| 56 | # 2005-10-24 jms1 - adding a "-n" switch to generate a list without the | ||
| 57 | # system accounts (i.e. no "locals" or "me" domains will be printed.) | ||
| 58 | # note that "fastforward" aliases are considered local, since they are | ||
| 59 | # processed through the local delivery mechanism. | ||
| 60 | # | ||
| 61 | # 2005-11-29 jms1 - now treats missing vpopmail directory as a warning | ||
| 62 | # rather than a fatal error. | ||
| 63 | # | ||
| 64 | # 2005-12-07 jms1 - after reviewing qmail-send.c and controls.c, it | ||
| 65 | # turns out that the "me" becoming part of "locals" only happens if | ||
| 66 | # the "control/locals" file does not exist... otherwise an empty | ||
| 67 | # "control/locals" file means that there are no locals. updating the | ||
| 68 | # script to duplicate this logic. | ||
| 69 | # also replacing ":" with "." in .qmail filenames. | ||
| 70 | # thanks to jeff hedlund for pointing me towards the "me" problem, | ||
| 71 | # and for pointing out my oversight with the ":" thing. | ||
| 72 | # | ||
| 73 | # 2005-12-29 jms1 - adding an array of numeric uid's (empty by default) | ||
| 74 | # which will be ignored when system uid's are scanned. thanks to | ||
| 75 | # roman volf for the suggestion. | ||
| 76 | # | ||
| 77 | # 2006-01-08 jms1 - fixed a typo, thanks to "marlowe" for pointing it out. | ||
| 78 | # | ||
| 79 | # 2006-01-11 jms1 - vpopmail has a "--enable-qmail-ext" option which | ||
| 80 | # changes how mailbox names are handled. if vpopmail is running WITH | ||
| 81 | # this option, every vpopmail mailbox has an implied "-default" alias | ||
| 82 | # whether there's a .qmail-user-default file there or not. thanks to | ||
| 83 | # robin bowes for pointing this out. | ||
| 84 | # | ||
| 85 | # 2006-01-12 jms1 - making the script work correctly in the unlikely | ||
| 86 | # case that the user-ext separator character was changed, either by | ||
| 87 | # changing conf-break before compiling qmail, or specifying a custom | ||
| 88 | # value in the users/cdb file. | ||
| 89 | # | ||
| 90 | # 2006-02-05 jms1 - adding an "exclude" list, for addresses which you | ||
| 91 | # may not want to include in the output (i.e. private mailing list | ||
| 92 | # aliases and things like that.) also fixed a bug in the code which | ||
| 93 | # handles the user-ext separator character. | ||
| 94 | # | ||
| 95 | # 2006-03-26 jms1 - fixed a minor typo in the text of an error message | ||
| 96 | # (which does not affect how the script works.) Thanks to Robin Bowes | ||
| 97 | # for pointing it out. | ||
| 98 | # | ||
| 99 | # 2006-11-29 jms1 - adding logic to work around the case where users/cdb | ||
| 100 | # just plain doesn't exist (which can happen on systems which don't use | ||
| 101 | # vpopmail etc.) thanks to "Eric d'Alibut" on djb's qmail mailing list | ||
| 102 | # for pointing it out. | ||
| 103 | # | ||
| 104 | ############################################################################### | ||
| 105 | # | ||
| 106 | # Copyright (C) 2005-2006 John Simpson. | ||
| 107 | # | ||
| 108 | # This program is free software; you can redistribute it and/or modify | ||
| 109 | # it under the terms of the GNU General Public License, version 2, as | ||
| 110 | # published by the Free Software Foundation. | ||
| 111 | # | ||
| 112 | # This program is distributed in the hope that it will be useful, | ||
| 113 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 114 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 115 | # GNU General Public License for more details. | ||
| 116 | # | ||
| 117 | # You should have received a copy of the GNU General Public License | ||
| 118 | # along with this program; if not, write to the Free Software | ||
| 119 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 120 | # or visit http://www.gnu.org/licenses/gpl.txt | ||
| 121 | # | ||
| 122 | ############################################################################### | ||
| 123 | |||
| 124 | require 5.003 ; | ||
| 125 | use strict ; | ||
| 126 | |||
| 127 | use CDB_File ; | ||
| 128 | |||
| 129 | ############################################################################### | ||
| 130 | # | ||
| 131 | # configuration | ||
| 132 | |||
| 133 | my $vq = "/var/qmail" ; | ||
| 134 | my $vuser = "vpopmail" ; # vpopmail userid | ||
| 135 | |||
| 136 | # any numeric uid's on the system which are lower than this will be ignored | ||
| 137 | # this way we don't create entries for root, bin, daemon, lp, news, uucp, | ||
| 138 | # and other non-used system users. | ||
| 139 | my $uid_min = 500 ; # ignore uid's lower than this | ||
| 140 | my $uid_max = 65000 ; # ignore uid's higher than this | ||
| 141 | my @uid_ignore = qw ( ) ; # ignore any uid's listed in this array | ||
| 142 | |||
| 143 | # any entries listed in this array will NOT be included in the output | ||
| 144 | my @exclude = qw | ||
| 145 | ( | ||
| 146 | sample1@domain.xyz | ||
| 147 | sample2@domain.xyz | ||
| 148 | ) ; | ||
| 149 | |||
| 150 | # if you have text files containing lists of valid mailboxes for smtproutes | ||
| 151 | # domains, put them all into a single directory and put that directory in | ||
| 152 | # the variable below. | ||
| 153 | # | ||
| 154 | # each line of each files should contain a mailbox userid- anything on the | ||
| 155 | # line which comes after "#" or "@" is deleted, so you can use "#" for | ||
| 156 | # comments if you like, and you can use a symlink (or hard link) to cause | ||
| 157 | # one file to be effective for multiple domains. | ||
| 158 | # | ||
| 159 | # note that these files are only consulted for domains listed in the | ||
| 160 | # smtproutes file. if this variable is blank, or it points to a directory | ||
| 161 | # which doesn't exist, all smtproutes domains will be printed as "@domain", | ||
| 162 | # which tells qmail-smtpd to accept any mailbox userid in that domain. | ||
| 163 | |||
| 164 | my $smtpr_dir = "" ; | ||
| 165 | |||
| 166 | ############################################################################### | ||
| 167 | # | ||
| 168 | # global variables | ||
| 169 | |||
| 170 | my ( %alldom , %ldom , %vdom , %sdom , %adom , %lusr , %ausr , | ||
| 171 | %home , %MRH , %UCDB , @output , $ffl , %ACDB ) ; | ||
| 172 | |||
| 173 | my $err = 0 ; | ||
| 174 | my $lfound = 0 ; | ||
| 175 | my $afound = 0 ; | ||
| 176 | my $vfound = 0 ; | ||
| 177 | my $showlocal = 1 ; | ||
| 178 | my $need_untie = 0 ; | ||
| 179 | |||
| 180 | my $vhome = "" ; | ||
| 181 | my $vbin = "" ; | ||
| 182 | my $vinc = "" ; | ||
| 183 | my $vqext = "?" ; | ||
| 184 | my $dash = "" ; | ||
| 185 | my $gdash = "" ; | ||
| 186 | |||
| 187 | ############################################################################### | ||
| 188 | # | ||
| 189 | # debugging function | ||
| 190 | |||
| 191 | my $show_debug = 0 ; | ||
| 192 | |||
| 193 | sub debug($) | ||
| 194 | { | ||
| 195 | $show_debug && print $_[0] ; | ||
| 196 | } | ||
| 197 | |||
| 198 | ############################################################################### | ||
| 199 | # | ||
| 200 | # function to read /var/qmail/alias/.qmail-default | ||
| 201 | |||
| 202 | sub find_ffl($) | ||
| 203 | { | ||
| 204 | my $file = shift ; | ||
| 205 | |||
| 206 | my $flagdeliver = 1 ; | ||
| 207 | my $flagpassthrough = 0 ; | ||
| 208 | my $flagdefault = 0 ; | ||
| 209 | |||
| 210 | if ( open ( DQD , "<$file" ) ) | ||
| 211 | { | ||
| 212 | while ( my $line = <DQD> ) | ||
| 213 | { | ||
| 214 | chomp $line ; | ||
| 215 | next unless ( $line =~ /^\|.*fastforward/ ) ; | ||
| 216 | |||
| 217 | $line =~ s/^.*fastforward\s+// ; | ||
| 218 | my @dw = split ( /\s+/ , $line ) ; | ||
| 219 | while ( my $zz = shift @dw ) | ||
| 220 | { | ||
| 221 | next if ( $zz =~ /^\-/ ) ; | ||
| 222 | $ffl = $zz ; | ||
| 223 | last ; | ||
| 224 | } | ||
| 225 | |||
| 226 | last if ( $ffl ) ; | ||
| 227 | } | ||
| 228 | close DQD ; | ||
| 229 | } | ||
| 230 | } | ||
| 231 | |||
| 232 | ############################################################################### | ||
| 233 | ############################################################################### | ||
| 234 | ############################################################################### | ||
| 235 | |||
| 236 | my $arg = ( shift || "" ) ; | ||
| 237 | if ( "-n" eq $arg ) | ||
| 238 | { | ||
| 239 | $showlocal = 0 ; | ||
| 240 | } | ||
| 241 | |||
| 242 | ############################################################################### | ||
| 243 | # | ||
| 244 | # only interested in domains for which we legitimately receive mail | ||
| 245 | |||
| 246 | open ( I , "<$vq/control/rcpthosts" ) | ||
| 247 | or die "$vq/control/rcpthosts: $!\n" ; | ||
| 248 | while ( my $line = <I> ) | ||
| 249 | { | ||
| 250 | chomp $line ; | ||
| 251 | $alldom{$line} = 1 ; | ||
| 252 | } | ||
| 253 | close I ; | ||
| 254 | |||
| 255 | open ( I , "<$vq/control/morercpthosts" ) | ||
| 256 | or die "$vq/control/morercpthosts: $!\n" ; | ||
| 257 | while ( my $line = <I> ) | ||
| 258 | { | ||
| 259 | chomp $line ; | ||
| 260 | $alldom{$line} = 1 ; | ||
| 261 | } | ||
| 262 | close I ; | ||
| 263 | |||
| 264 | if ( -f "$vq/control/morercpthosts.cdb" ) | ||
| 265 | { | ||
| 266 | tie ( %MRH , "CDB_File" , "$vq/control/morercpthosts.cdb" ) | ||
| 267 | or die "$vq/control/morercpthosts: $!\n" ; | ||
| 268 | map { $alldom{$_} = 1 } keys %MRH ; | ||
| 269 | untie %MRH ; | ||
| 270 | } | ||
| 271 | |||
| 272 | ############################################################################### | ||
| 273 | # | ||
| 274 | # classify each one as local, virtual, or pass-thru | ||
| 275 | # | ||
| 276 | # note that if the control/locals file does not exist, the name listed | ||
| 277 | # in the control/me file is used as if control/locals contained the | ||
| 278 | # data. | ||
| 279 | |||
| 280 | if ( -f "$vq/control/locals" ) | ||
| 281 | { | ||
| 282 | open ( I , "<$vq/control/locals" ) | ||
| 283 | or die "$vq/control/locals: $!\n" ; | ||
| 284 | while ( my $line = <I> ) | ||
| 285 | { | ||
| 286 | chomp $line ; | ||
| 287 | |||
| 288 | ######################################## | ||
| 289 | # ignore any that we don't actually receive mail for | ||
| 290 | |||
| 291 | next unless ( exists $alldom{$line} ) ; | ||
| 292 | delete $alldom{$line} ; | ||
| 293 | |||
| 294 | ######################################## | ||
| 295 | # mark this one as local | ||
| 296 | |||
| 297 | $ldom{$line} = 1 ; | ||
| 298 | $lfound ++ ; | ||
| 299 | $afound ++ ; | ||
| 300 | } | ||
| 301 | close I ; | ||
| 302 | } | ||
| 303 | elsif ( -f "$vq/control/me" ) | ||
| 304 | { | ||
| 305 | open ( I , "<$vq/control/me" ) | ||
| 306 | or die "$vq/control/me: $!\n" ; | ||
| 307 | while ( my $line = <I> ) | ||
| 308 | { | ||
| 309 | chomp $line ; | ||
| 310 | |||
| 311 | ######################################## | ||
| 312 | # ignore any that we don't actually receive mail for | ||
| 313 | |||
| 314 | next unless ( exists $alldom{$line} ) ; | ||
| 315 | delete $alldom{$line} ; | ||
| 316 | |||
| 317 | ######################################## | ||
| 318 | # mark this one as local | ||
| 319 | |||
| 320 | $ldom{$line} = 1 ; | ||
| 321 | $lfound ++ ; | ||
| 322 | $afound ++ ; | ||
| 323 | } | ||
| 324 | close I ; | ||
| 325 | } | ||
| 326 | |||
| 327 | if ( -f "$vq/control/virtualdomains" ) | ||
| 328 | { | ||
| 329 | open ( I , "<$vq/control/virtualdomains" ) | ||
| 330 | or die "$vq/control/virtualdomains: $!\n" ; | ||
| 331 | while ( my $line = <I> ) | ||
| 332 | { | ||
| 333 | chomp $line ; | ||
| 334 | |||
| 335 | ######################################## | ||
| 336 | # extract the domain name | ||
| 337 | |||
| 338 | my ( $dom , $zu ) = split ( /\s*\:\s*/ , $line ) ; | ||
| 339 | $dom || die "error in $vq/control/virtualdomains\n$line\n" ; | ||
| 340 | |||
| 341 | ######################################## | ||
| 342 | # ignore any that we don't actually receive mail for | ||
| 343 | |||
| 344 | next unless ( exists $alldom{$dom} ) ; | ||
| 345 | delete $alldom{$dom} ; | ||
| 346 | |||
| 347 | ######################################## | ||
| 348 | # check the userid | ||
| 349 | |||
| 350 | if ( $zu eq "alias" ) | ||
| 351 | { | ||
| 352 | ######################################## | ||
| 353 | # if the domain is handled by the qmail "alias" | ||
| 354 | # user, then it needs alias processing | ||
| 355 | |||
| 356 | $adom{$dom} = 1 ; | ||
| 357 | $afound ++ ; | ||
| 358 | } | ||
| 359 | else | ||
| 360 | { | ||
| 361 | ######################################## | ||
| 362 | # mark this one as a virtual domain | ||
| 363 | # and remember the full line, we will need it later | ||
| 364 | |||
| 365 | $vdom{$dom} = $line ; | ||
| 366 | $vfound ++ ; | ||
| 367 | } | ||
| 368 | } | ||
| 369 | close I ; | ||
| 370 | } | ||
| 371 | |||
| 372 | if ( -f "$vq/control/smtproutes" ) | ||
| 373 | { | ||
| 374 | open ( I , "<$vq/control/smtproutes" ) | ||
| 375 | or die "$vq/control/smtproutes: $!\n" ; | ||
| 376 | while ( my $line = <I> ) | ||
| 377 | { | ||
| 378 | chomp $line ; | ||
| 379 | |||
| 380 | ######################################## | ||
| 381 | # extract the domain name | ||
| 382 | |||
| 383 | $line =~ s/\:.*// ; | ||
| 384 | |||
| 385 | ######################################## | ||
| 386 | # ignore lines with no domain (default instruction) | ||
| 387 | |||
| 388 | next unless $line ; | ||
| 389 | |||
| 390 | ######################################## | ||
| 391 | # ignore any that we don't actually receive mail for | ||
| 392 | |||
| 393 | next unless ( exists $alldom{$line} ) ; | ||
| 394 | delete $alldom{$line} ; | ||
| 395 | |||
| 396 | ######################################## | ||
| 397 | # mark this one as an smtproutes domain | ||
| 398 | |||
| 399 | $sdom{$line} = 1 ; | ||
| 400 | } | ||
| 401 | close I ; | ||
| 402 | } | ||
| 403 | |||
| 404 | ############################################################################### | ||
| 405 | # | ||
| 406 | # catch leftovers - domains which come into the machine but are not handled | ||
| 407 | |||
| 408 | for my $d ( sort keys %alldom ) | ||
| 409 | { | ||
| 410 | print "ERROR: $d is listed in rcpthosts/morercpthosts.cdb" | ||
| 411 | . " but is not handled by the server.\n" ; | ||
| 412 | $err ++ ; | ||
| 413 | } | ||
| 414 | |||
| 415 | $err && die "Cannot continue.\n" ; | ||
| 416 | |||
| 417 | ############################################################################### | ||
| 418 | # | ||
| 419 | # start generating output. | ||
| 420 | # | ||
| 421 | # smtproutes domains - if a directory was specified, and it exists, and a | ||
| 422 | # file for the domain exists, read userid's from the file and generate | ||
| 423 | # "userid@domain" lines... otherwise just generate a single "@domain" line. | ||
| 424 | |||
| 425 | for my $d ( sort keys %sdom ) | ||
| 426 | { | ||
| 427 | if ( $smtpr_dir && ( -d $smtpr_dir ) && ( -f "$smtpr_dir/$d" ) ) | ||
| 428 | { | ||
| 429 | open ( I , "<$smtpr_dir/$d" ) | ||
| 430 | or die "Can\'t read $smtpr_dir/$d: $!\n" ; | ||
| 431 | while ( my $line = <I> ) | ||
| 432 | { | ||
| 433 | chomp $line ; | ||
| 434 | $line =~ s/#.*// ; | ||
| 435 | $line =~ s/\@.*// ; | ||
| 436 | $line =~ s/^\s+// ; | ||
| 437 | $line =~ s/\s+$// ; | ||
| 438 | next unless ( $line ) ; | ||
| 439 | push ( @output , "$line\@$d" ) ; | ||
| 440 | } | ||
| 441 | close I ; | ||
| 442 | } | ||
| 443 | else | ||
| 444 | { | ||
| 445 | push ( @output, "\@$d" ) ; | ||
| 446 | } | ||
| 447 | } | ||
| 448 | |||
| 449 | ############################################################################### | ||
| 450 | # | ||
| 451 | # local domains - all system accounts and aliases, in each local domain | ||
| 452 | |||
| 453 | if ( $lfound || $afound ) | ||
| 454 | { | ||
| 455 | ######################################## | ||
| 456 | # need the global "dash" character | ||
| 457 | |||
| 458 | unless ( $gdash ) | ||
| 459 | { | ||
| 460 | open ( GD , "$vq/bin/qmail-showctl |" ) | ||
| 461 | or die "Can\'t run qmail-showctl: $!\n" ; | ||
| 462 | while ( my $gdline = <GD> ) | ||
| 463 | { | ||
| 464 | if ( $gdline =~ /user\-ext delimiter\: (.)/ ) | ||
| 465 | { | ||
| 466 | $gdash = $1 ; | ||
| 467 | last ; | ||
| 468 | } | ||
| 469 | } | ||
| 470 | close GD ; | ||
| 471 | } | ||
| 472 | } | ||
| 473 | |||
| 474 | if ( $lfound ) | ||
| 475 | { | ||
| 476 | ######################################## | ||
| 477 | # turn array into hash for speed | ||
| 478 | |||
| 479 | my %ig = () ; | ||
| 480 | map { $ig{$_} = "" } @uid_ignore ; | ||
| 481 | |||
| 482 | ######################################## | ||
| 483 | # grab a list of system accounts | ||
| 484 | |||
| 485 | while ( my @pw = getpwent() ) | ||
| 486 | { | ||
| 487 | next if ( $pw[2] < $uid_min ) ; # ignore system accounts | ||
| 488 | next if ( $pw[2] > $uid_max ) ; # ignore "nobody" accounts | ||
| 489 | next if ( exists $ig{$pw[2]} ) ; # ignore special accounts | ||
| 490 | next unless ( $pw[2] ) ; # no deliveries to root | ||
| 491 | $lusr{$pw[0]} = 1 ; | ||
| 492 | |||
| 493 | if ( opendir ( D , $pw[7] ) ) | ||
| 494 | { | ||
| 495 | while ( my $f = readdir D ) | ||
| 496 | { | ||
| 497 | next unless ( $f =~ /^\.qmail${gdash}(.+)/ ) ; | ||
| 498 | my $zu = $1 ; | ||
| 499 | $zu =~ s/\:/./g ; | ||
| 500 | $lusr{"$pw[0]${gdash}$zu"} = 1 ; | ||
| 501 | } | ||
| 502 | closedir D ; | ||
| 503 | } | ||
| 504 | } | ||
| 505 | } | ||
| 506 | |||
| 507 | if ( $showlocal && ( $lfound || $afound ) ) | ||
| 508 | { | ||
| 509 | ######################################## | ||
| 510 | # grab a list of aliases | ||
| 511 | |||
| 512 | opendir ( D , "$vq/alias" ) | ||
| 513 | or die "$vq/alias: $!\n" ; | ||
| 514 | while ( my $f = readdir ( D ) ) | ||
| 515 | { | ||
| 516 | next unless ( $f =~ /^\.qmail${gdash}(.*)/ ) ; | ||
| 517 | my $u = $1 ; | ||
| 518 | |||
| 519 | if ( $u eq "default" ) | ||
| 520 | { | ||
| 521 | find_ffl ( "$vq/alias/.qmail${gdash}default" ) ; | ||
| 522 | } | ||
| 523 | else | ||
| 524 | { | ||
| 525 | $u =~ s/\:/./g ; | ||
| 526 | $ausr{$u} = 1 ; | ||
| 527 | } | ||
| 528 | } | ||
| 529 | closedir D ; | ||
| 530 | |||
| 531 | ######################################## | ||
| 532 | # if we found a fastforward file, grab those aliases as well | ||
| 533 | |||
| 534 | if ( $ffl ) | ||
| 535 | { | ||
| 536 | tie ( %ACDB , "CDB_File" , $ffl ) | ||
| 537 | or die "$ffl: $!\n" ; | ||
| 538 | |||
| 539 | for my $k ( keys %ACDB ) | ||
| 540 | { | ||
| 541 | next unless ( $k =~ /^\:(.*)\@(.*)$/ ) ; | ||
| 542 | my ( $au , $ad ) = ( $1 , $2 ) ; | ||
| 543 | |||
| 544 | if ( $ad ) | ||
| 545 | { | ||
| 546 | next unless ( exists ( $adom{$ad} ) | ||
| 547 | || exists ( $ldom{$ad} ) ) ; | ||
| 548 | push ( @output , "$au\@$ad" ) ; | ||
| 549 | } | ||
| 550 | else | ||
| 551 | { | ||
| 552 | $ausr{$au} = 1 ; | ||
| 553 | } | ||
| 554 | } | ||
| 555 | |||
| 556 | untie %ACDB ; | ||
| 557 | } | ||
| 558 | |||
| 559 | ######################################## | ||
| 560 | # generate output. | ||
| 561 | # local domains get every system user AND every alias user | ||
| 562 | |||
| 563 | for my $dd ( sort keys %ldom ) | ||
| 564 | { | ||
| 565 | map { push ( @output , "$_\@$dd" ) } sort keys %lusr ; | ||
| 566 | map { push ( @output , "$_\@$dd" ) } sort keys %ausr ; | ||
| 567 | } | ||
| 568 | |||
| 569 | ######################################## | ||
| 570 | # alias domains get every alias user | ||
| 571 | |||
| 572 | for my $dd ( sort keys %adom ) | ||
| 573 | { | ||
| 574 | map { push ( @output , "$_\@$dd" ) } sort keys %ausr ; | ||
| 575 | } | ||
| 576 | } | ||
| 577 | |||
| 578 | ############################################################################### | ||
| 579 | # | ||
| 580 | # virtual domains - a little more complicated. | ||
| 581 | |||
| 582 | if ( $vfound ) | ||
| 583 | { | ||
| 584 | ####################################################################### | ||
| 585 | # | ||
| 586 | # the virtualdomains file contains a mapping from the domain name to a | ||
| 587 | # userid, which may be a system account and may be a virtual userid | ||
| 588 | # defined in the $vq/users/assign file. | ||
| 589 | # | ||
| 590 | # vpopmail normally uses the domain name as the virtual userid for | ||
| 591 | # this purpose, but we want to be flexible enough to handle other | ||
| 592 | # cases as well. | ||
| 593 | # | ||
| 594 | # in order to deal with this extra layer of indirection, we need to | ||
| 595 | # read the users/cdb file. and because it's a cdb, we don't even need | ||
| 596 | # to read the whole thing- we just need to open it so that we can | ||
| 597 | # search it. | ||
| 598 | |||
| 599 | if ( -f "$vq/users/cdb" ) | ||
| 600 | { | ||
| 601 | tie ( %UCDB , "CDB_File" , "$vq/users/cdb" ) | ||
| 602 | or die "$vq/users/cdb: $!\n" ; | ||
| 603 | $need_untie = 1 ; | ||
| 604 | } | ||
| 605 | else | ||
| 606 | { | ||
| 607 | %UCDB = () ; | ||
| 608 | } | ||
| 609 | |||
| 610 | my $wc = ( $UCDB{""} || "" ) ; | ||
| 611 | |||
| 612 | ####################################################################### | ||
| 613 | # | ||
| 614 | # now we have the list of users/assign virtual users (if any), we need | ||
| 615 | # to identify the home directory, real or virutal, for the user. | ||
| 616 | |||
| 617 | for my $dom ( sort keys %vdom ) | ||
| 618 | { | ||
| 619 | $vdom{$dom} =~ /\:(.*)$/ ; | ||
| 620 | my $usr = $1 ; | ||
| 621 | |||
| 622 | my %vusr = () ; | ||
| 623 | my $dir = "" ; | ||
| 624 | my $vpopmail = 0 ; | ||
| 625 | |||
| 626 | ######################################## | ||
| 627 | # note that in cases where a given "userid" exists as both a | ||
| 628 | # system userid and a virtual userid, the virtual userid takes | ||
| 629 | # precedence (according to the qmail-lspawn man page.) | ||
| 630 | # this is why we saved the home directories above. | ||
| 631 | |||
| 632 | if ( exists $UCDB{"!$usr$wc"} ) | ||
| 633 | { | ||
| 634 | my @w = split ( /\0/ , $UCDB{"!$usr$wc"} ) ; | ||
| 635 | $dir = ( $w[3] || die "mis-formed users/cdb data:" | ||
| 636 | . " $usr\n" ) ; | ||
| 637 | $dash = ( $w[4] || "" ) ; | ||
| 638 | } | ||
| 639 | else | ||
| 640 | { | ||
| 641 | if ( my @pw = getpwnam ( $usr ) ) | ||
| 642 | { | ||
| 643 | $dir = $pw[7] ; | ||
| 644 | } | ||
| 645 | } | ||
| 646 | |||
| 647 | die "ERROR: virtual user \"$usr\" not found" | ||
| 648 | . " (for virtualdomain \"$dom\")\n" | ||
| 649 | unless ( $dir ) ; | ||
| 650 | |||
| 651 | ######################################## | ||
| 652 | # now we know which directory to look in. check for a | ||
| 653 | # ".qmail-default" file. if it contains "vdelievermail", we | ||
| 654 | # know that vpopmail is in control here... and if the | ||
| 655 | # vdelivermail line also has "bounce-no-mailbox", we need | ||
| 656 | # the list of individual users. otherwise we can just | ||
| 657 | # blindly accept the entire domain. | ||
| 658 | |||
| 659 | unless ( -r $dir ) | ||
| 660 | { | ||
| 661 | print STDERR "Can\'t read directory $dir" | ||
| 662 | . " (for vpopmail domain \"$dom\")\n" ; | ||
| 663 | next ; | ||
| 664 | } | ||
| 665 | |||
| 666 | if ( -f "$dir/.qmail${dash}default" ) | ||
| 667 | { | ||
| 668 | open ( V , "<$dir/.qmail${dash}default" ) | ||
| 669 | or die "$dir/.qmail${dash}default: $!\n" ; | ||
| 670 | |||
| 671 | while ( my $line = <V> ) | ||
| 672 | { | ||
| 673 | if ( $line =~ /vdelivermail.*(bounce\-no\-mailbox|delete)/ ) | ||
| 674 | { | ||
| 675 | $vpopmail = 1 ; | ||
| 676 | } | ||
| 677 | } | ||
| 678 | close V ; | ||
| 679 | } | ||
| 680 | |||
| 681 | ######################################## | ||
| 682 | # if we need the users... | ||
| 683 | |||
| 684 | if ( $vpopmail ) | ||
| 685 | { | ||
| 686 | ######################################## | ||
| 687 | # if we don't already know where it is, | ||
| 688 | # find the vpopmail user's "/bin" directory. | ||
| 689 | |||
| 690 | unless ( $vhome ) | ||
| 691 | { | ||
| 692 | my @pw = getpwnam ( $vuser ) | ||
| 693 | or die "getpwnam($vuser): $!\n" ; | ||
| 694 | $vhome = $pw[7] ; | ||
| 695 | $vbin = "$vhome/bin" ; | ||
| 696 | $vinc = "$vhome/include" ; | ||
| 697 | |||
| 698 | die "Can\'t find $vbin/vuserinfo: $!\n" | ||
| 699 | unless ( -e "$vbin/vuserinfo" ) ; | ||
| 700 | } | ||
| 701 | |||
| 702 | ######################################## | ||
| 703 | # if we don't already know, find out if | ||
| 704 | # vpopmail was built with --enable-qmail-ext | ||
| 705 | |||
| 706 | if ( $vqext eq "?" ) | ||
| 707 | { | ||
| 708 | $vqext = "no" ; | ||
| 709 | open ( VCH , "<$vinc/vpopmail_config.h" ) | ||
| 710 | or die ( "Can\'t read " | ||
| 711 | . "$vinc/vpopmail_config.h: $!\n" ) ; | ||
| 712 | |||
| 713 | while ( my $vcl = <VCH> ) | ||
| 714 | { | ||
| 715 | next unless ( $vcl =~ /^#define QMAIL_EXT 1/ ) ; | ||
| 716 | $vqext = "yes" ; | ||
| 717 | last ; | ||
| 718 | } | ||
| 719 | close VCH ; | ||
| 720 | debug "vqext=$vqext\n" ; | ||
| 721 | } | ||
| 722 | |||
| 723 | ######################################## | ||
| 724 | # run "vuserinfo -D {domain}" to get a list of | ||
| 725 | # actual mailboxes within the domain. | ||
| 726 | |||
| 727 | debug "/----- $vbin/vuserinfo -D $dom\n" ; | ||
| 728 | open ( VP , "$vbin/vuserinfo -D $dom |" ) | ||
| 729 | or die "Can\'t execute $vbin/vuserinfo: $!\n" ; | ||
| 730 | while ( my $line = <VP> ) | ||
| 731 | { | ||
| 732 | debug $line ; | ||
| 733 | next unless ( $line =~ /^name\:\s+(\S+)/ ) ; | ||
| 734 | my $u = $1 ; | ||
| 735 | $vusr{$u} = $u ; | ||
| 736 | debug "\t[$u]" ; | ||
| 737 | if ( $vqext eq "yes" ) | ||
| 738 | { | ||
| 739 | $vusr{"$u${dash}default"} = | ||
| 740 | "$u${dash}default" ; | ||
| 741 | debug " [$u${dash}default]" ; | ||
| 742 | } | ||
| 743 | debug "\n" ; | ||
| 744 | } | ||
| 745 | close VP ; | ||
| 746 | debug "\\-----\n" ; | ||
| 747 | |||
| 748 | ######################################## | ||
| 749 | # run "valias -s {domain}" to get a list of | ||
| 750 | # aliases within the domain. | ||
| 751 | |||
| 752 | debug "/----- $vbin/valias -s $dom\n" ; | ||
| 753 | open ( VP , "$vbin/valias -s $dom |" ) | ||
| 754 | or die "Can\'t execute $vbin/valias: $!\n" ; | ||
| 755 | while ( my $line = <VP> ) | ||
| 756 | { | ||
| 757 | debug $line ; | ||
| 758 | next unless ( $line =~ /^(.+?)\@/ ) ; | ||
| 759 | my $u = $1 ; | ||
| 760 | $vusr{$u} = $u ; | ||
| 761 | debug "\t[$u]\n" ; | ||
| 762 | } | ||
| 763 | close VP ; | ||
| 764 | debug "\\-----\n" ; | ||
| 765 | |||
| 766 | ######################################## | ||
| 767 | # read the directory itself. any .qmail-___ files are | ||
| 768 | # also valid aliases within the domain, even if | ||
| 769 | # "valias" doesn't seem to know about them. | ||
| 770 | |||
| 771 | opendir ( D , $dir ) | ||
| 772 | or die "$dir: $!\n" ; | ||
| 773 | while ( my $f = readdir ( D ) ) | ||
| 774 | { | ||
| 775 | if ( $f =~ /^\.qmail${dash}(.*)/ ) | ||
| 776 | { | ||
| 777 | my $u = $1 ; | ||
| 778 | next if ( $u eq "default" ) ; | ||
| 779 | $u =~ s/\:/./g ; | ||
| 780 | $vusr{$u} = $u ; | ||
| 781 | } | ||
| 782 | } | ||
| 783 | closedir D ; | ||
| 784 | |||
| 785 | ######################################## | ||
| 786 | # now %vusr contains a list of all valid email | ||
| 787 | # addresses within the domain. | ||
| 788 | |||
| 789 | map { push ( @output , "$_\@$dom" ) ; | ||
| 790 | debug "{$_\@$dom}\n" } sort keys %vusr ; | ||
| 791 | } | ||
| 792 | else | ||
| 793 | { | ||
| 794 | ######################################## | ||
| 795 | # virtual domain, but either it's not handled by | ||
| 796 | # vpopmail, or there is something going on with | ||
| 797 | # itother than "bounce-no-mailbox", which means | ||
| 798 | # we don't need the full list of mailboxes. | ||
| 799 | |||
| 800 | push ( @output , "\@$dom" ) ; | ||
| 801 | } | ||
| 802 | } | ||
| 803 | |||
| 804 | if ( $need_untie ) | ||
| 805 | { | ||
| 806 | untie %UCDB ; | ||
| 807 | $need_untie = 0 ; | ||
| 808 | } | ||
| 809 | } | ||
| 810 | |||
| 811 | ############################################################################### | ||
| 812 | # | ||
| 813 | # if we make it this far, we have no errors and can print the list. | ||
| 814 | # we need to filter out any "exclude" entries | ||
| 815 | |||
| 816 | my %ex = () ; | ||
| 817 | map { $ex{lc $_} = "" } @exclude ; | ||
| 818 | |||
| 819 | for my $k ( @output ) | ||
| 820 | { | ||
| 821 | $k = lc $k ; | ||
| 822 | unless ( exists $ex{$k} ) | ||
| 823 | { | ||
| 824 | print "$k\n" ; | ||
| 825 | } | ||
| 826 | } | ||
diff --git a/files/arts/software/Code/elektropost/qmail-smtpd.c.force.tls.patch b/files/arts/software/Code/elektropost/qmail-smtpd.c.force.tls.patch new file mode 100644 index 0000000..8eb4132 --- /dev/null +++ b/files/arts/software/Code/elektropost/qmail-smtpd.c.force.tls.patch | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | *** qmail-smtpd.c.orig Thu Jan 9 16:24:52 2014 | ||
| 2 | --- qmail-smtpd.c Thu Jan 9 16:30:52 2014 | ||
| 3 | *************** | ||
| 4 | *** 42,47 **** | ||
| 5 | --- 42,48 ---- | ||
| 6 | int tls_verify(); | ||
| 7 | void tls_nogateway(); | ||
| 8 | int ssl_rfd = -1, ssl_wfd = -1; /* SSL_get_Xfd() are broken */ | ||
| 9 | + int forcetls = 0; | ||
| 10 | #endif | ||
| 11 | |||
| 12 | int safewrite(fd,buf,len) int fd; char *buf; int len; | ||
| 13 | *************** | ||
| 14 | *** 700,705 **** | ||
| 15 | --- 701,709 ---- | ||
| 16 | if (!stralloc_0(&proto)) die_nomem(); | ||
| 17 | protocol = proto.s; | ||
| 18 | |||
| 19 | + /* Check if we have to force users to use ssl when authenticating */ | ||
| 20 | + if(control_readint(&forcetls,"control/smtpforcetls") == -1) die_control(); | ||
| 21 | + | ||
| 22 | /* have to discard the pre-STARTTLS HELO/EHLO argument, if any */ | ||
| 23 | dohelo(remotehost); | ||
| 24 | } | ||
| 25 | *************** | ||
| 26 | *** 894,899 **** | ||
| 27 | --- 898,912 ---- | ||
| 28 | out("503 auth not available (#5.3.3)\r\n"); | ||
| 29 | return; | ||
| 30 | } | ||
| 31 | + #ifdef TLS | ||
| 32 | + if (forcetls && !ssl) | ||
| 33 | + { | ||
| 34 | + out("538 auth not available without TLS (#5.3.3)\r\n"); | ||
| 35 | + flush(); | ||
| 36 | + die_read(); | ||
| 37 | + } | ||
| 38 | + #endif | ||
| 39 | + | ||
| 40 | if (authd) { err_authd(); return; } | ||
| 41 | if (seenmail) { err_authmail(); return; } | ||
| 42 | |||
diff --git a/files/arts/software/Code/elektropost/qmail-smtpd.c.privacy.patch b/files/arts/software/Code/elektropost/qmail-smtpd.c.privacy.patch new file mode 100644 index 0000000..d9ba4fd --- /dev/null +++ b/files/arts/software/Code/elektropost/qmail-smtpd.c.privacy.patch | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | --- qmail-smtpd.c 2009-07-21 23:32:27.000000000 +0200 | ||
| 2 | +++ qmail-smtpd.c 2009-07-21 23:30:48.000000000 +0200 | ||
| 3 | @@ -34,7 +34,7 @@ | ||
| 4 | unsigned int databytes = 0; | ||
| 5 | int timeout = 1200; | ||
| 6 | unsigned int spfbehavior = 0; | ||
| 7 | - | ||
| 8 | +static int authd = 0; | ||
| 9 | const char *protocol = "SMTP"; | ||
| 10 | |||
| 11 | #ifdef TLS | ||
| 12 | @@ -614,7 +614,10 @@ | ||
| 13 | qp = qmail_qp(&qqt); | ||
| 14 | out("354 go ahead\r\n"); | ||
| 15 | |||
| 16 | - received(&qqt,protocol,local,remoteip,remotehost,remoteinfo,fakehelo); | ||
| 17 | + if(!authd) | ||
| 18 | + received(&qqt,protocol,local,remoteip,remotehost,remoteinfo,fakehelo); | ||
| 19 | + else | ||
| 20 | + received(&qqt,protocol,local,remoteinfo,local,0,local); | ||
| 21 | spfreceived(); | ||
| 22 | blast(&hops); | ||
| 23 | hops = (hops >= MAXHOPS); | ||
| 24 | @@ -839,7 +842,6 @@ | ||
| 25 | char **childargs; | ||
| 26 | substdio ssup; | ||
| 27 | char upbuf[128]; | ||
| 28 | -int authd = 0; | ||
| 29 | |||
| 30 | int authgetl(void) { | ||
| 31 | int i; | ||
diff --git a/files/arts/software/Code/elektropost/tcp.smtp b/files/arts/software/Code/elektropost/tcp.smtp new file mode 100644 index 0000000..81e47fa --- /dev/null +++ b/files/arts/software/Code/elektropost/tcp.smtp | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | # Das hier sind die rulez fuer den tcpserver (ucspi) der den qmail-smtpd startet | ||
| 2 | # als relay fungiert <host> nur fuer localhost und <insert-local-nets here>. | ||
| 3 | # Alle anderen duerfen zwar senden, aber nur an domains, die in | ||
| 4 | # /var/qmail/control/rcpthosts stehen. | ||
| 5 | # | ||
| 6 | # Diese Datei muss mittels | ||
| 7 | # | ||
| 8 | # "cat /usr/local/vpopmail/etc/tcp.smtp | tcprules /usr/local/vpopmail/etc/tcp.smtp.cdb /usr/local/vpopmail/etc/tcp.smtp.tmp" | ||
| 9 | # | ||
| 10 | # "kompiliert" werden. | ||
| 11 | # | ||
| 12 | :allow | ||
| 13 | #127.0.0.1:allow,RELAYCLIENT="" | ||
| 14 | #192.168.0.1:allow,RELAYCLIENT="" | ||
diff --git a/files/arts/software/Code/elektropost/validrcptto.cdb.patch.new b/files/arts/software/Code/elektropost/validrcptto.cdb.patch.new new file mode 100644 index 0000000..bbd1eb4 --- /dev/null +++ b/files/arts/software/Code/elektropost/validrcptto.cdb.patch.new | |||
| @@ -0,0 +1,153 @@ | |||
| 1 | --- Makefile.old Mon Dec 4 03:33:09 2006 | ||
| 2 | +++ Makefile Mon Dec 4 03:35:01 2006 | ||
| 3 | @@ -1558,15 +1558,15 @@ | ||
| 4 | |||
| 5 | qmail-smtpd: \ | ||
| 6 | load qmail-smtpd.o rcpthosts.o commands.o timeoutread.o \ | ||
| 7 | -timeoutwrite.o ip.o ipme.o ipalloc.o strsalloc.o control.o constmap.o \ | ||
| 8 | +timeoutwrite.o ip.o ipme.o ipalloc.o subfderr.o strsalloc.o control.o constmap.o \ | ||
| 9 | received.o date822fmt.o now.o qmail.o spf.o dns.o cdb.a fd.a wait.a \ | ||
| 10 | -datetime.a getln.a open.a sig.a case.a env.a stralloc.a alloc.a substdio.a \ | ||
| 11 | +datetime.a getln.a open.a sig.a case.a env.a strerr.a stralloc.a alloc.a substdio.a \ | ||
| 12 | error.a str.a fs.a auto_qmail.o base64.o socket.lib dns.lib | ||
| 13 | ./load qmail-smtpd rcpthosts.o commands.o timeoutread.o \ | ||
| 14 | - timeoutwrite.o ip.o ipme.o ipalloc.o strsalloc.o control.o \ | ||
| 15 | + timeoutwrite.o ip.o ipme.o ipalloc.o subfderr.o strsalloc.o control.o \ | ||
| 16 | tls.o ssl_timeoutio.o ndelay.a -L/usr/lib -lssl -lcrypto \ | ||
| 17 | constmap.o received.o date822fmt.o now.o qmail.o spf.o dns.o cdb.a \ | ||
| 18 | - fd.a wait.a datetime.a getln.a open.a sig.a case.a env.a stralloc.a \ | ||
| 19 | + fd.a wait.a datetime.a getln.a open.a sig.a case.a env.a strerr.a stralloc.a \ | ||
| 20 | alloc.a substdio.a error.a fs.a auto_qmail.o base64.o \ | ||
| 21 | str.a `cat socket.lib` `cat dns.lib` | ||
| 22 | |||
| 23 | @@ -1579,7 +1579,7 @@ | ||
| 24 | substdio.h alloc.h auto_qmail.h control.h received.h constmap.h \ | ||
| 25 | error.h ipme.h ip.h ipalloc.h strsalloc.h ip.h gen_alloc.h ip.h qmail.h \ | ||
| 26 | substdio.h str.h fmt.h scan.h byte.h case.h env.h now.h datetime.h \ | ||
| 27 | -exit.h rcpthosts.h timeoutread.h timeoutwrite.h commands.h wait.h spf.h \ | ||
| 28 | +exit.h rcpthosts.h timeoutread.h timeoutwrite.h commands.h wait.h spf.h cdb.h uint32.h \ | ||
| 29 | fd.h base64.h | ||
| 30 | ./compile qmail-smtpd.c | ||
| 31 | |||
| 32 | --- qmail-smtpd.c.old Mon Dec 4 03:36:22 2006 | ||
| 33 | +++ qmail-smtpd.c Mon Dec 4 03:44:49 2006 | ||
| 34 | @@ -26,6 +26,8 @@ | ||
| 35 | #include "wait.h" | ||
| 36 | #include "fd.h" | ||
| 37 | #include "spf.h" | ||
| 38 | +#include "strerr.h" | ||
| 39 | +#include "cdb.h" | ||
| 40 | |||
| 41 | #define AUTHCRAM | ||
| 42 | #define MAXHOPS 100 | ||
| 43 | @@ -99,6 +101,7 @@ | ||
| 44 | int err_noauth() { out("504 auth type unimplemented (#5.5.1)\r\n"); return -1; } | ||
| 45 | int err_authabrt() { out("501 auth exchange cancelled (#5.0.0)\r\n"); return -1; } | ||
| 46 | int err_input() { out("501 malformed auth input (#5.5.4)\r\n"); return -1; } | ||
| 47 | +void err_vrt() { out("553 sorry, this recipient is not in my validrcptto list (#5.7.1)\r\n"); } | ||
| 48 | |||
| 49 | stralloc greeting = {0}; | ||
| 50 | stralloc spflocal = {0}; | ||
| 51 | @@ -139,6 +142,7 @@ | ||
| 52 | int bmfok = 0; | ||
| 53 | stralloc bmf = {0}; | ||
| 54 | struct constmap mapbmf; | ||
| 55 | +int vrtfd = -1; | ||
| 56 | |||
| 57 | void setup() | ||
| 58 | { | ||
| 59 | @@ -155,6 +159,9 @@ | ||
| 60 | |||
| 61 | if (rcpthosts_init() == -1) die_control(); | ||
| 62 | |||
| 63 | + vrtfd = open_read("control/validrcptto.cdb"); | ||
| 64 | + if (-1 == vrtfd) if (errno != error_noent) die_control(); | ||
| 65 | + | ||
| 66 | bmfok = control_readfile(&bmf,"control/badmailfrom",0); | ||
| 67 | if (bmfok == -1) die_control(); | ||
| 68 | if (bmfok) | ||
| 69 | @@ -269,6 +276,60 @@ | ||
| 70 | return 0; | ||
| 71 | } | ||
| 72 | |||
| 73 | +int vrtcheck() | ||
| 74 | +{ | ||
| 75 | + int j,k,r; | ||
| 76 | + uint32 dlen; | ||
| 77 | + stralloc laddr = {0}; | ||
| 78 | + | ||
| 79 | + stralloc user = {0}; | ||
| 80 | + stralloc adom = {0}; | ||
| 81 | + stralloc utry = {0}; | ||
| 82 | + | ||
| 83 | + if (-1 == vrtfd) return 1; | ||
| 84 | + | ||
| 85 | + /* lowercase whatever we were sent */ | ||
| 86 | + if (!stralloc_copy(&laddr,&addr)) die_nomem() ; | ||
| 87 | + case_lowerb(laddr.s,laddr.len); | ||
| 88 | + | ||
| 89 | + /* exact match? */ | ||
| 90 | + r = cdb_seek(vrtfd,laddr.s,laddr.len-1,&dlen) ; | ||
| 91 | + if (r>0) return r; | ||
| 92 | + | ||
| 93 | + j = byte_rchr(laddr.s,laddr.len,'@'); | ||
| 94 | + if (j < laddr.len) | ||
| 95 | + { | ||
| 96 | + /* start "-default" search loop */ | ||
| 97 | + stralloc_copyb(&user,laddr.s,j) ; | ||
| 98 | + stralloc_copyb(&adom,laddr.s+j,laddr.len-j-1); | ||
| 99 | + | ||
| 100 | + while(1) | ||
| 101 | + { | ||
| 102 | + k = byte_rchr(user.s,user.len,'-'); | ||
| 103 | + if (k >= user.len) break ; | ||
| 104 | + | ||
| 105 | + user.len = k+1; | ||
| 106 | + stralloc_cats(&user,"default"); | ||
| 107 | + | ||
| 108 | + stralloc_copy(&utry,&user); | ||
| 109 | + stralloc_cat (&utry,&adom); | ||
| 110 | + stralloc_0(&utry); | ||
| 111 | + | ||
| 112 | + r = cdb_seek(vrtfd,utry.s,utry.len-1,&dlen); | ||
| 113 | + if (r>0) return r; | ||
| 114 | + | ||
| 115 | + user.len = k ; | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + /* try "@domain" */ | ||
| 119 | + r = cdb_seek(vrtfd,laddr.s+j,laddr.len-j-1,&dlen) ; | ||
| 120 | + if (r>0) return r; | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + return 0; | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | + | ||
| 127 | int addrallowed() | ||
| 128 | { | ||
| 129 | int r; | ||
| 130 | @@ -280,7 +341,6 @@ | ||
| 131 | return r; | ||
| 132 | } | ||
| 133 | |||
| 134 | - | ||
| 135 | int seenmail = 0; | ||
| 136 | int flagbarf; /* defined if seenmail */ | ||
| 137 | int flagbarfspf; | ||
| 138 | @@ -402,8 +462,14 @@ | ||
| 139 | if (!stralloc_cats(&addr,relayclient)) die_nomem(); | ||
| 140 | if (!stralloc_0(&addr)) die_nomem(); | ||
| 141 | } | ||
| 142 | - else | ||
| 143 | + else { | ||
| 144 | if (!addrallowed()) { err_nogateway(); return; } | ||
| 145 | + if (!vrtcheck()) { | ||
| 146 | + strerr_warn4("qmail-smtpd: not in validrcptto: ",addr.s, | ||
| 147 | + " at ",remoteip,0); | ||
| 148 | + err_vrt(); return; | ||
| 149 | + } | ||
| 150 | + } | ||
| 151 | if (!stralloc_cats(&rcptto,"T")) die_nomem(); | ||
| 152 | if (!stralloc_cats(&rcptto,addr.s)) die_nomem(); | ||
| 153 | if (!stralloc_0(&rcptto)) die_nomem(); | ||
diff --git a/files/arts/software/Code/vchat-client b/files/arts/software/Code/vchat-client new file mode 100755 index 0000000..ab1c6f3 --- /dev/null +++ b/files/arts/software/Code/vchat-client | |||
| Binary files differ | |||
