Browse Source

postgresql and postfixadmin

tags/v1.0.0
Robin Thoni 7 years ago
commit
46c15eac59
100 changed files with 7381 additions and 0 deletions
  1. 2
    0
      .gitignore
  2. 2
    0
      README.md
  3. 35
    0
      docker-compose.yml
  4. 35
    0
      postfixadmin/Dockerfile
  5. 59
    0
      postfixadmin/apache2.conf
  6. 52
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/README.TXT
  7. BIN
      postfixadmin/postfixadmin-3.0/ADDITIONS/change_password.tgz
  8. 112
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/cleanupdirs.pl
  9. 40
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/convert-passwd-to-postfixadmin.pl
  10. 8
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/Changelog
  11. 7
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/README-ES.txt
  12. 7
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/README.txt
  13. 36
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/cyrus-mailbox-postcreation.pl
  14. 36
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/cyrus-mailbox-postdelete.pl
  15. 33
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/cyrus-mailbox-postedit.pl
  16. 31
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/cyrus.conf
  17. 77
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/delete-mailq-by-domain.pl
  18. 141
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/fetchmail.pl
  19. 231
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/import_users_from_csv.py
  20. 124
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/mailbox_remover.pl
  21. 167
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/mkeveryone.pl
  22. 111
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/pfa_maildir_cleanup.pl
  23. 62
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/postfixadmin-domain-postdeletion.sh
  24. 61
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/postfixadmin-mailbox-postcreation.sh
  25. 77
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/postfixadmin-mailbox-postdeletion.sh
  26. 151
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/quota_usage.pl
  27. 38
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/INSTALL
  28. 40
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/LICENSE.txt
  29. 70
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/README
  30. 44
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/common.php
  31. 22
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/config.php.sample
  32. 20
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/README.Debian
  33. 27
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/changelog
  34. 1
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/conffiles
  35. 19
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/control
  36. 11
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/copyright
  37. 4
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/docs
  38. 1
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/files
  39. 3
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/postfixadmin-squirrelmail.dirs
  40. 5
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/postinst
  41. 56
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/rules
  42. 102
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/functions.inc.php
  43. 27
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/index.php
  44. 6
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/build.sh
  45. BIN
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/cs_CZ/LC_MESSAGES/postfixadmin.mo
  46. 132
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/cs_CZ/LC_MESSAGES/postfixadmin.po
  47. BIN
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/da_DK/LC_MESSAGES/postfixadmin.mo
  48. 127
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/da_DK/LC_MESSAGES/postfixadmin.po
  49. BIN
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/de_DE/LC_MESSAGES/postfixadmin.mo
  50. 127
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/de_DE/LC_MESSAGES/postfixadmin.po
  51. BIN
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/hu_HU/LC_MESSAGES/postfixadmin.mo
  52. 135
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/hu_HU/LC_MESSAGES/postfixadmin.po
  53. 129
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/it_IT/LC_MESSAGES/postfixadmin.po
  54. BIN
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/nl_NL/LC_MESSAGES/postfixadmin.mo
  55. 131
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/nl_NL/LC_MESSAGES/postfixadmin.po
  56. BIN
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/pl_PL/LC_MESSAGES/postfixadmin.mo
  57. 132
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/pl_PL/LC_MESSAGES/postfixadmin.po
  58. BIN
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/pt_BR/LC_MESSAGES/postfixadmin.mo
  59. 127
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/pt_BR/LC_MESSAGES/postfixadmin.po
  60. 127
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/po/postfixadmin.po
  61. 128
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/postfixadmin_changepass.php
  62. 165
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/postfixadmin_forward.php
  63. 157
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/postfixadmin_vacation.php
  64. 61
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/setup.php
  65. 2
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/version
  66. 185
    0
      postfixadmin/postfixadmin-3.0/ADDITIONS/virtualmaildel.php
  67. 1015
    0
      postfixadmin/postfixadmin-3.0/CHANGELOG.TXT
  68. 39
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/BACKUP_MX.txt
  69. 214
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/DOVECOT.txt
  70. 36
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/FAQ.txt
  71. 50
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/HORDE.txt
  72. 17
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/LANGUAGE.txt
  73. 26
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/POSTFIXADMIN.txt
  74. 176
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/POSTFIX_CONF.txt
  75. 44
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/SECURITY.txt
  76. 16
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/SUPERADMIN.txt
  77. 111
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/UPGRADE.txt
  78. 2
    0
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/README.txt
  79. BIN
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-admin-create-alias.jpg
  80. BIN
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-admin-create-domain.jpg
  81. BIN
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-admin-create-mailbox.jpg
  82. BIN
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-admin-domain-list.jpg
  83. BIN
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-admin-virtual-list.jpg
  84. BIN
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-inital-welcome.jpg
  85. BIN
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-mail-admin-login.jpg
  86. BIN
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-user-change-forward.jpg
  87. BIN
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-user-overview.jpg
  88. BIN
      postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-user-vacation.jpg
  89. 281
    0
      postfixadmin/postfixadmin-3.0/GPL-LICENSE.TXT
  90. 159
    0
      postfixadmin/postfixadmin-3.0/INSTALL.TXT
  91. 46
    0
      postfixadmin/postfixadmin-3.0/LICENSE.TXT
  92. 512
    0
      postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/FILTER_README
  93. 222
    0
      postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/INSTALL.TXT
  94. 22
    0
      postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/index.php
  95. 22
    0
      postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/asterisk-email.txt
  96. 55
    0
      postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/facebook.txt
  97. 43
    0
      postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/mail-myself.txt
  98. 110
    0
      postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/mailing-list.txt
  99. 105
    0
      postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/spam.txt
  100. 0
    0
      postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/teodor-smtp-envelope-headers.txt

+ 2
- 0
.gitignore View File

@@ -0,0 +1,2 @@
1
+*.swp
2
+/data/postgresql/data

+ 2
- 0
README.md View File

@@ -0,0 +1,2 @@
1
+postfixadmin default admin:
2
+root@example.org:toor42

+ 35
- 0
docker-compose.yml View File

@@ -0,0 +1,35 @@
1
+version: '2'
2
+
3
+services:
4
+    database:
5
+        build: ./postgresql
6
+        container_name: mx-postgresql
7
+        networks:
8
+            internal.docker:
9
+                aliases:
10
+                    - postgresql.internal.docker
11
+        volumes:
12
+            - ./data/postgresql/data:/var/lib/postgresql/data
13
+        ports:
14
+            - "34000:5432"
15
+        environment:
16
+            - POSTGRES_USER=postfixadmin
17
+            - POSTGRES_PASSWORD=pg_password
18
+
19
+    postfixadmin:
20
+        build: ./postfixadmin
21
+        container_name: mx-postfixadmin
22
+        networks:
23
+            internal.docker:
24
+                aliases:
25
+                    - postfixadmin.internal.docker
26
+        ports:
27
+            - "34001:80"
28
+        environment:
29
+            - DB_HOST=postgresql.internal.docker
30
+            - DB_USER=postfixadmin
31
+            - DB_PASSWORD=pg_password
32
+            - DB_DB=postfixadmin
33
+
34
+networks:
35
+    internal.docker:

+ 35
- 0
postfixadmin/Dockerfile View File

@@ -0,0 +1,35 @@
1
+FROM debian:jessie
2
+
3
+# FROM https://github.com/ZHAJOR/Docker-Apache-2.4-Php-5.6-for-Laravel
4
+MAINTAINER Robin Thoni <robin@rthoni.com>
5
+
6
+COPY run.sh /run.sh
7
+
8
+RUN apt-get update && apt-get -y install\
9
+        apache2=2.4.*\
10
+        libapache2-mod-php5\
11
+        php5\
12
+        php5-mcrypt\
13
+        php5-pgsql\
14
+        php5-mysql\
15
+        php5-gd\
16
+        php5-curl\
17
+        php5-imap &&\
18
+        apt-get clean &&\
19
+        /usr/sbin/a2enmod rewrite &&\
20
+        rm -rf /var/www/html &&\
21
+        mkdir -p /var/lock/apache2 /var/run/apache2 /var/log/apache2 /var/www/html &&\
22
+        chown -R www-data:www-data /var/lock/apache2 /var/run/apache2 /var/log/apache2 /var/www/html &&\
23
+        chmod -v +x /run.sh &&\
24
+        ln -sf /dev/stderr /var/log/apache2/error.log &&\
25
+        ln -sf /dev/stdout /var/log/apache2/access.log
26
+
27
+COPY apache2.conf /etc/apache2/apache2.conf
28
+
29
+EXPOSE 80
30
+
31
+COPY ./postfixadmin-3.0/ /var/www/html/
32
+RUN chmod -R 777 /var/www/html/templates_c
33
+#VOLUME ["/var/www/html"]
34
+
35
+CMD ["/run.sh"]

+ 59
- 0
postfixadmin/apache2.conf View File

@@ -0,0 +1,59 @@
1
+# see http://sources.debian.net/src/apache2/2.4.10-1/debian/config-dir/apache2.conf
2
+
3
+Mutex file:/var/lock/apache2 default
4
+PidFile /var/run/apache2/apache2.pid
5
+Timeout 300
6
+KeepAlive On
7
+MaxKeepAliveRequests 100
8
+KeepAliveTimeout 5
9
+User www-data
10
+Group www-data
11
+HostnameLookups Off
12
+ErrorLog /var/log/apache2/error.log
13
+LogLevel warn
14
+
15
+IncludeOptional mods-enabled/*.load
16
+IncludeOptional mods-enabled/*.conf
17
+
18
+# ports.conf
19
+Listen 80
20
+<IfModule ssl_module>
21
+    Listen 443
22
+</IfModule>
23
+<IfModule mod_gnutls.c>
24
+    Listen 443
25
+</IfModule>
26
+
27
+DocumentRoot "/var/www/html/"
28
+
29
+<Directory />
30
+    Options FollowSymLinks
31
+    AllowOverride None
32
+    Require all denied
33
+</Directory>
34
+
35
+<Directory /var/www/html/>
36
+    Options FollowSymLinks
37
+    AllowOverride All
38
+    Require all granted
39
+</Directory>
40
+
41
+
42
+
43
+LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
44
+LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
45
+LogFormat "%h %l %u %t \"%r\" %>s %O" common
46
+LogFormat "%{Referer}i -> %U" referer
47
+LogFormat "%{User-agent}i" agent
48
+
49
+CustomLog /var/log/apache2/access.log combined
50
+
51
+<FilesMatch \.php$>
52
+    SetHandler application/x-httpd-php
53
+</FilesMatch>
54
+
55
+# Multiple DirectoryIndex directives within the same context will add
56
+# to the list of resources to look for rather than replace
57
+# https://httpd.apache.org/docs/current/mod/mod_dir.html#directoryindex
58
+DirectoryIndex disabled
59
+DirectoryIndex index.php index.html

+ 52
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/README.TXT View File

@@ -0,0 +1,52 @@
1
+#
2
+# Postfix Admin ADDITIONS
3
+#
4
+
5
+BEFORE YOU START
6
+----------------
7
+
8
+**** ALL THESE SCRIPTS ARE CREATED BY THIRD PARTIES ****
9
+     **** THEY ARE AS IS, USE AT YOUR OWN RISK! ****
10
+
11
+ADDITIONS
12
+---------
13
+
14
+In this directory you will find additional scripts that are build by others.
15
+
16
+- change_password.tgz
17
+by George Vieira <george at citadelcomputer dot com dot au>
18
+SquirrelMail plugin to change your passwor
19
+
20
+- cleanupdirs.pl
21
+by jared bell <jared at beol dot net>
22
+Displays a list of mailboxes that need to be deleted
23
+
24
+- mailbox_remover.pl
25
+by Petr Znojemsky
26
+Deletes all unused mailboxes
27
+
28
+- mkeveryone.pl
29
+by Joshua Preston
30
+Generate an 'everybody' alias for a domain.
31
+
32
+- pfa_maildir_cleanup.pl
33
+by Stephen Fulton <sfulton at esoteric dot ca>
34
+Deletes all unused mailboxes
35
+
36
+- postfixadmin-0.3-1.4.tar.gz
37
+by Florian Kimmerl <info at spacekoeln dot de>
38
+The Postfixadmin SquirrelMail plugin let users change their virtual alias,
39
+vacation status/message and password.
40
+
41
+- virtualmaildel.php
42
+by George Vieira <george at citadelcomputer dot com dot au>
43
+Deletes all unused mailboxes
44
+
45
+- postfixadmin-mailbox-postcreation.sh
46
+- postfixadmin-mailbox-postdeletion.sh
47
+- postfixadmin-domain-postdeletion.sh
48
+by Troels Arvin <troels@arvin.dk>
49
+Examples of scripts relevant to the optional 
50
+$CONF['mailbox_postcreation_script'],
51
+$CONF['mailbox_postdeletion_script'] and
52
+$CONF['domain_postdeletion_script']  configuration options.

BIN
postfixadmin/postfixadmin-3.0/ADDITIONS/change_password.tgz View File


+ 112
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/cleanupdirs.pl View File

@@ -0,0 +1,112 @@
1
+#!/usr/bin/perl -w
2
+
3
+################################################################################
4
+#
5
+# cleanupdirs 1.2 by jared bell <jared@beol.net>
6
+#
7
+# display/remove maildir & domains directory tree's not listed in the postfix
8
+# mysql database. currently setup for use with postfixadmin, but can be
9
+# adapted. edit settings where it says 'change settings as needed.' by default
10
+# this program will display a list of directories which need deleted, nothing
11
+# is actually deleted. to change this behavior, look into the command line
12
+# arguments.
13
+#
14
+# command line arguments:
15
+#   --delete
16
+#       force automatic deletion of directories. instead of displaying a list
17
+#       of deleted directories, they will be logged in the specified logfile.
18
+#   --print
19
+#       display deleted directories as well as log them. only valid when
20
+#       '--delete' has been specified.
21
+#
22
+# settings:
23
+#   $root_path = "/home/vmail";
24
+#       if maildir is '/home/vmail/domain.tld/user' then '/home/vmail' is the
25
+#       $root_path. if your maildirs are '/home/vmail/user@domain.tld' then
26
+#       this program will need to be modified in order to work right.
27
+#   $logfile = "/var/log/removed_maildirs.log";
28
+#       the logfile to use when $delete_old_dirs is set to 1
29
+#   $db_* = "*";
30
+#       sets the host, port, database, user and pass to your mysql server
31
+#
32
+# version history:
33
+#   1.2 - removed uneeded settings. added '--print' command line argument
34
+#   1.1 - added '--delete' command line argument
35
+#   1.0 - initial release
36
+#
37
+################################################################################
38
+
39
+use strict;
40
+use DBI;
41
+use File::Path;
42
+use Getopt::Long;
43
+
44
+### change settings as needed, see notes above #################################
45
+our $root_path = "/home/vmail";
46
+our $logfile = "/var/log/removed_maildirs.log";
47
+our $db_hostname = "localhost";
48
+our $db_port = "3306"; # this script currently supports MySQL only
49
+our $db_database = "postfix";
50
+our $db_username = "someuser";
51
+our $db_password = "somepass";
52
+
53
+# instead of changing this script, you can put your settings to /etc/mail/postfixadmin/cleanupdirs.conf
54
+# just use perl syntax there to fill the variables listed above (without the "our" keyword). Example:
55
+# $db_username = 'mail';
56
+if (-f "/etc/mail/postfixadmin/cleanupdirs.conf") {
57
+	require "/etc/mail/postfixadmin/cleanupdirs.conf";
58
+}
59
+
60
+################################################################################
61
+
62
+### begin program ##############################################################
63
+my(@dirs_to_delete, $logfile_open);
64
+my $delete_old_dirs = 0; # do not delete by default, use cmdline to change this
65
+my $print_also = 0; # also print items when deleting, use cmdline to change this
66
+GetOptions ('delete' => \$delete_old_dirs, 'print' => \$print_also);
67
+my $conn_info = "DBI:mysql:database=$db_database;hostname=$db_hostname;port=$db_port";
68
+my $dbh = DBI->connect($conn_info, $db_username, $db_password)
69
+  or die $DBI::errstr;
70
+opendir DOMAINDIR, $root_path
71
+  or die "Unable to access directory '$root_path' ($!)";
72
+foreach my $domain_dir (sort readdir DOMAINDIR) {
73
+  next if $domain_dir =~ /^\./; # skip dotted dirs
74
+  next if (! -d "$root_path/$domain_dir"); # skip everything that is not a directory
75
+  my $full_domain_dir = "$root_path/$domain_dir";
76
+  opendir USERDIR, $full_domain_dir
77
+    or die "Unable to access directory '$full_domain_dir' ($!)";
78
+  foreach my $user_dir (sort readdir USERDIR) {
79
+    next if $user_dir =~ /^\./; # skip dotted dirs
80
+    push @dirs_to_delete, "$full_domain_dir/$user_dir"
81
+      if &check_dir("SELECT maildir FROM mailbox WHERE maildir = ?",
82
+        "$domain_dir/$user_dir/"); # end slash needed for checkdir
83
+  }
84
+  push @dirs_to_delete, $full_domain_dir
85
+    if &check_dir("SELECT domain FROM domain WHERE domain = ?", $domain_dir);
86
+}
87
+closedir USERDIR;
88
+closedir DOMAINDIR;
89
+$dbh->disconnect;
90
+if (@dirs_to_delete) {
91
+  foreach my $to_delete (@dirs_to_delete) {
92
+    if ($delete_old_dirs == 1) {
93
+      $logfile_open = open LOGFILE, ">> $logfile"
94
+        or die "Unable to append logfile '$logfile' ($!)"
95
+          unless $logfile_open;
96
+      rmtree $to_delete;
97
+      print LOGFILE localtime() . " Deleting directory '$to_delete'\n";
98
+      print localtime() . " Deleting directory '$to_delete'\n"
99
+        if $print_also;
100
+    } else {
101
+      print localtime() . " Need to delete directory '$to_delete'\n";
102
+    }
103
+  }
104
+}
105
+close LOGFILE if $logfile_open;
106
+sub check_dir {
107
+  my($query, $dir) = @_;
108
+  my $sth = $dbh->prepare($query);
109
+  my $num_rows = $sth->execute($dir);
110
+  $sth->finish;
111
+  ($num_rows eq "0E0") ? 1 : 0;
112
+}

+ 40
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/convert-passwd-to-postfixadmin.pl View File

@@ -0,0 +1,40 @@
1
+#!/usr/bin/perl -w
2
+#
3
+# Postfix Admin 
4
+# 
5
+# LICENSE 
6
+# This source file is subject to the GPL license that is bundled with  
7
+# this package in the file LICENSE.TXT. 
8
+# 
9
+# Further details on the project are available at http://postfixadmin.sf.net 
10
+# 
11
+# @version $Id: convert-passwd-to-postfixadmin.pl 1558 2013-11-10 15:57:32Z christian_boltz $ 
12
+# @license GNU GPL v2 or later. 
13
+#
14
+#
15
+# Really crude attempt at taking all users from a local 
16
+# passwd file (/etc/shadow) and creating postfixadmin mailboxes for them.
17
+#
18
+# The script outputs some SQL, which you need to then insert into your database
19
+# as appropriate.
20
+#
21
+# Notes:
22
+#  1) Change $mydomain and $true as required.
23
+#  2) Ideally it should parse /etc/passwd, or call the getpw()? function and
24
+#     populate someone's name if known.
25
+#  3) There's plenty of room for improvement.
26
+#
27
+# Original author: David Goodwin <david at palepurple-co-uk> - 2007/10/05.
28
+#
29
+use strict;
30
+
31
+open(FH, '</etc/shadow') or die ('Cannot open shadow file; you need to be root - ' . $!);
32
+my $mydomain = "test.com";
33
+my $true = "t"; # t for pgsql; 1 for mysql
34
+foreach(<FH>) { 
35
+    my ($username, $password) = split(':', $_);
36
+    next if $password eq '!';
37
+    next if $password eq '*';
38
+    my $maildir = "$username\@$mydomain/";
39
+    print "insert into mailbox (username, password, domain, active, maildir) values ('$username', '$password', '$mydomain', $true, '$maildir');\n";
40
+}

+ 8
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/Changelog View File

@@ -0,0 +1,8 @@
1
+
2
+Version 0.1 -- 26/10/2009
3
+---------------------------
4
+
5
+  * Public Release.
6
+  * Postcreation, Postdeletion and Postedit hooks.
7
+
8
+

+ 7
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/README-ES.txt View File

@@ -0,0 +1,7 @@
1
+
2
+Configuración
3
+-------------
4
+
5
+ - Edita el fichero cyrus.conf y modifica las variables $cyrus_*. El usuario debe tener permisos sobre todas las cuentas.
6
+ - Edita los ficheros cyrus-*.pl y cambia la ruta de cyrus.conf (linea require '/path/to/cyrus.conf';)
7
+

+ 7
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/README.txt View File

@@ -0,0 +1,7 @@
1
+
2
+Configuration
3
+-------------
4
+
5
+ - Edit cyrus.conf and set $cyrus_* variables correctly. User must have permission over all accounts.
6
+ - Edit cyrus-*.pl and change path to cyrus.conf (require '/path/to/cyrus.conf'; line)
7
+

+ 36
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/cyrus-mailbox-postcreation.pl View File

@@ -0,0 +1,36 @@
1
+#!/usr/bin/perl 
2
+
3
+# Cyrus Mailbox creation
4
+#
5
+# Iñaki Rodriguez (irodriguez@virtualminds.es / irodriguez@ackstorm.es)
6
+# 
7
+#  LICENSE
8
+#  This source file is subject to the GPL license that is bundled with
9
+#  this package in the file LICENSE.TXT.
10
+#
11
+# (26/10/2009) 
12
+
13
+use Cyrus::IMAP::Admin;
14
+require '/etc/mail/postfixadmin/cyrus.conf';
15
+use strict;
16
+use vars qw($cyrus_user $cyrus_password $cyrus_host);
17
+
18
+my %opts;
19
+
20
+my $mailbox = mailbox_name($ARGV[0]);
21
+
22
+my $client = Cyrus::IMAP::Admin->new($cyrus_host);
23
+die_on_error($client);
24
+
25
+$opts{-user} = $cyrus_user;
26
+$opts{-password} = $cyrus_password;
27
+
28
+$client->authenticate(%opts);
29
+die_on_error($client);
30
+
31
+$client->create($mailbox);
32
+die_on_error($client);
33
+
34
+$client->setquota($mailbox,'STORAGE',scalar $ARGV[3]) if ($ARGV[3] > 0);
35
+die_on_error($client);
36
+

+ 36
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/cyrus-mailbox-postdelete.pl View File

@@ -0,0 +1,36 @@
1
+#!/usr/bin/perl 
2
+
3
+# Cyrus Mailbox deletion
4
+#
5
+# Iñaki Rodriguez (irodriguez@virtualminds.es / irodriguez@ackstorm.es)
6
+# 
7
+#  LICENSE
8
+#  This source file is subject to the GPL license that is bundled with
9
+#  this package in the file LICENSE.TXT.
10
+#
11
+# (26/10/2009) 
12
+
13
+use Cyrus::IMAP::Admin;
14
+require '/etc/mail/postfixadmin/cyrus.conf';
15
+use strict;
16
+use vars qw($cyrus_user $cyrus_password $cyrus_host);
17
+
18
+my %opts;
19
+
20
+my $mailbox = mailbox_name($ARGV[0]);
21
+
22
+my $client = Cyrus::IMAP::Admin->new($cyrus_host);
23
+die_on_error($client);
24
+
25
+$opts{-user} = $cyrus_user;
26
+$opts{-password} = $cyrus_password;
27
+
28
+$client->authenticate(%opts);
29
+die_on_error($client);
30
+
31
+$client->setacl($mailbox,$cyrus_user => 'all');
32
+die_on_error($client);
33
+
34
+$client->deletemailbox($mailbox);
35
+die_on_error($client);
36
+

+ 33
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/cyrus-mailbox-postedit.pl View File

@@ -0,0 +1,33 @@
1
+#!/usr/bin/perl 
2
+
3
+# Cyrus Mailbox edition
4
+#
5
+# Iñaki Rodriguez (irodriguez@virtualminds.es / irodriguez@ackstorm.es)
6
+#
7
+#  LICENSE
8
+#  This source file is subject to the GPL license that is bundled with
9
+#  this package in the file LICENSE.TXT.
10
+#
11
+# (26/10/2009)
12
+
13
+use Cyrus::IMAP::Admin;
14
+require '/etc/mail/postfixadmin/cyrus.conf';
15
+use strict;
16
+use vars qw($cyrus_user $cyrus_password $cyrus_host);
17
+
18
+my %opts;
19
+
20
+my $mailbox = mailbox_name($ARGV[0]);
21
+
22
+my $client = Cyrus::IMAP::Admin->new($cyrus_host);
23
+die_on_error($client);
24
+
25
+$opts{-user} = $cyrus_user;
26
+$opts{-password} = $cyrus_password;
27
+
28
+$client->authenticate(%opts);
29
+die_on_error($client);
30
+
31
+$client->setquota($mailbox,'STORAGE',scalar $ARGV[3]) if ($ARGV[3] > 0);
32
+die_on_error($client);
33
+

+ 31
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/cyrus/cyrus.conf View File

@@ -0,0 +1,31 @@
1
+#!/usr/bin/perl
2
+
3
+# Config
4
+
5
+$cyrus_user = 		'cyrus';
6
+$cyrus_password =	'cyruspass';
7
+$cyrus_host =		'localhost';
8
+
9
+# unixhierarchysep => 1 (yes) / 0 (no)
10
+$unixhierarchysep =	1;
11
+
12
+# Common routines
13
+
14
+sub mailbox_name {
15
+	my $mailbox = shift;
16
+	
17
+	if($unixhierarchysep) {
18
+	        $mailbox = 'user/'.$ARGV[0];
19
+	} else {
20
+        	$mailbox = 'user.'.$ARGV[0];
21
+	}
22
+
23
+	return $mailbox;
24
+}
25
+
26
+sub die_on_error {
27
+	my $cyradm = shift;
28
+	if($cyradm->error) { die $cyradm->error; }
29
+}
30
+1;
31
+

+ 77
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/delete-mailq-by-domain.pl View File

@@ -0,0 +1,77 @@
1
+#!/usr/bin/perl
2
+
3
+
4
+use strict;
5
+use warnings;
6
+use Getopt::Long;
7
+
8
+
9
+$ENV{'PATH'} = "/sbin:/bin:/usr/sbin:/usr/bin";
10
+
11
+my ($domain);
12
+my $list = 0;
13
+
14
+(help()) if (!$ARGV[0]);
15
+GetOptions ('l' => \$list, 'd=s' => \$domain) or (help());
16
+
17
+
18
+(list_queue()) if ($list == 1);
19
+
20
+(delete_queue()) if ($domain);
21
+
22
+
23
+sub delete_queue {
24
+my $ids = `postqueue -p`;
25
+my @ids = split /\n/, $ids;
26
+
27
+for my $id (@ids) {
28
+        next if $id =~ /^[\s\(-]/;
29
+        chomp $id;
30
+        next unless $id;
31
+        $id =~ s/(.*?)\**\s.*/$1/;
32
+        #print "$id\n";
33
+        my $match = `postcat -q $id | grep '$domain'`;
34
+        next unless $match;
35
+        #print "Deleting ID: $id\n";
36
+        my $saida = `postsuper -d $id`;
37
+        print $saida;
38
+}
39
+
40
+}
41
+
42
+
43
+
44
+
45
+sub list_queue {
46
+my %hash_mail = ();
47
+my @queue = `postqueue -p`;
48
+my($queue,$key,$total);
49
+
50
+
51
+foreach $queue(@queue) {
52
+        chomp $queue;
53
+        if ( $queue =~ /^\s+.*\@(.*)/ ) {
54
+                $hash_mail{$1}++;
55
+        }
56
+}
57
+print"\nTOTAL\tTO\n";
58
+print"-----
59
+----------------------------------------------------------------\n";
60
+foreach $key (reverse sort { $hash_mail{$a} <=> $hash_mail{$b}} keys
61
+%hash_mail) {
62
+        $total += $hash_mail{$key};
63
+        print"$hash_mail{$key} - $key\n";
64
+}
65
+print"\n$total -> TOTAL QUEUE\n";
66
+
67
+}
68
+
69
+
70
+sub help {
71
+print "Usage $0 -l	            To list a row of E-mail
72
+Usage $0 -d domain.com   To delete the mensgens the Domain\n"; 
73
+}
74
+
75
+
76
+
77
+

+ 141
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/fetchmail.pl View File

@@ -0,0 +1,141 @@
1
+#!/usr/bin/perl
2
+
3
+use DBI;
4
+use MIME::Base64;
5
+# use Data::Dumper;
6
+use File::Temp qw/ mkstemp /;
7
+use Sys::Syslog;
8
+# require liblockfile-simple-perl
9
+use LockFile::Simple qw(lock trylock unlock);
10
+
11
+######################################################################
12
+########## Change the following variables to fit your needs ##########
13
+
14
+# database settings
15
+
16
+# database backend - uncomment one of these
17
+our $db_type = 'Pg';
18
+#my $db_type = 'mysql';
19
+
20
+# host name
21
+our $db_host="127.0.0.1";
22
+# database name
23
+our $db_name="postfix";
24
+# database username
25
+our $db_username="mail";
26
+# database password
27
+our $db_password="CHANGE_ME!";
28
+
29
+# instead of changing this script, you can put your settings to /etc/mail/postfixadmin/fetchmail.conf
30
+# just use perl syntax there to fill the variables listed above (without the "our" keyword). Example:
31
+# $db_username = 'mail';
32
+if (-f "/etc/mail/postfixadmin/fetchmail.conf") {
33
+	require "/etc/mail/postfixadmin/fetchmail.conf";
34
+}
35
+
36
+
37
+#################### Don't change anything below! ####################
38
+######################################################################
39
+
40
+openlog("fetchmail-all", "pid", "mail");
41
+
42
+sub log_and_die {
43
+	my($message) = @_;
44
+  syslog("err", $message);
45
+  die $message;
46
+}
47
+
48
+# read options and arguments
49
+
50
+$configfile = "/etc/fetchmail-all/config";
51
+
52
+@ARGS1 = @ARGV;
53
+
54
+while ($_ = shift @ARGS1) {
55
+    if (/^-/) {
56
+        if (/^--config$/) {
57
+            $configfile = shift @ARGS1
58
+        }
59
+    }
60
+}
61
+
62
+$run_dir="/var/run/fetchmail";
63
+
64
+# use specified config file
65
+if (-e $configfile) {
66
+    do $configfile;
67
+}
68
+
69
+if($db_type eq "Pg" || $db_type eq "mysql") {
70
+	$dsn = "DBI:$db_type:database=$db_name;host=$db_host";
71
+} else {
72
+	log_and_die "unsupported db_type $db_type";
73
+}
74
+
75
+$lock_file=$run_dir . "/fetchmail-all.lock";
76
+
77
+$lockmgr = LockFile::Simple->make(-autoclean => 1, -max => 1);
78
+$lockmgr->lock($lock_file) || log_and_die "can't lock ${lock_file}";
79
+
80
+# database connect
81
+$dbh = DBI->connect($dsn, $db_username, $db_password) || log_and_die "cannot connect the database";
82
+
83
+if($db_type eq "Pg") {
84
+	$sql_cond = "active = 't' AND date_part('epoch',now())-date_part('epoch',date)";
85
+} elsif($db_type eq "mysql") {
86
+	$sql_cond = "active = 1 AND unix_timestamp(now())-unix_timestamp(date)";
87
+}
88
+
89
+$sql = "
90
+	SELECT id,mailbox,src_server,src_auth,src_user,src_password,src_folder,fetchall,keep,protocol,mda,extra_options,usessl, sslcertck, sslcertpath, sslfingerprint
91
+	FROM fetchmail
92
+	WHERE $sql_cond  > poll_time*60
93
+	";
94
+
95
+my (%config);
96
+map{
97
+	my ($id,$mailbox,$src_server,$src_auth,$src_user,$src_password,$src_folder,$fetchall,$keep,$protocol,$mda,$extra_options,$usessl,$sslcertck,$sslcertpath,$sslfingerprint)=@$_;
98
+
99
+	syslog("info","fetch ${src_user}@${src_server} for ${mailbox}");
100
+
101
+	$cmd="user '${src_user}' there with password '".decode_base64($src_password)."'";
102
+	$cmd.=" folder '${src_folder}'" if ($src_folder);
103
+	$cmd.=" mda ".$mda if ($mda);
104
+
105
+#	$cmd.=" mda \"/usr/local/libexec/dovecot/deliver -m ${mailbox}\"";
106
+	$cmd.=" is '${mailbox}' here";
107
+
108
+	$cmd.=" keep" if ($keep);
109
+	$cmd.=" fetchall" if ($fetchall);
110
+	$cmd.=" ssl" if ($usessl);
111
+	$cmd.=" sslcertck" if($sslcertck);
112
+	$cmd.=" sslcertpath $sslcertpath" if ($sslcertck && $sslcertpath);
113
+	$cmd.=" sslfingerprint \"$sslfingerprint\"" if ($sslfingerprint);
114
+	$cmd.=" ".$extra_options if ($extra_options);
115
+
116
+	$text=<<TXT;
117
+set postmaster "postmaster"
118
+set nobouncemail
119
+set no spambounce
120
+set properties ""
121
+set syslog
122
+
123
+poll ${src_server} with proto ${protocol}
124
+	$cmd
125
+
126
+TXT
127
+
128
+  ($file_handler, $filename) = mkstemp( "/tmp/fetchmail-all-XXXXX" ) or log_and_die "cannot open/create fetchmail temp file";
129
+  print $file_handler $text;
130
+  close $file_handler;
131
+
132
+  $ret=`/usr/bin/fetchmail -f $filename -i $run_dir/fetchmail.pid`;
133
+
134
+  unlink $filename;
135
+
136
+  $sql="UPDATE fetchmail SET returned_text=".$dbh->quote($ret).", date=now() WHERE id=".$id;
137
+  $dbh->do($sql);
138
+}@{$dbh->selectall_arrayref($sql)};
139
+
140
+$lockmgr->unlock($lock_file);
141
+closelog();

