line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package PheMail::Vhost; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
255536
|
use 5.006; |
|
1
|
|
|
|
|
5
|
|
|
1
|
|
|
|
|
46
|
|
4
|
1
|
|
|
1
|
|
6
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
39
|
|
5
|
1
|
|
|
1
|
|
6
|
use warnings; |
|
1
|
|
|
|
|
7
|
|
|
1
|
|
|
|
|
44
|
|
6
|
1
|
|
|
1
|
|
2539
|
use DBI; |
|
1
|
|
|
|
|
28552
|
|
|
1
|
|
|
|
|
111
|
|
7
|
1
|
|
|
|
|
2385
|
use vars qw($sth $dbh $sname $sadmin $droot $id $extensions @sextensions $redirect |
8
|
|
|
|
|
|
|
$soptions $i $htaccess $sdomain $servername $users %SQL $hoster $eredirect |
9
|
1
|
|
|
1
|
|
15
|
$safe_mode $open_basedir $magic_quotes $enableauth $authname $disablefunc); |
|
1
|
|
|
|
|
2
|
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
require Exporter; |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
our @ISA = qw(Exporter); |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
# Items to export into callers namespace by default. Note: do not export |
16
|
|
|
|
|
|
|
# names by default without a very good reason. Use EXPORT_OK instead. |
17
|
|
|
|
|
|
|
# Do not simply export all your public functions/methods/constants. |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
# This allows declaration use PheMail::Vhost ':all'; |
20
|
|
|
|
|
|
|
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK |
21
|
|
|
|
|
|
|
# will save memory. |
22
|
|
|
|
|
|
|
our %EXPORT_TAGS = ( 'all' => [ qw( |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
) ] ); |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
our @EXPORT = qw( |
29
|
|
|
|
|
|
|
LoadVhosts |
30
|
|
|
|
|
|
|
ReportSql |
31
|
|
|
|
|
|
|
alterSqlFromString |
32
|
|
|
|
|
|
|
alterSql |
33
|
|
|
|
|
|
|
); |
34
|
|
|
|
|
|
|
our $VERSION = '0.14'; |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
# Preloaded methods go here. |
38
|
|
|
|
|
|
|
# alter the SQL interface from the outside. |
39
|
|
|
|
|
|
|
sub alterSqlFromString($$$$$$) { |
40
|
0
|
|
|
0
|
0
|
|
($SQL{'backend'},$SQL{'user'},$SQL{'pass'},$SQL{'database'},$SQL{'hostname'},$SQL{'whoami'}) = @_; |
41
|
|
|
|
|
|
|
} |
42
|
|
|
|
|
|
|
sub RandSalt() { |
43
|
|
|
|
|
|
|
# function to create a random 2-char salt. Thanks Kimusan. |
44
|
0
|
|
|
0
|
0
|
|
my @chars = ('a'..'z','A'..'Z',0..9); |
45
|
0
|
|
|
|
|
|
return join '', map $chars[rand @chars], 1..2; |
46
|
|
|
|
|
|
|
} |
47
|
|
|
|
|
|
|
sub ReportSql { |
48
|
0
|
|
|
0
|
0
|
|
print "SQL Information:\n---------------\n"; |
49
|
0
|
|
|
|
|
|
foreach my $foo (keys %SQL) { |
50
|
0
|
|
|
|
|
|
print $foo." = ".$SQL{$foo}."\n"; |
51
|
|
|
|
|
|
|
} |
52
|
|
|
|
|
|
|
} |
53
|
|
|
|
|
|
|
sub LoadVhosts($) { |
54
|
0
|
|
|
0
|
0
|
|
my $VirtualHost = shift; |
55
|
0
|
|
|
|
|
|
$i = 0; |
56
|
|
|
|
|
|
|
# $dbh = DBI->connect("DBI:".$SQL{'backend'}.":".$SQL{'database'}.":".$SQL{'hostname'},$SQL{'user'},$SQL{'pass'}); # for MySQL |
57
|
0
|
0
|
|
|
|
|
$dbh = DBI->connect("DBI:".$SQL{'backend'}.":dbname=".$SQL{'database'}.";host=".$SQL{'hostname'},$SQL{'user'},$SQL{'pass'}) |
58
|
|
|
|
|
|
|
or die("DBI Error: ".DBI::errstr); |
59
|
0
|
|
|
|
|
|
$sth = $dbh->prepare("SELECT * FROM vhosts WHERE hoster='".$SQL{'whoami'}."'"); |
60
|
0
|
|
|
|
|
|
$sth->execute(); |
61
|
0
|
|
|
|
|
|
while (($id, |
62
|
|
|
|
|
|
|
$hoster, |
63
|
|
|
|
|
|
|
$sname, |
64
|
|
|
|
|
|
|
$droot, |
65
|
|
|
|
|
|
|
$sadmin, |
66
|
|
|
|
|
|
|
$sdomain, |
67
|
|
|
|
|
|
|
$soptions, |
68
|
|
|
|
|
|
|
$htaccess, |
69
|
|
|
|
|
|
|
$users, |
70
|
|
|
|
|
|
|
$extensions, |
71
|
|
|
|
|
|
|
$redirect, |
72
|
|
|
|
|
|
|
$eredirect, |
73
|
|
|
|
|
|
|
$open_basedir, |
74
|
|
|
|
|
|
|
$safe_mode, |
75
|
|
|
|
|
|
|
$magic_quotes, |
76
|
|
|
|
|
|
|
$enableauth, |
77
|
|
|
|
|
|
|
$authname, |
78
|
|
|
|
|
|
|
$disablefunc) = $sth->fetchrow_array()) { |
79
|
0
|
|
|
|
|
|
$i++; |
80
|
0
|
|
|
|
|
|
$droot =~ s/^\///; |
81
|
0
|
0
|
|
|
|
|
$servername = $sname ? $sname.".".$sdomain : $sdomain; |
82
|
0
|
0
|
|
|
|
|
if (-d "/home/customers/$sdomain/wwwroot/$droot") { |
83
|
0
|
0
|
|
|
|
|
if ($htaccess) { |
84
|
0
|
0
|
|
|
|
|
open(HT,"> /home/customers/$sdomain/wwwroot/$droot/.htaccess") |
85
|
|
|
|
|
|
|
or die("Couldn't open: $!"); |
86
|
0
|
|
|
|
|
|
print HT $htaccess; |
87
|
0
|
|
|
|
|
|
close(HT); |
88
|
|
|
|
|
|
|
} else { |
89
|
0
|
0
|
|
|
|
|
system("/bin/rm /home/customers/$sdomain/wwwroot/$droot/.htaccess") |
90
|
|
|
|
|
|
|
if (-e "/home/customers/$sdomain/wwwroot/$droot/.htaccess"); |
91
|
|
|
|
|
|
|
} |
92
|
|
|
|
|
|
|
} else { |
93
|
0
|
0
|
|
|
|
|
if (!$redirect) { |
94
|
0
|
|
|
|
|
|
warn "PheMail::Vhost: Warning: ".$servername."'s documentroot does not exist.\n"; |
95
|
0
|
|
|
|
|
|
next; |
96
|
|
|
|
|
|
|
} |
97
|
|
|
|
|
|
|
} |
98
|
0
|
0
|
|
|
|
|
@sextensions = split("\n",$extensions) if $extensions; |
99
|
0
|
|
|
|
|
|
my $lamext; |
100
|
0
|
|
|
|
|
|
push @$lamext, [ "image/x-icon", ".ico" ]; # just to have something for default AddType so it won't fail. |
101
|
0
|
|
|
|
|
|
foreach my $grasp (@sextensions) { |
102
|
0
|
|
|
|
|
|
chomp($grasp); # remove the latter \n |
103
|
0
|
|
|
|
|
|
my($dotext,$handler) = split(/:/,$grasp); |
104
|
0
|
0
|
|
|
|
|
$handler =~ s/\r//g if $handler; # obviously this created some errors in the arrayref push |
105
|
0
|
0
|
0
|
|
|
|
push @$lamext, [ $handler, $dotext ] if ($dotext && $handler); # push in the new extensions |
106
|
|
|
|
|
|
|
} |
107
|
0
|
|
|
|
|
|
my $php_modes; my $php_flags; |
108
|
0
|
|
|
|
|
|
push @$php_modes, [ "sendmail_from", $sadmin ]; # default values in the modes, just to have something |
109
|
0
|
|
|
|
|
|
push @$php_modes, [ "include_path", "/usr/home/customers/$sdomain/wwwroot/$droot:/usr/local/share/pear" ]; # include path |
110
|
|
|
|
|
|
|
# disable functions? |
111
|
0
|
0
|
|
|
|
|
if ($disablefunc) { |
112
|
0
|
|
|
|
|
|
push @$php_modes, [ "disable_functions", $disablefunc ]; |
113
|
|
|
|
|
|
|
} |
114
|
|
|
|
|
|
|
# -- /disable functions -- |
115
|
0
|
0
|
|
|
|
|
if ($open_basedir > 0) { |
116
|
0
|
|
|
|
|
|
push @$php_modes, [ "open_basedir", "/usr/home/customers/".$sdomain."/wwwroot/".$droot ]; |
117
|
|
|
|
|
|
|
} |
118
|
0
|
0
|
|
|
|
|
if ($safe_mode > 0) { |
119
|
0
|
|
|
|
|
|
push @$php_flags, [ "safe_mode", 1 ]; |
120
|
|
|
|
|
|
|
} else { |
121
|
0
|
|
|
|
|
|
push @$php_flags, [ "safe_mode", 0 ]; |
122
|
|
|
|
|
|
|
} |
123
|
0
|
0
|
|
|
|
|
if ($magic_quotes > 0) { |
124
|
0
|
|
|
|
|
|
push @$php_flags, [ "magic_quotes_gpc", 1 ]; |
125
|
|
|
|
|
|
|
} else { |
126
|
0
|
|
|
|
|
|
push @$php_flags, [ "magic_quotes_gpc", 0 ]; |
127
|
|
|
|
|
|
|
} |
128
|
|
|
|
|
|
|
# prepare auth-directory thingie |
129
|
0
|
|
|
|
|
|
my %Location; # decius: reset every time |
130
|
0
|
0
|
|
|
|
|
if ($enableauth) { |
131
|
0
|
|
|
|
|
|
print "[+] Enabled HTTP-Auth for vhost $servername.."; |
132
|
0
|
|
|
|
|
|
$authname =~ s/\s/_/g; |
133
|
0
|
0
|
|
|
|
|
$Location{'/'} = { |
134
|
|
|
|
|
|
|
"Limit" => { |
135
|
|
|
|
|
|
|
"METHODS" => "post get", # no idea why you need this, won't work without though. |
136
|
|
|
|
|
|
|
"require" => "valid-user", |
137
|
|
|
|
|
|
|
}, |
138
|
|
|
|
|
|
|
"AuthType" => "Basic", |
139
|
|
|
|
|
|
|
"AuthName" => ($authname ? $authname : "PheMail"), |
140
|
|
|
|
|
|
|
"AuthUserFile" => "/usr/home/customers/$sdomain/wwwroot/$droot/.htpasswd", |
141
|
|
|
|
|
|
|
}; |
142
|
0
|
|
|
|
|
|
print ". done.\n"; |
143
|
|
|
|
|
|
|
} |
144
|
|
|
|
|
|
|
# write users here |
145
|
|
|
|
|
|
|
# decius: problem with enabling auth. I'll take a look. |
146
|
0
|
0
|
|
|
|
|
if ($enableauth) { |
147
|
0
|
0
|
|
|
|
|
open(FOOPWD,"> /usr/home/customers/$sdomain/wwwroot/$droot/.htpasswd") or die("Unable to open .htpasswd: $!"); |
148
|
0
|
|
|
|
|
|
print "Writing file for $servername..\n"; |
149
|
0
|
|
|
|
|
|
my @rusers = split(/\n/,$users); |
150
|
0
|
|
|
|
|
|
foreach my $user (@rusers) { |
151
|
0
|
|
|
|
|
|
$user =~ s/\r//g; |
152
|
0
|
|
|
|
|
|
my($username,$password) = split(/:/,$user); |
153
|
0
|
|
|
|
|
|
print FOOPWD $username.":".crypt($password,&RandSalt)."\n"; |
154
|
|
|
|
|
|
|
} |
155
|
0
|
|
|
|
|
|
close(FOOPWD); |
156
|
|
|
|
|
|
|
} |
157
|
|
|
|
|
|
|
# enable redirect here |
158
|
0
|
0
|
|
|
|
|
if ($eredirect) { |
159
|
0
|
|
|
|
|
|
push @{$VirtualHost->{'*'}}, { |
|
0
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
ServerName => $servername, |
161
|
|
|
|
|
|
|
ServerAdmin => $sadmin, |
162
|
|
|
|
|
|
|
ErrorLog => "/usr/home/customers/$sdomain/log/httpd-error.log", |
163
|
|
|
|
|
|
|
TransferLog => "/usr/home/customers/$sdomain/log/httpd-access.log", |
164
|
|
|
|
|
|
|
Redirect => [ "/", $redirect ], |
165
|
|
|
|
|
|
|
}; |
166
|
|
|
|
|
|
|
} else { # no redirect? oh well, write the normal one. |
167
|
0
|
|
|
|
|
|
push @{$VirtualHost->{'*'}}, { |
|
0
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
ServerName => $servername, |
169
|
|
|
|
|
|
|
ServerAdmin => $sadmin, |
170
|
|
|
|
|
|
|
DocumentRoot => "/usr/home/customers/$sdomain/wwwroot/$droot", |
171
|
|
|
|
|
|
|
ErrorLog => "/usr/home/customers/$sdomain/log/httpd-error.log", |
172
|
|
|
|
|
|
|
TransferLog => "/usr/home/customers/$sdomain/log/httpd-access.log", |
173
|
|
|
|
|
|
|
AddType => $lamext, |
174
|
|
|
|
|
|
|
php_admin_value => $php_modes, |
175
|
|
|
|
|
|
|
php_admin_flag => $php_flags, |
176
|
|
|
|
|
|
|
Directory => { |
177
|
|
|
|
|
|
|
"/usr/home/customers/$sdomain/wwwroot/$droot" => { |
178
|
|
|
|
|
|
|
Options => $soptions, |
179
|
|
|
|
|
|
|
AllowOverride => "All", |
180
|
|
|
|
|
|
|
}, |
181
|
|
|
|
|
|
|
}, |
182
|
|
|
|
|
|
|
Location => { |
183
|
|
|
|
|
|
|
%Location, |
184
|
|
|
|
|
|
|
}, |
185
|
|
|
|
|
|
|
}; |
186
|
|
|
|
|
|
|
} |
187
|
|
|
|
|
|
|
} |
188
|
0
|
|
|
|
|
|
printf("PheMail: Done loading %d vhosts.\n",$i); |
189
|
0
|
|
|
|
|
|
$sth->finish(); |
190
|
0
|
|
|
|
|
|
$dbh->disconnect(); |
191
|
|
|
|
|
|
|
} |
192
|
|
|
|
|
|
|
1; |
193
|
|
|
|
|
|
|
__END__ |