+ 231
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/import_users_from_csv.py View File

@@ -0,0 +1,231 @@
1
+#!/usr/bin/env python
2
+# -*- coding: utf-8 -*-
3
+# Script takes a CSV list of users and does a 'bulk' insertion into mysql.
4
+#
5
+# Copyright (C) 2009 Simone Piccardi
6
+#
7
+# This program is free software; you can redistribute it and/or modify
8
+# it under the terms of the GNU General Public License as published by
9
+# the Free Software Foundation; either version 2 of the License, or (at
10
+# your option) any later version.
11
+#
12
+# This program is distributed in the hope that it will be useful, but
13
+# WITHOUT ANY WARRANTY; without even the implied warranty of
14
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
+# General Public License for more details.
16
+#
17
+# You should have received a copy of the GNU General Public License
18
+# along with this program; if not, write to the Free Software
19
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20
+#
21
+
22
+import csv
23
+import getopt
24
+import sys
25
+import re
26
+import time
27
+import random, string
28
+from datetime import datetime
29
+from crypt import crypt
30
+try:
31
+    import MySQLdb 
32
+except ImportError ,e:
33
+    print 'Cannot import the needed MySQLdb module, you must install it'
34
+    print 'on Debian systems just use the command'
35
+    print '   apt-get install python-mysqldb'
36
+
37
+def usage():
38
+    print "Usage: inspostadmusers.py [options] users.csv"
39
+    print "       -h        print this help"
40
+    print "       -t        test run, do not insert, just print"
41
+    print "       -u        DB user"
42
+    print "       -p        DB password"
43
+    print "       -D        DB name"
44
+    print "       -H        DB host"
45
+    print "       -q        Quota in Mb (0 => no limit)"
46
+    print "       -n        char in seed"
47
+    print "       -d        debug info on"
48
+    print "       -A        create default alias for each domain"
49
+    print
50
+    print "the users.csv file must contains the user list with a line"
51
+    print "for each user, first line should be a title line with at least"
52
+    print "the following column names: "
53
+    print " * user     - user part of the email (like user in user@domain.com)"
54
+    print " * password - cleartext password"
55
+    print " * domain   - domain name (like 'domain.com')"
56
+    print " * name     - full user name ('Name Surname')"
57
+    print
58
+    print "the 'name' column is optional, other columns will be ignored"
59
+    print
60
+    print "Known restrictions:"
61
+    print "* this script only works with MySQL"
62
+    print "* mailbox paths are hardcoded to domain/username/"
63
+
64
+
65
+# option parsing
66
+try:
67
+    opts, args = getopt.getopt(sys.argv[1:], 'u:p:d:D:H:htdA')
68
+    optval={}
69
+    for opt, val in opts:
70
+        if opt == "-h":
71
+            usage()
72
+            sys.exit(0)
73
+        else:
74
+            optval[opt]=val
75
+except getopt.GetoptError:
76
+    usage()
77
+    sys.exit(2)
78
+
79
+#
80
+# Setup DB connection
81
+#
82
+MYSQLDB="postfixadmin"
83
+MYSQLUSER="postfixadmin"
84
+MYSQLPASSWORD=""
85
+MYSQLHOST="localhost"
86
+
87
+# settings by command line options
88
+if optval.has_key('-u'):
89
+    MYSQLUSER = optval['-u']
90
+if optval.has_key('-p'):
91
+    MYSQLPASSWORD = optval['-p']
92
+if optval.has_key('-D'):
93
+    MYSQLDB = optval['-D']
94
+if optval.has_key('-H'):
95
+    MYSQLHOST = optval['-H']
96
+
97
+if optval.has_key('-q'):
98
+    quota = optval['-q']
99
+else:
100
+    quota = 0
101
+
102
+if optval.has_key('-n'):
103
+    seed_len = optval['-n']
104
+else:
105
+    seed_len = 8
106
+
107
+# check arguments, only the user list file must be present
108
+if len(args) !=1:
109
+    print 'Need just one argument'
110
+    usage()
111
+    sys.exit(1)
112
+
113
+# MySQL connection (skipped in test run)
114
+if optval.has_key('-t'):
115
+    print "Test Run"
116
+else:
117
+    try:
118
+        connection = MySQLdb.connect(host=MYSQLHOST, user=MYSQLUSER, 
119
+                                     db=MYSQLDB, passwd=MYSQLPASSWORD)
120
+    except MySQLdb.MySQLError, e:
121
+        print "Database connection error"
122
+        print e
123
+        sys.exit(1)
124
+ 
125
+    cursor = connection.cursor()
126
+
127
+#
128
+# Main body
129
+#
130
+NOW = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
131
+
132
+# read and convert CSV data
133
+lista = csv.DictReader(open(args[0]))
134
+
135
+def gen_seed(seed_len, chars):
136
+    return '$1$'+''.join([random.choice(chars) for _ in xrange(seed_len)])+'$'
137
+
138
+def insert_record(cursor,table,record):
139
+    columns = record.keys()
140
+    query = "INSERT INTO " + table + "(" + ','.join(columns) + ") VALUES (" + ','.join(len(columns)*['%s']) + ")"
141
+    try:
142
+        cursor.execute(query, record.values())
143
+        return 0
144
+    except MySQLdb.MySQLError, e:
145
+        print "Database insertion error"
146
+        print e
147
+        print "Record was:"
148
+        print record.values()
149
+        print "Query was:"
150
+        print query
151
+
152
+# defining default values for tables (mailbox, alias and domain)
153
+mailbox = {
154
+    'created': NOW, 
155
+    'modified': NOW,
156
+    'active': 1,
157
+    'quota': quota
158
+    }
159
+aliases = {
160
+    'created':  NOW,
161
+    'modified': NOW,
162
+    'active':   1
163
+    }
164
+domain = {
165
+    'description': "",
166
+    'aliases': 0,
167
+    'mailboxes': 0,
168
+    'quota': 0,
169
+    'transport': 'virtual',
170
+    'backupmx': 0,
171
+    'created': NOW,
172
+    'modified': NOW,
173
+    'active': 1
174
+}
175
+
176
+# list of default alias
177
+def_alias = ['abuse','hostmaster','postmaster','webmaster'] 
178
+
179
+domain_list = {}
180
+chars = string.letters + string.digits
181
+
182
+# loop over the CSV 
183
+for row in lista:
184
+    # create domain if it does not exists
185
+    if domain_list.has_key(row["domain"]):
186
+        if optval.has_key('-d'):
187
+            print "Domain " + row["domain"] + "already exixts"
188
+    else:
189
+        domain_list[row["domain"]] = 1
190
+        domain['domain'] = row["domain"]
191
+        if optval.has_key('-t'):
192
+            print "Inserting domain"
193
+            print domain
194
+        else:
195
+            insert_record(cursor,'domain',domain)
196
+            if optval.has_key('-A'):
197
+                for i in def_alias:
198
+                    aliases['address']= i+'@'+row["domain"]
199
+                    aliases['goto']= aliases['address']
200
+                    aliases['domain'] = row["domain"]
201
+                    if optval.has_key('-t'):
202
+                        print "Inserting alias"
203
+                        print aliases
204
+                    else:
205
+                        insert_record(cursor,'alias',aliases)
206
+
207
+    # build query data for mailbox table
208
+    mailbox['username']=row["user"]+'@'+row["domain"]
209
+    encpass=crypt(row["password"], gen_seed(seed_len,chars))
210
+    mailbox['password'] = encpass
211
+    mailbox['name'] = row["name"]
212
+    mailbox['maildir'] = row["domain"]+'/'+row["user"]+'/'
213
+    mailbox['local_part'] =row["user"]
214
+    mailbox['domain'] = row["domain"]
215
+
216
+    # build query data for alias table
217
+    aliases['address']= mailbox['username']
218
+    aliases['goto']= mailbox['username']
219
+    aliases['domain'] = row["domain"]
220
+
221
+    # inserting data for mailbox (and relate alias)
222
+    if optval.has_key('-t'):
223
+        print "Inserting mailbox"
224
+        print mailbox
225
+        print aliases
226
+    else:
227
+        insert_record(cursor,'mailbox',mailbox)
228
+        insert_record(cursor,'alias',aliases)
229
+
230
+
231
+sys.exit(0)

+ 124
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/mailbox_remover.pl View File

@@ -0,0 +1,124 @@
1
+#!/usr/bin/perl
2
+#
3
+# by Petr Znojemsky (c) 2004
4
+# Mailbox remover 0.1a 23/10/2004 - the very first version for MySQL
5
+# removes maildirs from disk when they are not found in a database
6
+#
7
+# Added subdir support and pause --- Alan Batie 2007
8
+# Lists directories to be deleted then pauses for 5 seconds for chance to abort
9
+# $Id: mailbox_remover.pl 211 2007-11-11 23:36:46Z christian_boltz $
10
+#
11
+# All your maildirs or other directories could be accidentally removed.
12
+# Use it at own risk. No warranties!
13
+
14
+use strict;
15
+use DBI;
16
+use File::Path;
17
+
18
+##########
19
+# Set these variables according to your configuration
20
+
21
+# when mailboxes are removed, save their tarballs here
22
+my $archdir="/var/archive/mailboxes";
23
+
24
+# expected to support z option, tweak invocation if you want different
25
+my $archcmd="/usr/bin/tar";
26
+
27
+# trailing slash not needed
28
+my $maildir_path="/var/mail";
29
+# find out if we need to check subdirs for mailboxes or just maildir_path
30
+# $CONF['domain_path'] = 'YES';
31
+my $pfadmin_config="/usr/local/www/postfixadmin/config.inc.php";
32
+
33
+# database information
34
+my $host="localhost";
35
+my $port="3306";
36
+my $userid="dbuser";
37
+my $passwd="dbpw";
38
+my $db="dbname";
39
+############
40
+
41
+my $connectionInfo="DBI:mysql:database=$db;$host:$port";
42
+# make connection to database
43
+my $dbh = DBI->connect($connectionInfo,$userid,$passwd);
44
+# prepare and execute query
45
+my $query = "SELECT maildir FROM mailbox";
46
+my $sth = $dbh->prepare($query);
47
+$sth->execute();
48
+
49
+# assign fields to variables
50
+my ($db_maildir, %db_maildirs);
51
+$sth->bind_columns(\$db_maildir);
52
+
53
+# load up directory list
54
+while($sth->fetch()) {
55
+    $db_maildirs{$db_maildir} = 1;
56
+}
57
+
58
+$sth->finish();
59
+# disconnect from database
60
+$dbh->disconnect;
61
+
62
+# 
63
+# find out if we need to check subdirs for mailboxes or just maildir_path
64
+# $CONF['domain_path'] = 'YES';
65
+#
66
+my $use_subdirs = 0;
67
+open(CONFIG, "<$pfadmin_config") || die "Can't open '$pfadmin_config': $!\n";
68
+while(<CONFIG>) {
69
+    if (/\$CONF\['domain_path'\] *= *'([^']*)'/) {
70
+	$use_subdirs = ($1 =~ /yes/i);
71
+    }
72
+}
73
+close(CONFIG);
74
+
75
+# store maildir list to %directories
76
+# key is path, value is username to use in archive file
77
+my %directories;
78
+opendir(DIR, $maildir_path) || die "Cannot open dir $maildir_path: $!\n";
79
+foreach my $name (readdir(DIR)) {
80
+    next if ($name eq '.' || $name eq '..' || ! -d "$maildir_path/$name");
81
+
82
+    if ($use_subdirs) {
83
+	opendir(SUBDIR, "$maildir_path/$name") || die "Cannot open dir $maildir_path/$name: $!\n";
84
+	foreach my $subname (readdir(SUBDIR)) {
85
+	    next if ($subname eq '.' || $subname eq '..' || ! -d "$maildir_path/$name/$subname");
86
+	    # db entry has trailing slash...
87
+	    if (!defined($db_maildirs{"$name/$subname/"})) {
88
+	        print "marking $maildir_path/$name/$subname for deletion.\n";
89
+		$directories{"$name/$subname"} = "$name-$subname";
90
+	    }
91
+	}
92
+	closedir(SUBDIR);
93
+    } else {
94
+	# db entry has trailing slash...
95
+	if (!defined($db_maildirs{"$name/"})) {
96
+	    print "marking $maildir_path/$name for deletion.\n";
97
+	    $directories{"$name"} = $name;
98
+	}
99
+    }
100
+}
101
+closedir(DIR);
102
+
103
+print "Ctrl-C in 5 seconds to abort before removal starts...\n";
104
+sleep 5;
105
+
106
+my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
107
+# yyyymmddhhmm
108
+my $tstamp = sprintf("%04d%02d%02d%02d%02d", $year+1900, $mon+1, $mday, $hour, $min);
109
+
110
+# compare two arrays and erase maildirs not found in database
111
+chdir $maildir_path || die "Can't change to maildir '$maildir_path': $!\n";;
112
+my @args;
113
+foreach my $maildir (keys(%directories)) {
114
+    my $archive = "$archdir/$directories{$maildir}-$tstamp.tgz";
115
+    # quick permissions check
116
+    open(TOUCH, ">$archive") || die "Can't create archive file $archive: $!\n";
117
+    close(TOUCH);
118
+    print "Archiving $maildir\n";
119
+    @args = ($archcmd, "cvzf", $archive, $maildir);
120
+	system(@args) == 0 or die "Creating archive for $maildir failed: $?"
121
+
122
+    rmtree($maildir);
123
+    print localtime() . " $maildir has been deleted.\n";
124
+}

+ 167
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/mkeveryone.pl View File

@@ -0,0 +1,167 @@
1
+#!/usr/bin/perl
2
+#
3
+# Generate an 'everybody' alias for a domain.
4
+#
5
+# Create the file /etc/mkeveryone.conf
6
+# chmod 640 /etc/mkeveryone.conf
7
+# Example of mkeveryone.conf
8
+#
9
+# userid=postfix
10
+# passwd=postfix
11
+# db=postfix
12
+# host=localhost
13
+# port=3306
14
+# domain=domain.tld
15
+# target=everybody@domain.tld
16
+# ignore=vacation@domain.tld
17
+# ignore=spam@domain.tld
18
+# ignore=newsletter@domain.tld
19
+# ignore=root@domain.tld
20
+#
21
+# Save this file in, for example, /usr/local/sbin/mkeveryone.pl
22
+# chmod 750 /usr/local/sbin/mkeveryone.pl
23
+#
24
+# Run the script!
25
+#
26
+use DBI;
27
+use Time::Local;
28
+use POSIX qw(EAGAIN);
29
+use Fcntl;
30
+use IO;
31
+use IO::File;
32
+
33
+my $timeNow=time();
34
+
35
+my $DATFILE     = "/etc/mkeveryone.conf";
36
+my $FILEHANDLE  = "";
37
+
38
+# database information
39
+my $db="postfix";
40
+my $host="localhost";
41
+my $port="3306";
42
+my $userid="postfix";
43
+my $passwd="postfix";
44
+my $domain="domain.tld";
45
+my $target="everyone@$domain";
46
+my @ignore;
47
+my @dest;
48
+
49
+open (FILEHANDLE, $DATFILE);
50
+
51
+while ( $LINE = <FILEHANDLE> ) {
52
+
53
+       if ( length $LINE > 0 ) {
54
+       chomp $LINE;
55
+
56
+           $RETURNCODE = 0;
57
+
58
+           SWITCH: {
59
+
60
+               $LINE =~ /^ignore/i and do {
61
+                   $LINE =~ s/^ignore// && $LINE =~ s/=// && $LINE =~ s/^ //g;
62
+                   @ignore = (@ignore,$LINE);
63
+                };
64
+
65
+               $LINE =~ /^userid/i and do {
66
+                   # Userid found.";
67
+                   $LINE =~ s/^userid// && $LINE =~ s/=// && $LINE =~ s/^ //g;
68
+                   $userid = $LINE;
69
+               };
70
+
71
+               $LINE =~ /^passwd/i and do {
72
+                   # Passwd found.";
73
+                   $LINE =~ s/^passwd// && $LINE =~ s/=// && $LINE =~ s/^ //g;
74
+                   $passwd = $LINE;
75
+               };
76
+
77
+               $LINE =~ /^db/i and do {
78
+                   # Database found.";
79
+                   $LINE =~ s/^db// && $LINE =~ s/=// && $LINE =~ s/^ //g;
80
+                   $db = $LINE;
81
+               };
82
+
83
+               $LINE =~ /^host/i and do {
84
+                   # Database host found.";
85
+                   $LINE =~ s/^host// && $LINE =~ s/=// && $LINE =~ s/^ //g;
86
+                   $host = $LINE;
87
+               };
88
+
89
+               $LINE =~ /^port/i and do {
90
+                   # Database host found.";
91
+                   $LINE =~ s/^port// && $LINE =~ s/=// && $LINE =~ s/^ //g;
92
+                   $port = $LINE;
93
+               };
94
+
95
+               $LINE =~ /^target/i and do {
96
+                   # Database host found.";
97
+                   $LINE =~ s/^target// && $LINE =~ s/=// && $LINE =~ s/^ //g;
98
+                   $target = $LINE;
99
+               };
100
+
101
+               $LINE =~ /^domain/i and do {
102
+                   # Database host found.";
103
+                   $LINE =~ s/^domain// && $LINE =~ s/=// && $LINE =~ s/^ //g;
104
+                   $domain = $LINE;
105
+               };
106
+          }
107
+       }
108
+}
109
+
110
+print "Connecting to database $db on $host:$port...\n\r";
111
+
112
+print "Target email address is $target...\n\r";
113
+
114
+my $connectionInfo="DBI:mysql:database=$db;$host:$port";
115
+
116
+# make connection to database
117
+$dbh = DBI->connect($connectionInfo,$userid,$passwd);
118
+
119
+# Delete the old message...prepare and execute query
120
+$query = "SELECT username FROM mailbox WHERE domain='$domain';";
121
+$sth = $dbh->prepare($query);
122
+$sth->execute();
123
+
124
+# assign fields to variables
125
+$sth->bind_columns(\$username);
126
+
127
+my $ign="false";
128
+while($sth->fetch()) {
129
+  $ign = "false";
130
+
131
+  foreach $ignored ( @ignore ) {
132
+     if ( $username eq $ignored ){
133
+          $ign = "true";
134
+          }
135
+  }
136
+
137
+  if ( $ign eq "false" ) {
138
+       @dest = (@dest,$username);
139
+  }
140
+}
141
+
142
+# Delete the old aliases...prepare and execute query
143
+$query = "DELETE FROM alias WHERE address='$target';";
144
+$sth = $dbh->prepare($query);
145
+$sth->execute();
146
+
147
+print "Record deleted from the database.\r\n";
148
+
149
+$sth->finish();
150
+
151
+$goto = join(",",@dest);
152
+print "$goto\n\r\n\r";
153
+
154
+
155
+# Insert the new message...prepare and execute query
156
+$query = "INSERT INTO alias (address,goto,domain,created,modified) VALUES ('$target','$goto','$domain',now(),now());";
157
+
158
+$sth = $dbh->prepare($query);
159
+$sth->execute();
160
+
161
+print "Record added to the database.\r\n";
162
+
163
+$sth->finish();
164
+
165
+# disconnect from databse
166
+$dbh->disconnect;
167
+

+ 111
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/pfa_maildir_cleanup.pl View File

@@ -0,0 +1,111 @@
1
+#!/usr/bin/perl
2
+#
3
+##
4
+## pfa_maildir_cleanup.pl
5
+##
6
+## (c) 2004 by Stephen Fulton (sfulton@esoteric.ca)
7
+##
8
+## based on a script by Petr Znojemsky (thanks!) 
9
+##
10
+## Simple script to remove maildirs/domains not listed in a MySQL database.
11
+## Set up for use with those using PostfixAdmin, but can be adapted.
12
+##
13
+## Edit the variables between the ##EDIT## to match your setup.
14
+##
15
+## USE AT YOUR OWN RISK. I ASSUME NO RESPONSIBILITY.
16
+##
17
+
18
+use DBI;
19
+use File::Path;
20
+
21
+##EDIT## 
22
+
23
+$root_path = "/home/mail";
24
+$logfile = "/var/log/removed_maildirs.log";
25
+
26
+$db_host = "localhost";
27
+$db_database = "database";
28
+$db_user = "username";
29
+$db_password = 'password';
30
+
31
+##END EDIT##
32
+
33
+
34
+$connectionInfo = "DBI:mysql:database=$db_database;$db_host:3306";
35
+
36
+## Read a list of domain directories in the root path /remote/mail1
37
+
38
+opendir(DIRHANDLE, $root_path) || die "Cannot access directory $maildir_path: $!";
39
+
40
+my @directories = ();
41
+
42
+foreach $directory (sort readdir(DIRHANDLE)) {
43
+   push (@directories, $directory);
44
+}
45
+
46
+closedir(DIRHANDLE);
47
+
48
+## Strip the "." and ".." from the directories array
49
+
50
+($dot, $doubledot, @directories) = @directories;
51
+
52
+## For each of the domain directories..
53
+
54
+foreach $domain_dir (@directories) {
55
+   $complete_domain_path = "$root_path/$domain_dir";
56
+
57
+   ## Get a list of user directories within each domain directory...
58
+
59
+   opendir(DOMAINHANDLE, $complete_domain_path) || die "Cannot access directory $complete_domain_path: $!";
60
+
61
+   my @user_directories = ();
62
+
63
+   foreach $dir (sort readdir(DOMAINHANDLE)) {
64
+      push(@user_directories, $dir);
65
+   }
66
+   close(DOMAINHANDLE);
67
+
68
+   ## Now remove any "." or ".." directory entries and construct a domain/maildir variable
69
+   ## valid for one iteration of loop.
70
+
71
+   foreach $user_directory (@user_directories) {
72
+      if( not($user_directory eq '..') && not($user_directory eq '.') ) {
73
+         $short_user_dir = "$domain_dir/$user_directory/";
74
+
75
+         ## Here is where the $short_user_dir is compared against the DB entry.
76
+
77
+         $dbh = DBI->connect($connectionInfo,$db_user,$db_password);
78
+         $user_query = "SELECT maildir FROM mailbox WHERE maildir = '$short_user_dir'";
79
+         $sth = $dbh->prepare($user_query);
80
+         $rows = $sth->execute();
81
+
82
+         ## If there are no rows that match, then directory is orphaned and can
83
+         ## be deleted.
84
+
85
+         if($rows == 0) {
86
+            $maildir_path = "$root_path/$short_user_dir";
87
+            open(INFO, ">>$logfile") || die "Cannot write to the logfile: $logfile.";
88
+            rmtree($maildir_path);
89
+            print INFO localtime()." Maildir ".$maildir_path." has been deleted.\n";
90
+            (INFO);
91
+         }
92
+         $sth->finish;
93
+         $dbh->disconnect;
94
+      }
95
+   }
96
+
97
+   $dbh2 = DBI->connect($connectionInfo,$db_user,$db_password);
98
+   $domain_query = "SELECT domain FROM domain WHERE domain = '$domain_dir'";
99
+   $sth2 = $dbh2->prepare($domain_query);
100
+   $domain_rows = $sth2->execute();
101
+
102
+   if($domain_rows == 0) {
103
+      open(INFO, ">>$logfile") || die "Cannot write to the logfile: $logfile.";
104
+      rmtree($complete_domain_path);
105
+      print INFO localtime()." Domain directory ".$complete_domain_path." has been deleted.\n";
106
+      close(INFO);
107
+   }
108
+
109
+$sth2->finish;
110
+$dbh2->disconnect;
111
+}

+ 62
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/postfixadmin-domain-postdeletion.sh View File

@@ -0,0 +1,62 @@
1
+#!/bin/sh
2
+
3
+# Example script for removing a Maildir domain top-level folder
4
+# from a Courier-IMAP virtual mail hierarchy.
5
+
6
+# The script only looks at argument 1, assuming that it 
7
+# indicates the relative name of a domain, such as
8
+# "somedomain.com". If $basedir/somedomain.com exists, it will
9
+# be removed.
10
+
11
+# The script will not actually delete the directory. I moves it
12
+# to a special directory which may once in a while be cleaned up
13
+# by the system administrator.
14
+
15
+# This script should be run as the user which owns the maildirs. If 
16
+# the script is actually run by the apache user (e.g. through PHP),
17
+# then you could use "sudo" to grant apache the rights to run
18
+# this script as the relevant user.
19
+# Assume this script has been saved as
20
+# /usr/local/bin/postfixadmin-domain-postdeletion.sh and has been
21
+# made executable. Now, an example /etc/sudoers line:
22
+# apache ALL=(courier) NOPASSWD: /usr/local/bin/postfixadmin-domain-postdeletion.sh
23
+# The line states that the apache user may run the script as the
24
+# user "courier" without providing a password.
25
+
26
+
27
+# Change this to where you keep your virtual mail users' maildirs.
28
+basedir=/var/spool/maildirs
29
+
30
+# Change this to where you would like deleted maildirs to reside.
31
+trashbase=/var/spool/deleted-maildirs
32
+
33
+if [ `echo $1 | fgrep '..'` ]; then
34
+    echo "First argument contained a double-dot sequence; bailing out."
35
+    exit 1
36
+fi
37
+
38
+if [ ! -e "$trashbase" ]; then
39
+    echo "trashbase '$trashbase' does not exist; bailing out."
40
+    exit 1
41
+fi
42
+
43
+trashdir="${trashbase}/`date +%F_%T`_$1"
44
+domaindir="${basedir}/$1"
45
+
46
+if [ ! -e "$domaindir" ]; then
47
+    echo "Directory '$domaindir' does not exits; nothing to do."
48
+    exit 0;
49
+fi
50
+if [ ! -d "$domaindir" ]; then
51
+    echo "'$domaindir' is not a directory; bailing out."
52
+    exit 1
53
+fi
54
+if [ -e "$trashdir" ]; then
55
+    echo "Directory '$trashdir' already exits; bailing out."
56
+    exit 1;
57
+fi
58
+
59
+mv $domaindir $trashdir
60
+
61
+exit $?
62
+

+ 61
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/postfixadmin-mailbox-postcreation.sh View File

@@ -0,0 +1,61 @@
1
+#!/bin/sh
2
+
3
+# Example script for adding a Maildir to a Courier-IMAP virtual mail
4
+# hierarchy.
5
+
6
+# The script only looks at argument 3, assuming that it 
7
+# indicates the relative name of a maildir, such as
8
+# "somedomain.com/peter/".
9
+
10
+# This script should be run as the user which owns the maildirs. If 
11
+# the script is actually run by the apache user (e.g. through PHP),
12
+# then you could use "sudo" to grant apache the rights to run
13
+# this script as the relevant user.
14
+# Assume this script has been saved as
15
+# /usr/local/bin/postfixadmin-mailbox-postcreation.sh and has been
16
+# made executable. Now, an example /etc/sudoers line:
17
+# apache ALL=(courier) NOPASSWD: /usr/local/bin/postfixadmin-mailbox-postcreation.sh
18
+# The line states that the apache user may run the script as the
19
+# user "courier" without providing a password.
20
+
21
+
22
+# Change this to where you keep your virtual mail users' maildirs.
23
+basedir=/var/spool/maildirs
24
+
25
+if [ ! -e "$basedir" ]; then
26
+    echo "$0: basedir '$basedir' does not exist; bailing out."
27
+    exit 1
28
+fi
29
+
30
+if [ `echo $3 | fgrep '..'` ]; then
31
+    echo "$0: An argument contained a double-dot sequence; bailing out."
32
+    exit 1
33
+fi
34
+
35
+maildir="${basedir}/$3"
36
+parent=`dirname "$maildir"`
37
+if [ ! -d "$parent" ]; then
38
+    if [ -e "$parent" ]; then
39
+        echo "$0: strange - directory '$parent' exists, but is not a directory; bailing out."
40
+        exit 1
41
+    else
42
+        mkdir -p "${parent}"
43
+        if [ $? -ne 0 ]; then
44
+            echo "$0: mkdir -p '$parent' returned non-zero; bailing out."
45
+            exit 1
46
+        fi
47
+    fi
48
+fi
49
+
50
+if [ -e "$maildir" ]; then
51
+    echo "$0: Directory '$maildir' already exists! bailing out"
52
+    exit 1
53
+fi
54
+
55
+maildirmake "$maildir"
56
+if [ ! -d "$maildir" ]; then
57
+    echo "$0: maildirmake didn't produce a directory; bailing out."
58
+    exit 1
59
+fi
60
+
61
+exit 0

+ 77
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/postfixadmin-mailbox-postdeletion.sh View File

@@ -0,0 +1,77 @@
1
+#!/bin/sh
2
+
3
+# Example script for removing a Maildir from a Courier-IMAP virtual mail
4
+# hierarchy.
5
+
6
+# The script looks at arguments 1 and 2, assuming that they 
7
+# indicate username and domain, respectively.
8
+
9
+# The script will not actually delete the maildir. I moves it
10
+# to a special directory which may once in a while be cleaned up
11
+# by the system administrator.
12
+
13
+# This script should be run as the user which owns the maildirs. If 
14
+# the script is actually run by the apache user (e.g. through PHP),
15
+# then you could use "sudo" to grant apache the rights to run
16
+# this script as the relevant user.
17
+# Assume this script has been saved as
18
+# /usr/local/bin/postfixadmin-mailbox-postdeletion.sh and has been
19
+# made executable. Now, an example /etc/sudoers line:
20
+# apache ALL=(courier) NOPASSWD: /usr/local/bin/postfixadmin-mailbox-postdeletion.sh
21
+# The line states that the apache user may run the script as the
22
+# user "courier" without providing a password.
23
+
24
+
25
+# Change this to where you keep your virtual mail users' maildirs.
26
+basedir=/var/spool/maildirs
27
+
28
+# Change this to where you would like deleted maildirs to reside.
29
+trashbase=/var/spool/deleted-maildirs
30
+
31
+
32
+if [ ! -e "$trashbase" ]; then
33
+    echo "trashbase '$trashbase' does not exist; bailing out."
34
+    exit 1
35
+fi
36
+
37
+if [ `echo $1 | fgrep '..'` ]; then
38
+    echo "First argument contained a double-dot sequence; bailing out."
39
+    exit 1
40
+fi
41
+if [ `echo $2 | fgrep '..'` ]; then
42
+    echo "First argument contained a double-dot sequence; bailing out."
43
+    exit 1
44
+fi
45
+
46
+subdir=`echo "$1" | sed 's/@.*//'`
47
+
48
+maildir="${basedir}/$2/${subdir}"
49
+trashdir="${trashbase}/$2/`date +%F_%T`_${subdir}"
50
+
51
+parent=`dirname "$trashdir"`
52
+if [ ! -d "$parent" ]; then
53
+    if [ -e "$parent" ]; then
54
+        echo "Strainge - directory '$parent' exists, but is not a directory."
55
+        echo "Bailing out."
56
+        exit 1
57
+    else
58
+        mkdir -p "$parent"
59
+        if [ $? -ne 0 ]; then
60
+            echo "mkdir -p '$parent' returned non-zero; bailing out."
61
+            exit 1
62
+        fi
63
+    fi
64
+fi
65
+
66
+if [ ! -e "$maildir" ]; then
67
+    echo "maildir '$maildir' does not exist; nothing to do."
68
+    exit 1
69
+fi
70
+if [ -e "$trashdir" ]; then
71
+    echo "trashdir '$trashdir' already exists; bailing out."
72
+    exit 1
73
+fi
74
+
75
+mv $maildir $trashdir
76
+
77
+exit $?

+ 151
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/quota_usage.pl View File

@@ -0,0 +1,151 @@
1
+#!/usr/bin/perl
2
+# vim:ts=4:sw=4:et
3
+# Virtual quota_usage 0.3
4
+# Contributed to Postfixadmin by Jose Nilton <jniltinho@gmail.com> 
5
+#
6
+# See also : http://www.russelldare.net/media/perl/dirsizeSource.pdf
7
+# License: GPL v2.
8
+
9
+# Usage:
10
+# perl quota_usage.pl --list 
11
+# perl quota_usage.pl --list --addmysql 
12
+#                                      for add mysql database postfix 
13
+#
14
+# Requirements - the following perl modules are required:
15
+# DBD::Pg or DBD::mysql; perl perl-DBD-mysql perl-DBD (may be named differently depending on your platform).
16
+#           and the 'du' binary in $ENV{'PATH'} (see below).
17
+#
18
+# You will need to modify the postfix DATABASE to add a quota_usage column. 
19
+# Mysql:
20
+# 	ALTER TABLE mailbox ADD quota_usage INT(11) NOT NULL DEFAULT '0' AFTER modified, 
21
+# 	ADD quota_usage_date DATE NOT NULL DEFAULT '0000-00-00' AFTER quota_usage;
22
+# PostgreSQL:
23
+# 	ALTER TABLE mailbox ADD COLUMN quota_usage INTEGER NOT NULL DEFAULT 0;
24
+# 	ALTER TABLE mailbox ADD COLUMN quota_usage_date DATE NOT NULL DEFAULT current_date;
25
+#
26
+
27
+use strict;
28
+use warnings;
29
+use File::Path;
30
+use DBI;
31
+use Getopt::Long;
32
+
33
+##EDIT## 
34
+my $db_host 	= 'localhost';
35
+my $db_database = 'postfix';
36
+my $db_user 	= 'postfix';
37
+my $db_password = '123456';
38
+my $root_path 	= '/home/vmail';
39
+# Pg or mysql
40
+my $db_type     = 'mysql'; 
41
+##END EDIT##
42
+
43
+(help()) if (!$ARGV[0]);
44
+
45
+$ENV{'PATH'} = "/sbin:/bin:/usr/sbin:/usr/bin";
46
+my($domain_dir, $full_domain_dir, $user_dir, $usage, $email, $sql, $dbh);
47
+
48
+my $list = 0;
49
+my $insert_db = 0;
50
+my $total_mailbox = 0;
51
+my $total_domain = 0;
52
+GetOptions ('l|list' => \$list, 'i|addmysql' => \$insert_db, 'help|h|man' => \&help) or (help());
53
+
54
+
55
+(list_quota_usage()) if ($list == 1 || $insert_db == 1 );
56
+
57
+
58
+
59
+sub list_quota_usage {
60
+    opendir(DOMAINDIR, $root_path) or die ("Unable to access directory '$root_path' ($!)");
61
+
62
+    if($insert_db == 1){
63
+        $dbh = DBI->connect("DBI:$db_type:database=$db_database;host=$db_host", $db_user, $db_password) or die ("cannot connect the database");
64
+        execSql("UPDATE mailbox set quota_usage = 0");
65
+    }
66
+
67
+    foreach $domain_dir (sort readdir DOMAINDIR) {
68
+        next if $domain_dir =~ /^\./;                    # skip dotted dirs
69
+        $full_domain_dir = "$root_path/$domain_dir"; #print "$full_domain_dir\n";
70
+        $total_domain++;            
71
+
72
+        opendir(USERDIR, $full_domain_dir) or die ("Unable to access directory '$full_domain_dir' ($!)");
73
+        foreach $user_dir (sort readdir USERDIR) {
74
+            next if $user_dir =~ /^\./; # skip dotted dirs
75
+            $email = "$user_dir\@$domain_dir";
76
+            $total_mailbox++;
77
+
78
+            my $i = `du -0 --summarize $full_domain_dir/$user_dir`;
79
+            ($usage) = split(" ", $i);
80
+
81
+            if ($usage < 100) {
82
+                $usage = 0;
83
+            } elsif ($usage < 1000) {
84
+                $usage = 1;
85
+            } else {
86
+                $usage = $usage + 500;
87
+                $usage = int $usage / 1000;
88
+            }
89
+            if($insert_db == 1){execSql("UPDATE mailbox set quota_usage = $usage, quota_usage_date = CAST(NOW() AS DATE) WHERE username = '$email'");}
90
+            print_list() if ($list == 1);
91
+
92
+        }
93
+    }
94
+    close(DOMAINDIR);
95
+    close(USERDIR);
96
+
97
+    (print_total()) if ($list == 1);
98
+
99
+}
100
+
101
+
102
+
103
+
104
+
105
+sub execSql {
106
+    my $sql = shift;
107
+    my $ex;
108
+    $ex = $dbh->do($sql) or die ("error when running $sql");
109
+}
110
+
111
+
112
+
113
+sub print_total{
114
+    print "---------------------------------------------------------\n";
115
+    print "TOTAL DOMAIN\t\t\t\tTOTAL MAILBOX\n";
116
+    print "---------------------------------------------------------\n";
117
+    print "$total_domain\t\t\t\t\t\t$total_mailbox\n";
118
+}
119
+
120
+
121
+
122
+sub print_list {
123
+format STDOUT_TOP =
124
+Report of Quota Used
125
+---------------------------------------------------------
126
+EMAIL                                         QUOTA USED
127
+---------------------------------------------------------
128
+.
129
+
130
+
131
+format = 
132
+@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<         @<<<<<<<<<<
133
+$email,                                           "$usage MB"                         
134
+.
135
+
136
+    write;
137
+}
138
+
139
+
140
+
141
+
142
+
143
+sub help {
144
+    print "$0 [options...]\n";
145
+    print "-l|--list                     List quota used\n";
146
+    print "-i|--addmysql                 For insert quota used in database mysql\n";
147
+
148
+}
149
+
150
+
151
+

+ 38
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/INSTALL View File

@@ -0,0 +1,38 @@
1
+Installing the postfixadmin Plugin
2
+======================================
3
+
4
+Requirements:
5
+=============
6
+
7
+ - PHP 5.[234].* with php5-xmlrpc installed (if available; it should be available by default anyway)
8
+ - http access to a local/remote postfixadmin interface 
9
+ - Zend Framework (1.12.x) - needs adding to the include path within common.php, 
10
+   or installing in a system include path directory (e.g. /usr/share/php)
11
+   (e.g. from within the directory containing this file ...
12
+	wget https://packages.zendframework.com/releases/ZendFramework-1.12.3/ZendFramework-1.12.3-minimal.tar.gz 
13
+	tar -zxf ZendFramework-1.12.3-minimal.tar.gz
14
+	mv ZendFramework-1.12.3-minimal/library/Zend .    )
15
+   NOTE: This plugin is _not compatible_ with Zend Framework version 2.x.
16
+
17
+Installation :
18
+==============
19
+
20
+- Copy this code into the Squirrelmail plugins directory - your life will be easiest if it's in a directory called 'postfixadmin'
21
+- Install Zend Framework (see above under Requirements for example)
22
+- Edit config.php and specify the remote URL for the Postfixadmin XmlRpc service. 
23
+- Edit common.php and (if you need to) change the include path(s) so they are correct.
24
+- Edit the remote Postfixadmin's XmlRpc service config file and ensure 'xmlrpc_enabled' is set to boolean true.
25
+- Enable the plugin through 'squirrelmail-configure' or 'config/conf.pl'.  
26
+   Choose option 8 and move the plugin from the "Available Plugins"
27
+   category to the "Installed Plugins" category.  Save and exit.
28
+
29
+Security :
30
+==========
31
+
32
+- The XmlRpc client needs to get the user's mailbox password before it will be able to connect to the
33
+  XmlRpc server (postfixadmin). The plugin prompts the user for their mailbox password, and caches it in their session
34
+  ($_SESSION['password']). This password is then sent once on every page load to the remote XmlRpc server.
35
+
36
+- You should consider doing any of the following :
37
+ - Using https if the server and client are on seperate servers. This will probably require a signed certificate etc, and may require changes to the Zend_XmlRpc_Client's HttpClient.
38
+ - Using something like stunnel to encrypt traffic between server(s).

+ 40
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/LICENSE.txt View File

@@ -0,0 +1,40 @@
1
+
2
+2007/03/29 :
3
+    Before I (David Goodwin) customised this plugin, it contained the following within all
4
+    files as a header. 
5
+
6
+    /****************************************************************************************
7
+
8
+        Author ......... Florian Kimmerl
9
+        Contact ........ info@spacekoeln.de
10
+        Home Site ...... http://www.spacekoeln.de/
11
+        Program ........ postfixadmin
12
+        Purpose ........ Allows you to change your postfixadmin settings within squirrelmail
13
+
14
+        *************************************************************************************
15
+
16
+        The Original Code is Postfix Admin.
17
+        The Initial Developer of the Original Code is Mischa Peters .
18
+        Portions created by Mischa Peters are Copyright (c) 2002, 2003, 2004.
19
+        All Rights Reserved.
20
+        Contributor(s):
21
+        This project includes work by Mischa Peters and others that is:
22
+        Copyright (c) 2002,2003,2004 Mischa Peters
23
+        All rights reserved.
24
+
25
+    ****************************************************************************************/
26
+
27
+    
28
+    Contacting the author provided no success, so I took over maintainership.
29
+
30
+    Please note:
31
+
32
+    1) Changes made by myself (David Goodwin) will be licensed under the GPL
33
+    2) PostfixAdmin has itself been relicensed under the GPL; however this took place _after_
34
+       this plugin was written.
35
+    3) Squirrelmail itself is released under http://squirrelmail.org/wiki/SquirrelMailGPL (GPL)
36
+
37
+
38
+The GNU public license can be found online at :
39
+
40
+    http://www.gnu.org/licenses/gpl.txt

+ 70
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/README View File

@@ -0,0 +1,70 @@
1
+Squirrelmail Plugin Postfixadmin
2
+********************************
3
+
4
+The Postfixadmin SquirrelMail plugin let users change their virtual alias,
5
+vacation status/message and password if you are using the great postfixadmin
6
+tool from http://high5.net/postfixadmin
7
+
8
+Version 0.4.3   2007/08/14
9
+
10
+Postfixadmin - Postfixadmin+MySQL/PgSQL plugin for Squirrelmail
11
+
12
+
13
+Author: Florian Kimmerl <info@spacekoeln.de>
14
+Author: Sam Brookes <sam at pale purple.co.uk>
15
+    - Initial conversion to MDB2
16
+    - Fix SQL Injections etc
17
+Author: David Goodwin <david at pale purple.co.uk>
18
+    - Subsequent tidyup + testing etc
19
+Author: Krzysztof 'Mad Max' Laska - <madmax at riders.pl>
20
+    - Polish Translation.
21
+
22
+
23
+
24
+The Initial Developer of the Original postfixadmin Code is Mischa Peters.
25
+Portions created by Mischa Peters are Copyright (c) 2002, 2003, 2004.
26
+All Rights Reserved.
27
+
28
+REQUIREMENTS
29
+
30
+o SquirrelMail 1.4x
31
+
32
+o A working Mail-System "Virtual Domains and Users with postfix+Courier-IMAP+MySQL" (or PostgreSQL) See http://high5.net/howto/
33
+
34
+o POSTFIXADMIN version 2.2.0 or higher. See http://sf.net/projects/postfixadmin
35
+
36
+o This plugin only uses the postfixadmin database
37
+
38
+o Pear MDB2 database abstraction layer - see http://pear.php.net 
39
+
40
+o PHP installation with register globals TURNED OFF (huraren on IRC reports that the MDB2 driver isn't happy with it turned on)
41
+
42
+INSTALLATION
43
+
44
+See the included file INSTALL
45
+
46
+BUGS
47
+
48
+o Probably vulnerable to cross site scripting, certainly when setting the vacation message.
49
+
50
+o There may be some remaining SQL injection holes.
51
+
52
+TODO
53
+
54
+-Code Cleanup
55
+-Tranlation
56
+
57
+
58
+TRANSLATIONS
59
+
60
+Translations are welcome! Send the *.po-File to: david@NO.codepoets.SPAM.co.uk
61
+
62
+
63
+ACKNOWLEDGMENTS
64
+
65
+Thanks to the SquirrelMail team for building such a great app and
66
+for all the work they do to keep it running.
67
+
68
+Thanks to high5.net for writing the great Postfixadmin tool
69
+
70
+

+ 44
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/common.php View File

@@ -0,0 +1,44 @@
1
+<?php
2
+// vim:ts=4:sw=4:et
3
+ini_set('include_path', get_include_path() . ':' . dirname(__FILE__));
4
+
5
+@include_once('Zend/Version.php');
6
+if(!class_exists('Zend_Version', false)) {
7
+	die("Zend Framework not found. Please check the INSTALL File.");
8
+}
9
+chdir("..");
10
+
11
+
12
+if (!defined('SM_PATH')) 
13
+{
14
+    define('SM_PATH','../');
15
+}
16
+include_once(dirname(__FILE__)  . '/config.php');
17
+include_once(dirname(__FILE__) . '/functions.inc.php');
18
+include_if_exists(dirname(__FILE__) . '/../include/validate.php');
19
+if (file_exists(dirname(__FILE__) . '/../include/validate.php')) 
20
+{
21
+    include_once(dirname(__FILE__) . '/include/validate.php');
22
+}
23
+else { 
24
+    include_if_exists(SM_PATH . 'src/validate.php');
25
+}
26
+include_once(SM_PATH . 'functions/page_header.php');
27
+include_once(SM_PATH . 'functions/display_messages.php');
28
+include_once(SM_PATH . 'functions/imap.php');
29
+include_if_exists(SM_PATH . 'functions/array.php');
30
+if (file_exists(SM_PATH . 'src/load_prefs.php'))
31
+{
32
+    include_once(SM_PATH . 'src/load_prefs.php');
33
+}
34
+else {
35
+    include_if_exists(SM_PATH . 'include/load_prefs.php');
36
+}
37
+// overwrite squirrelmail's content type to utf8...
38
+header("Content-Type: text/html; charset=utf8");
39
+
40
+
41
+//global $VACCONFMESSAGE;
42
+bindtextdomain('postfixadmin', dirname(__FILE__) . '/postfixadmin/locale');
43
+textdomain('postfixadmin');
44
+

+ 22
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/config.php.sample View File

@@ -0,0 +1,22 @@
1
+<?php
2
+
3
+$CONF = array();
4
+$CONF['xmlrpc_url'] = 'http://postfixadmin.local/postfixadmin/xmlrpc.php';
5
+
6
+// Virtual Vacation
7
+// If you use virtual vacation for you mailbox users set this to 'true'.
8
+// NOTE: Make sure that you install the vacation module!!
9
+
10
+//$AllowVacation = true;    // true or false
11
+global $AllowVacation;
12
+$AllowVacation = true;
13
+
14
+// Change Password
15
+// Enables user to change the POP3/IMAP Password.
16
+//$AllowChangePass = true;    // true or false
17
+global $AllowChangePass;
18
+$AllowChangePass = true;
19
+
20
+// Minimum password length - set to Zero to not care, otherwise the number of 
21
+// characters a password must be longer than.
22
+$CONF['min_password_length'] = 5;

+ 20
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/README.Debian View File

@@ -0,0 +1,20 @@
1
+Squirrelmail PostfixAdmin Plugin for Debian
2
+===========================================
3
+
4
+After installing the package, you will need to :
5
+
6
+1) Edit the config.inc.php file to point to the PostfixAdmin server.
7
+
8
+2) Ensure the xmlrpc interface is available and enabled on the Postfixadmin server
9
+
10
+3) Run the squirrelmail-configure script.
11
+
12
+Where to get help
13
+=================
14
+
15
+See http://squirrelmail-postfixadmin.palepurple.co.uk
16
+
17
+Try also : david [at] pale purple dot co dot uk
18
+
19
+Or #postfixadmin on irc.freenode.net might be a good bet.
20
+

+ 27
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/changelog View File

@@ -0,0 +1,27 @@
1
+squirrelmail-postfixadmin (2.3.0) stable; urgency=low
2
+
3
+  * Using XMLRPC backend (no SQL here)
4
+
5
+ -- David Goodwin <david.goodwin@palepurple.co.uk>  Mon, 01 Feb 2010 09:56:00 +0000
6
+
7
+squirrelmail-postfixadmin (2.2.0) stable; urgency=low
8
+
9
+  * Changed DB backend to use prepared statements
10
+  * Changed vacation handling to match that of Postfixadmin (vacation.active
11
+    etc)
12
+  * Changed vacation page to support UTF8
13
+
14
+ -- David Goodwin <david.goodwin@palepurple.co.uk>  Wed, 20 Aug 2008 15:25:00 +0000
15
+
16
+squirrelmail-postfixadmin (2.1.1-1) stable; urgency=low
17
+
18
+  * Add NL language support
19
+  * Better db error logging (e.g. if wrong mdb2 driver specified etc)
20
+
21
+ -- David Goodwin <david.goodwin@palepurple.co.uk>  Wed, 12 Dec 2007 16:00:00 +0000
22
+
23
+squirrelmail-postfixadmin (2.1.0-1) stable; urgency=low
24
+
25
+  * Initial release.
26
+
27
+ -- David Goodwin <david.goodwin@palepurple.co.uk>  Thu,  8 Nov 2007 20:00:00 +0000

+ 1
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/conffiles View File

@@ -0,0 +1 @@
1
+/etc/squirrelmail/plugins/postfixadmin-config.php

+ 19
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/control View File

@@ -0,0 +1,19 @@
1
+Source: squirrelmail-postfixadmin
2
+Section: mail
3
+Priority: optional
4
+Maintainer: David Goodwin <david.goodwin@palepurple.co.uk>
5
+Standards-Version: 3.6.1
6
+
7
+Package: squirrelmail-postfixadmin
8
+Architecture: all
9
+Depends: squirrelmail, php-pear
10
+Suggests: postfixadmin
11
+Description: Plugin for Squirrelmail to integrate with Postfixadmin
12
+ Postfixadmin is a web based interface for managing mail domains 
13
+ and users. This package integrates Squirrelmail with it. 
14
+ Users can change their password, forwarding and vacation settings
15
+ from within Squirrelmail when this package is installed, and 
16
+ enabled through the ./squirrelmail-configure command.
17
+ .
18
+ For further information see 
19
+ http://squirrelmail-postfixadmin.palepurple.co.uk

+ 11
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/copyright View File

@@ -0,0 +1,11 @@
1
+This package was debianized by David Goodwin <david@palepurple.co.uk>
2
+2007/11/08
3
+
4
+It was downloaded from: http://squirremail-postfixadmin.palepurple.co.uk
5
+
6
+Upstream Author(s): n/a
7
+
8
+Copyright:
9
+    Copyright (C) 2007+ by David Goodwin <david@palepurple.co.uk>
10
+
11
+License: GPL v2+

+ 4
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/docs View File

@@ -0,0 +1,4 @@
1
+LICENSE.txt
2
+README
3
+INSTALL
4
+debian/README.Debian

+ 1
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/files View File

@@ -0,0 +1 @@
1
+squirrelmail-postfixadmin_2.2.0_all.deb mail optional

+ 3
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/postfixadmin-squirrelmail.dirs View File

@@ -0,0 +1,3 @@
1
+usr/share/squirrelmail/plugins/postfixadmin
2
+usr/share/doc/squirrelmail-postfixadmin
3
+etc/squirrelmail/plugins

+ 5
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/postinst View File

@@ -0,0 +1,5 @@
1
+#!/bin/sh
2
+
3
+echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
4
+echo "WARNING: You need to read /usr/share/doc/squirrelmail-postfixadmin/README.Debian!"
5
+echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

+ 56
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/debian/rules View File

@@ -0,0 +1,56 @@
1
+#!/usr/bin/make -f
2
+# debian/rules makefile for squirrelmail
3
+
4
+# Uncomment this to turn on verbose mode.
5
+#export DH_VERBOSE=1
6
+
7
+build: build-stamp
8
+build-stamp:
9
+	dh_testdir
10
+
11
+clean:
12
+	dh_testdir
13
+	dh_testroot
14
+	dh_clean
15
+
16
+install: build
17
+	$(checkdir)
18
+	dh_testdir
19
+	dh_testroot
20
+	dh_clean -k
21
+	dh_installdirs
22
+	dh_install
23
+	mkdir -p debian/tmp/usr/share/squirrelmail/plugins/postfixadmin
24
+	cp -a *.php version debian/tmp/usr/share/squirrelmail/plugins/postfixadmin
25
+	cp -a locale debian/tmp/usr/share/squirrelmail/plugins/postfixadmin
26
+	cp -a po debian/tmp/usr/share/squirrelmail/plugins/postfixadmin
27
+	mkdir -p debian/tmp/etc/squirrelmail/plugins/
28
+	cp -a *.sample debian/tmp/etc/squirrelmail/plugins/postfixadmin-config.php
29
+	mkdir -p debian/tmp/DEBIAN
30
+	cp debian/postinst debian/tmp/DEBIAN/postinst
31
+	chmod 555 debian/tmp/DEBIAN/postinst
32
+	ln -s /etc/squirrelmail/plugins/postfixadmin-config.php debian/tmp/usr/share/squirrelmail/plugins/postfixadmin/config.php
33
+	find debian/tmp -name .svn | xargs -r rm -r
34
+
35
+# Build architecture-independent files here.
36
+binary-indep: build install
37
+	dh_testdir
38
+	dh_testroot
39
+	dh_installdebconf	
40
+	dh_installdocs -X.svn
41
+	dh_installexamples
42
+	dh_installman
43
+	dh_installcron
44
+	dh_link
45
+	dh_compress
46
+	dh_fixperms -X/var
47
+	dh_installdeb
48
+	dh_gencontrol
49
+	dh_md5sums
50
+	dh_builddeb
51
+
52
+# Build architecture-dependent files here.
53
+binary-arch:
54
+
55
+binary: binary-indep binary-arch
56
+.PHONY: build clean binary-indep binary-arch binary install

+ 102
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/functions.inc.php View File

@@ -0,0 +1,102 @@
1
+<?php
2
+/**
3
+ * Postfixadmin (http://postfixadmin.sf.net) integration with Squirrelmail.
4
+ * See http://squirrelmail-postfixadmin.palepurple.co.uk
5
+ * @author David Goodwin and many others
6
+ */
7
+
8
+
9
+function do_header() {
10
+    global $color;
11
+    displayPageHeader($color, 'None');
12
+}
13
+
14
+function do_footer() {
15
+    echo "</body></html>";
16
+}
17
+
18
+function _display_password_form() {
19
+    bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
20
+    textdomain('postfixadmin');
21
+    do_header('Postfixadmin Squirrelmail - Login');
22
+    echo _('The PostfixAdmin plugin needs your current mailbox password');
23
+    echo "<form action='' method='post'>";
24
+    echo _('Password for');
25
+    echo " " . $_SESSION['username'] . " :"; 
26
+    echo "<input type='password' name='password' value=''>";
27
+    echo "<input type='submit' value='" . _('Submit') . "'></form>";
28
+    do_footer();
29
+}
30
+
31
+/**
32
+ * This returns a Zend_XmlRpc_Client instance - unless we can't log you in...
33
+ */
34
+function get_xmlrpc() {
35
+    global $CONF;
36
+    require_once('Zend/XmlRpc/Client.php');
37
+    $client = new Zend_XmlRpc_Client($CONF['xmlrpc_url']);
38
+    $http_client = $client->getHttpClient();
39
+    $http_client->setCookieJar();
40
+
41
+    $login_object = $client->getProxy('login');
42
+
43
+    if(empty($_SESSION['password'])) {
44
+        if(empty($_POST['password'])) {
45
+            _display_password_form();
46
+            exit(0);
47
+        }
48
+        else {
49
+            try {
50
+                $success = $login_object->login($_SESSION['username'], $_POST['password']);
51
+            }
52
+            catch(Exception $e) {
53
+                //var_dump($client->getHttpClient()->getLastResponse()->getBody());
54
+                error_log("Failed to login to xmlrpc instance - " . $e->getMessage());
55
+                die('Failed to login to xmlrpc instance');
56
+            }
57
+            if($success) {
58
+                $_SESSION['password'] = $_POST['password'];
59
+                // reload the current page as a GET request.
60
+                header("Location: {$_SERVER['REQUEST_URI']}");
61
+                exit(0);
62
+            }
63
+            else {
64
+                _display_password_form();
65
+                exit(0);
66
+            }
67
+        }
68
+    }
69
+    else {
70
+        $success = $login_object->login($_SESSION['username'], $_SESSION['password']);
71
+    }
72
+
73
+    if(!$success) {
74
+        unset($_SESSION['password']);
75
+        die("Invalid details cached... refresh this page and re-enter your mailbox password");
76
+    }
77
+    return $client;
78
+}
79
+
80
+function include_if_exists($filename) {
81
+    if(file_exists($filename)) {
82
+        include_once($filename);
83
+    }
84
+    return;
85
+}
86
+global $optmode;
87
+$optmode = 'display';
88
+
89
+//
90
+// check_email
91
+// Action: Checks if email is valid and returns TRUE if this is the case.
92
+// Call: check_email (string email)
93
+//
94
+function check_email($email) {
95
+    $return = filter_var($email, FILTER_VALIDATE_EMAIL);
96
+    if($return === false) {
97
+        return false;
98
+    }
99
+    return true;
100
+}
101
+
102
+

+ 27
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/index.php View File

@@ -0,0 +1,27 @@
1
+<?php
2
+
3
+/****************************************************************************************
4
+
5
+    Author ......... Florian Kimmerl
6
+    Contact ........ info@spacekoeln.de
7
+    Home Site ...... http://www.spacekoeln.de/
8
+    Program ........ postfixadmin
9
+    Version ........ 0.3-1.4
10
+    Purpose ........ Allows you to change your postfixadmin settings within squirrelmail
11
+
12
+ /**
13
+ * index.php
14
+ *
15
+ * Copyright (c) 1999-2003 The SquirrelMail Project Team
16
+ * Licensed under the GNU GPL. For full terms see the file COPYING.
17
+ *
18
+ * This file simply takes any attempt to view source files and sends those
19
+ * people to the login screen. At this point no attempt is made to see if
20
+ * the person is logged or not.
21
+ *
22
+ *
23
+****************************************************************************************/
24
+
25
+header("Location: ../../index.php");
26
+
27
+?>

+ 6
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/build.sh View File

@@ -0,0 +1,6 @@
1
+#!/bin/bash
2
+
3
+for f in $(find . -name postfixadmin.po)
4
+do
5
+    msgfmt -o $(dirname $f)/postfixadmin.mo $f
6
+done

BIN
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/cs_CZ/LC_MESSAGES/postfixadmin.mo View File


+ 132
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/cs_CZ/LC_MESSAGES/postfixadmin.po View File

@@ -0,0 +1,132 @@
1
+# SOME DESCRIPTIVE TITLE.
2
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+# This file is distributed under the same license as the PACKAGE package.
4
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+#
6
+msgid ""
7
+msgstr ""
8
+"Project-Id-Version: PACKAGE VERSION\n"
9
+"POT-Creation-Date: 2004-01-29 17:35+0100\n"
10
+"PO-Revision-Date: 2007-07-20 20:46+0100\n"
11
+"Last-Translator: Michael Heca <michael.heca@gmail.com>\n"
12
+"Language-Team: LANGUAGE <LL@li.org>\n"
13
+"MIME-Version: 1.0\n"
14
+"Content-Type: text/plain; charset=iso-8859-2\n"
15
+"Content-Transfer-Encoding: 8bit\n"
16
+
17
+#: setup.php
18
+msgid "Forwarding"
19
+msgstr "Pøesmìrování"
20
+
21
+msgid "Here you can create and edit E-Mail forwards."
22
+msgstr "Zde mù¾ete vytvoøit a nastavit pøesmìrování"
23
+
24
+msgid "Set an OUT OF OFFICE message or auto responder for your mail."
25
+msgstr "Zde mù¾ete nastavit automatickou odpovìd, pokud nebudete k zasti¾ení."
26
+
27
+msgid "Change your mailbox password."
28
+msgstr "Zmìnít heslo k Va¹emu e-mailovému úètu"
29
+
30
+#: postfixadmin_changepass.php
31
+msgid "Alias"
32
+msgstr "Úèet"
33
+
34
+msgid "Change Password"
35
+msgstr "Zmìnit heslo"
36
+
37
+msgid "Change your login password"
38
+msgstr "Zmìnít heslo k Va¹emu e-mailovému úètu"
39
+
40
+#: postfixadmin_forward.php
41
+msgid "Edit Alias"
42
+msgstr "Editace adresy pro pøesmìrování"
43
+
44
+msgid "Edit an alias* for your domain.<br />One entry per line."
45
+msgstr "Editace pøesmìrování pro Vá¹ úèet. <br/> Ka¾dá adresa na novém øádku."
46
+
47
+msgid "The email address that you have entered is not valid:"
48
+msgstr "Zadaná e-mailová adresa je chybná:"
49
+
50
+msgid "Unable to locate alias!"
51
+msgstr "Neni mo¾né nalézt úèet!"
52
+
53
+msgid "Unable to modify the alias!"
54
+msgstr "Není mo¾né zmìnit úèet!"
55
+
56
+msgid "*Additional forward-aliase always recieve messages BBC!"
57
+msgstr "Dal¹í aliasy dostanou e-mail jako BBC!"
58
+
59
+msgid "Alias successfully changend!"
60
+msgstr "Pøesmìrování bylo zmìnìno!"
61
+
62
+msgid "To remove an alias, simply delete it's line from the text box."
63
+msgstr "Pro odstranení pøesmìrování sma¾te v¹echny øádky v textovém boxu."
64
+
65
+#: postfixadmin_vacation.php
66
+msgid "Auto Response"
67
+msgstr "Automatická odpovìï"
68
+
69
+msgid "Going Away"
70
+msgstr "Jsem mimo"
71
+
72
+msgid "Coming Back"
73
+msgstr "Jsem zpìt"
74
+
75
+msgid "Options"
76
+msgstr "Nastavení"
77
+
78
+msgid "Out of Office"
79
+msgstr "Mimo kanceláø"
80
+
81
+msgid "Subject"
82
+msgstr "Pøedmìt"
83
+
84
+msgid "Body"
85
+msgstr "Tìlo mailu"
86
+
87
+msgid "Your auto response has been removed!"
88
+msgstr "Va¹e automatická odpovìï byla odstranìna!"
89
+
90
+msgid "Your auto response has been set!"
91
+msgstr "Va¹e automatická odpovìï byla nastavena!"
92
+
93
+msgid "You already have an auto response configured!"
94
+msgstr "U¾ máte nastavenu automatickou odpovìï!"
95
+
96
+#: postfixadmin_changepass.php:81
97
+#: postfixadmin_changepass.php:87
98
+msgid "The passwords that you supplied don't match!<br />Or are empty!"
99
+msgstr "Zadaná hesla nejsou stejná a nebo jsou prázdná!"
100
+
101
+#: postfixadmin_forward.php:70
102
+#: postfixadmin_forward.php:152
103
+msgid "To"
104
+msgstr "Komu"
105
+
106
+#: postfixadmin_changepass.php:101
107
+msgid "Unable to change your password!"
108
+msgstr "Není mo¾né zmìnit heslo!"
109
+
110
+#: postfixadmin_changepass.php:75
111
+msgid "You didn't supply your current password!"
112
+msgstr "Stávající heslo neodpovídá!"
113
+
114
+#: postfixadmin_changepass.php:96
115
+msgid "Your password has been changed!"
116
+msgstr "Va¹e heslo bylo zmìnìno!"
117
+
118
+msgid "Password current"
119
+msgstr "Stávající heslo"
120
+
121
+msgid "Password new"
122
+msgstr "Nové heslo"
123
+
124
+msgid "Password new again"
125
+msgstr "Nové heslo znovu"
126
+
127
+msgid "Please sign out and log back again with your new password!"
128
+msgstr "Prosím odhla¹te se a pøihla¹te se s novým heslem!"
129
+
130
+msgid "I will be away from <date> until <date>. For urgent matters you can contact <contact person>."
131
+msgstr "Nebudy k zasti¾ení od <date> do <date>. Pro naléhané po¾adavky prosím kontaktujte <contact person>."
132
+

BIN
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/da_DK/LC_MESSAGES/postfixadmin.mo View File


+ 127
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/da_DK/LC_MESSAGES/postfixadmin.po View File

@@ -0,0 +1,127 @@
1
+# Danish translation for Squirrelmail Plugin Postfixadmin.
2
+# Copyright (C) 2004 Florian Kimmerl, 2007 David Goodwin
3
+# This file is distributed under the same license as the Squirrelmail Plugin Postfixadmin package.
4
+# Jesper R. Meyer <jrm@upthere.dk>, 2007.
5
+#
6
+#, fuzzy
7
+msgid ""
8
+msgstr ""
9
+"Project-Id-Version: 0.4.3\n"
10
+"POT-Creation-Date: 2004-01-29 17:35+0100\n"
11
+"PO-Revision-Date: 2007-11-09 16:07+0100\n"
12
+"Last-Translator: JESPER MEYER <jrm@upthere.dk>\n"
13
+"Language-Team: DANISH <LL@li.org>\n"
14
+"MIME-Version: 1.0\n"
15
+"Content-Type: text/plain; charset=UTF-8\n"
16
+"Content-Transfer-Encoding: 8bit\n"
17
+
18
+#: setup.php
19
+msgid "Forwarding"
20
+msgstr "Videresending"
21
+
22
+msgid "Here you can create and edit E-Mail forwards."
23
+msgstr "Her kan du oprette og ændre email-videresendinger."
24
+
25
+msgid "Set an OUT OF OFFICE message or auto responder for your mail."
26
+msgstr "Tilføj en 'ikke tilstede' besked eller et autosvar til din emailadresse."
27
+
28
+msgid "Change your mailbox password."
29
+msgstr "Ændre adgangskoden til din postboks"
30
+
31
+#: postfixadmin_changepass.php
32
+msgid "Alias"
33
+msgstr "Alias"
34
+
35
+msgid "Change Password"
36
+msgstr "Ændre adgangskode"
37
+
38
+msgid "Change your login password"
39
+msgstr "Ændre din login-adgangskode"
40
+
41
+#: postfixadmin_forward.php
42
+msgid "Edit Alias"
43
+msgstr "Rediger alias"
44
+
45
+msgid "Edit an alias* for your domain.<br />One entry per line."
46
+msgstr "Rediger et alias* for dit domæne.<br />En modtager pr. linje."
47
+
48
+msgid "The email address that you have entered is not valid:"
49
+msgstr "Emailadressen du angav er ugyldig"
50
+
51
+msgid "Unable to locate alias!"
52
+msgstr "Aliaset eksistere ikke!"
53
+
54
+msgid "Unable to modify the alias!"
55
+msgstr "Kunne ikke ændre aliaset!"
56
+
57
+msgid "*Additional forward-aliase always recieve messages BBC!"
58
+msgstr "*Eksta vidersendingsalias modtager altid meddelelser BCC!"
59
+
60
+msgid "Alias successfully changend!"
61
+msgstr "Alias ændret!"
62
+
63
+#: postfixadmin_vacation.php
64
+msgid "Auto Response"
65
+msgstr "Autosvar"
66
+
67
+msgid "Going Away"
68
+msgstr "Tager afsted"
69
+
70
+msgid "Coming Back"
71
+msgstr "Kommer tilbage"
72
+
73
+msgid "Options"
74
+msgstr "Indstillinger"
75
+
76
+msgid "Out of Office"
77
+msgstr "Ikke tilstede"
78
+
79
+msgid "Subject"
80
+msgstr "Emne"
81
+
82
+msgid "Body"
83
+msgstr "Meddelelse"
84
+
85
+msgid "Your auto response has been removed!"
86
+msgstr "Autosvar er fjernet!"
87
+
88
+msgid "Your auto response has been set!"
89
+msgstr "Autosvar er aktiveret!"
90
+
91
+msgid "You already have an auto response configured!"
92
+msgstr "Du har allerede et autosvar indstillet!"
93
+
94
+#: postfixadmin_changepass.php:81 postfixadmin_changepass.php:87
95
+msgid "The passwords that you supplied don't match!<br />Or are empty!"
96
+msgstr "Adgangskoderne er ikke ens!<br />Eller er tomme!"
97
+
98
+#: postfixadmin_forward.php:70 postfixadmin_forward.php:152
99
+msgid "To"
100
+msgstr "Til"
101
+
102
+#: postfixadmin_changepass.php:101
103
+msgid "Unable to change your password!"
104
+msgstr "Kan ikke ændre adgangskoden!"
105
+
106
+#: postfixadmin_changepass.php:75
107
+msgid "You didn't supply your current password!"
108
+msgstr "Du glemte at skrive din nuværende adgangskode!"
109
+
110
+#: postfixadmin_changepass.php:96
111
+msgid "Your password has been changed!"
112
+msgstr "Din adgangskode er ændret!"
113
+
114
+msgid "Password current"
115
+msgstr "Nuværende adgangskode"
116
+
117
+msgid "Password new"
118
+msgstr "Ny adgangskode"
119
+
120
+msgid "Password new again"
121
+msgstr "Ny adgangskode (igen)"
122
+
123
+msgid "Please sign out and log back again with your new password!"
124
+msgstr "Log af og log ind igen med din nye adgangskode!"
125
+
126
+msgid "I will be away from <date> until <date>. For urgent matters you can contact <contact person>."
127
+msgstr "Jeg er ikke tilstede i perioden <dato> til <dato>. I nødstilfælde kan <kontaktperson> kontaktes."

BIN
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/de_DE/LC_MESSAGES/postfixadmin.mo View File


+ 127
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/de_DE/LC_MESSAGES/postfixadmin.po View File

@@ -0,0 +1,127 @@
1
+# postfixadmin - Plugin for Squirrelmail.
2
+# Copyright (C) 2004 FLORIAN KIMMERL
3
+# This file is distributed under the same license as the PACKAGE package.
4
+# Florian Kimmerl <info@spacekoeln.de>, 2004.
5
+#
6
+#, fuzzy
7
+msgid ""
8
+msgstr ""
9
+"Project-Id-Version: 0.3-1.4\n"
10
+"POT-Creation-Date: 2004-01-28 16:32+0100\n"
11
+"PO-Revision-Date: 2004-01-28 16:32+0100\n"
12
+"Last-Translator: FLORIAN KIMMERL <info@spacekoeln.de>\n"
13
+"Language-Team: GERMAN <LL@li.org>\n"
14
+"MIME-Version: 1.0\n"
15
+"Content-Type: text/plain; charset=ISO-8859-1\n"
16
+"Content-Transfer-Encoding: 8bit\n"
17
+
18
+#: setup.php
19
+msgid "Forwarding"
20
+msgstr "Weiterleitungen"
21
+
22
+msgid "Here you can create and edit E-Mail forwards."
23
+msgstr "Hier können Sie E-Mail-Weiterleitungen erstellen und bearbeiten."
24
+
25
+msgid "Set an OUT OF OFFICE message or auto responder for your mail."
26
+msgstr "Hier können Sie den Abwesenheits-Assistenten konfigurieren."
27
+
28
+msgid "Change your mailbox password."
29
+msgstr "Hier können Sie Passwort ändern. Nach der Änderung müssen Sie sich neu anmelden!"
30
+
31
+#: postfixadmin_changepass.php
32
+msgid "Alias"
33
+msgstr "E-Mail"
34
+
35
+msgid "Change Password"
36
+msgstr "Passwort ändern"
37
+
38
+msgid "Change your login password"
39
+msgstr "Ändern Sie Ihr Zugangspasswort für POP3/IMAP"
40
+
41
+#: postfixadmin_forward.php
42
+msgid "Edit Alias"
43
+msgstr "E-Mail Weiterleitungen bearbeiten"
44
+
45
+msgid "Edit an alias* for your domain.<br />One entry per line."
46
+msgstr "Bearbeiten Sie hier Ihre E-Mail Weiterleitungen*.<br />Ein Eintrag pro Zeile."
47
+
48
+msgid "The email address that you have entered is not valid:"
49
+msgstr "Die angegebene E-Mail-Adresse ist ungültig:"
50
+
51
+msgid "Unable to locate alias!"
52
+msgstr "Ihre Weiterleitungen können nicht angefordert werden! Versuchen Sie es später erneut."
53
+
54
+msgid "Unable to modify the alias!"
55
+msgstr "Ihre Weiterleitungen können nicht modifiziert werden! Versuchen Sie es später erneut."
56
+
57
+msgid "*Additional forward-aliase always recieve messages BBC!"
58
+msgstr "*Zusätzliche Weiterleitungen erhalten alle Nachrichten als Kopie (BCC)!"
59
+
60
+msgid "Alias successfully changend!"
61
+msgstr "Weiterleitungen wurden erfolgreich geändert!"
62
+
63
+#: postfixadmin_vacation.php
64
+msgid "Auto Response"
65
+msgstr "Abwesenheits-Assistent"
66
+
67
+msgid "Going Away"
68
+msgstr "Ich bin weg"
69
+
70
+msgid "Coming Back"
71
+msgstr "Ich bin zurück"
72
+
73
+msgid "Options"
74
+msgstr "Optionen"
75
+
76
+msgid "Out of Office"
77
+msgstr ""
78
+
79
+msgid "Subject"
80
+msgstr "Betreff"
81
+
82
+msgid "Body"
83
+msgstr "Nachrichtentext"
84
+
85
+msgid "Your auto response has been removed!"
86
+msgstr "Iher Abwesenheits-Nachricht wurde deaktiviert!"
87
+
88
+msgid "Your auto response has been set!"
89
+msgstr "Ihre Abwesenheits-Nachricht wurde aktiviert!"
90
+
91
+msgid "You already have an auto response configured!"
92
+msgstr "Ihre Abwesenheits-Nachricht ist bereits aktiviert!"
93
+
94
+msgid "back"
95
+msgstr "zurück"
96
+
97
+#: postfixadmin_changepass.php:81 postfixadmin_changepass.php:87
98
+msgid "The passwords that you supplied don't match!<br />Or are empty!"
99
+msgstr "Die beiden neuen Passwörter stimmen nicht überein!<br />Oder die Felder wurden nicht ausgefüllt!"
100
+
101
+#: postfixadmin_forward.php:70 postfixadmin_forward.php:152
102
+msgid "To"
103
+msgstr "An"
104
+
105
+#: postfixadmin_changepass.php:101
106
+msgid "Unable to change your password!"
107
+msgstr "Ihr Passwort kann nicht geändert werden!"
108
+
109
+#: postfixadmin_changepass.php:75
110
+msgid "You didn't supply your current password!"
111
+msgstr "Ihr aktuelles Passwort wurde nicht angegeben oder ist falsch!"
112
+
113
+#: postfixadmin_changepass.php:96
114
+msgid "Your password has been changed!"
115
+msgstr "Ihr Passwort wurde ergolgreich geändert!"
116
+
117
+msgid "Password current"
118
+msgstr "Passwort aktuell"
119
+
120
+msgid "Password new"
121
+msgstr "Passwort neu"
122
+
123
+msgid "Password new again"
124
+msgstr "Passwort neu nochmal"
125
+
126
+msgid "Please sign out and log back again with your new password!"
127
+msgstr "Bitte melden Sie sich hier ab und loggen sich mit Ihrem neuen Passwort erneut ein! "

BIN
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/hu_HU/LC_MESSAGES/postfixadmin.mo View File


+ 135
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/hu_HU/LC_MESSAGES/postfixadmin.po View File

@@ -0,0 +1,135 @@
1
+# postfixadmin - Plugin for Squirrelmail.
2
+# Copyright (C) 2004 FLORIAN KIMMERL
3
+# This file is distributed under the same license as the PACKAGE package.
4
+# Florian Kimmerl <info@spacekoeln.de>, 2004.
5
+#
6
+#, fuzzy
7
+msgid ""
8
+msgstr ""
9
+"Project-Id-Version: 0.3-1.4\n"
10
+"POT-Creation-Date: 2004-01-28 16:32+0100\n"
11
+"PO-Revision-Date: 2004-01-28 16:32+0100\n"
12
+"Last-Translator: FLORIAN KIMMERL <info@spacekoeln.de>\n"
13
+"Language-Team: HUNGARIAN <LL@li.org>\n"
14
+"MIME-Version: 1.0\n"
15
+"Content-Type: text/plain; charset=ISO-8859-2\n"
16
+"Content-Transfer-Encoding: 8bit\n"
17
+
18
+#: setup.php
19
+msgid "Forwarding"
20
+msgstr "Levéltovábbítás"
21
+
22
+msgid "Here you can create and edit E-Mail forwards."
23
+msgstr "Itt tudod létrehozni és szerkeszteni az E-mail továbbításokat."
24
+
25
+msgid "Set an OUT OF OFFICE message or auto responder for your mail."
26
+msgstr "Itt lehet beállítani az automatikus válasz levél szövegét, ha az ember távol van."
27
+
28
+msgid "Change your mailbox password."
29
+msgstr "Itt tudod megváltoztatni a belépéshez szükséges jelszót."
30
+
31
+#: postfixadmin_changepass.php
32
+msgid "Alias"
33
+msgstr "E-mail"
34
+
35
+msgid "Change Password"
36
+msgstr "Jelszó megváltoztatása"
37
+
38
+msgid "Change your login password"
39
+msgstr "Bejelentkezési jelszó megváltoztatása"
40
+
41
+#: postfixadmin_forward.php
42
+msgid "Edit Forward"
43
+msgstr "Levéltovábbítás szerkesztése"
44
+
45
+msgid "Edit Alias"
46
+msgstr "Levéltovábbítás szerkesztése"
47
+
48
+msgid "The email address that you have entered is not valid:"
49
+msgstr "Az E-mail cím amit beírtál hibás:"
50
+
51
+msgid "Unable to locate alias!"
52
+msgstr "Hiba az e-mail címmel."
53
+
54
+msgid "Unable to modify the alias!"
55
+msgstr "A módosítás sikertelen!"
56
+
57
+msgid "Alias successfully changed!"
58
+msgstr "A módosítás sikeres!"
59
+
60
+#: postfixadmin_vacation.php
61
+msgid "Auto Response"
62
+msgstr "Automatikus válasz"
63
+
64
+msgid "Going Away"
65
+msgstr "Házonkívül vagyok"
66
+
67
+msgid "Coming Back"
68
+msgstr "Visszajöttem"
69
+
70
+msgid "Options"
71
+msgstr "Opciók"
72
+
73
+msgid "Out of Office"
74
+msgstr "Házonkívül"
75
+
76
+msgid "Subject"
77
+msgstr "Tárgy"
78
+
79
+msgid "Body"
80
+msgstr "Levéltörzs"
81
+
82
+msgid "Your auto response has been removed!"
83
+msgstr "Az automatikus válasz törölve lett!"
84
+
85
+msgid "Your auto response has been set!"
86
+msgstr "Az automatikus válasz be lett állítva!"
87
+
88
+msgid "You already have an auto response configured!"
89
+msgstr "Már létezik egy automatikus válasz!"
90
+
91
+#: postfixadmin_changepass.php:81 postfixadmin_changepass.php:87
92
+msgid "The passwords that you supplied don't match!<br />Or are empty!"
93
+msgstr "A jelszavak nem egyeznek!<br />Vagy üresen hagytad a mezõket!"
94
+
95
+#: postfixadmin_changepass.php:101
96
+msgid "Unable to change your password!"
97
+msgstr "A jelszó megváltoztatása sikertelen!"
98
+
99
+#: postfixadmin_changepass.php:75
100
+msgid "You didn't supply your current password!"
101
+msgstr "Az aktuális jelszó nem megfelelõ!"
102
+
103
+#: postfixadmin_changepass.php:96
104
+msgid "Your password has been changed!"
105
+msgstr "A jelszó változtatása sikeres volt!"
106
+
107
+msgid "Password current"
108
+msgstr "Aktuális jelszó"
109
+
110
+msgid "Password new"
111
+msgstr "Új jelszó"
112
+
113
+msgid "Password new again"
114
+msgstr "Új jelszó mégegyszer"
115
+
116
+msgid "Please sign out and log back again with your new password!"
117
+msgstr "Kérjük, jelentkezzen ki, majd újra be az új jelszavával!"
118
+
119
+msgid "I will be away from <date> until <date>. For urgent matters you can contact <contact person>."
120
+msgstr "Házonkívül leszek <date> és <date> között. Sürgõs esetben értesítendõ: <contact person>."
121
+
122
+msgid "One copy always goes to"
123
+msgstr "Egy másolat mindig ide"
124
+
125
+msgid "Another copy also goes to"
126
+msgstr "További másolatok ide"
127
+
128
+msgid "Enter an email address (or addresses) where you would like an additional copy of messages addressed to you sent.<br> Enter only one address per line."
129
+msgstr "Sorolja fel azokat az e-mail címeket, amelyekre az Önhöz érkezõ leveleket továbbítani szeretné.<br>Soronként csak egy címet adjon meg!"
130
+
131
+msgid "A copy of each message will go to both your mailbox and the forwarded address(es)."
132
+msgstr "Minden Önnek címzett levél meg fog érkezni a saját postafiókjába és a továbbított e-mail címekre is."
133
+
134
+msgid "To remove a Forward, simply delete its line from the text box."
135
+msgstr "Ahhoz, hogy töröljön egy továbbítást, ki kell törölnie az adott sort a felsorolásból."

+ 129
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/it_IT/LC_MESSAGES/postfixadmin.po View File

@@ -0,0 +1,129 @@
1
+# SOME DESCRIPTIVE TITLE.
2
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+# This file is distributed under the same license as the PACKAGE package.
4
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+#
6
+msgid ""
7
+msgstr ""
8
+"Project-Id-Version: PACKAGE VERSION\n"
9
+"POT-Creation-Date: 2004-01-29 17:35+0100\n"
10
+"PO-Revision-Date: 2010-02-19 11:30+0100\n"
11
+"Last-Translator: valentina <ruggiolona@tiscali.it>\n"
12
+"Language-Team: LANGUAGE <LL@li.org>\n"
13
+"MIME-Version: 1.0\n"
14
+"Content-Type: text/plain; charset=utf-8\n"
15
+"Content-Transfer-Encoding: 8bit\n"
16
+
17
+#: setup.php
18
+msgid "Forwarding"
19
+msgstr "Inoltro E-MAIL"
20
+
21
+msgid "Here you can create and edit E-Mail forwards."
22
+msgstr "Qui puoi creare e modificare l'inoltro dell' E-MAIL."
23
+
24
+msgid "Set an OUT OF OFFICE message or auto responder for your mail."
25
+msgstr "Imposta un messaggio OUT OF OFFICE / ASSENTE o un risponditore automatico per la tua mail."
26
+
27
+msgid "Change your mailbox password."
28
+msgstr "Modifica la tua password di accesso alla mail"
29
+
30
+#: postfixadmin_changepass.php
31
+msgid "Alias"
32
+msgstr "Alias"
33
+
34
+msgid "Change Password"
35
+msgstr "Modifica password"
36
+
37
+msgid "Change your login password"
38
+msgstr "Modifica la tua password di accesso"
39
+
40
+#: postfixadmin_forward.php
41
+msgid "Edit Alias"
42
+msgstr "Modifica Alias"
43
+
44
+msgid "Edit an alias* for your domain.<br />One entry per line."
45
+msgstr "Modifica un Alias per il tuo dominio.<br />Un record per linea."
46
+
47
+msgid "The email address that you have entered is not valid:"
48
+msgstr "L'indirizzo email che hai inserito non è corretto:"
49
+
50
+msgid "Unable to locate alias!"
51
+msgstr "Impossibile trovare l'alias!"
52
+
53
+msgid "Unable to modify the alias!"
54
+msgstr "Impossibile modificare l'alias!"
55
+
56
+msgid "*Additional forward-aliase always recieve messages BBC!"
57
+msgstr "* L'inoltro ad un alias aggiuntivo comporta l'invio del messaggio in BCC!"
58
+
59
+msgid "Alias successfully changend!"
60
+msgstr "Alias modificato correttamente!"
61
+
62
+#: postfixadmin_vacation.php
63
+msgid "Auto Response"
64
+msgstr "Risponditore automatico"
65
+
66
+msgid "Going Away"
67
+msgstr "Going Away"
68
+
69
+msgid "Coming Back"
70
+msgstr "Coming Back"
71
+
72
+msgid "Options"
73
+msgstr "Opzioni"
74
+
75
+msgid "Out of Office"
76
+msgstr "Out of Office/Assente"
77
+
78
+msgid "Subject"
79
+msgstr "Oggetto"
80
+
81
+msgid "Body"
82
+msgstr "Messaggio"
83
+
84
+msgid "Your auto response has been removed!"
85
+msgstr "Il risponditore automatico è stato disattivato!"
86
+
87
+msgid "Your auto response has been set!"
88
+msgstr "Il risponditore automatico è stato configurato!"
89
+
90
+msgid "You already have an auto response configured!"
91
+msgstr "Hai gia configurato il risponditore automatico !"
92
+
93
+#: postfixadmin_changepass.php:81
94
+#: postfixadmin_changepass.php:87
95
+msgid "The passwords that you supplied don't match!<br />Or are empty!"
96
+msgstr "Le password inserite non coincidono!<br />O i campi sono vuoti!"
97
+
98
+#: postfixadmin_forward.php:70
99
+#: postfixadmin_forward.php:152
100
+msgid "To"
101
+msgstr "A"
102
+
103
+#: postfixadmin_changepass.php:101
104
+msgid "Unable to change your password!"
105
+msgstr "Impossibile modificare la password"
106
+
107
+#: postfixadmin_changepass.php:75
108
+msgid "You didn't supply your current password!"
109
+msgstr "Non hai indicato la password attuale!"
110
+
111
+#: postfixadmin_changepass.php:96
112
+msgid "Your password has been changed!"
113
+msgstr "La tua password è stata modificata!"
114
+
115
+msgid "Password current"
116
+msgstr "Password attuale"
117
+
118
+msgid "Password new"
119
+msgstr "Nuova password"
120
+
121
+msgid "Password new again"
122
+msgstr "Insierisci nuovamente la nuova password"
123
+
124
+msgid "Please sign out and log back again with your new password!"
125
+msgstr "Per favore fai log out e riaccedi alla tua mail con la nuova password!"
126
+
127
+msgid "I will be away from <date> until <date>. For urgent matters you can contact <contact person>."
128
+msgstr "Mi dispiace sarò assente dal <date> al <date>. Per richieste urgenti vi prego di contattare <nome e indirizzo email>.    I will be away from <date> until <date>. For urgent matters you can contact <contact person>."
129
+

BIN
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/nl_NL/LC_MESSAGES/postfixadmin.mo View File


+ 131
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/nl_NL/LC_MESSAGES/postfixadmin.po View File

@@ -0,0 +1,131 @@
1
+# SOME DESCRIPTIVE TITLE.
2
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+# This file is distributed under the same license as the PACKAGE package.
4
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+#
6
+#, fuzzy
7
+msgid ""
8
+msgstr ""
9
+"Project-Id-Version: postfixadmin-squirrelmail 2.1.0\n"
10
+"POT-Creation-Date: 2007-11-16 17:35+0100\n"
11
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12
+"Last-Translator: Johan <johan@double-l.nl>\n"
13
+"Language-Team: LANGUAGE <LL@li.org>\n"
14
+"MIME-Version: 1.0\n"
15
+"Content-Type: text/plain; charset=iso-8859-2\n"
16
+"Content-Transfer-Encoding: 8bit\n"
17
+
18
+#: setup.php
19
+msgid "Forwarding"
20
+msgstr "Doorsturen"
21
+
22
+msgid "Here you can create and edit E-Mail forwards."
23
+msgstr "Hier kunt u uw doorstuur adres bewerken"
24
+
25
+msgid "Set an OUT OF OFFICE message or auto responder for your mail."
26
+msgstr "Configureer hier uw automatisch beantwoorden"
27
+
28
+msgid "Change your mailbox password."
29
+msgstr "Verander uw wachtwoord"
30
+
31
+#: postfixadmin_changepass.php
32
+msgid "Alias"
33
+msgstr "Alias"
34
+
35
+msgid "Change Password"
36
+msgstr "Verander wachtwoord"
37
+
38
+msgid "Change your login password"
39
+msgstr "Verander uw login wachtwoord"
40
+
41
+#: postfixadmin_forward.php
42
+msgid "Edit Forwards"
43
+msgstr "Bewerk aliassen"
44
+
45
+msgid "Edit an alias* for your email address.<br />One entry per line."
46
+msgstr "Bewerk uw alias(sen) voor uw emailadres.<br />1 alias per regel."
47
+
48
+msgid "The email address that you have entered is not valid:"
49
+msgstr "Het ingevoerde adres is geen geldig adres"
50
+
51
+msgid "Unable to locate alias!"
52
+msgstr "Niet in staat opgeven alias te vinden!"
53
+
54
+msgid "Unable to modify the alias!"
55
+msgstr "Niet in staat de alias aan te passen"
56
+
57
+msgid "*Additional forward-aliases always receive messages BBC!"
58
+msgstr "Aliassen ontvangen altijd per BCC! "
59
+
60
+msgid "To remove an alias, simply delete its line from the text box."
61
+msgstr "Verwijder de regel om de alias(sen) te verwijderen."
62
+
63
+msgid "Alias successfully changed!"
64
+msgstr "Alias succesvol aangepast"
65
+
66
+#: postfixadmin_vacation.php
67
+msgid "Auto Response"
68
+msgstr "Automatisch beantwoorden"
69
+
70
+msgid "Going Away"
71
+msgstr "Ik ben weg, schakel Out of Office IN"
72
+
73
+msgid "Coming Back"
74
+msgstr "Ik ben terug, schakel Out of Office UIT"
75
+
76
+msgid "Options"
77
+msgstr "Opties"
78
+
79
+msgid "Out of Office"
80
+msgstr "Out of office"
81
+
82
+msgid "Subject"
83
+msgstr "Onderwerp"
84
+
85
+msgid "Body"
86
+msgstr "Tekst"
87
+
88
+msgid "Your auto response has been removed!"
89
+msgstr "Uw automatisch beantwoorden is verwijderd!"
90
+
91
+msgid "Your auto response has been set!"
92
+msgstr "Uw automatisch beantwoorden is geactiveerd!"
93
+
94
+msgid "You already have an auto response configured!"
95
+msgstr "Automatisch beantwoorden is al geconfigureerd!"
96
+
97
+#: postfixadmin_changepass.php:81 postfixadmin_changepass.php:87
98
+msgid "The passwords that you supplied don't match!<br />Or are empty!"
99
+msgstr "De wachtwoorden komen niet overeen!<br />Of er is geen wachtwoord opgegeven!"
100
+
101
+#: postfixadmin_forward.php:70 postfixadmin_forward.php:152
102
+msgid "To"
103
+msgstr "Aan"
104
+
105
+#: postfixadmin_changepass.php:101
106
+msgid "Unable to change your password!"
107
+msgstr "Niet in staat uw wachtwoord te wijzigen!"
108
+
109
+#: postfixadmin_changepass.php:75
110
+msgid "You didn't supply your current password!"
111
+msgstr "U moet uw huidige wachtwoord opgeven!"
112
+
113
+#: postfixadmin_changepass.php:96
114
+msgid "Your password has been changed!"
115
+msgstr "Uw wachtwoord is gewijzigd!"
116
+
117
+msgid "Password current"
118
+msgstr "Huidig wachtwoord"
119
+
120
+msgid "Password new"
121
+msgstr "Nieuw wachtwoord"
122
+
123
+msgid "Password new again"
124
+msgstr "Nieuw wachtwoord nogmaals"
125
+
126
+msgid "Please sign out and log back again with your new password!"
127
+msgstr "Log uit en opnieuw in met het nieuwe wachtwoord"
128
+
129
+msgid "I will be away from <date> until <date>. For urgent matters you can contact <contact person>."
130
+msgstr "Ik ben niet aanwezig van <datum> tot <datum>. Voor dringende zaken kunt u contact opnemen met <Contact persoon>."
131
+

BIN
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/pl_PL/LC_MESSAGES/postfixadmin.mo View File


+ 132
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/pl_PL/LC_MESSAGES/postfixadmin.po View File

@@ -0,0 +1,132 @@
1
+# SOME DESCRIPTIVE TITLE.
2
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+# This file is distributed under the same license as the PACKAGE package.
4
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+#
6
+msgid ""
7
+msgstr ""
8
+"Project-Id-Version: PACKAGE VERSION\n"
9
+"POT-Creation-Date: 2004-01-29 17:35+0100\n"
10
+"PO-Revision-Date: 2007-07-20 20:46+0100\n"
11
+"Last-Translator: Krzysztof Laska <krzysiek@dip.pl>\n"
12
+"Language-Team: LANGUAGE <LL@li.org>\n"
13
+"MIME-Version: 1.0\n"
14
+"Content-Type: text/plain; charset=iso-8859-2\n"
15
+"Content-Transfer-Encoding: 8bit\n"
16
+
17
+#: setup.php
18
+msgid "Forwarding"
19
+msgstr "Przekazywanie"
20
+
21
+msgid "Here you can create and edit E-Mail forwards."
22
+msgstr "Tutaj mo¿esz ustawiæ i edytowaæ opcje przekazywania wiadomo¶ci"
23
+
24
+msgid "Set an OUT OF OFFICE message or auto responder for your mail."
25
+msgstr "Ustaw wiadomo¶æ wysy³an± nadawcom podczas Twojej nieobecno¶ci (Vacation)"
26
+
27
+msgid "Change your mailbox password."
28
+msgstr "Zmieñ has³o do swojego konta pocztowego"
29
+
30
+#: postfixadmin_changepass.php
31
+msgid "Alias"
32
+msgstr "Konto"
33
+
34
+msgid "Change Password"
35
+msgstr "Zmieñ has³o"
36
+
37
+msgid "Change your login password"
38
+msgstr "Zmieñ has³o do swojego konta pocztowego"
39
+
40
+#: postfixadmin_forward.php
41
+msgid "Edit Alias"
42
+msgstr "Edytuj adresy do przekazywania"
43
+
44
+msgid "Edit an alias* for your domain.<br />One entry per line."
45
+msgstr "Edytuj forward* dla swojego konta. <br/> Ka¿dy adres w nowym wierszu."
46
+
47
+msgid "The email address that you have entered is not valid:"
48
+msgstr "Adres e-mail jaki poda³e¶ jest niepoprawny:"
49
+
50
+msgid "Unable to locate alias!"
51
+msgstr "Nie mo¿na zlokalizowaæ aliasu!"
52
+
53
+msgid "Unable to modify the alias!"
54
+msgstr "Nie mo¿na zmodyfikowaæ aliasu!"
55
+
56
+msgid "*Additional forward-aliase always recieve messages BBC!"
57
+msgstr "*Wszystkie dodatkowe adresy zawsze odbieraj± wiadomo¶ci przesy³ane jako BCC! Ca³a poczta jest przekazywana i nie jest przechowywana na koncie podstawowym!"
58
+
59
+msgid "Alias successfully changend!"
60
+msgstr "Zmiana zachowana!"
61
+
62
+msgid "To remove an alias, simply delete it's line from the text box."
63
+msgstr "¯eby wy³±czyæ forward na dane konto po prostu usuñ liniê z adresem na który nie chcesz ju¿ przekazywaæ poczty."
64
+
65
+#: postfixadmin_vacation.php
66
+msgid "Auto Response"
67
+msgstr "Autoodpowied¼"
68
+
69
+msgid "Going Away"
70
+msgstr "W³±cz autoodpowied¼"
71
+
72
+msgid "Coming Back"
73
+msgstr "Wy³±cz autoodpowied¼"
74
+
75
+msgid "Options"
76
+msgstr "Opcje"
77
+
78
+msgid "Out of Office"
79
+msgstr "Autoodpowied¼"
80
+
81
+msgid "Subject"
82
+msgstr "Temat"
83
+
84
+msgid "Body"
85
+msgstr "Tre¶æ"
86
+
87
+msgid "Your auto response has been removed!"
88
+msgstr "Twoja autoodpowied¼ zosta³a wy³±czona!"
89
+
90
+msgid "Your auto response has been set!"
91
+msgstr "Twoja autoodpowied¼ zosta³a w³±czona!"
92
+
93
+msgid "You already have an auto response configured!"
94
+msgstr "Masz ju¿ skonfigurowan± autoodpowied¼!"
95
+
96
+#: postfixadmin_changepass.php:81
97
+#: postfixadmin_changepass.php:87
98
+msgid "The passwords that you supplied don't match!<br />Or are empty!"
99
+msgstr "Has³a które poda³e¶ nie pasuj± lub s± puste!"
100
+
101
+#: postfixadmin_forward.php:70
102
+#: postfixadmin_forward.php:152
103
+msgid "To"
104
+msgstr "Do"
105
+
106
+#: postfixadmin_changepass.php:101
107
+msgid "Unable to change your password!"
108
+msgstr "Nie mo¿na zmieniæ has³a!"
109
+
110
+#: postfixadmin_changepass.php:75
111
+msgid "You didn't supply your current password!"
112
+msgstr "Nie poda³e¶ aktualnego has³a!"
113
+
114
+#: postfixadmin_changepass.php:96
115
+msgid "Your password has been changed!"
116
+msgstr "Twoje has³o zosta³o zmienione!"
117
+
118
+msgid "Password current"
119
+msgstr "Bie¿±ce has³o"
120
+
121
+msgid "Password new"
122
+msgstr "Nowe has³o"
123
+
124
+msgid "Password new again"
125
+msgstr "Powtórz nowe has³o"
126
+
127
+msgid "Please sign out and log back again with your new password!"
128
+msgstr "Wyloguj siê i zaloguj z nowym has³em!"
129
+
130
+msgid "I will be away from <date> until <date>. For urgent matters you can contact <contact person>."
131
+msgstr "Nie bêdê odbieraæ poczty pomiêdzy <data> a <data>. W sprawach pilnych proszê kontaktowaæ siê z <osoba kontaktowa>"
132
+

BIN
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/pt_BR/LC_MESSAGES/postfixadmin.mo View File


+ 127
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/locale/pt_BR/LC_MESSAGES/postfixadmin.po View File

@@ -0,0 +1,127 @@
1
+# SOME DESCRIPTIVE TITLE.
2
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+# This file is distributed under the same license as the PACKAGE package.
4
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+#
6
+#, fuzzy
7
+msgid ""
8
+msgstr ""
9
+"Project-Id-Version: PACKAGE VERSION\n"
10
+"POT-Creation-Date: 2004-01-29 17:35+0100\n"
11
+"PO-Revision-Date: 2008-10-16 20:30+3\n"
12
+"Last-Translator: Julio Covolato <julio@psi.com.br>\n"
13
+"Language-Team: BRAZILIAN PORTUGUESE <LL@li.org>\n"
14
+"MIME-Version: 1.0\n"
15
+"Content-Type: text/plain; charset=utf-8\n"
16
+"Content-Transfer-Encoding: 8bit\n"
17
+
18
+#: setup.php
19
+msgid "Forwarding"
20
+msgstr "Encaminhar"
21
+
22
+msgid "Here you can create and edit E-Mail forwards."
23
+msgstr "Aqui Voc&ecirc; pode criar e editar alias."
24
+
25
+msgid "Set an OUT OF OFFICE message or auto responder for your mail."
26
+msgstr "Configurar mensagem de f&eacute;rias para seu email."
27
+
28
+msgid "Change your mailbox password."
29
+msgstr "Troque a senha de seu email."
30
+
31
+#: postfixadmin_changepass.php
32
+msgid "Alias"
33
+msgstr ""
34
+
35
+msgid "Change Password"
36
+msgstr "Mudar Senha"
37
+
38
+msgid "Change your login password"
39
+msgstr "Mude sua senha de login"
40
+
41
+#: postfixadmin_forward.php
42
+msgid "Edit Alias"
43
+msgstr "Editar Alias"
44
+
45
+msgid "Edit an alias* for your domain.<br />One entry per line."
46
+msgstr "Editar um alias* para seu dom&iacute;nio.<br /> Uma entrada por linha."
47
+
48
+msgid "The email address that you have entered is not valid:"
49
+msgstr "Este endere&ccedil;o de email informado n&atilde;o &eacute; v&aacute;lido:"
50
+
51
+msgid "Unable to locate alias!"
52
+msgstr "Alias n&atilde;o encontrado!"
53
+
54
+msgid "Unable to modify the alias!"
55
+msgstr "Imposs&iacute;vel modificar o alias!"
56
+
57
+msgid "*Additional forward-aliase always recieve messages BBC!"
58
+msgstr "*Alias adicionais sempre recebem mensagens em BCC"
59
+
60
+msgid "Alias successfully changend!"
61
+msgstr "Alias alterado com sucesso!"
62
+
63
+#: postfixadmin_vacation.php
64
+msgid "Auto Response"
65
+msgstr "Auto resposta"
66
+
67
+msgid "Going Away"
68
+msgstr "Ativar"
69
+
70
+msgid "Coming Back"
71
+msgstr "Desativar"
72
+
73
+msgid "Options"
74
+msgstr "Op&ccedil;&otilde;es"
75
+
76
+msgid "Out of Office"
77
+msgstr "Fora do escrit&oacute;rio"
78
+
79
+msgid "Subject"
80
+msgstr "Assunto"
81
+
82
+msgid "Body"
83
+msgstr "Mensagem"
84
+
85
+msgid "Your auto response has been removed!"
86
+msgstr "Sua auto resporta foi removida!"
87
+
88
+msgid "Your auto response has been set!"
89
+msgstr "Sua auto resposta foi ativada!"
90
+
91
+msgid "You already have an auto response configured!"
92
+msgstr "Voc&ecirc; ainda tem uma auto resposta ativa"
93
+
94
+#: postfixadmin_changepass.php:81 postfixadmin_changepass.php:87
95
+msgid "The passwords that you supplied don't match!<br />Or are empty!"
96
+msgstr "A senha digitada n&atilde;o confere!<br />Ou est&aacute; vazia"
97
+
98
+#: postfixadmin_forward.php:70 postfixadmin_forward.php:152
99
+msgid "To"
100
+msgstr "Para"
101
+
102
+#: postfixadmin_changepass.php:101
103
+msgid "Unable to change your password!"
104
+msgstr "Imposs&iacute;vel alterar a sua senha!"
105
+
106
+#: postfixadmin_changepass.php:75
107
+msgid "You didn't supply your current password!"
108
+msgstr "Voc&ecirc; n&atilde;o forneceu a sua senha atual!"
109
+
110
+#: postfixadmin_changepass.php:96
111
+msgid "Your password has been changed!"
112
+msgstr "Sua senha foi alterada com sucesso!"
113
+
114
+msgid "Password current"
115
+msgstr "senha atual"
116
+
117
+msgid "Password new"
118
+msgstr "Nova senha"
119
+
120
+msgid "Password new again"
121
+msgstr "Confirme a nova senha"
122
+
123
+msgid "Please sign out and log back again with your new password!"
124
+msgstr "Por favor, saia e entre novamente no webmail com a nova senha"
125
+
126
+msgid "I will be away from <date> until <date>. For urgent matters you can contact <contact person>."
127
+msgstr "Estarei fora do escrit&oacute;rio entre os dias <data> e <data> do m&ecirc;s de <m&ecirc;s>.<br /> Qualquer mensagem urgente, favor enviar para o email <email>."

+ 127
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/po/postfixadmin.po View File

@@ -0,0 +1,127 @@
1
+# SOME DESCRIPTIVE TITLE.
2
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+# This file is distributed under the same license as the PACKAGE package.
4
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+#
6
+#, fuzzy
7
+msgid ""
8
+msgstr ""
9
+"Project-Id-Version: PACKAGE VERSION\n"
10
+"POT-Creation-Date: 2004-01-29 17:35+0100\n"
11
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+"Language-Team: LANGUAGE <LL@li.org>\n"
14
+"MIME-Version: 1.0\n"
15
+"Content-Type: text/plain; charset=CHARSET\n"
16
+"Content-Transfer-Encoding: 8bit\n"
17
+
18
+#: setup.php
19
+msgid "Forwarding"
20
+msgstr ""
21
+
22
+msgid "Here you can create and edit E-Mail forwards."
23
+msgstr ""
24
+
25
+msgid "Set an OUT OF OFFICE message or auto responder for your mail."
26
+msgstr ""
27
+
28
+msgid "Change your mailbox password."
29
+msgstr ""
30
+
31
+#: postfixadmin_changepass.php
32
+msgid "Alias"
33
+msgstr ""
34
+
35
+msgid "Change Password"
36
+msgstr ""
37
+
38
+msgid "Change your login password"
39
+msgstr ""
40
+
41
+#: postfixadmin_forward.php
42
+msgid "Edit Alias"
43
+msgstr ""
44
+
45
+msgid "Edit an alias* for your domain.<br />One entry per line."
46
+msgstr ""
47
+
48
+msgid "The email address that you have entered is not valid:"
49
+msgstr ""
50
+
51
+msgid "Unable to locate alias!"
52
+msgstr ""
53
+
54
+msgid "Unable to modify the alias!"
55
+msgstr ""
56
+
57
+msgid "*Additional forward-aliase always recieve messages BBC!"
58
+msgstr ""
59
+
60
+msgid "Alias successfully changend!"
61
+msgstr ""
62
+
63
+#: postfixadmin_vacation.php
64
+msgid "Auto Response"
65
+msgstr ""
66
+
67
+msgid "Going Away"
68
+msgstr ""
69
+
70
+msgid "Coming Back"
71
+msgstr ""
72
+
73
+msgid "Options"
74
+msgstr ""
75
+
76
+msgid "Out of Office"
77
+msgstr ""
78
+
79
+msgid "Subject"
80
+msgstr ""
81
+
82
+msgid "Body"
83
+msgstr ""
84
+
85
+msgid "Your auto response has been removed!"
86
+msgstr ""
87
+
88
+msgid "Your auto response has been set!"
89
+msgstr ""
90
+
91
+msgid "You already have an auto response configured!"
92
+msgstr ""
93
+
94
+#: postfixadmin_changepass.php:81 postfixadmin_changepass.php:87
95
+msgid "The passwords that you supplied don't match!<br />Or are empty!"
96
+msgstr ""
97
+
98
+#: postfixadmin_forward.php:70 postfixadmin_forward.php:152
99
+msgid "To"
100
+msgstr ""
101
+
102
+#: postfixadmin_changepass.php:101
103
+msgid "Unable to change your password!"
104
+msgstr ""
105
+
106
+#: postfixadmin_changepass.php:75
107
+msgid "You didn't supply your current password!"
108
+msgstr ""
109
+
110
+#: postfixadmin_changepass.php:96
111
+msgid "Your password has been changed!"
112
+msgstr ""
113
+
114
+msgid "Password current"
115
+msgstr ""
116
+
117
+msgid "Password new"
118
+msgstr ""
119
+
120
+msgid "Password new again"
121
+msgstr ""
122
+
123
+msgid "Please sign out and log back again with your new password!"
124
+msgstr ""
125
+
126
+msgid "I will be away from <date> until <date>. For urgent matters you can contact <contact person>."
127
+msgstr ""

+ 128
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/postfixadmin_changepass.php View File

@@ -0,0 +1,128 @@
1
+<?php
2
+require_once(dirname(__FILE__) . '/common.php');
3
+
4
+$xmlrpc = get_xmlrpc();
5
+$user = $xmlrpc->getProxy('user');
6
+
7
+global $username;
8
+
9
+do_header();
10
+
11
+$USERID_USERNAME = $username;
12
+$tmp = preg_split ('/@/', $USERID_USERNAME);
13
+$USERID_DOMAIN = $tmp[1];
14
+
15
+
16
+$stMessage = '';
17
+$tMessage = '';
18
+$pPassword_admin_text = '';
19
+$pPassword_password_current_text = '';
20
+$pPassword_password_text = '';
21
+$error = 0;
22
+
23
+if ($_SERVER['REQUEST_METHOD'] == "POST")
24
+{
25
+    //$pPassword_password_text = _("pPassword_password_text");
26
+    $fPassword_current = $_POST['fPassword_current'];
27
+    $fPassword = $_POST['fPassword'];
28
+    $fPassword2 = $_POST['fPassword2'];
29
+    $username = $USERID_USERNAME;
30
+
31
+    if(!$user->login($_SESSION['username'], $_POST['fPassword_current'])) {
32
+        $error = 1;
33
+        bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
34
+        textdomain('postfixadmin');
35
+        $pPassword_password_current_text = _("You didn't supply your current password!");
36
+        bindtextdomain('squirrelmail', SM_PATH . 'locale');
37
+        textdomain('squirrelmail');
38
+    }
39
+    $min_length = 0;
40
+    if(isset($CONF['min_password_length'])) {
41
+        $min_length = $CONF['min_password_length'];
42
+    }
43
+    if (empty ($fPassword) or ($fPassword != $fPassword2) or ($min_length > 0 && strlen($fPassword) < $min_length)) {
44
+        $error = 1;
45
+        bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
46
+        textdomain('postfixadmin');
47
+        if(empty($fPassword)) {
48
+            $pPassword_password_text .= _("The passwords that you supplied are empty!");
49
+        }
50
+        if($fPassword != $fPassword2) {
51
+            $pPassword_password_text .= _("The passwords that you supplied don't match!");
52
+        }
53
+        if($min_length > 0 && strlen($fPassword) < $min_length) {
54
+            $pPassword_password_text .= _("The password you supplied is too short!");
55
+        }
56
+        bindtextdomain('squirrelmail', SM_PATH . 'locale');
57
+        textdomain('squirrelmail');
58
+    }
59
+
60
+    if ($error != 1) {
61
+        $success = $user->changePassword($fPassword_current, $fPassword);
62
+
63
+        if ($success) {
64
+            bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
65
+            textdomain('postfixadmin');
66
+            $tMessage = _("Your password has been changed!");
67
+            $stMessage = _("Please sign out and log back again with your new password!");
68
+            bindtextdomain('squirrelmail', SM_PATH . 'locale');
69
+            textdomain('squirrelmail');
70
+        }
71
+        else {
72
+            bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
73
+            textdomain('postfixadmin');
74
+            $tMessage = _("Unable to change your password!");
75
+            bindtextdomain('squirrelmail', SM_PATH . 'locale');
76
+            textdomain('squirrelmail');
77
+        }
78
+    }
79
+}
80
+bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
81
+textdomain('postfixadmin');
82
+echo "<table bgcolor=\"$color[0]\" align=\"center\" width=\"95%\" cellpadding=\"1\" cellspacing=\"0\" border=\"0\">
83
+    <tr>
84
+    <td align=\"center\"><b>". _("Options") ." - ". _("Change Password")." </b>
85
+    <table align=\"center\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" border=\"0\">
86
+    <tr><td bgcolor=\"$color[4]\" align=\"center\"><br>
87
+    <table align=\"center\" width=\"95%\" cellpadding=\"4\" cellspacing=\"0\" border=\"0\"><tr>
88
+    <td bgcolor=\"$color[3]\" align=\"center\"><b>" ._("Change your login password") ."\n
89
+    </b></td>
90
+    </tr>
91
+    <tr>
92
+    <td bgcolor=\"$color[0]\" align=\"center\"><form name=\"mailbox\" method=\"post\">
93
+    <b>$tMessage<b><font color=red><br>
94
+    <a href=\"../../src/signout.php\" target=\"_top\">$stMessage</a>
95
+    ".$pPassword_admin_text."\n
96
+    ".$pPassword_password_current_text."\n
97
+    ".$pPassword_password_text."\n
98
+    </b><table width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"2\">
99
+    <tr>
100
+    <td width=\"37%\"><b>". _("Alias") . ":\n</td>
101
+    <td width=\"63%\">{$_SESSION['username']}</td>
102
+    </tr>
103
+    <tr>
104
+    <td><b>". _("Password current"). ":\n</td>
105
+    <td><input type=\"password\" name=\"fPassword_current\" size=\"30\" /></td>
106
+    </tr>
107
+    <tr>
108
+    <td><b>". _("Password new"). ":\n</td>
109
+    <td><input type=\"password\" name=\"fPassword\" size=\"30\" /></td>
110
+    </tr>
111
+    <tr>
112
+    <td><b>". _("Password new again"). ":\n</td>
113
+    <td><input type=\"password\" name=\"fPassword2\" size=\"30\" /></td>
114
+    </tr>
115
+    <tr>
116
+    <td>&nbsp;</td>
117
+    <td><input type=\"submit\" name=\"submit\" value=\"" ._("Change Password") . "\" /></td>
118
+    <td>&nbsp;</td>
119
+    </tr>
120
+    </table>
121
+    <TT></TT></FORM></td>
122
+    </tr><tr><td bgcolor=\"$color[4]\" align=\"left\">&nbsp;</td>
123
+    </tr></table><BR>
124
+    </td>
125
+    </tr></table></td></tr></table>";
126
+bindtextdomain('squirrelmail', SM_PATH . 'locale');
127
+textdomain('squirrelmail');
128
+?>

+ 165
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/postfixadmin_forward.php View File

@@ -0,0 +1,165 @@
1
+<?php
2
+
3
+require_once(dirname(__FILE__) . '/common.php');
4
+
5
+
6
+
7
+$USERID_USERNAME = $username;
8
+$tmp = preg_split ('/@/', $USERID_USERNAME);
9
+$USERID_LOCALPART = $tmp[0];
10
+$USERID_DOMAIN = $tmp[1];
11
+
12
+$xmlrpc = get_xmlrpc();
13
+$alias = $xmlrpc->getProxy('alias');
14
+do_header();
15
+// Normal page request (GET)
16
+if ($_SERVER['REQUEST_METHOD'] == "GET")
17
+{
18
+    $row = $alias->get();
19
+    if($row === false) {
20
+        bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
21
+        textdomain('postfixadmin');
22
+        $tMessage = _("Unable to locate alias!");
23
+        bindtextdomain('squirrelmail', SM_PATH . 'locale');
24
+        textdomain('squirrelmail');
25
+        exit(0);
26
+    }
27
+}
28
+
29
+if ($_SERVER['REQUEST_METHOD'] == "POST")
30
+{
31
+    $pEdit_alias_goto = _("To");
32
+
33
+    $fGoto = $_POST['fGoto'];
34
+
35
+    // reform string into a list...
36
+    $goto = preg_replace ('/\r\n/', ',', $fGoto);
37
+    $goto = preg_replace ('/[\s]+/i', '', $goto);
38
+    $goto = preg_replace ('/\,*$/', '', $goto);
39
+    $array = preg_split ('/,/', $goto);
40
+    $error = 0;
41
+    // check that we have valid addresses in the list
42
+
43
+    foreach($array as $key => $email_address) 
44
+    {
45
+        if (empty($email_address))
46
+        {
47
+            unset($array[$key]);	
48
+            continue;
49
+        }
50
+        if (!check_email($email_address)) 
51
+        {
52
+            $error = 1;
53
+            $tGoto = $goto;
54
+            bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
55
+            textdomain('postfixadmin');
56
+            $tMessage = _("The email address that you have entered is not valid:") . " $email_address</font>";
57
+            bindtextdomain('squirrelmail', SM_PATH . 'locale');
58
+            textdomain('squirrelmail');
59
+        }
60
+    }
61
+    if ($error != 1) {
62
+        $flag = 'forward_and_store'; // goto = $USERID_USERNAME;
63
+        $success = $alias->update($array, $flag);
64
+        if(!$success) {
65
+            bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
66
+            textdomain('postfixadmin');
67
+            $tMessage = _("Unable to modify the alias!");
68
+            bindtextdomain('squirrelmail', SM_PATH . 'locale');
69
+            textdomain('squirrelmail');
70
+        }
71
+        else {
72
+
73
+            bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
74
+            textdomain('postfixadmin');
75
+            echo "<p align=center><b>". _("Alias successfully changed!"). "\n</b></p>";
76
+            bindtextdomain('squirrelmail', SM_PATH . 'locale');
77
+            textdomain('squirrelmail');
78
+            echo "<p align=center><a href=\"javascript:history.go(-1)\">". _("Click here to go back") ."</a></p>";
79
+            exit;
80
+        }
81
+    }
82
+}
83
+bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
84
+textdomain('postfixadmin');
85
+
86
+if(!isset($tMessage)) {
87
+    $tMessage = '';
88
+}
89
+echo "<table bgcolor=\"$color[0]\" align=\"center\" width=\"95%\" cellpadding=\"1\" cellspacing=\"0\" border=\"0\">
90
+<tr>
91
+<td align=\"center\" bgcolor=\"$color[0]\" colspan=\"2\">
92
+<b>". _("Options") ." - ". _("Edit Alias"). " </b>
93
+<table align=\"center\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">
94
+<tr>
95
+<td bgcolor=\"$color[4]\" align=\"center\">
96
+<table align=\"center\" width=\"100%\">
97
+<tr>
98
+<td align=\"left\">". _("Edit an alias* for your email address.<br />One entry per line."). " </td>
99
+</tr>
100
+<tr>
101
+<td align=\"left\">". _("*Additional forward-aliases always receive messages BCC!"). "\n
102
+</tr>
103
+<tr>
104
+<td align=\"left\">" . _("To remove an alias, simply delete its line from the text box.") . "</td>
105
+</tr>
106
+</table>
107
+<table align=\"center\" width\"95%\" cellpadding=\"5\" cellspacing=\"1\">
108
+<form name=\"mailbox\" method=\"post\">
109
+<tr>
110
+<td bgcolor=\"$color[3]\" align=\"center\"><b>". _("Edit Forwards"). "</b>
111
+</td>
112
+</tr>
113
+<tr>
114
+<td bgcolor=\"$color[5]\" align=\"center\">$tMessage
115
+<table cellpadding=\"5\" cellspacing=\"1\">
116
+<tr>
117
+<th align=\"left\">". _("Alias"). ":\n
118
+</th>
119
+<td align=\"left\">" . $_SESSION['username'] . "</td>
120
+</tr>
121
+<tr>
122
+<th>&nbsp;</th>
123
+<td>&nbsp;</td>
124
+</tr>
125
+<tr>
126
+<th align=\"left\" valign=\"top\">". _("To"). ":\n</th>
127
+<td>
128
+<textarea rows=\"8\" cols=\"50\" name=\"fGoto\">";
129
+bindtextdomain('squirrelmail', SM_PATH . 'locale');
130
+textdomain('squirrelmail');
131
+$aliases = $alias->get();
132
+foreach($aliases as $address) {
133
+    if ($address == "" || $address == NULL) { continue; }
134
+    print "$address\n";
135
+}
136
+bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
137
+textdomain('postfixadmin');
138
+echo "
139
+</textarea>
140
+</td>
141
+</tr>
142
+<tr>
143
+<th>&nbsp;</th>
144
+<td>&nbsp;</td>
145
+</tr>
146
+<tr>
147
+<th>&nbsp;</th>
148
+<td align=\"left\"colspan=\"2\">
149
+<input type=\"submit\" name=\"submit\" value=\"" . _("Edit Alias") . "\">
150
+</td>
151
+</tr>
152
+</table>
153
+</td>
154
+</tr>
155
+</table>
156
+</form>
157
+</td>
158
+</tr>
159
+</table>
160
+</td></tr>
161
+</table>
162
+";
163
+bindtextdomain('squirrelmail', SM_PATH . 'locale');
164
+textdomain('squirrelmail');
165
+?>

+ 157
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/postfixadmin_vacation.php View File

@@ -0,0 +1,157 @@
1
+<?php
2
+
3
+require_once(dirname(__FILE__) . '/common.php');
4
+
5
+$xmlrpc = get_xmlrpc();
6
+$vacation = $xmlrpc->getProxy('vacation');
7
+
8
+$VACCONFTXT = _("I will be away from <date> until <date>. For urgent matters you can contact <contact person>.");
9
+bindtextdomain('squirrelmail', SM_PATH . 'locale');
10
+textdomain('squirrelmail');
11
+$VACCONF = <<<EOM
12
+$VACCONFTXT
13
+EOM;
14
+
15
+do_header();
16
+
17
+$USERID_USERNAME = $username;
18
+$tmp = preg_split ('/@/', $USERID_USERNAME);
19
+$USERID_DOMAIN = $tmp[1];
20
+
21
+if ($_SERVER['REQUEST_METHOD'] == "GET")
22
+{
23
+    $details = $vacation->getDetails();
24
+    if($vacation->checkVacation()) {
25
+
26
+        bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
27
+        textdomain('postfixadmin');
28
+        $tMessage = _("You already have an auto response configured!");
29
+        bindtextdomain('squirrelmail', SM_PATH . 'locale');
30
+        textdomain('squirrelmail');
31
+        bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
32
+        textdomain('postfixadmin');
33
+        echo "<table bgcolor=\"#b8cbdc\" align=\"center\" width=\"95%\" cellpadding=\"1\" cellspacing=\"0\" border=\"0\"><tr>
34
+            <td align=\"center\"><b>". _("Options") ." - ". _("Auto Response") ."</b>
35
+            <table align=\"center\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" border=\"0\">
36
+            <tr><td bgcolor=\"$color[4]\" align=\"center\"><br>
37
+            <table align=\"center\" width=\"70%\" cellpadding=\"4\" cellspacing=\"0\" border=\"0\"><tr>
38
+            <td bgcolor=\"$color[3]\" align=\"center\"><b>". _("Auto Response") ."\n
39
+            </b></td></tr><tr>
40
+            <td bgcolor=\"$color[0]\" align=\"center\"><form name=\"vacation\" method=\"post\">
41
+            <table width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"2\">
42
+            <tr>
43
+            <td><center>$tMessage<p></center></td>
44
+            </tr>
45
+            <tr>
46
+            <td> <div align=\"center\">
47
+            <input type=\"submit\" name=\"fBack\" value=\"" . _("Coming Back"). "\" />
48
+            </div></td>
49
+            </tr>
50
+            </table>
51
+            <TT></TT></FORM>
52
+            </td>
53
+            </tr><tr><td bgcolor=\"$color[4]\" align=\"left\">&nbsp;</td>
54
+            </tr></table><BR></td></tr></table></td></tr></table>";
55
+        bindtextdomain('squirrelmail', SM_PATH . 'locale');
56
+        textdomain('squirrelmail');
57
+    }
58
+    else
59
+    {
60
+        $tSubject = "Out of Office";
61
+        $tSubject = $details['subject'];
62
+        $VACCONF = $details['body'];
63
+
64
+        $tMessage = '';
65
+        bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
66
+        textdomain('postfixadmin');
67
+        echo "<table bgcolor=\"$color[0]\" align=\"center\" width=\"95%\" cellpadding=\"1\" cellspacing=\"0\" border=\"0\">
68
+            <tr>
69
+            <td align=\"center\"><b>". _("Options") ." - ". _("Auto Response") ." </b>
70
+            <table align=\"center\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" border=\"0\">
71
+            <tr><td bgcolor=\"$color[4]\" align=\"center\"><br>
72
+            <table align=\"center\" width=\"70%\" cellpadding=\"4\" cellspacing=\"0\" border=\"0\"><tr>
73
+            <td bgcolor=\"$color[3]\" align=\"center\"><b>" . _("Auto Response") ."\n
74
+            </b></td></tr><tr>
75
+            <td bgcolor=\"$color[0]\" align=\"center\"><form name=\"vacation\" method=\"post\">$tMessage
76
+            <table width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"2\"><tr>
77
+            <td width=\"23%\">". _("Subject") .":\n</td>
78
+            <td width=\"2%\">&nbsp;</td>
79
+            <td width=\"69%\"><input type=\"text\" name=\"fSubject\" value=\"" . $tSubject . "\" /></td>
80
+            <td width=\"2%\">&nbsp;</td>
81
+            <td width=\"4%\">&nbsp;</td>
82
+            </tr><tr>
83
+            <td>". _("Body") .":\n</td>
84
+            <td>&nbsp;</td>
85
+            <td><textarea rows=\"10\" cols=\"80\" name=\"fBody\">$VACCONF\n
86
+            </textarea></td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td>
87
+            <td><input type=\"submit\" name=\"fAway\" value=\"" . _("Going Away") . "\" /></td>
88
+            <td>&nbsp;</td><td>&nbsp;</td></tr>
89
+            </table><TT></TT></FORM></td>
90
+            </tr><tr><td bgcolor=\"$color[4]\" align=\"left\">&nbsp;</td>
91
+            </tr></table><BR></td></tr></table></td></tr></table>";
92
+        bindtextdomain('squirrelmail', SM_PATH . 'locale');
93
+        textdomain('squirrelmail');
94
+    }
95
+}
96
+
97
+if ($_SERVER['REQUEST_METHOD'] == "POST")
98
+{
99
+    $fBack = null;
100
+    $fAway = null;
101
+    foreach(array('fBack', 'fAway', 'fSubject', 'fBody') as $key) {
102
+        $$key = null;
103
+        if(isset($_POST[$key])) {
104
+            $$key = $_POST[$key];
105
+        }
106
+    }
107
+    
108
+    if (!empty($fBack))
109
+    {
110
+        $success = $vacation->remove();
111
+
112
+        if(!$success)
113
+        {
114
+            bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
115
+            textdomain('postfixadmin');
116
+            $tMessage = _("Unable to update your auto response settings!");
117
+            echo "<p>This may signify an error; please contact support (1)</p>";
118
+            bindtextdomain('squirrelmail', SM_PATH . 'locale');
119
+            textdomain('squirrelmail');
120
+        }
121
+        else
122
+        {
123
+            bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
124
+            textdomain('postfixadmin');
125
+            echo "<p align=center><b>". _("Your auto response has been removed!") ."</b></p>";
126
+            bindtextdomain('squirrelmail', SM_PATH . 'locale');
127
+            textdomain('squirrelmail');
128
+
129
+        }
130
+    }
131
+
132
+    if (!empty ($fAway))
133
+    {
134
+        // add record into vacation
135
+        $success = $vacation->setAway($fSubject, $fBody);
136
+
137
+        if(!$success) {
138
+            $error = 1;
139
+            bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
140
+            textdomain('postfixadmin');
141
+            $tMessage = _("Unable to update your auto response settings!");
142
+            bindtextdomain('squirrelmail', SM_PATH . 'locale');
143
+            textdomain('squirrelmail');
144
+        }
145
+        else
146
+        {
147
+            bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
148
+            textdomain('postfixadmin');
149
+            echo "<p align=center><b>". _("Your auto response has been set!") ."</b></p>";
150
+            bindtextdomain('squirrelmail', SM_PATH . 'locale');
151
+            textdomain('squirrelmail');
152
+
153
+        }
154
+    }
155
+}
156
+
157
+?>

+ 61
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/setup.php View File

@@ -0,0 +1,61 @@
1
+<?php
2
+// vim:ts=4:sw=4:et
3
+include_once(SM_PATH . 'functions/i18n.php');
4
+
5
+function squirrelmail_plugin_init_postfixadmin() {
6
+    include(dirname(__FILE__) . '/config.php');
7
+    global $squirrelmail_plugin_hooks;
8
+
9
+    $squirrelmail_plugin_hooks['optpage_register_block']['postfixadmin'] = 'postfixadmin_optpage_register_block';
10
+
11
+}
12
+
13
+function postfixadmin_version(){
14
+    return '2.3.0';
15
+}
16
+
17
+function postfixadmin_optpage_register_block () {
18
+    // Gets added to the user's OPTIONS page.
19
+    global $optpage_blocks;
20
+    global $AllowVacation;
21
+    global $AllowChangePass;
22
+
23
+    //  if ( !soupNazi() ) {
24
+
25
+    bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
26
+    textdomain('postfixadmin');
27
+    $optpage_blocks[] = array (
28
+        'name' => _("Forwarding"),
29
+        'url'  => '../plugins/postfixadmin/postfixadmin_forward.php',
30
+        'desc' => _("Here you can create and edit E-Mail forwards."),
31
+        'js'   => FALSE
32
+    );
33
+    bindtextdomain('squirrelmail', SM_PATH . 'locale');
34
+    textdomain('squirrelmail');
35
+
36
+    bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
37
+    textdomain('postfixadmin');
38
+    if($AllowVacation) {
39
+        $optpage_blocks[] = array(
40
+            'name' => _("Auto Response"),
41
+            'url'  => '../plugins/postfixadmin/postfixadmin_vacation.php',
42
+            'desc' => _("Set an OUT OF OFFICE message or auto responder for your mail."),
43
+            'js'   => false
44
+        );
45
+        bindtextdomain('squirrelmail', SM_PATH . 'locale');
46
+        textdomain('squirrelmail');
47
+    }
48
+    bindtextdomain('postfixadmin', SM_PATH . 'plugins/postfixadmin/locale');
49
+    textdomain('postfixadmin');
50
+    if($AllowChangePass) {
51
+        $optpage_blocks[] = array(
52
+            'name' => _("Change Password"),
53
+            'url'  => '../plugins/postfixadmin/postfixadmin_changepass.php',
54
+            'desc' => _("Change your mailbox password."),
55
+            'js'   => false
56
+        );
57
+        bindtextdomain('squirrelmail', SM_PATH . 'locale');
58
+        textdomain('squirrelmail');
59
+    }
60
+}
61
+?>

+ 2
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/squirrelmail-plugin/version View File

@@ -0,0 +1,2 @@
1
+postfixadmin
2
+2.3.0

+ 185
- 0
postfixadmin/postfixadmin-3.0/ADDITIONS/virtualmaildel.php View File

@@ -0,0 +1,185 @@
1
+<?php
2
+//
3
+// Virtual Mail Delete
4
+// by George Vieira <george at citadelcomputer dot com dot au>
5
+//
6
+// You can run this from your crontab with something like
7
+//
8
+// 0 4 * * * *    vmail    php -q virtualmaildel.php >/dev/null
9
+
10
+	//
11
+	// Setup location of postfixadmin config files. Needed to login to mysql
12
+	//
13
+	$conf		= '/home/httpd/mail/admin/config.inc.php';
14
+
15
+	//
16
+	// Where's the homedir accounts stored. (GET THIS RIGHT OTHERWISE IT THINK NONE EXIST AND DELETES ALL)
17
+	//
18
+	$homedir	= '/home/virtual';
19
+
20
+	//
21
+	// Make sure everything is everything before continuing
22
+	//
23
+	if ( ! file_exists( $conf ) )
24
+		die( "Cannot find config file $conf\n" );
25
+
26
+	if ( ! is_dir( $homedir ) )
27
+		die( "Cannot find home directory for virtual mailboxes in $homedir\n" );
28
+
29
+	//
30
+	// Load mysql authentication from postfixadmin
31
+	//
32
+	include( $conf );
33
+
34
+	//
35
+	// Recursive Delete Function
36
+	//
37
+	function deldir($dir)
38
+	{
39
+		$current_dir = opendir($dir);
40
+		while($entryname = readdir($current_dir))
41
+		{
42
+			if(is_dir("$dir/$entryname") and ($entryname != "." and $entryname!=".."))
43
+			{
44
+				deldir("${dir}/${entryname}");
45
+			}
46
+			elseif($entryname != "." and $entryname!="..")
47
+			{
48
+				unlink("${dir}/${entryname}");
49
+			}
50
+		}
51
+		closedir($current_dir);
52
+		@rmdir(${dir});
53
+	}
54
+
55
+// --- Main Start ---
56
+
57
+	//
58
+	// Get list of directories
59
+	//
60
+	$fr = opendir( $homedir );
61
+	while ( ($domain = readdir($fr)) !== false)
62
+	{
63
+		//
64
+		// Check if it's a dir
65
+		//
66
+		if ( $domain != "." and $domain != ".." and filetype($homedir .'/'. $domain) == "dir" )
67
+		{
68
+			//
69
+			// Open the (assumed) DOMAIN directory
70
+			//
71
+			$ff = opendir( $homedir .'/'. $domain );
72
+			while ( ($user = readdir($ff)) !== false)
73
+			{
74
+				//
75
+				// Check for directories assuming it's a user account
76
+				//
77
+				if ( $user!="." and $user!=".." and filetype($homedir .'/'. $domain .'/'. $user) == "dir" )
78
+				{
79
+					//
80
+					// if the dir 'new' exists inside then it's an account
81
+					//
82
+					if ( file_exists($homedir .'/'. $domain .'/'. $user .'/'. "new") )
83
+					{
84
+						$dir[$domain][$user] = "";
85
+					}
86
+					else
87
+					{
88
+						//
89
+						// Alert that the dir doesn't have a 'new' dir, possibly not an account. Leave it.
90
+						//
91
+						echo "UNKNOWN  : " . $homedir ."/". $domain ."/". $user ."/new NOT FOUND. Possibly not an account. Leaving untouched\n";
92
+					}
93
+				}
94
+			} 
95
+		}
96
+	} 
97
+	//
98
+	// OK, got an array of accounts from the dir, Now connect to the DB and check them
99
+	//
100
+	$conx = mysql_connect( $CONF['database_host'],$CONF['database_user'],$CONF['database_password'] );
101
+	//
102
+	// Is there a problem connecting?
103
+	//
104
+	if ( $conx != false )
105
+	{
106
+		//
107
+		// Select the database
108
+		//
109
+		mysql_select_db( $CONF['database_name'] , $conx) or die ("Can't access database postfix : " . mysql_error()); 
110
+
111
+		//
112
+		// Select all mailboxes to verify against dirs listed in array
113
+		//
114
+		$query = "SELECT * FROM mailbox";
115
+		$result = mysql_query( $query );
116
+
117
+		//
118
+		// Query the mailbox table
119
+		//
120
+		if ( $result != false )
121
+		{
122
+			//
123
+			// Fetch the list of results
124
+			//
125
+			while ( $row = mysql_fetch_assoc( $result ) )
126
+			{
127
+				//
128
+				// Pull apart the maildir field, needed to figure out the directory structure to compare
129
+				//
130
+				$strip = explode("/",$row['maildir']);
131
+				//
132
+				// Unset the array if it exists. This stops it being erased later.
133
+				//
134
+				unset( $dir[ $strip[0] ][ $strip[1] ] );
135
+			}
136
+			//
137
+			// If there are results. unset the domain too.
138
+			//
139
+			if ( count($dir[$strip[0]])==0 and mysql_num_rows($result)>0 )
140
+				unset( $dir[$strip[0]] );
141
+		}
142
+		else
143
+			die( "Failed SELECT in mailboxes\n" );
144
+	}
145
+	else
146
+		die( 'Cannot connect to the database!\n' );
147
+
148
+	//
149
+	// OK, time to clean up. All known users/domains have been removed from the list.
150
+	//
151
+
152
+	//
153
+	// If the array still exists (incase nothing there)
154
+	//
155
+	if ( is_array($dir) )
156
+	{
157
+		//
158
+		// Go through each dir
159
+		//
160
+		foreach ( $dir as $key => $value )
161
+		{
162
+			//
163
+			// Is this a user array?
164
+			//
165
+			if ( is_array( $value) )
166
+			{
167
+				//
168
+				// Go through and nuke the folders
169
+				//
170
+				foreach ( $value as $user => $value2 )
171
+				{
172
+					//
173
+					// Nuke.. need any more explanations?
174
+					//
175
+					echo "REMOVING : " . $homedir."/".$key."/".$user."\n" ;
176
+					deldir( $homedir."/".$key."/".$user ) ;
177
+				}
178
+			}
179
+		}
180
+	}
181
+	//
182
+	// And we are outta here....
183
+	//
184
+	echo "Cleanup process completed\n";
185
+?>

+ 1015
- 0
postfixadmin/postfixadmin-3.0/CHANGELOG.TXT
File diff suppressed because it is too large
View File


+ 39
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/BACKUP_MX.txt View File

@@ -0,0 +1,39 @@
1
+#
2
+# Postfix Admin
3
+# by Mischa Peters <mischa at high5 dot net>
4
+# Copyright (c) 2002 - 2005 High5!
5
+# Licensed under GPL for more info check GPL-LICENSE.TXT
6
+#
7
+
8
+Please follow these steps if your mailserver is used as a backup MX for some
9
+(or all) of your domains.
10
+
11
+Note: The setup described in this file only checks the domain, not the full
12
+mail address. 
13
+You should use "reject_unverified_recipient" in your postfix config or setup
14
+"relay_recipient_maps" with a list of valid mail adresses on the primary mx
15
+to avoid that your backup MX accepts mails for non-existing recipient adresses.
16
+Without this, your backup MX might become a backscatter source.
17
+
18
+1. Modify main.cf
19
+-----------------
20
+In order for Postfix to use MySQL for relay_domains add the following
21
+to your main.cf
22
+
23
+relay_domains = proxy:mysql:/usr/local/etc/postfix/mysql_relay_domains_maps.cf
24
+
25
+
26
+2. mysql_relay_domains_maps.cf
27
+------------------------------
28
+You will need to put this into a text file for postfix to pickup.
29
+
30
+user = postfix
31
+password = password
32
+hosts = localhost
33
+dbname = postfix
34
+query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = '1'
35
+
36
+
37
+3. Restart Postfix
38
+-------------------
39
+When you are done make sure to restart Postfix so the changes take effect.

+ 214
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/DOVECOT.txt View File

@@ -0,0 +1,214 @@
1
+#
2
+# Dovecot configuration for Postfix Admin
3
+# Originally written by: Massimo <AndyCapp> Danieli
4
+# Revised by: Sampsa Hario <shario> for Dovecot v1.0
5
+# Revised by: David Goodwin <david@palepurple.co.uk> for Dovecot 2.1.x  (2014/01/02)
6
+#
7
+
8
+More complete Dovecot documentation:
9
+
10
+http://wiki.dovecot.org/Quota
11
+http://wiki.dovecot.org/Quota/Dict
12
+http://www.opensourcehowto.org/how-to/mysql/mysql-users-postfixadmin-postfix-dovecot--squirrelmail-with-userprefs-stored-in-mysql.html
13
+
14
+
15
+Here are the relevant parts of Dovecot v2.1.x configuration for Postfixadmin setup.
16
+
17
+Please refer to Dovecot documentation for complete information.
18
+
19
+The setup gets userdb and passdb info from MySQL as well as quotas, and 
20
+uses dict backend to store used quotas as key=value pairs so that they can
21
+be viewed real-time in Postfixadmin.
22
+
23
+
24
+1. Dovecot setup
25
+-----------------
26
+
27
+A basic /etc/dovecot/dovecot.conf is as follows, this was generated using 'dovecot -n' on a vanilla install and then
28
+changing to talk to a PostgreSQL or MySQL database. 
29
+
30
+# BEGIN /etc/dovecot/dovecot.conf:
31
+# Change this to where your mail root is, this needs to match whatever structure postfix expects....
32
+
33
+mail_location = maildir:/var/mail/vmail/%u/
34
+
35
+namespace inbox {
36
+  inbox = yes
37
+  location = 
38
+  mailbox Drafts {
39
+    special_use = \Drafts
40
+  }
41
+  mailbox Junk {
42
+    special_use = \Junk
43
+  }
44
+  mailbox Sent {
45
+    special_use = \Sent
46
+  }
47
+  mailbox "Sent Messages" {
48
+    special_use = \Sent
49
+  }
50
+  mailbox Trash {
51
+    special_use = \Trash
52
+  }
53
+  prefix = 
54
+}
55
+
56
+protocols = "imap pop3"
57
+# change to 'no' if you don't have ssl cert/keys, and comment out ssl_cert/ssl_key
58
+ssl = yes 
59
+ssl_cert = </etc/dovecot/private/dovecot.pem
60
+ssl_key = </etc/dovecot/private/dovecot.pem
61
+
62
+# login is for outlook express smtpd auth
63
+auth_mechanisms = plain login
64
+
65
+# If you're having trouble, try uncommenting these :
66
+#auth_debug = yes
67
+#auth_debug_passwords = yes
68
+
69
+userdb { 
70
+    driver = sql
71
+    args = /etc/dovecot/dovecot-sql.conf 
72
+}
73
+
74
+passdb { 
75
+    driver = sql
76
+    args = /etc/dovecot/dovecot-sql.conf 
77
+}
78
+
79
+# Uncomment this if you want Postfix to be able to do smtpd auth through dovecot
80
+# At a minimum Postfix probably needs : smtpd_sasl_type = dovecot 
81
+# And additionally: smtpd_sasl_path = private/auth
82
+#service auth {
83
+#    unix_listener /var/spool/postfix/private/auth {
84
+#        mode = 0660
85
+#        user = postfix
86
+#        group = postfix
87
+#    }
88
+#    user = postfix
89
+#    group = postfix
90
+#}
91
+
92
+# Needs to match Postfix virtual_uid_maps
93
+first_valid_uid = 1001 
94
+
95
+# allow plaintext auth (change to 'yes' to block plaintext passwords)
96
+disable_plaintext_auth = no
97
+
98
+#END
99
+
100
+
101
+2. Dovecot *sql setup
102
+----------------------
103
+
104
+Below you'll find the relevant part of dovecot-sql.conf file regarding our
105
+setup. 
106
+
107
+Things you will probably need to change are db connection settings (connect=)
108
+and the default_pass_scheme.
109
+
110
+#BEGIN /etc/dovecot/dovecot-sql.conf
111
+
112
+connect = host=localhost dbname=postfix user=postfix password=postfix
113
+# Use either 
114
+driver = mysql
115
+# Or 
116
+# driver = pgsql
117
+
118
+# Default password scheme - change to match your Postfixadmin setting.
119
+# depends on your $CONF['encrypt'] setting:
120
+# md5crypt  -> MD5-CRYPT
121
+# md5       -> PLAIN-MD5
122
+# cleartext -> PLAIN
123
+default_pass_scheme = MD5-CRYPT
124
+
125
+# Query to retrieve password. user can be used to retrieve username in other
126
+# formats also.
127
+
128
+password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'
129
+
130
+# Query to retrieve user information, note uid matches dovecot.conf AND Postfix virtual_uid_maps parameter.
131
+user_query = SELECT maildir, 1001 AS uid, 1001 AS gid FROM mailbox WHERE username = '%u' AND active='1'
132
+
133
+
134
+# MYSQL :
135
+user_query = SELECT CONCAT('/var/vmail/mail/', maildir) AS home, 1001 AS uid, 1001 AS gid, 
136
+	CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active='1'
137
+# PostgreSQL : (no Quota though) :
138
+# user_query = SELECT '/var/vmail/mail/' || maildir AS home, 1001 as uid, 1001 as gid FROM mailbox WHERE username = '%u' AND active = '1'
139
+
140
+#END /etc/dovecot/dovecot-sql.conf
141
+
142
+
143
+
144
+
145
+
146
+3. Dovecot v1.0 quota support (optional)
147
+----------------------------------------
148
+
149
+Please note that you need to use Dovecot's own local delivery agent to
150
+enforce and update quotas. Then you can view real-time used quotas in
151
+Postfixadmin.
152
+
153
+Add to dovecot.conf:
154
+
155
+## IMAP quota
156
+protocol imap {
157
+  quota = dict:storage=200000 proxy::quota
158
+}
159
+
160
+## POP quota
161
+protocol pop3 {
162
+  mail_plugins = quota
163
+}
164
+
165
+## Local Delivery Agent
166
+protocol lda {
167
+  mail_plugins = quota
168
+}
169
+
170
+## Dictionary DB proxy
171
+dict {
172
+  quota = mysql:/etc/dovecot-dict-quota.conf
173
+}
174
+
175
+## Default quota values
176
+plugin {
177
+quota = dict:storage=200000 proxy::quota
178
+}
179
+
180
+
181
+Change dovecot-sql.conf to return quota values:
182
+
183
+for MySQL:
184
+user_query = SELECT maildir, 1001 AS uid, 1001 AS gid, CONCAT('dict:storage=',floor(quota/1000),' proxy::quota') as quota FROM mailbox WHERE username = '%u' AND active='1'
185
+
186
+for PostgreSQL:
187
+user_query = SELECT maildir, 1001 AS uid, 1001 AS gid, 'dict:storage=' || floor(quota/1000) || '::proxy::quota' as quota FROM mailbox WHERE username = '%u' AND active='1'
188
+
189
+
190
+Create file dovecot-dict-quota.conf:
191
+
192
+driver = mysql
193
+connect = host=localhost dbname=postfix user=postfix password=postfix
194
+default_pass_scheme = MD5-CRYPT
195
+table = quota
196
+select_field = current
197
+where_field = path
198
+username_field = username
199
+
200
+
201
+Create database in Mysql:
202
+(This is automatically done by postfixadmin's setup.php)
203
+
204
+Enable quota support in Postfixadmin config.inc.php:
205
+
206
+$CONF['used_quotas'] = 'YES';
207
+$CONF['quota'] = 'YES';
208
+
209
+Note: The above text describes the configuration for dovecot 1.0 & 1.1 quota table format.
210
+
211
+If you use dovecot 1.2 or newer, 
212
+- use the 'quota2' table (also created by setup.php)
213
+- set $CONF['new_quota_table'] = 'YES'
214
+

+ 36
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/FAQ.txt View File

@@ -0,0 +1,36 @@
1
+Frequently Asked Questions:
2
+
3
+
4
+1) Why isn't PostfixAdmin creating my mailbox?
5
+
6
+ - PostfixAdmin is only a web interface for storing configuration settings. 
7
+   It does not (by default!) have the ability to create mail folders on disk. 
8
+   In a normal setup, sending the 'Welcome' email accomplishes this task - 
9
+   as Courier/Cyrus/etc do it (and have permission to do so)
10
+
11
+
12
+2) I've deleted the mailbox from PostfixAdmin, yet it still exists on disk? Why?
13
+
14
+ - This is related to #1 above - namely, PostfixAdmin (which is a php web 
15
+   application) does not have permission to modify the mailbox files on disk.
16
+   You need to either manually remove the directories 
17
+   (e.g. rm -Rf /var/spool/mail/vmail/something@example.org) 
18
+   or install the postfixadmin-mailbox-postdeletion.sh script (See ADDITIONS/)
19
+   and modify config.inc.php appropriately.
20
+
21
+
22
+3) How do I have to setup sudo to run the $CONF['*_script'] scripts?
23
+
24
+ - run   visudo   to edit the sudo configuration file
25
+ - add a line like this for every script you want to run:
26
+      wwwrun  ALL = (courier) NOPASSWD: /usr/local/bin/postfixadmin-mailbox-postcreation.sh
27
+   (replace usernames and path according to your setup)
28
+
29
+
30
+4) I try and create a mailbox, but it keeps saying "Invalid email address"... ?
31
+
32
+ - Postfixadmin, by default, attempts to verify an email address is valid, partly by
33
+   checking that the domain exists. For most people this works as expected, but
34
+   if it doesn't for you, try editing $CONF['emailcheck_resolve_domain'] to 'NO' in 
35
+   config.inc.php and try again.
36
+

+ 50
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/HORDE.txt View File

@@ -0,0 +1,50 @@
1
+Horde integration with Postfixadmin 
2
+
3
+This is taken from the following thread :
4
+
5
+https://sourceforge.net/forum/forum.php?thread_id=1869141&forum_id=676076
6
+
7
+Namely :
8
+
9
+"Hi, people, I was wondering if anyone was using PA with Horde3. I want my users to be able to change teir password from inside Horde, so I was wondering if anyone has implemented a custom hook or defined a SQL query to make the password change possible. "
10
+
11
+
12
+Solution :
13
+
14
+"Hi, 
15
+ 
16
+that works for me without any hook - with the SQL driver. I connect through IP to localhost. You can also try socket connection... 
17
+ 
18
+my horde/passwd/config/backends.php looks like: 
19
+ 
20
+$backends['sql'] = array ( 
21
+'name' => 'Mail SQL Server', 
22
+'preferred' => '', 
23
+'password policy' => array( 
24
+'minLength' => 3, 
25
+'maxLength' => 8, 
26
+'maxSpace' => 0, 
27
+'minUpper' => 1, 
28
+'minLower' => 1, 
29
+'minNumeric' => 1, 
30
+'minSymbols' => 1 
31
+), 
32
+'driver' => 'sql', 
33
+'params' => array( 
34
+'phptype' => 'mysql', 
35
+'hostspec' => '127.0.0.1', 
36
+'port' => '3306', 
37
+'protocol' => 'tcp', 
38
+'username' => 'postfix', 
39
+'password' => 'yourpostfixdbpassword', 
40
+'encryption' => 'crypt-md5', 
41
+'database' => 'postfix', 
42
+'table' => 'mailbox', 
43
+'user_col' => 'username', 
44
+'pass_col' => 'password', 
45
+'show_encryption' => false 
46
+) 
47
+); "
48
+
49
+Thanks to 'Kope' for the solution, and of course Luis Hernán Otegui (slimshady76) for asking the question.
50
+

+ 17
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/LANGUAGE.txt View File

@@ -0,0 +1,17 @@
1
+#
2
+# Postfix Admin
3
+# by Mischa Peters <mischa at high5 dot net>
4
+# Copyright (c) 2002 - 2005 High5!
5
+# Licensed under GPL for more info check GPL-LICENSE.TXT
6
+#
7
+
8
+If you want to contribute a translation, please follow these easy steps:
9
+- download your language file from SVN
10
+  http://postfixadmin.svn.sourceforge.net/viewvc/postfixadmin/trunk/languages/
11
+- search for lines with '# XXX' comments and
12
+  - translate the line
13
+  - remove the '# XXX'
14
+  Note: The file is utf-8 encoded. You can also use htmlentities.
15
+- post your translation to the Sourceforge tracker
16
+  http://sourceforge.net/tracker/?group_id=191583&atid=937966
17
+

+ 26
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/POSTFIXADMIN.txt View File

@@ -0,0 +1,26 @@
1
+---------------------------------------
2
+  The different parts of PostfixAdmin
3
+
4
+
5
+Postfix Admin has a concept of a "global" administrator (think 'root') and 
6
+domain administrators.  When you install PostfixAdmin, the setup.php file 
7
+will ask you to create the global administrators account. Using this global
8
+account, you can (if you so wish) create domain administrators who are 
9
+limited to making changes within the domains you specify for them.
10
+
11
+Historically when you logged in as the 'global' (or superadmin) user, you'd
12
+access /admin; with version 2.2.0, this 'functionality' was removed (as there
13
+was excessive code duplication) and everyone uses the same login.php script.
14
+
15
+
16
+Needless to say, as a global administrator, you can do all kinds of bad things -
17
+like deleting domains and stopping delivery of mail to a particular mailbox. So
18
+- take care, and if you're unsure take semi-regular backups.
19
+
20
+
21
+If you login, and you are not an administrator (i.e. you are a 'regular' user
22
+who just has a mailbox on the server), then you will only see functionality to 
23
+modify your own account - e.g. change password, edit forward records and specify 
24
+whether you are on vacation (out of office) or not.
25
+
26
+

+ 176
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/POSTFIX_CONF.txt View File

@@ -0,0 +1,176 @@
1
+#!/bin/bash
2
+content="
3
+
4
+  Postfix configuration for use with PostfixAdmin
5
+
6
+-----------------------
7
+
8
+  Your installation of Postfix MUST support either MySQL or Postgres
9
+lookup tables.  You can verify that with 'postconf -m'
10
+
11
+Its generally recommended to use proxy as well (which should also appear in
12
+postconf -m)  Three main.cf variables are involved:
13
+
14
+virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
15
+virtual_alias_maps =
16
+   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
17
+   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
18
+   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
19
+virtual_mailbox_maps =
20
+   proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
21
+   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
22
+
23
+# if you let postfix store your mails directly (without using maildrop, dovecot deliver etc.)
24
+virtual_mailbox_base = /var/mail/vmail
25
+# or whereever you want to store the mails
26
+
27
+# Additional for quota support
28
+virtual_create_maildirsize = yes
29
+virtual_mailbox_extended = yes
30
+virtual_mailbox_limit_maps = mysql:/etc/postfix/sql/mysql_virtual_mailbox_limit_maps.cf
31
+virtual_mailbox_limit_override = yes
32
+virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
33
+virtual_overquota_bounce = yes
34
+
35
+Where you chose to store the .cf files doesn't really matter, but they will
36
+have database passwords stored in plain text so they should be readable only
37
+by user postfix, or in a directory only accessible to user postfix.
38
+
39
+This isn't necessarily all you need to do to Postfix to get up and
40
+running.  Also, additional changes are needed for the vacation
41
+autoreply features.
42
+
43
+-------------------------
44
+
45
+  Contents of the files
46
+
47
+These are examples only, you will likely have to and want to make some
48
+customizations.  You will also want to consider the config.inc.php
49
+settings for domain_path and domain_in_mailbox.  These examples
50
+use values of domain_path=YES and domain_in_mailbox=NO
51
+
52
+You can create these files (with your values for user, password, hosts and
53
+dbname) automatically by executing this file (sh POSTFIX_CONF.txt).
54
+Please note that the generated files are for use with MySQL. 
55
+
56
+If you are using PostgreSQL, you'll need to do some changes to the queries:
57
+- PostgreSQL uses a different implementation for boolean values, which means 
58
+  you'll need to change  active='1'  to  active='t'  in all queries
59
+- PostgreSQL does not have a concat() function, instead use e.g. 
60
+  .... alias.address = '%u' || '@' || alias_domain.target_domain AND ....
61
+ 
62
+
63
+mysql_virtual_alias_maps.cf:
64
+user = postfix
65
+password = password
66
+hosts = localhost
67
+dbname = postfix
68
+query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
69
+#expansion_limit = 100
70
+
71
+mysql_virtual_alias_domain_maps.cf:
72
+user = postfix
73
+password = password
74
+hosts = localhost
75
+dbname = postfix
76
+query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
77
+
78
+mysql_virtual_alias_domain_catchall_maps.cf:
79
+# handles catch-all settings of target-domain
80
+user = postfix
81
+password = password
82
+hosts = localhost
83
+dbname = postfix
84
+query  = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
85
+
86
+(See above note re Concat + PostgreSQL)
87
+
88
+mysql_virtual_domains_maps.cf:
89
+user = postfix
90
+password = password
91
+hosts = localhost
92
+dbname = postfix
93
+query          = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
94
+#query          = SELECT domain FROM domain WHERE domain='%s'
95
+#optional query to use when relaying for backup MX
96
+#query           = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
97
+#expansion_limit = 100
98
+
99
+mysql_virtual_mailbox_maps.cf:
100
+user = postfix
101
+password = password
102
+hosts = localhost
103
+dbname = postfix
104
+query           = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
105
+#expansion_limit = 100
106
+
107
+mysql_virtual_alias_domain_mailbox_maps.cf:
108
+user = postfix
109
+password = password
110
+hosts = localhost
111
+dbname = postfix
112
+query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'
113
+
114
+
115
+(See above note re Concat + PostgreSQL)
116
+
117
+# For quota support
118
+
119
+mysql_virtual_mailbox_limit_maps.cf:
120
+user = postfix
121
+password = password
122
+hosts = localhost
123
+dbname = postfix
124
+query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
125
+
126
+-------------------------
127
+
128
+  More information - HowTo docs that use PostfixAdmin
129
+
130
+http://postfix.wiki.xs4all.nl/index.php?title=Virtual_Users_and_Domains_with_Courier-IMAP_and_MySQL
131
+http://wiki.dovecot.org/HowTo/DovecotLDAPostfixAdminMySQL
132
+
133
+" # end content
134
+
135
+# generate config files out of this file
136
+# to do this, run   sh POSTFIX_CONF.txt
137
+
138
+POSTFIX_CONF="$0"
139
+
140
+map_files="`sed -n '/^mysql.*cf:/ s/://p' < \"$0\"`"
141
+
142
+tmpdir="`mktemp -d /tmp/postfixadmin-XXXXXX`" || { echo "Error: could not create tempdir" >&2 ; exit 1; }
143
+echo $tmpdir
144
+
145
+echo 'Database host? (often localhost)'
146
+read hosts
147
+test -z "$hosts" && hosts=localhost
148
+
149
+echo 'Database name?'
150
+read dbname
151
+test -z "$dbname" && { echo "Error: you did not enter a database name" >&2 ; exit 1; }
152
+
153
+echo Database user?
154
+read user
155
+test -z "$user" && { echo "Error: you did not enter a database username" >&2 ; exit 1; }
156
+
157
+echo Database password?
158
+read password
159
+test -z "$password" && { echo "Error: you did not enter a database password" >&2 ; exit 1; }
160
+
161
+for file in $map_files ; do
162
+	(
163
+		echo "# $file"
164
+		sed -n "/$file:/,/^$/ p" < "$POSTFIX_CONF" | sed "
165
+			1d ; # filename
166
+			s/^user =.*/user = $user/ ;
167
+			s/^password =.*/password = $password/ ;
168
+			s/^hosts =.*/hosts = $hosts/ ;
169
+			s/^dbname =.*/dbname = $dbname/ ;
170
+		"
171
+	) > "$tmpdir/$file"
172
+done
173
+
174
+echo "Config files have been written to $tmpdir. Please check their content and move them to /etc/postfix/sql/."
175
+echo "Do not forget to edit /etc/postfix/main.cf as described in $POSTFIX_CONF."
176
+

+ 44
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/SECURITY.txt View File

@@ -0,0 +1,44 @@
1
+Security and PostfixAdmin
2
+-------------------------
3
+
4
+While the developers of PostfixAdmin believe the software to be 
5
+secure, there is no guarantee that it will continue to do be so
6
+in the future - especially as new types of exploit are discovered.
7
+(After all, this software is without warranty!)
8
+
9
+In the event you do discover a vulnerability in this software,
10
+please report it to the development mailing list, or contact 
11
+one of the developers directly.
12
+
13
+
14
+
15
+
16
+DATABASE USER SECURITY
17
+----------------------
18
+
19
+You may wish to consider the following :
20
+
21
+ 1. Postfix only requires READ access to the database tables.
22
+ 2. The virtual vacation support (if used) only needs to WRITE to 
23
+    the vacation_notification table (and read alias and vacation).
24
+ 3. PostfixAdmin itself needs to be able to READ and WRITE to 
25
+    all the tables.
26
+ 4. PostfixAdmin's setup.php additionally needs permissions to CREATE
27
+    and ALTER tables in the PostfixAdmin database. For PostgreSQL, also
28
+	permissions for CREATE FUNCTION and CREATE TRIGGER are needed.
29
+	In other words: setup.php needs all permissions on the PostfixAdmin
30
+	database.
31
+
32
+Using the above, you can improve security by creating separate 
33
+database user accounts for each of the above roles, and limit 
34
+the permissions available to them as appropriate.
35
+
36
+
37
+FILE SYSTEM SECURITY
38
+--------------------
39
+
40
+PostfixAdmin does not require write support on the underlying 
41
+filesystem with the following exceptions:
42
+- the templates_c directory where Smarty caches the templates
43
+- PHP's session.save_path to store session files
44
+

+ 16
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/SUPERADMIN.txt View File

@@ -0,0 +1,16 @@
1
+------------------------------------
2
+  Recreating a superadmin account
3
+
4
+
5
+When you run setup.php you will be required to enter a super user name and password. 
6
+This user will be able to login and modify any domain or setting. Hence, superadmin!.
7
+
8
+With that login you can create new superadmins (and you should delete or change the
9
+password of  admin@domain.tld). If that user is no longer there or you didn't use
10
+the .TXT files, you could add another manually from the database. 
11
+
12
+In case you forgot your superadmin username or password, you can create a new
13
+superadmin account using setup.php.
14
+
15
+If you also have forgotten your setup password, you can use setup.php to configure
16
+a new setup password.

+ 111
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/UPGRADE.txt View File

@@ -0,0 +1,111 @@
1
+#
2
+# Postfix Admin
3
+# by Mischa Peters <mischa at high5 dot net>
4
+# Copyright (c) 2002 - 2005 High5!
5
+# Licensed under GPL for more info check GPL-LICENSE.TXT
6
+#
7
+
8
+REQUIRED!!
9
+----------
10
+- You are using Postfix 2.0 or higher.
11
+- You are using Apache 1.3.27 / Lighttpd 1.3.15 or higher.
12
+- You are using PHP 5.1.2 or higher.
13
+- You are using MySQL 3.23 or higher OR PostgreSQL v7.4+
14
+
15
+
16
+READ THIS FIRST!
17
+----------------
18
+
19
+This document describes upgrading from an older PostfixAdmin version
20
+(>= v1.5x)
21
+
22
+It's recommend that you install Postfix Admin in a new folder and not
23
+on-top of the old install!! (At the very least, make sure you have backups of 
24
+the database and relevant filesystem!)
25
+
26
+When upgrading Postfix Admin, make sure you backup your database before
27
+running upgrade.php.
28
+
29
+
30
+1. Backup the Database
31
+----------------------
32
+When you install from a previous version make sure you backup your database
33
+first. There are a lot of changes in the database structure since Postfix Admin
34
+1.5.4.
35
+
36
+  $ mysqldump -a -u root -p > /tmp/postfixadmin-backup.sql
37
+or
38
+  $ pg_dump -ad -u postfix postfix > /tmp/postfixadmin-backup.sql
39
+
40
+
41
+2. Unarchive new Postfix Admin
42
+------------------------------
43
+Make sure that you are in your WWW directory and then unarchive the
44
+Postfix Admin archive (whatever the filename is):
45
+
46
+  $ tar -zxvf postfixadmin-X.X.tgz
47
+
48
+
49
+3. Change permissions
50
+----------------------
51
+Since the database password is stored in the config.inc.php it's a good idea
52
+to have change the permissions for Postfix Admin.
53
+
54
+  $ cd /usr/local/www/postfixadmin
55
+  $ find -type f -print0 | xargs -0 chmod 640
56
+  $ find -type f -print0 | xargs -0 chown root:www
57
+
58
+(the last command assumes your Apache is running with group "www")
59
+
60
+Since version 2.4 we use smarty templates. That means the templates_c directory
61
+needs to be writeable for your webserver.
62
+
63
+  $ chown -R www-data templates_c/
64
+
65
+(if your Apache runs as user "www-data")
66
+
67
+
68
+4. Configure
69
+------------
70
+Check the config.inc.php file. There you can specify settings that are
71
+relevant to your setup.
72
+
73
+Comparing config.inc.php with your previous using "diff" might save you some
74
+time.
75
+
76
+You can use a config.local.php file to contain your local settings. These will override any 
77
+defined in config.inc.php - and save some time when upgrading to a new version of PostfixAdmin ;-)
78
+
79
+5. Run setup.php
80
+----------------------------------------
81
+
82
+Access setup.php through a web browser.
83
+
84
+It will attempt to upgrade your database, and also allow you to create a superadmin user.
85
+(In case the database upgrade fails, you can run setup.php?debug=1 to see the last executed query.)
86
+
87
+From version 2.3, you need to specify a setup_password in config.inc.php - 
88
+setup.php should guide you through this process. If you do not have a setup_password, type one
89
+into the form, and setup.php will echo out the hashed value (which needs to go into config.inc.php).
90
+The setup_password removes the requirement for you to delete setup.php, and also closes a security hole.
91
+
92
+Since version 2.2 of Postfixadmin, setup.php can perform the needed database 
93
+updates automatically .
94
+
95
+If you update from 2.1 or older, also create a superadmin account using setup.php.
96
+
97
+Note that admin/ has been merged into the main directory. Login with the
98
+superadmin account to setup domains and domain admins.
99
+
100
+6. Upgrade your postfix config
101
+------------------------------
102
+
103
+Since version 2.3, PostfixAdmin supports alias domains ($CONF['alias_domain']).
104
+If you want to use them, you have to add some queries to your postfix config -
105
+see POSTFIX_CONF for details.
106
+
107
+
108
+7. Done
109
+-------
110
+This is all that is needed. Fire up your browser and go to the site that you
111
+specified to host Postfix Admin.

+ 2
- 0
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/README.txt View File

@@ -0,0 +1,2 @@
1
+Random Screenshots taken on 2007/09/25, using a version of Postfixadmin from subversion.
2
+

BIN
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-admin-create-alias.jpg View File


BIN
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-admin-create-domain.jpg View File


BIN
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-admin-create-mailbox.jpg View File


BIN
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-admin-domain-list.jpg View File


BIN
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-admin-virtual-list.jpg View File


BIN
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-inital-welcome.jpg View File


BIN
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-mail-admin-login.jpg View File


BIN
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-user-change-forward.jpg View File


BIN
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-user-overview.jpg View File


BIN
postfixadmin/postfixadmin-3.0/DOCUMENTS/screenshots/postfixadmin-user-vacation.jpg View File


+ 281
- 0
postfixadmin/postfixadmin-3.0/GPL-LICENSE.TXT View File

@@ -0,0 +1,281 @@
1
+		    GNU GENERAL PUBLIC LICENSE
2
+		       Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+			    Preamble
10
+
11
+  The licenses for most software are designed to take away your
12
+freedom to share and change it.  By contrast, the GNU General Public
13
+License is intended to guarantee your freedom to share and change free
14
+software--to make sure the software is free for all its users.  This
15
+General Public License applies to most of the Free Software
16
+Foundation's software and to any other program whose authors commit to
17
+using it.  (Some other Free Software Foundation software is covered by
18
+the GNU Library General Public License instead.)  You can apply it to
19
+your programs, too.
20
+
21
+  When we speak of free software, we are referring to freedom, not
22
+price.  Our General Public Licenses are designed to make sure that you
23
+have the freedom to distribute copies of free software (and charge for
24
+this service if you wish), that you receive source code or can get it
25
+if you want it, that you can change the software or use pieces of it
26
+in new free programs; and that you know you can do these things.
27
+
28
+  To protect your rights, we need to make restrictions that forbid
29
+anyone to deny you these rights or to ask you to surrender the rights.
30
+These restrictions translate to certain responsibilities for you if you
31
+distribute copies of the software, or if you modify it.
32
+
33
+  For example, if you distribute copies of such a program, whether
34
+gratis or for a fee, you must give the recipients all the rights that
35
+you have.  You must make sure that they, too, receive or can get the
36
+source code.  And you must show them these terms so they know their
37
+rights.
38
+
39
+  We protect your rights with two steps: (1) copyright the software, and
40
+(2) offer you this license which gives you legal permission to copy,
41
+distribute and/or modify the software.
42
+
43
+  Also, for each author's protection and ours, we want to make certain
44
+that everyone understands that there is no warranty for this free
45
+software.  If the software is modified by someone else and passed on, we
46
+want its recipients to know that what they have is not the original, so
47
+that any problems introduced by others will not reflect on the original
48
+authors' reputations.
49
+
50
+  Finally, any free program is threatened constantly by software
51
+patents.  We wish to avoid the danger that redistributors of a free
52
+program will individually obtain patent licenses, in effect making the
53
+program proprietary.  To prevent this, we have made it clear that any
54
+patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+  The precise terms and conditions for copying, distribution and
57
+modification follow.
58
+
59
+		    GNU GENERAL PUBLIC LICENSE
60
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+  0. This License applies to any program or other work which contains
63
+a notice placed by the copyright holder saying it may be distributed
64
+under the terms of this General Public License.  The "Program", below,
65
+refers to any such program or work, and a "work based on the Program"
66
+means either the Program or any derivative work under copyright law:
67
+that is to say, a work containing the Program or a portion of it,
68
+either verbatim or with modifications and/or translated into another
69
+language.  (Hereinafter, translation is included without limitation in
70
+the term "modification".)  Each licensee is addressed as "you".
71
+
72
+Activities other than copying, distribution and modification are not
73
+covered by this License; they are outside its scope.  The act of
74
+running the Program is not restricted, and the output from the Program
75
+is covered only if its contents constitute a work based on the
76
+Program (independent of having been made by running the Program).
77
+Whether that is true depends on what the Program does.
78
+
79
+  1. You may copy and distribute verbatim copies of the Program's
80
+source code as you receive it, in any medium, provided that you
81
+conspicuously and appropriately publish on each copy an appropriate
82
+copyright notice and disclaimer of warranty; keep intact all the
83
+notices that refer to this License and to the absence of any warranty;
84
+and give any other recipients of the Program a copy of this License
85
+along with the Program.
86
+
87
+You may charge a fee for the physical act of transferring a copy, and
88
+you may at your option offer warranty protection in exchange for a fee.
89
+
90
+  2. You may modify your copy or copies of the Program or any portion
91
+of it, thus forming a work based on the Program, and copy and
92
+distribute such modifications or work under the terms of Section 1
93
+above, provided that you also meet all of these conditions:
94
+
95
+    a) You must cause the modified files to carry prominent notices
96
+    stating that you changed the files and the date of any change.
97
+
98
+    b) You must cause any work that you distribute or publish, that in
99
+    whole or in part contains or is derived from the Program or any
100
+    part thereof, to be licensed as a whole at no charge to all third
101
+    parties under the terms of this License.
102
+
103
+    c) If the modified program normally reads commands interactively
104
+    when run, you must cause it, when started running for such
105
+    interactive use in the most ordinary way, to print or display an
106
+    announcement including an appropriate copyright notice and a
107
+    notice that there is no warranty (or else, saying that you provide
108
+    a warranty) and that users may redistribute the program under
109
+    these conditions, and telling the user how to view a copy of this
110
+    License.  (Exception: if the Program itself is interactive but
111
+    does not normally print such an announcement, your work based on
112
+    the Program is not required to print an announcement.)
113
+
114
+These requirements apply to the modified work as a whole.  If
115
+identifiable sections of that work are not derived from the Program,
116
+and can be reasonably considered independent and separate works in
117
+themselves, then this License, and its terms, do not apply to those
118
+sections when you distribute them as separate works.  But when you
119
+distribute the same sections as part of a whole which is a work based
120
+on the Program, the distribution of the whole must be on the terms of
121
+this License, whose permissions for other licensees extend to the
122
+entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+Thus, it is not the intent of this section to claim rights or contest
125
+your rights to work written entirely by you; rather, the intent is to
126
+exercise the right to control the distribution of derivative or
127
+collective works based on the Program.
128
+
129
+In addition, mere aggregation of another work not based on the Program
130
+with the Program (or with a work based on the Program) on a volume of
131
+a storage or distribution medium does not bring the other work under
132
+the scope of this License.
133
+
134
+  3. You may copy and distribute the Program (or a work based on it,
135
+under Section 2) in object code or executable form under the terms of
136
+Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+    a) Accompany it with the complete corresponding machine-readable
139
+    source code, which must be distributed under the terms of Sections
140
+    1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+    b) Accompany it with a written offer, valid for at least three
143
+    years, to give any third party, for a charge no more than your
144
+    cost of physically performing source distribution, a complete
145
+    machine-readable copy of the corresponding source code, to be
146
+    distributed under the terms of Sections 1 and 2 above on a medium
147
+    customarily used for software interchange; or,
148
+
149
+    c) Accompany it with the information you received as to the offer
150
+    to distribute corresponding source code.  (This alternative is
151
+    allowed only for noncommercial distribution and only if you
152
+    received the program in object code or executable form with such
153
+    an offer, in accord with Subsection b above.)
154
+
155
+The source code for a work means the preferred form of the work for
156
+making modifications to it.  For an executable work, complete source
157
+code means all the source code for all modules it contains, plus any
158
+associated interface definition files, plus the scripts used to
159
+control compilation and installation of the executable.  However, as a
160
+special exception, the source code distributed need not include
161
+anything that is normally distributed (in either source or binary
162
+form) with the major components (compiler, kernel, and so on) of the
163
+operating system on which the executable runs, unless that component
164
+itself accompanies the executable.
165
+
166
+If distribution of executable or object code is made by offering
167
+access to copy from a designated place, then offering equivalent
168
+access to copy the source code from the same place counts as
169
+distribution of the source code, even though third parties are not
170
+compelled to copy the source along with the object code.
171
+
172
+  4. You may not copy, modify, sublicense, or distribute the Program
173
+except as expressly provided under this License.  Any attempt
174
+otherwise to copy, modify, sublicense or distribute the Program is
175
+void, and will automatically terminate your rights under this License.
176
+However, parties who have received copies, or rights, from you under
177
+this License will not have their licenses terminated so long as such
178
+parties remain in full compliance.
179
+
180
+  5. You are not required to accept this License, since you have not
181
+signed it.  However, nothing else grants you permission to modify or
182
+distribute the Program or its derivative works.  These actions are
183
+prohibited by law if you do not accept this License.  Therefore, by
184
+modifying or distributing the Program (or any work based on the
185
+Program), you indicate your acceptance of this License to do so, and
186
+all its terms and conditions for copying, distributing or modifying
187
+the Program or works based on it.
188
+
189
+  6. Each time you redistribute the Program (or any work based on the
190
+Program), the recipient automatically receives a license from the
191
+original licensor to copy, distribute or modify the Program subject to
192
+these terms and conditions.  You may not impose any further
193
+restrictions on the recipients' exercise of the rights granted herein.
194
+You are not responsible for enforcing compliance by third parties to
195
+this License.
196
+
197
+  7. If, as a consequence of a court judgment or allegation of patent
198
+infringement or for any other reason (not limited to patent issues),
199
+conditions are imposed on you (whether by court order, agreement or
200
+otherwise) that contradict the conditions of this License, they do not
201
+excuse you from the conditions of this License.  If you cannot
202
+distribute so as to satisfy simultaneously your obligations under this
203
+License and any other pertinent obligations, then as a consequence you
204
+may not distribute the Program at all.  For example, if a patent
205
+license would not permit royalty-free redistribution of the Program by
206
+all those who receive copies directly or indirectly through you, then
207
+the only way you could satisfy both it and this License would be to
208
+refrain entirely from distribution of the Program.
209
+
210
+If any portion of this section is held invalid or unenforceable under
211
+any particular circumstance, the balance of the section is intended to
212
+apply and the section as a whole is intended to apply in other
213
+circumstances.
214
+
215
+It is not the purpose of this section to induce you to infringe any
216
+patents or other property right claims or to contest validity of any
217
+such claims; this section has the sole purpose of protecting the
218
+integrity of the free software distribution system, which is
219
+implemented by public license practices.  Many people have made
220
+generous contributions to the wide range of software distributed
221
+through that system in reliance on consistent application of that
222
+system; it is up to the author/donor to decide if he or she is willing
223
+to distribute software through any other system and a licensee cannot
224
+impose that choice.
225
+
226
+This section is intended to make thoroughly clear what is believed to
227
+be a consequence of the rest of this License.
228
+
229
+  8. If the distribution and/or use of the Program is restricted in
230
+certain countries either by patents or by copyrighted interfaces, the
231
+original copyright holder who places the Program under this License
232
+may add an explicit geographical distribution limitation excluding
233
+those countries, so that distribution is permitted only in or among
234
+countries not thus excluded.  In such case, this License incorporates
235
+the limitation as if written in the body of this License.
236
+
237
+  9. The Free Software Foundation may publish revised and/or new versions
238
+of the General Public License from time to time.  Such new versions will
239
+be similar in spirit to the present version, but may differ in detail to
240
+address new problems or concerns.
241
+
242
+Each version is given a distinguishing version number.  If the Program
243
+specifies a version number of this License which applies to it and "any
244
+later version", you have the option of following the terms and conditions
245
+either of that version or of any later version published by the Free
246
+Software Foundation.  If the Program does not specify a version number of
247
+this License, you may choose any version ever published by the Free Software
248
+Foundation.
249
+
250
+  10. If you wish to incorporate parts of the Program into other free
251
+programs whose distribution conditions are different, write to the author
252
+to ask for permission.  For software which is copyrighted by the Free
253
+Software Foundation, write to the Free Software Foundation; we sometimes
254
+make exceptions for this.  Our decision will be guided by the two goals
255
+of preserving the free status of all derivatives of our free software and
256
+of promoting the sharing and reuse of software generally.
257
+
258
+			    NO WARRANTY
259
+
260
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
262
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
266
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
267
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+REPAIR OR CORRECTION.
269
+
270
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+POSSIBILITY OF SUCH DAMAGES.
279
+
280
+		     END OF TERMS AND CONDITIONS
281
+

+ 159
- 0
postfixadmin/postfixadmin-3.0/INSTALL.TXT View File

@@ -0,0 +1,159 @@
1
+#
2
+# Postfix Admin
3
+# by Mischa Peters <mischa at high5 dot net>
4
+# Copyright (c) 2002 - 2005 High5!
5
+# Licensed under GPL for more info check GPL-LICENSE.TXT
6
+#
7
+
8
+REQUIRED!!
9
+----------
10
+- You are using Postfix 2.0 or higher.
11
+- You are using Apache 1.3.27 / Lighttpd 1.3.15 or higher.
12
+- You are using PHP 5.1.2 or higher.
13
+- You are using MySQL 3.23 or higher (5.x recommended) OR PostgreSQL 7.4 (or higher)
14
+
15
+
16
+READ THIS FIRST!
17
+----------------
18
+When this is an upgrade from a previous version of Postfix Admin, please read 
19
+DOCUMENTS/UPGRADE.TXT also!
20
+
21
+If you need to setup Postfix to be able to handle Virtual Domains and Virtual
22
+Users check out:
23
+
24
+  - the PostfixAdmin documentation in the DOCUMENTS/ directory
25
+  - our wiki at http://sourceforge.net/apps/mediawiki/postfixadmin/
26
+
27
+There are also lots of HOWTOs around the web. Be warned that many of them 
28
+(even those listed below) may be outdated or incomplete. 
29
+Please stick to the PostfixAdmin documentation, and use those HOWTOs only if
30
+you need some additional information that is missing in the PostfixAdmin 
31
+DOCUMENTS/ folder.
32
+  - http://codepoets.co.uk/postfixadmin-postgresql-courier-squirrelmail-debian-etch-howto-tutorial (Debian+Courier+PostgreSQL+Postfix+Postfixadmin)
33
+  - http://bliki.rimuhosting.com/space/knowledgebase/linux/mail/postfixadmin+on+debian+sarge (Postfix+MySQL+Postfixadmin+Dovecot)
34
+  - http://en.gentoo-wiki.com/wiki/Virtual_mail_server_using_Postfix,_Courier_and_PostfixAdmin (Postfix+MySQL+Postfixadmin+Courier)
35
+
36
+
37
+1. Unarchive new Postfix Admin
38
+------------------------------
39
+Make sure that you are in your WWW directory and then unarchive the
40
+Postfix Admin archive (whatever the filename is):
41
+
42
+  $ tar -zxvf postfixadmin-$version.tgz
43
+
44
+
45
+2. Setup a Database
46
+-------------------
47
+
48
+With your chosen/preferred database server (i.e. MySQL or PostgreSQL), 
49
+you need to create a new database. A good name for this could be :
50
+
51
+  postfix
52
+
53
+The mechanics of creating the database vary depending on which server 
54
+you are using. Most users will find using phpMyAdmin or phpPgAdmin the
55
+easiest route.
56
+
57
+If you wish to use the command line, you'll need to do something like :
58
+
59
+For MySQL:
60
+  CREATE DATABASE postfix;
61
+  CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'choose_a_password';
62
+  GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';
63
+
64
+For PostgreSQL:
65
+  CREATE USER postfix WITH PASSWORD 'whatever';
66
+  CREATE DATABASE postfix OWNER postfix ENCODING 'unicode';
67
+
68
+
69
+3. Configure PostfixAdmin so it can find the database
70
+-----------------------------------------------------
71
+
72
+Create a config.local.php file for your local configuration:
73
+
74
+<?php
75
+$CONF['database_type'] = 'mysqli';
76
+$CONF['database_user'] = 'postfix';
77
+$CONF['database_password'] = 'postfixadmin';
78
+$CONF['database_name'] = 'postfix';
79
+
80
+$CONF['configured'] = true;
81
+?>
82
+
83
+See config.inc.php for all available config options and their default value.
84
+
85
+You can also edit config.inc.php instead of creating a config.local.php,
86
+but this will make updates harder and is therefore not recommended.
87
+
88
+The most important settings are those for your database server.
89
+
90
+You must also change the line that says :
91
+
92
+$CONF['configured'] = false;
93
+
94
+to
95
+
96
+$CONF['configured'] = true;
97
+
98
+
99
+PostfixAdmin does not require write access to any files except the templates_c 
100
+directory (smarty cache). You can therefore leave the files owned as root (or
101
+another user); as long as the web server user (e.g. www-data) can read them, it
102
+will be fine.
103
+For templates_c/, allow write access (only) for the web server user (e. g. www-data).
104
+The easiest way to do this is   chown -R www-data templates_c
105
+
106
+
107
+4. Check settings, and create Admin user
108
+----------------------------------------
109
+
110
+Hit http://yourserver.tld/postfixadmin/setup.php in a web browser.
111
+
112
+You should see a list of 'OK' messages. 
113
+
114
+The setup.php script will attempt to create the database structure 
115
+(or upgrade it if you're coming from a previous version). 
116
+
117
+Assuming everything is OK you can specify a password (which you'll 
118
+need to use setup.php again in the future); when you submit the form, 
119
+the hashed value (which you need to enter into config.inc.php is echoed 
120
+out - with appropriate instructions on what to do with it).
121
+
122
+create the admin user using the form displayed.
123
+
124
+5. Use PostfixAdmin
125
+-------------------
126
+
127
+This is all that is needed. Fire up your browser and go to the site that you
128
+specified to host Postfix Admin.
129
+
130
+6. Integration with Postfix, Dovecot etc.
131
+-----------------------------------------
132
+
133
+Now that PostfixAdmin is working, you need to do some configuration in Postfix,
134
+Dovecot etc. so that they use the domains, mailboxes and aliases you setup in
135
+PostfixAdmin.
136
+
137
+The files in the DOCUMENTS/ directory explain which settings you need to
138
+do/change.
139
+
140
+7. XMLRPC Integration (OPTIONAL!)
141
+--------------------------------
142
+
143
+See ADDITIONS/squirrelmail-plugin
144
+See xmlrpc.php - only a subset of Postfixadmin's functionality is currently exposed.
145
+See config.inc.php - see xmlrpc_enabled key (defaults to off).
146
+
147
+You'll need to install a copy of the Zend Framework (version 1.12.x) within Postfixadmin
148
+or your PHP include_path (see header within xmlrpc.php).
149
+NOTE: The XMLRPC interface is _not compatible_ with Zend Framework version 2.x.
150
+You'll need to enable the xmlrpc link (see config.inc.php)
151
+
152
+8. More information
153
+-------------------
154
+As of March 2007, PostfixAdmin moved to SourceForge.  For the
155
+forum posts and source updates, see:
156
+
157
+https://sourceforge.net/projects/postfixadmin
158
+
159
+There is also #postfixadmin on irc.freenode.net.

+ 46
- 0
postfixadmin/postfixadmin-3.0/LICENSE.TXT View File

@@ -0,0 +1,46 @@
1
+
2
+    Postfix Admin is a Web Based Management tool created for Postfix. It is
3
+    a PHP based application that handles Postfix Style Virtual Domains and
4
+    Users that are stored in MySQL.
5
+    Copyright (c) 2005 High5! (Mischa Peters and others)
6
+
7
+    This program is free software; you can redistribute it and/or modify
8
+    it under the terms of the GNU General Public License as published by
9
+    the Free Software Foundation; either version 2 of the License, or
10
+    (at your option) any later version.
11
+
12
+    This program is distributed in the hope that it will be useful,
13
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
+    GNU General Public License for more details.
16
+
17
+    You should have received a copy of the GNU General Public License
18
+    along with this program; if not, write to the Free Software
19
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20
+
21
+    Postfix Admin version 2.1.1, Copyright (c) 2005 High5! (Mischa Peters & Contributors)
22
+    Postfix Admin comes with ABSOLUTELY NO WARRANTY.
23
+    This is free software, and you are welcome to redistribute it
24
+    under certain conditions.
25
+
26
+    High5!, hereby disclaims all copyright interest in the program
27
+    `Postfix Admin' (which makes passes at Postfix, PHP and MySQL) written
28
+    by Wietse Venema, PHP Group and MYSQL AB.
29
+
30
+    Contributors: Mihau, Tarvin, SteveB, DJTremors, WhiteFox, David Osborn, 
31
+                  David Goodwin (GingerDog), Christian Boltz (cboltz) and GregC and others.
32
+
33
+
34
+Postfix Admin uses some libraries that come with a different license.
35
+
36
+a) libraries shipped with PostfixAdmin 
37
+- the Smarty templating engine is licensed under the GNU LESSER GENERAL PUBLIC 
38
+  LICENSE Version 3 (see smarty/COPYING.lib)
39
+- the CLI (commandline interface) is based on CakePHP which is licensed under
40
+  the MIT license.
41
+
42
+b) libraries not shipped with PostfixAdmin
43
+- the XMLRPC interface and the squirrelmail plugin use the Zend Framework which is
44
+  licensed under the New BSD License (3-clause), see http://framework.zend.com/license
45
+- PHPUnit (used in tests/) is licensed under the BSD License (3-clause).
46
+

+ 512
- 0
postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/FILTER_README View File

@@ -0,0 +1,512 @@
1
+Introduction
2
+============
3
+
4
+This is a very first implementation of Postfix content filtering.
5
+A Postfix content filter receives unfiltered mail from Postfix and
6
+does one of the following:
7
+
8
+- re-injects the mail back into Postfix, perhaps after changing content
9
+- rejects the mail (by sending a suitable status code back to
10
+  Postfix) so that it is returned to sender.
11
+- sends the mail somewhere else
12
+
13
+This document describes two approaches to content filtering: simple
14
+and advanced. Both filter all the mail by default.
15
+
16
+At the end are examples that show how to filter only mail from
17
+users, about using different filters for different domains that
18
+you provide MX service for, and about selective filtering on the 
19
+basis of message envelope and/or header/body patterns.
20
+
21
+Simple content filtering example
22
+================================
23
+
24
+The first example is simple to set up.  It uses a shell script that
25
+receives unfiltered mail from the Postfix pipe delivery agent, and
26
+that feeds filtered mail back into the Postfix sendmail command.
27
+
28
+Only mail arriving via SMTP will be content filtered.
29
+
30
+                  ..................................
31
+                  :            Postfix             :
32
+Unfiltered mail----->smtpd \                /local---->Filtered mail
33
+                  :         -cleanup->queue-       :
34
+               ---->pickup /                \smtp----->Filtered mail
35
+               ^  :                        |       :
36
+               |  :                         \pipe-----+
37
+               |  ..................................  |
38
+               |                                      |
39
+               |                                      |
40
+               +-Postfix sendmail<----filter script<--+
41
+
42
+Mail is filtered by a /some/where/filter program. This can be a
43
+simple shell script like this:
44
+
45
+    #!/bin/sh
46
+
47
+    # Localize these.
48
+    INSPECT_DIR=/var/spool/filter
49
+    SENDMAIL="/usr/sbin/sendmail -i"
50
+
51
+    # Exit codes from <sysexits.h>
52
+    EX_TEMPFAIL=75
53
+    EX_UNAVAILABLE=69
54
+
55
+    # Clean up when done or when aborting.
56
+    trap "rm -f in.$$" 0 1 2 3 15
57
+
58
+    # Start processing.
59
+    cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }
60
+
61
+    cat >in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; }
62
+
63
+    # filter <in.$$ || { echo Message content rejected; exit $EX_UNAVAILABLE; }
64
+
65
+    $SENDMAIL "$@" <in.$$
66
+
67
+    exit $?
68
+
69
+The idea is to first capture the message to file and then run the
70
+content through a third-party content filter program.
71
+
72
+- If the mail cannot be captured to file, mail delivery is deferred
73
+  by terminating with exit status 75 (EX_TEMPFAIL). Postfix will
74
+  try again after some delay.
75
+
76
+- If the content filter program finds a problem, the mail is bounced
77
+  by terminating with exit status 69 (EX_UNAVAILABLE).  Postfix
78
+  will return the message to the sender as undeliverable.
79
+
80
+- If the content is OK, it is given as input to the Postfix sendmail
81
+  command, and the exit status of the filter command is whatever
82
+  exit status the Postfix sendmail command produces. Postfix will
83
+  deliver the message as usual.
84
+
85
+I suggest that you run this script by hand until you are satisfied
86
+with the results. Run it with a real message (headers+body) as
87
+input:
88
+
89
+    % /some/where/filter -f sender recipient... <message-file
90
+
91
+Once you're satisfied with the content filtering script:
92
+
93
+1 - Create a dedicated local user account called "filter".  This
94
+    user handles all potentially dangerous mail content - that is
95
+    why it should be a separate account. Do not use "nobody", and
96
+    most certainly do not use "root" or "postfix".  The user will
97
+    never log in, and can be given a "*" password and non-existent
98
+    shell and home directory.
99
+
100
+2 - Create a directory /var/spool/filter that is accessible only
101
+    to the "filter" user. This is where the content filtering script
102
+    is supposed to store its temporary files.
103
+
104
+3 - Define the content filter in the Postfix master file:
105
+
106
+    /etc/postfix/master.cf:
107
+      filter    unix  -       n       n       -       -       pipe
108
+        flags=Rq user=filter argv=/somewhere/filter -f ${sender} -- ${recipient}
109
+
110
+To turn on content filtering for mail arriving via SMTP only, append
111
+"-o content_filter=filter:dummy" to the master.cf entry that defines
112
+the Postfix SMTP server:
113
+
114
+    /etc/postfix/master.cf:
115
+        smtp      inet     ...stuff...      smtpd
116
+            -o content_filter=filter:dummy
117
+
118
+The content_filter configuration parameter accepts the same syntax
119
+as the right-hand side in a Postfix transport table.  Execute
120
+"postfix reload" to complete the change.
121
+
122
+To turn off content filtering, edit the master.cf file, remove the
123
+"-o content_filter=filter:dummy" text from the entry that defines
124
+the Postfix SMTP server, and execute another "postfix reload".
125
+
126
+With the shell script as shown above you will lose a factor of four
127
+in Postfix performance for transit mail that arrives and leaves
128
+via SMTP. You will lose another factor in transit performance for
129
+each additional temporary file that is created and deleted in the
130
+process of content filtering.  The performance impact is less for
131
+mail that is submitted or delivered locally, because such deliveries
132
+are already slower than SMTP transit mail.
133
+
134
+Simple content filter limitations
135
+=================================
136
+
137
+The problem with content filters like the one above is that they
138
+are not very robust. The reason is that the software does not talk
139
+a well-defined protocol with Postfix. If the filter shell script
140
+aborts because the shell runs into some memory allocation problem,
141
+the script will not produce a nice exit status as defined in the
142
+file /usr/include/sysexits.h.  Instead of going to the deferred
143
+queue, mail will bounce.  The same lack of robustness can happen
144
+when the content filtering software itself runs into a resource
145
+problem.
146
+
147
+Advanced content filtering example
148
+===================================
149
+
150
+The second example is more complex, but can give much better
151
+performance, and is less likely to bounce mail when the machine
152
+runs into a resource problem.  This approach uses content filtering
153
+software that can receive and deliver mail via SMTP.
154
+
155
+Some Anti-virus software is built to receive and deliver mail via
156
+SMTP and is ready to use as an advanced Postfix content filter.
157
+For non-SMTP capable content filtering software, Bennett Todd's
158
+SMTP proxy implements a nice PERL/SMTP content filtering framework.
159
+See: http://bent.latency.net/smtpprox/
160
+
161
+The example given here filters all mail, including mail that arrives
162
+via SMTP and mail that is locally submitted via the Postfix sendmail
163
+command.
164
+
165
+You can expect to lose about a factor of two in Postfix performance
166
+for transit mail that arrives and leaves via SMTP, provided that
167
+the content filter creates no temporary files. Each temporary file
168
+created by the content filter adds another factor to the performance
169
+loss.
170
+
171
+We will set up a content filtering program that receives SMTP mail
172
+via localhost port 10025, and that submits SMTP mail back into
173
+Postfix via localhost port 10026.
174
+
175
+      ..................................
176
+      :            Postfix             :
177
+   ----->smtpd \                /local---->
178
+      :         -cleanup->queue-       :
179
+   ---->pickup /    ^       |   \smtp----->
180
+      :             |       v          :
181
+      :           smtpd    smtp        :
182
+      :           10026     |          :
183
+      ......................|...........
184
+                    ^       |
185
+                    |       v
186
+                ....|............
187
+                :   |     10025 :
188
+                :   filter      :
189
+                :               :
190
+                .................
191
+
192
+To enable content filtering in this manner, specify in main.cf a
193
+new parameter:
194
+
195
+    /etc/postfix/main.cf:
196
+        content_filter = scan:localhost:10025
197
+
198
+This causes Postfix to add one extra content filtering record to
199
+each incoming mail message, with content scan:localhost:10025.
200
+The content filtering records are added by the smtpd and pickup
201
+servers.
202
+
203
+When a queue file has content filtering information, the queue
204
+manager will deliver the mail to the specified content filter
205
+regardless of its final destination.
206
+
207
+In this example, "scan" is an instance of the Postfix SMTP client
208
+with slightly different configuration parameters. This is how
209
+one would set up the service in the Postfix master.cf file:
210
+
211
+    /etc/postfix/master.cf:
212
+        scan      unix  -       -       n       -       10       smtp
213
+
214
+Instead of a limit of 10 concurrent processes, use whatever process
215
+limit is feasible for your machine.  Content inspection software
216
+can gobble up a lot of system resources, so you don't want to have
217
+too much of it running at the same time.
218
+
219
+The content filter can be set up with the Postfix spawn service,
220
+which is the Postfix equivalent of inetd. For example, to instantiate
221
+up to 10 content filtering processes on demand:
222
+
223
+    /etc/postfix/master.cf:
224
+        localhost:10025     inet  n      n      n      -      10     spawn
225
+            user=filter argv=/some/where/filter localhost 10026
226
+
227
+"filter" is a dedicated local user account.  The user will never
228
+log in, and can be given a "*" password and non-existent shell and
229
+home directory.  This user handles all potentially dangerous mail
230
+content - that is why it should be a separate account.
231
+
232
+In the above example, Postfix listens on port localhost:10025.  If
233
+you want to have your filter listening on port localhost:10025
234
+instead of Postfix, then you must run your filter as a stand-alone
235
+program.
236
+
237
+Note: the localhost port 10025 SMTP server filter should announce
238
+itself as "220 localhost...".  Postfix aborts delivery when it
239
+connects to an SMTP server that uses the same hostname as Postfix
240
+("host <servername> greeted me with my own hostname"), because that
241
+normally means you have a mail delivery loop problem.
242
+
243
+The example here assumes that the /some/where/filter command is a
244
+PERL script. PERL has modules that make talking SMTP easy. The
245
+command-line specifies that mail should be sent back into Postfix
246
+via localhost port 10026.
247
+
248
+The simplest content filter just copies SMTP commands and data
249
+between its inputs and outputs. If it has a problem, all it has to
250
+do is to reply to an input of `.' with `550 content rejected', and
251
+to disconnect without sending `.' on the connection that injects
252
+mail back into Postfix.
253
+
254
+The job of the content filter is to either bounce mail with a
255
+suitable diagnostic, or to feed the mail back into Postfix through
256
+a dedicated listener on port localhost 10026:
257
+
258
+    /etc/postfix/master.cf:
259
+        localhost:10026     inet  n      -      n      -      10      smtpd
260
+            -o content_filter= 
261
+            -o local_recipient_maps=
262
+            -o relay_recipient_maps=
263
+            -o myhostname=localhost.domain.tld
264
+            -o smtpd_helo_restrictions=
265
+            -o smtpd_client_restrictions=
266
+            -o smtpd_sender_restrictions=
267
+            -o smtpd_recipient_restrictions=permit_mynetworks,reject
268
+            -o mynetworks=127.0.0.0/8
269
+
270
+Warning for Postfix version 2 users: in this SMTP server after the
271
+content filter, do not override main.cf settings for virtual_alias_maps
272
+or virtual_alias_domains. That would cause mail to be rejected with
273
+"User unknown".
274
+
275
+This SMTP server has the same process limit as the "filter" master.cf
276
+entry.
277
+
278
+The "-o content_filter=" requests no content filtering for incoming
279
+mail.
280
+
281
+The "-o local_recipient_maps=" and "-o relay_recipient_maps=" avoid
282
+unnecessary table lookups.
283
+
284
+The "-o myhostname=localhost.domain.tld" avoids false alarms ("host
285
+<servername> greeted me with my own hostname") if your content
286
+filter is based on a proxy that simply relays SMTP commands.
287
+
288
+The "-o smtpd_xxx_restrictions" and "-o mynetworks=127.0.0.0/8"
289
+turn off UCE controls that would only waste time here.
290
+
291
+Squeezing out more performance
292
+==============================
293
+
294
+Many refinements are possible, such as running a specially-configured
295
+smtp delivery agent for feeding mail into the content filter, and
296
+turning off address rewriting before content filtering.
297
+
298
+As the example below shows, things quickly become very complex,
299
+because a lot of main.cf like information gets listed in the
300
+master.cf file. This makes the system hard to understand.
301
+
302
+Even worse, details change as Postfix evolves and different
303
+configuration parameters are implemented by different programs.
304
+
305
+If you need to squeeze out more performance, it is probably simpler
306
+to run multiple Postfix instances, one before and one after the
307
+content filter. That way, each instance can have simple main.cf
308
+and master.cf files, each instance can have its own mail queue,
309
+and the system will be easier to understand.
310
+
311
+As before, we will set up a content filtering program that receives
312
+SMTP mail via localhost port 10025, and that submits SMTP mail back
313
+into Postfix via localhost port 10026.
314
+
315
+      .......................................
316
+      :                Postfix              :
317
+   ----->smtpd \                            :
318
+      :         -pre-cleanup-\       /local---->
319
+   ---->pickup /              -queue-       :
320
+      :             -cleanup-/   |   \smtp----->
321
+      :     bounces/    ^        v          :
322
+      : and locally     |        v          :
323
+      :   forwarded   smtpd     scan        :
324
+      :    messages   10026      |          :
325
+      ...........................|...........
326
+                        ^        |
327
+                        |        v
328
+                    ....|.............
329
+                    :   |      10025 :
330
+                    :   filter       :
331
+                    :                :
332
+                    ..................
333
+
334
+To enable content filtering in this manner, specify in main.cf a
335
+new parameter:
336
+
337
+/etc/postfix/main.cf:
338
+    content_filter = scan:localhost:10025
339
+
340
+/etc/postfix/master.cf:
341
+#
342
+# These are the usual input "smtpd" and local "pickup" servers already
343
+# present in master.cf. We add an option to select a non-default
344
+# cleanup service (defined further below).
345
+#
346
+smtp      inet  n       -       n       -       -       smtpd
347
+    -o cleanup_service_name=pre-cleanup
348
+pickup    fifo  n       -       n       60      1       pickup
349
+    -o cleanup_service_name=pre-cleanup
350
+#
351
+# ------------------------------------------------------------------
352
+#
353
+# This is the cleanup daemon that handles messages in front of
354
+# the content filter. It does header_checks and body_checks (if
355
+# any), but does no virtual alias or canonical address mapping,
356
+# so that mail passes through your content filter with the original
357
+# recipient addresses mostly intact.
358
+#
359
+# Virtual alias or canonical address mapping happens in the second
360
+# cleanup phase after the content filter. This gives the content_filter
361
+# access to *largely* unmodified addresses for maximum flexibility.
362
+#
363
+# Some sites may specifically want to perform canonical or virtual
364
+# address mapping in front of the content_filter.  In that case you
365
+# still have to enable address rewriting in the after-filter cleanup
366
+# instance, in order to correctly process forwarded mail or bounced
367
+# mail.
368
+#
369
+pre-cleanup         unix  n      -      n      -       0      cleanup
370
+        -o canonical_maps=
371
+        -o sender_canonical_maps=
372
+        -o recipient_canonical_maps=
373
+        -o masquerade_domains=
374
+        -o virtual_alias_maps=
375
+#
376
+# ------------------------------------------------------------------
377
+#
378
+# This is the delivery agent that injects mail into the content
379
+# filter.  It is tuned for low concurrency, because most content
380
+# filters burn CPU and use lots of memory.  The process limit of 10
381
+# re-enforces the effect of $default_destination_concurrency_limit.
382
+# Even without an explicit process limit, the concurrency is bounded
383
+# because all messages heading into the content filter have the same
384
+# destination.
385
+#
386
+scan                unix  -      -      n      -      10      smtp
387
+#
388
+# ------------------------------------------------------------------
389
+#
390
+# This is the SMTP listener that receives filtered messages from
391
+# the content filter. It *MUST* clear the content_filter
392
+# parameter to avoid loops, and use a different hostname to avoid
393
+# triggering the Postfix SMTP loop detection code.
394
+#
395
+# This "smtpd" uses the normal cleanup service which is also used
396
+# for bounces and for internally forwarded mail.
397
+#
398
+# The parameters from mynetworks onward disable all access
399
+# control other than insisting on connections from one of the IP
400
+# addresses of the host. This is typically overkill, but can
401
+# reduce resource usage, if the default restrictions use lots of
402
+# tables.
403
+#
404
+localhost:10026     inet  n      -      n      -       -      smtpd
405
+    -o content_filter= 
406
+    -o myhostname=localhost.domain.tld
407
+    -o local_recipient_maps=
408
+    -o relay_recipient_maps=
409
+    -o mynetworks=127.0.0.0/8
410
+    -o mynetworks_style=host
411
+    -o smtpd_restriction_classes=
412
+    -o smtpd_client_restrictions=
413
+    -o smtpd_helo_restrictions=
414
+    -o smtpd_sender_restrictions=
415
+    -o smtpd_recipient_restrictions=permit_mynetworks,reject
416
+#
417
+# Do not override main.cf settings here for virtual_alias_maps or
418
+# virtual_mailbox_maps. This causes mail to be rejected with "User
419
+# unknown in virtual (alias|mailbox) recipient table".
420
+#
421
+# ------------------------------------------------------------------
422
+#
423
+# This is the normal cleanup daemon for use after content filtering.
424
+# No header or body checks, because those have already been taken
425
+# care of by the pre-cleanup service before the content filter.
426
+# 
427
+# The normal cleanup instance does all the virtual alias and canonical
428
+# address mapping that was disabled in the pre-cleanup instance before
429
+# the content filter. This rewriting must be done even when you didn't
430
+# disable address rewriting in the pre-cleanup instance, in order to
431
+# correctly process bounces and locally forwarded mail.
432
+#
433
+cleanup            unix  n      -      n      -       0      cleanup
434
+    -o header_checks=
435
+    -o mime_header_checks=
436
+    -o nested_header_checks=
437
+    -o body_checks=
438
+#
439
+# ------------------------------------------------------------------
440
+#
441
+# The normal "smtp" delivery agent for contrast with "scan".
442
+#
443
+smtp                unix  -      -      n      -      -       smtp
444
+
445
+The above example causes Postfix to add one content filtering record
446
+to each incoming mail message, with content scan:localhost:10025.
447
+You can use the same syntax as in the right-hand side of a Postfix
448
+transport table.  The content filtering records are added by the
449
+smtpd and pickup servers.
450
+
451
+The "scan" transport is a dedicated instance of the "smtp" delivery
452
+agent for injecting messages into the SMTP content filter. Using
453
+a dedicated "smtp" transport allows one to tune it for the specific
454
+task of delivering mail to a local content filter (low latency,
455
+low concurrency, throughput dependent on predictably low latency).
456
+
457
+See the previous example for setting up the content filter with
458
+the Postfix spawn service; you can of course use any server that
459
+can be run stand-alone outside the Postfix environment.
460
+
461
+Filtering mail from outside users only
462
+======================================
463
+
464
+The easiest approach is to configure ONE Postfix instance with TWO
465
+SMTP server addresses in master.cf:
466
+
467
+- One SMTP server address for inside users only that never invokes
468
+  content filtering.
469
+
470
+- One SMTP server address for outside users that always invokes
471
+  content filtering.
472
+
473
+/etc/postfix.master.cf:
474
+    # SMTP service for internal users only, no content filtering.
475
+    1.2.3.4:smtp        inet  n       -       n       -       -       smtpd
476
+        -o smtpd_client_restrictions=permit_mynetworks,reject
477
+    127.0.0.1:smtp      inet  n       -       n       -       -       smtpd
478
+        -o smtpd_client_restrictions=permit_mynetworks,reject
479
+
480
+    # SMTP service for external users, with content filtering.
481
+    1.2.3.5:smtp        inet  n       -       n       -       -       smtpd
482
+        -o content_filter=foo:bar
483
+
484
+Getting really nasty
485
+====================
486
+
487
+The above filtering configurations are static. Mail that follows
488
+a given path is either always filtered or it is never filtered. As
489
+of Postfix 2.0 you can also turn on content filtering on the fly.
490
+The Postfix UCE features allow you to specify a filtering action
491
+on the fly:
492
+
493
+    FILTER foo:bar
494
+
495
+You can do this in smtpd access maps as well as the cleanup server's
496
+header/body_checks.  This feature must be used with great care:
497
+you must disable all the UCE features in the after-filter smtpd
498
+and cleanup daemons or else you will have a content filtering loop.
499
+
500
+Limitations:
501
+
502
+- There can be only one content filter action per message.
503
+
504
+- FILTER actions from smtpd access maps and header/body_checks take
505
+  precedence over filters specified with the main.cf content_filter 
506
+  parameter.
507
+
508
+- Only the last FILTER action from smtpd access maps or from
509
+  header/body_checks takes effect.
510
+
511
+- The same content filter is applied to all the recipients of a
512
+  given message.

+ 222
- 0
postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/INSTALL.TXT View File

@@ -0,0 +1,222 @@
1
+######################################
2
+# Virtual Vacation for Postfix Admin #
3
+######################################
4
+#
5
+# Postfix Admin (Virtual Vacation)
6
+# Originally authored by Mischa Peters <mischa at high5 dot net>
7
+# Copyright (c) 2002 - 2005 High5!
8
+# Licensed under GPL for more info check GPL-LICENSE.TXT
9
+#
10
+
11
+REQUIRED!
12
+---------
13
+There are a bunch of Perl modules which need installing, depending on your 
14
+distribution these may be available through your package management tool, or
15
+will need installing through CPAN.
16
+
17
+A full list of required modules can be found in the source of vacation.pl.
18
+
19
+It obviously relies on Perl
20
+
21
+About Virtual Vacation
22
+----------------------
23
+The vacation script runs as service within Postfix's master.cf configuration file.
24
+Mail is sent to the vacation service via a transport table mapping.
25
+When users mark themselves as away on vacation, an alias is added to their account 
26
+sending a copy of all mail to them to the vacation service.
27
+
28
+e.g. mail to billy@goat.com will be delivered to 
29
+    billy@goat.com AND 
30
+    billy#goat.com@autoreply.goat.com
31
+
32
+Mail to @autoreply.goat.com is caught by the vacation.pl script and a reply 
33
+will be sent based on various settings. By default a reply is only sent once.
34
+
35
+
36
+Install Virtual Vacation
37
+------------------------
38
+
39
+1. Create a local account
40
+-------------------------
41
+
42
+Create a dedicated local user account called "vacation". 
43
+This user handles all potentially dangerous mail content - that is why it
44
+should be a separate account.
45
+
46
+Do not use "nobody", and most certainly do not use "root" or "postfix".  The
47
+user will never log in, and can be given a "*" password and non-existent
48
+shell and home directory.
49
+
50
+Also create a separate "vacation" group.
51
+
52
+This should look like this:
53
+
54
+#/etc/passwd
55
+vacation:*:65501:65501:Virtual Vacation:/nonexistent:/sbin/nologin
56
+
57
+#/etc/group
58
+vacation:*:65501:
59
+
60
+
61
+2. Create a log directory or log file
62
+-------------------------------------
63
+
64
+If you want to log to a file ($log_to_file), create a log directory or an 
65
+empty log file.
66
+
67
+This file or directory needs to be writeable for the "vacation" user.
68
+
69
+Note: If you are logging to syslog, you can skip this step.
70
+
71
+
72
+3. Install vacation.pl
73
+----------------------
74
+
75
+Create a directory /usr/lib/postfixadmin/ and copy the vacation.pl file to it:
76
+
77
+  $ mkdir /usr/lib/postfixadmin
78
+  $ cp vacation.pl /usr/lib/postfixadmin/vacation.pl
79
+  $ chown -R root:vacation /usr/lib/postfixadmin
80
+  $ chmod 750 /usr/lib/postfixadmin/ /usr/lib/postfixadmin/vacation.pl
81
+
82
+Which will then look something like:
83
+
84
+-rwxr-x---   1 root  vacation  3356 Dec 21 00:00 vacation.pl*
85
+
86
+
87
+4. Setup the transport type
88
+---------------------------
89
+Define the transport type in the Postfix master file:
90
+
91
+#/etc/postfix/master.cf:
92
+vacation    unix  -       n       n       -       -       pipe
93
+  flags=Rq user=vacation argv=/usr/lib/postfixadmin/vacation.pl -f ${sender} -- ${recipient}
94
+
95
+5. Setup the transport maps file
96
+--------------------------------
97
+
98
+Tell Postfix to use a transport maps file, so add the following to your
99
+Postfix main.cf:
100
+
101
+#/etc/postfix/main.cf:
102
+transport_maps = hash:/etc/postfix/transport
103
+
104
+Then add the transport definition to the newly created transport file.
105
+Obviously, change yourdomain.com to your own domain. This can be any
106
+arbitrary domain, and it is easiest if you just choose one that will be used
107
+for all your domains.
108
+
109
+#/etc/postfix/transport
110
+autoreply.yourdomain.com	vacation:
111
+
112
+(You may need to create an entry in /etc/hosts for your non-existant domain)
113
+
114
+Execute "postmap /etc/postfix/transport" to build the hashed database.
115
+
116
+Execute "postfix reload" to complete the change.
117
+
118
+
119
+
120
+
121
+6. Configure vacation.pl
122
+------------------------
123
+
124
+The perl vacation.pl script needs to know which database you are using, and also
125
+how to connect to the database.
126
+
127
+Namely :
128
+
129
+Change any variables starting with '$db_' and '$db_type' to either 'mysql' or 'pgsql'.
130
+
131
+Change the $vacation_domain variable to match what you entered in your /etc/postfix/transport 
132
+file.
133
+
134
+You can do this in two ways:
135
+
136
+a) edit vacation.pl directly (not recommended!)
137
+
138
+b) create /etc/postfixadmin/vacation.conf and enter your settings there
139
+
140
+   Just use perl syntax there to fill the config variables listed in vacation.pl
141
+   (without the "our" keyword). Example:
142
+   $db_username = 'mail';
143
+
144
+   To make sure nobody except vacation.pl can read your vacation.conf (including the
145
+   database password), run
146
+
147
+   $ chown root:vacation /etc/postfixadmin/vacation.conf
148
+   $ chmod 640 /etc/postfixadmin/vacation.conf
149
+
150
+
151
+7. Check the alias expansion
152
+----------------------------
153
+
154
+Depending on your setup, you may have multiple 'smtpd' service definitions within 
155
+your postfix master.cf file. This is especially the case if you are also using AMAVIS or
156
+another content filtering system when mail is re-injected into Postfix using the smtpd daemon.
157
+
158
+If you are, it's likely that alias expansion may happen more than once, in which case you 
159
+may see vacation-style responses duplicated. To suppress this behaviour, you need to add:
160
+
161
+  -o receive_override_options=no_address_mappings
162
+
163
+For example :
164
+
165
+smtp      inet  n       -       -       -       12       smtpd
166
+    -o content_filter=amavis:[127.0.0.50]:10024
167
+    -o receive_override_options=no_address_mappings
168
+
169
+127.0.0.1:10025 inet    n   -   -   -   - smtpd
170
+    -o smtpd_autorized_xforward_hosts=127.0.0.0/8
171
+    -o smtpd_client_restrictions=
172
+    -o smtpd_helo_restrictions=
173
+    -o smtpd_sender_restrictions=
174
+    -o smtpd_recipient_restrictions=permit_mynetworks,reject
175
+    -o mynetworks=127.0.0.0/8
176
+    -o receive_override_options=no_header_body_checks
177
+
178
+	^^^ Alias expansion occurs here, so we don't want it to happen again for the
179
+		first smtpd daemon (above). If you have per-user settings in amavis,
180
+		you might want to have no_address_mappings in the smtpd on port 10025
181
+		instead.
182
+
183
+
184
+8. Security
185
+-----------
186
+
187
+If security is an issue for you, read ../DOCUMENTS/Security.txt
188
+
189
+
190
+
191
+
192
+What do these files do?
193
+-----------------------
194
+When a user enables a vacation message on their account, the alias
195
+definition is changed so that in addition to delivering to their own
196
+mailbox, it also delivers to a dummy alias which calls the vacation.pl
197
+program. In other words, if joeuser@domain.com enables their vacation, the
198
+entry in the alias database table will deliver mail to
199
+joeuser@something.com, as well as
200
+joeuser#something.com@autoreply.yourdomain.com
201
+
202
+vacation.pl then checks the database to see wether a user is on holiday and
203
+what message to send back. Make sure that vacation.pl is able to communicate
204
+to your database. You have to specify the database, username and password for 
205
+it as described in the "Configure vacation.pl" section.
206
+
207
+NOTE: Make sure that the path to perl in vacation.pl is correct.
208
+
209
+
210
+I'm in trouble!
211
+---------------
212
+When something is not working there are a couple of files that you can have
213
+a look at. The most important one is your maillog (usually in /var/log/).
214
+
215
+Vacation.pl also has some debugging and logging capabilties. Check the top
216
+of vacation.pl.
217
+
218
+
219
+Done!
220
+-----
221
+When this is all in place you need to have a look at the Postfix Admin
222
+config.inc.php. Here you need to enable Virtual Vacation for the site.

+ 22
- 0
postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/index.php View File

@@ -0,0 +1,22 @@
1
+<?php
2
+// 
3
+// Postfix Admin 
4
+// by Mischa Peters <mischa at high5 dot net>
5
+// Copyright (c) 2002 - 2005 High5!
6
+// Licensed under GPL for more info check GPL-LICENSE.TXT
7
+//
8
+// File: index.php
9
+//
10
+// Template File: -none-
11
+//
12
+// Template Variables:
13
+//
14
+// -none-
15
+//
16
+// Form POST \ GET Variables:
17
+//
18
+// -none-
19
+//
20
+header ("Location: ../login.php");
21
+exit;
22
+?>

+ 22
- 0
postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/asterisk-email.txt View File

@@ -0,0 +1,22 @@
1
+Return-Path: <www-data@palepurple.co.uk>
2
+X-Original-To: david@example.org
3
+Delivered-To: david@example.org
4
+Received: by mail.palepurple.co.uk (Postfix, from userid 33)
5
+	id 1942F894CF9; Fri,  1 Aug 2008 11:23:45 +0100 (BST)
6
+To: "" <david@example.org>
7
+Subject: New Phone call - annotate it!
8
+X-PHP-Script: admin.palepurple.co.uk/contacts/dispatch.php for 78.105.97.55
9
+From: "asterisk@example.org" <asterisk@example.org>
10
+Date: Fri, 01 Aug 2008 11:23:45 +0100
11
+Content-Type: text/plain; charset="iso-8859-1"
12
+Content-Transfer-Encoding: quoted-printable
13
+Content-Disposition: inline
14
+Message-Id: <20080801102345.1942F894CF9@mail.palepurple.co.uk>
15
+Content-Length: 250
16
+Lines: 5
17
+
18
+
19
+=0AVisit the following URL(s) to annotate these phone calls... :=0A=0A htt=
20
+ps://admin.palepurple.co.uk/contacts/phone_communication/browse.php=0Ahttp=
21
+s://admin.palepurple.co.uk/contacts/phone_communication/view.php?phone_com=
22
+munication_id=3D3532

+ 55
- 0
postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/facebook.txt View File

@@ -0,0 +1,55 @@
1
+Return-Path: <notification+meynbxsa@facebookmail.com>
2
+X-Original-To: david@example.org
3
+Delivered-To: david@example.org
4
+Received: by mail.palepurple.co.uk (Postfix, from userid 1007)
5
+	id B735A894CF8; Mon,  4 Aug 2008 16:28:13 +0100 (BST)
6
+Received: from localhost (localhost [127.0.0.1])
7
+	by mail.palepurple.co.uk (Postfix) with ESMTP id 79230894CF9
8
+	for <david@example.org>; Mon,  4 Aug 2008 16:28:13 +0100 (BST)
9
+X-Virus-Scanned: by Amavis+SpamAssassin+ClamAV and more at palepurple.co.uk
10
+X-Spam-Score: -3.565
11
+X-Spam-Level: 
12
+X-Spam-Status: No, score=-3.565 tagged_above=-99 required=5 tests=[AWL=0.035,
13
+	BAYES_00=-2.599, RCVD_IN_DNSWL_LOW=-1, SPF_PASS=-0.001]
14
+Received: from mail.palepurple.co.uk ([127.0.0.50])
15
+	by localhost (oak.palepurple.co.uk [127.0.0.50]) (amavisd-new, port 10024)
16
+	with ESMTP id AajG3+FXGWMd for <david@example.org>;
17
+	Mon,  4 Aug 2008 16:28:10 +0100 (BST)
18
+Received: from mx-out.facebook.com (outmail003.ash1.tfbnw.net [69.63.184.103])
19
+	by mail.palepurple.co.uk (Postfix) with ESMTP id 36DD4894CF8
20
+	for <david@example.org>; Mon,  4 Aug 2008 16:28:09 +0100 (BST)
21
+Received: from www.new.facebook.com (intlb01-mip1.sctm.tfbnw.net [10.1.240.6])
22
+	by mx-out.facebook.com [email023.ash1.facebook.com] (8.13.7/8.13.6) with ESMTP id m74FS8Oa030908
23
+	for <david@example.org>; Mon, 4 Aug 2008 08:28:09 -0700
24
+X-Facebook: from zuckmail ([207.118.59.216]) 
25
+	by www.new.facebook.com with HTTP (ZuckMail);
26
+Date: Mon, 4 Aug 2008 08:28:08 -0700
27
+To: David Goodwin <david@example.org>
28
+From: Facebook <notification+meynbxsa@facebookmail.com>
29
+Reply-to: noreply <noreply@facebookmail.com>
30
+Subject: Mark Spencer also commented on Jon Masters's note...
31
+Message-ID: <dummycontentgoeshere27efe2cde474@www.new.facebook.com>
32
+X-Priority: 3
33
+X-Mailer: ZuckMail [version 1.00]
34
+X-Facebook-Notify: note_reply
35
+Errors-To: notification+meynbxsa@facebookmail.com
36
+MIME-Version: 1.0
37
+Content-Transfer-Encoding: 8bit
38
+Content-Type: text/plain; charset="UTF-8"
39
+Content-Length: 374
40
+Lines: 14
41
+
42
+Mark also commented on Jon Masters's note "Visiting the UK"
43
+
44
+To read all the comments, follow the link below:
45
+
46
+http://www.facebook.com/n/?note.php&note_id=whatever
47
+
48
+Thanks,
49
+The Facebook Team
50
+
51
+___
52
+Want to control which emails you receive from Facebook? Go to:
53
+http://www.facebook.com/editaccount.php?notifications&md=sheepmightfly
54
+
55
+

+ 43
- 0
postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/mail-myself.txt View File

@@ -0,0 +1,43 @@
1
+Return-Path: <david@example.org>
2
+X-Original-To: david@example.org
3
+Delivered-To: david@example.org
4
+Received: by mail.palepurple.co.uk (Postfix, from userid 1007)
5
+	id 83AE0894CF8; Tue,  5 Aug 2008 20:15:53 +0100 (BST)
6
+Received: from localhost (localhost [127.0.0.1])
7
+	by mail.palepurple.co.uk (Postfix) with ESMTP id 4A249894CF9
8
+	for <david@example.org>; Tue,  5 Aug 2008 20:15:53 +0100 (BST)
9
+X-Virus-Scanned: by Amavis+SpamAssassin+ClamAV and more at palepurple.co.uk
10
+X-Spam-Score: -2.836
11
+X-Spam-Level: 
12
+X-Spam-Status: No, score=-2.836 tagged_above=-99 required=5 tests=[AWL=-0.237,
13
+	BAYES_00=-2.599]
14
+Received: from mail.palepurple.co.uk ([127.0.0.50])
15
+	by localhost (oak.palepurple.co.uk [127.0.0.50]) (amavisd-new, port 10024)
16
+	with ESMTP id gHB1TKpjKIKX for <david@example.org>;
17
+	Tue,  5 Aug 2008 20:15:50 +0100 (BST)
18
+Received: from irc.palepurple.co.uk (irc.palepurple.co.uk [89.16.169.131])
19
+	by mail.palepurple.co.uk (Postfix) with ESMTP id CAF82894CF8
20
+	for <david@example.org>; Tue,  5 Aug 2008 20:15:50 +0100 (BST)
21
+Received: by irc.palepurple.co.uk (Postfix, from userid 1000)
22
+	id 8869450146; Tue,  5 Aug 2008 20:15:50 +0100 (BST)
23
+Date: Tue, 5 Aug 2008 20:15:50 +0100
24
+From: David Goodwin <david@example.org>
25
+To: david@example.org, fred@example.org, barney@example.org, rover@example.org,
26
+    roger@example.org
27
+Subject: test email
28
+Message-ID: <20080805191549.GA27905@codepoets.co.uk>
29
+MIME-Version: 1.0
30
+Content-Type: text/plain; charset=us-ascii
31
+Content-Disposition: inline
32
+X-GnuPG-Key-URL: http://codepoets.co.uk/files/pubkey.txt
33
+X-PGP-Key: 0x117957A6
34
+User-Agent: Mutt/1.5.13 (2006-08-11)
35
+Content-Length: 136
36
+Lines: 7
37
+
38
+hello world; this is in plain text only.
39
+
40
+-- 
41
+David Goodwin 
42
+
43
+[ http://www.codepoets.co.uk       ]

+ 110
- 0
postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/mailing-list.txt View File

@@ -0,0 +1,110 @@
1
+Return-Path: <fw-general-return-20540-david=example.org@lists.zend.com>
2
+X-Original-To: david@example.org
3
+Delivered-To: david@example.org
4
+Received: by mail.palepurple.co.uk (Postfix, from userid 1007)
5
+	id A41BE894CF8; Tue,  5 Aug 2008 19:46:09 +0100 (BST)
6
+Received: from localhost (localhost [127.0.0.1])
7
+	by mail.palepurple.co.uk (Postfix) with ESMTP id 6786E894CF9
8
+	for <david@example.org>; Tue,  5 Aug 2008 19:46:09 +0100 (BST)
9
+X-Virus-Scanned: by Amavis+SpamAssassin+ClamAV and more at palepurple.co.uk
10
+X-Spam-Score: -2.478
11
+X-Spam-Level: 
12
+X-Spam-Status: No, score=-2.478 tagged_above=-99 required=5 tests=[AWL=0.545,
13
+	BAYES_00=-2.599, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-1,
14
+	SPF_HELO_NEUTRAL=0.576, SPF_PASS=-0.001]
15
+Received: from mail.palepurple.co.uk ([127.0.0.50])
16
+	by localhost (oak.palepurple.co.uk [127.0.0.50]) (amavisd-new, port 10024)
17
+	with ESMTP id F7C1kX6O4LsN for <david@example.org>;
18
+	Tue,  5 Aug 2008 19:46:01 +0100 (BST)
19
+Received: from www.zend.com (lists.zend.com [67.15.86.102])
20
+	by mail.palepurple.co.uk (Postfix) with SMTP id 83287894CF8
21
+	for <david@example.org>; Tue,  5 Aug 2008 19:46:01 +0100 (BST)
22
+Received: (qmail 28760 invoked by uid 505); 5 Aug 2008 18:45:46 -0000
23
+Mailing-List: contact fw-general-help@lists.zend.com; run by ezmlm
24
+Precedence: bulk
25
+List-Post: <mailto:fw-general@lists.zend.com>
26
+List-Help: <mailto:fw-general-help@lists.zend.com>
27
+List-Unsubscribe: <mailto:fw-general-unsubscribe@lists.zend.com>
28
+List-Subscribe: <mailto:fw-general-subscribe@lists.zend.com>
29
+Delivered-To: mailing list fw-general@lists.zend.com
30
+Received: (qmail 28753 invoked from network); 5 Aug 2008 18:45:46 -0000
31
+DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
32
+  s=s1024; d=yahoo.com;
33
+  h=Received:X-Mailer:Date:From:Subject:To:Cc:MIME-Version:Content-Type:Message-ID;
34
+  b=RX7cjkrkpdsfHOXg2TRzzF2P5UXe0S5UVRucVl9FdqyE070/mV2za8ehvsGVRTh11tjkhkzh9QJoijpzHTTyu8F4HUHHoql4wUS6zJJC/PgdcCpBVXf0Im4RkyXqhIOAndNk1d9tCPmUnKDjC6SvO6i0Xd5+CqFH9f+eaKzUFAI=;
35
+X-Mailer: YahooMailRC/1042.48 YahooMailWebService/0.7.218
36
+Date: Tue, 5 Aug 2008 11:45:44 -0700 (PDT)
37
+From: =?iso-8859-1?Q?P=E1draic_Brady?= <some.one@yahoo.com>
38
+To: Some one Else <someone.else@gmail.com>
39
+Cc: Zend Framework General <overthere@example.org>
40
+MIME-Version: 1.0
41
+Content-Type: multipart/alternative; boundary="0-283769398-1217961944=:498"
42
+Message-ID: <944272.498.qm@web55003.mail.re4.yahoo.com>
43
+X-pstn-neptune: 0/0/0.00/0
44
+X-pstn-levels:     (S:99.90000/99.90000 CV:99.0000 P:95.9108 M:97.0282 C:98.6951 )
45
+X-pstn-settings: 1 (0.1500:0.1500) cv gt3 gt2 gt1 p m c 
46
+X-pstn-addresses: from <some.one@yahoo.com> [638/31] 
47
+Subject: Re: [fw-general] Zend_Paginate how to integrate?
48
+Content-Length: 4072
49
+Lines: 60
50
+
51
+--0-283769398-1217961944=:498
52
+Content-Type: text/plain; charset=iso-8859-1
53
+Content-Transfer-Encoding: quoted-printable
54
+
55
+I do pretty much what Giorgio suggests and tie it into the Model as much as=
56
+ possible - fits into the concept of doing as little as possible in your co=
57
+ntrollers by pushing reusable code into Model (or other) objects if appropr=
58
+iate.=0A=0A P=E1draic Brady=0A=0Ahttp://blog.astrumfutura.com=0Ahttp://www.=
59
+patternsforphp.com=0AOpenID Europe Foundation=0A=0A=0A=0A=0A----- Original =
60
+Message ----=0AFrom: Giorgio Sironi <whatever@example.org>=0ATo=
61
+: Axel W=FCstemann <awu@xxxqbus.de>=0ACc: fw-general@xxlists.zend.com=0ASent: Tu=
62
+esday, August 5, 2008 7:20:48 PM=0ASubject: Re: [fw-general] Zend_Paginate =
63
+how to integrate?=0A=0A2008/8/5 Axel W=FCstemann <awuxxxx@qbus.de>:=0A> Yes, it=
64
+ seems to me a good idea to let reside the paginator in the model.=0A> What=
65
+ happens in the controller? How the view comes into play?=0A=0AThe controll=
66
+er simply calls the method prepareArticles with the right=0Apage (a param o=
67
+f request) and pass the paginator to the view, so the=0Aview script can use=
68
+ it for helpers like PaginationControl. Note that=0Abecause the paginator g=
69
+oes into the view, it return only=0Amultidimensional array and not objects.=
70
+=0A=0A-- =0AGiorgio Sironi=0APiccolo Principe & Ossigeno Scripter=0Ahttp://=
71
+www.sourceforge.net/projects/ossigeno=0A
72
+--0-283769398-1217961944=:498
73
+Content-Type: text/html; charset=iso-8859-1
74
+Content-Transfer-Encoding: quoted-printable
75
+
76
+<html><head><style type=3D"text/css"><!-- DIV {margin:0px;} --></style></he=
77
+ad><body><div style=3D"font-family:Courier New,courier,monaco,monospace,san=
78
+s-serif;font-size:10pt"><font style=3D"font-family: times new roman,new yor=
79
+k,times,serif;" size=3D"3">I do pretty much what Giorgio suggests and tie i=
80
+t into the Model as much as possible - fits into the concept of doing as li=
81
+ttle as possible in your controllers by pushing reusable code into Model (o=
82
+r other) objects if appropriate.</font><br><div>&nbsp;</div><span style=3D"=
83
+color: rgb(0, 0, 191);"><font style=3D"font-family: times new roman,new yor=
84
+k,times,serif;" size=3D"3"><span style=3D"font-weight: bold;">P=E1draic Bra=
85
+dy<br><br></span></font><span style=3D"font-style: italic;"><font style=3D"=
86
+font-family: times new roman,new york,times,serif;" size=3D"3"><a rel=3D"no=
87
+follow" target=3D"_blank" href=3D"http://blog.astrumfutura.com">http://blog=
88
+.astrumfutura.com</a><br><a rel=3D"nofollow" target=3D"_blank"
89
+ href=3D"http://www.patternsforphp.com">http://www.patternsforphp.com</a><b=
90
+r><a rel=3D"nofollow" target=3D"_blank" href=3D"http://www.openideurope.eu/=
91
+">OpenID Europe Foundation</a><br></font></span></span><div><br></div><div =
92
+style=3D"font-family: Courier New,courier,monaco,monospace,sans-serif; font=
93
+-size: 10pt;"><br><div style=3D"font-family: arial,helvetica,sans-serif; fo=
94
+nt-size: 10pt;">----- Original Message ----<br>From: Giorgio Sironi &lt;pic=
95
+coloprincipeazzurroxxxxx@gxxxmail.com&gt;<br>To: Axel W=FCstemann &lt;awuxx@qbus.de&g=
96
+t;<br>Cc: fw-general@xxxlists.zend.com<br>Sent: Tuesday, August 5, 2008 7:20:4=
97
+8 PM<br>Subject: Re: [fw-general] Zend_Paginate how to integrate?<br><br>=
98
+=0A2008/8/5 Axel W=FCstemann &lt;<a ymailto=3D"mailto:awuxxx@xxxqbus.de" href=3D"=
99
+mailto:awuxx@xxqbus.de">xxawu@qxxxbus.de</a>&gt;:<br>&gt; Yes, it seems to me a good=
100
+ idea to let reside the paginator in the model.<br>&gt; What happens in the=
101
+ controller? How the view comes into play?<br><br>The controller simply cal=
102
+ls the method prepareArticles with the right<br>page (a param of request) a=
103
+nd pass the paginator to the view, so the<br>view script can use it for hel=
104
+pers like PaginationControl. Note that<br>because the paginator goes into t=
105
+he view, it return only<br>multidimensional array and not objects.<br><br>-=
106
+- <br>Giorgio Sironi<br>Piccolo Principe &amp; Ossigeno Scripter<br><a href=
107
+=3D"http://www.sourceforge.net/projects/ossigeno" target=3D"_blank">http://=
108
+www.sourceforge.net/projects/ossigeno</a><br></div></div></div></body></htm=
109
+l>
110
+--0-283769398-1217961944=:498--

+ 105
- 0
postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/spam.txt View File

@@ -0,0 +1,105 @@
1
+Return-Path: <mary@ccr.org>
2
+X-Original-To: david@codepoets.co.uk
3
+Delivered-To: david@codepoets.co.uk
4
+Received: by mail.palepurple.co.uk (Postfix, from userid 1007)
5
+	id A7BB7894CF8; Tue,  5 Aug 2008 19:32:19 +0100 (BST)
6
+Received: from localhost (localhost [127.0.0.1])
7
+	by mail.palepurple.co.uk (Postfix) with ESMTP id 673E4894CF9
8
+	for <david@codepoets.co.uk>; Tue,  5 Aug 2008 19:32:19 +0100 (BST)
9
+X-Quarantine-ID: <KOCPqIot+eWP>
10
+X-Virus-Scanned: by Amavis+SpamAssassin+ClamAV and more at palepurple.co.uk
11
+X-Spam-Flag: YES
12
+X-Spam-Score: 35.511
13
+X-Spam-Level: ***********************************
14
+X-Spam-Status: Yes, score=35.511 tagged_above=-99 required=5
15
+	tests=[BAYES_99=3.5, DIGEST_MULTIPLE=0.001, FH_HELO_EQ_D_D_D_D=0.001,
16
+	HELO_DYNAMIC_HCC=4.295, HELO_DYNAMIC_IPADDR2=4.395,
17
+	HTML_EXTRA_CLOSE=2.809, HTML_MESSAGE=0.001, PYZOR_CHECK=3.7,
18
+	RAZOR2_CF_RANGE_51_100=0.5, RAZOR2_CF_RANGE_E4_51_100=1.5,
19
+	RAZOR2_CF_RANGE_E8_51_100=1.5, RAZOR2_CHECK=0.5, RCVD_IN_PBL=0.905,
20
+	RDNS_DYNAMIC=0.1, TVD_RCVD_IP=1.931, URIBL_AB_SURBL=1.86,
21
+	URIBL_BLACK=1.955, URIBL_JP_SURBL=1.501, URIBL_OB_SURBL=1.5,
22
+	URIBL_RHS_DOB=1.083, URIBL_SC_SURBL=0.474, URIBL_WS_SURBL=1.5]
23
+X-Spam-Report:
24
+ *  3.5 BAYES_99 BODY: Bayesian spam probability is 99 to 100%
25
+ *      [score: 0.9982]
26
+ *  4.3 HELO_DYNAMIC_HCC Relay HELO'd using suspicious hostname (HCC)
27
+ *  4.4 HELO_DYNAMIC_IPADDR2 Relay HELO'd using suspicious hostname (IP addr
28
+ *       2)
29
+ *  0.0 FH_HELO_EQ_D_D_D_D Helo is d-d-d-d
30
+ *  1.9 TVD_RCVD_IP TVD_RCVD_IP
31
+ *  0.9 RCVD_IN_PBL RBL: Received via a relay in Spamhaus PBL
32
+ *      [189.31.157.78 listed in zen.spamhaus.org]
33
+ *  2.8 HTML_EXTRA_CLOSE BODY: HTML contains far too many close tags
34
+ *  0.0 HTML_MESSAGE BODY: HTML included in message
35
+ *  1.5 RAZOR2_CF_RANGE_E8_51_100 Razor2 gives engine 8 confidence level
36
+ *      above 50%
37
+ *      [cf: 100]
38
+ *  1.5 RAZOR2_CF_RANGE_E4_51_100 Razor2 gives engine 4 confidence level
39
+ *      above 50%
40
+ *      [cf: 100]
41
+ *  0.5 RAZOR2_CHECK Listed in Razor2 (http://razor.sf.net/)
42
+ *  0.5 RAZOR2_CF_RANGE_51_100 Razor2 gives confidence level above 50%
43
+ *      [cf: 100]
44
+ *  3.7 PYZOR_CHECK Listed in Pyzor (http://pyzor.sf.net/)
45
+ *  1.1 URIBL_RHS_DOB Contains an URI of a new domain (Day Old Bread)
46
+ *      [URIs: heartremember.com]
47
+ *  2.0 URIBL_BLACK Contains an URL listed in the URIBL blacklist
48
+ *      [URIs: heartremember.com]
49
+ *  1.9 URIBL_AB_SURBL Contains an URL listed in the AB SURBL blocklist
50
+ *      [URIs: heartremember.com]
51
+ *  1.5 URIBL_WS_SURBL Contains an URL listed in the WS SURBL blocklist
52
+ *      [URIs: heartremember.com]
53
+ *  1.5 URIBL_JP_SURBL Contains an URL listed in the JP SURBL blocklist
54
+ *      [URIs: heartremember.com]
55
+ *  1.5 URIBL_OB_SURBL Contains an URL listed in the OB SURBL blocklist
56
+ *      [URIs: heartremember.com]
57
+ *  0.5 URIBL_SC_SURBL Contains an URL listed in the SC SURBL blocklist
58
+ *      [URIs: heartremember.com]
59
+ *  0.0 DIGEST_MULTIPLE Message hits more than one network digest check
60
+ *  0.1 RDNS_DYNAMIC Delivered to trusted network by host with
61
+ *      dynamic-looking rDNS
62
+Received: from mail.palepurple.co.uk ([127.0.0.50])
63
+	by localhost (oak.palepurple.co.uk [127.0.0.50]) (amavisd-new, port 10024)
64
+	with ESMTP id KOCPqIot+eWP for <david@codepoets.co.uk>;
65
+	Tue,  5 Aug 2008 19:32:13 +0100 (BST)
66
+Received: from 189-31-157-78.gnace704.dsl.brasiltelecom.net.br (189-31-157-78.gnace704.dsl.brasiltelecom.net.br [189.31.157.78])
67
+	by mail.palepurple.co.uk (Postfix) with ESMTP id 02E02894CF8
68
+	for <postmaster@codepoets.co.uk>; Tue,  5 Aug 2008 19:32:11 +0100 (BST)
69
+Date: Tue, 05 Aug 2008 16:44:31 +0000
70
+Message-ID: <45605.clarke@shan>
71
+From: "ferd clarke" <mary@ccr.org>
72
+To: <postmaster@codepoets.co.uk>
73
+Subject: *** SPAM *** Super eustace proposition
74
+MIME-Version: 1.0
75
+Content-Type: multipart/alternative;
76
+	boundary="=_xjl52j6iKNOFLD"
77
+Content-Length: 628
78
+Lines: 26
79
+
80
+This is a multi-part message in MIME format.
81
+
82
+--=_xjl52j6iKNOFLD
83
+Content-Type: text/plain;
84
+	charset="iso-8859-1"
85
+Content-Transfer-Encoding: quoted-printable
86
+
87
+ view,  medicine todays best solution check out here
88
+--=_xjl52j6iKNOFLD
89
+Content-Type: text/html;
90
+	charset="iso-8859-1"
91
+Content-Transfer-Encoding: quoted-printable
92
+
93
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
94
+<HTML>
95
+<HEAD>
96
+<META http-equiv=3DContent-Type content=3D"text/html; =
97
+charset=3Diso-8859-1">
98
+</HEAD>
99
+<P> view,  medicine todays best solution <A =
100
+href=3D"http://heartremember.com">check out here</A></P>
101
+</BODY>
102
+</HTML>
103
+--=_xjl52j6iKNOFLD--
104
+
105
+

+ 0
- 0
postfixadmin/postfixadmin-3.0/VIRTUAL_VACATION/tests/teodor-smtp-envelope-headers.txt View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save