php IHDR w Q )Ba pHYs sRGB gAMA a IDATxMk\U s&uo,mD )Xw+e?tw.oWp;QHZnw`gaiJ9̟灙a=nl[ ʨ G;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ y H@E7j 1j+OFRg}ܫ;@Ea~ j`u'o> j- $_q?qS XzG'ay
files >> /usr/libexec/webmin/virtual-server/scripts/ |
files >> //usr/libexec/webmin/virtual-server/scripts/squirrelmail.pl |
# script_squirrelmail_desc() sub script_squirrelmail_desc { return "SquirrelMail"; } sub script_squirrelmail_uses { return ( "php" ); } sub script_squirrelmail_longdesc { return "SquirrelMail is a standards-based webmail package written in PHP"; } # script_squirrelmail_versions() sub script_squirrelmail_versions { return ( "1.4.22" ); } sub script_squirrelmail_version_desc { local ($ver) = @_; return $ver < 1.5 ? "$ver (Stable)" : "$ver (Development)"; } sub script_squirrelmail_category { return "Email"; } sub script_squirrelmail_php_vers { return ( 4, 5 ); } sub script_squirrelmail_pear_modules { local ($d, $opts) = @_; return $opts->{'db'} ? ( "DB" ) : ( ); } # script_squirrelmail_params(&domain, version, &upgrade-info) # Returns HTML for table rows for options for installing PHP-NUKE sub script_squirrelmail_params { local ($d, $ver, $upgrade) = @_; local $rv; local $hdir = &public_html_dir($d, 1); if ($upgrade) { # Options are fixed when upgrading local ($dbtype, $dbname) = split(/_/, $upgrade->{'opts'}->{'db'}, 2); if ($dbtype) { $rv .= &ui_table_row("Database for SquirrelMail preferences", $dbname); } local $dir = $upgrade->{'opts'}->{'dir'}; $dir =~ s/^$d->{'home'}\///; $rv .= &ui_table_row("Install directory", $dir); } else { # Show editable install options local @dbs = &domain_databases($d, [ "mysql" ]); if (@dbs) { $rv .= &ui_table_row("Database for SquirrelMail preferences", &ui_radio("db_def", 1, [ [ 1, "None" ], [ 0, "Selected database" ] ])."\n". &ui_database_select("db", undef, \@dbs)); } else { $rv .= &ui_hidden("db_def", 1)."\n"; } $rv .= &ui_table_row("Install sub-directory under <tt>$hdir</tt>", &ui_opt_textbox("dir", &substitute_scriptname_template("squirrelmail", $d), 30, "At top level")); } return $rv; } # script_squirrelmail_parse(&domain, version, &in, &upgrade-info) # Returns either a hash ref of parsed options, or an error string sub script_squirrelmail_parse { local ($d, $ver, $in, $upgrade) = @_; if ($upgrade) { # Options are always the same return $upgrade->{'opts'}; } else { local $hdir = &public_html_dir($d, 0); $in{'dir_def'} || $in{'dir'} =~ /\S/ && $in{'dir'} !~ /\.\./ || return "Missing or invalid installation directory"; local $dir = $in{'dir_def'} ? $hdir : "$hdir/$in{'dir'}"; return { 'db' => $in{'db_def'} ? undef : $in->{'db'}, 'dir' => $dir, 'path' => $in{'dir_def'} ? "/" : "/$in{'dir'}", }; } } # script_squirrelmail_check(&domain, version, &opts, &upgrade-info) # Returns an error message if a required option is missing or invalid sub script_squirrelmail_check { local ($d, $ver, $opts, $upgrade) = @_; $opts->{'dir'} =~ /^\// || return "Missing or invalid install directory"; if (-r "$opts->{'dir'}/config/config.php") { return "SquirrelMail appears to be already installed in the selected directory"; } if ($opts->{'db'}) { local ($dbtype, $dbname) = split(/_/, $opts->{'db'}, 2); local $clash = &find_database_table($dbtype, $dbname, "userprefs|address|global_abook"); $clash && return "SquirrelMail appears to be already using the selected database (table $clash)"; } return undef; } # script_squirrelmail_files(&domain, version, &opts, &upgrade-info) # Returns a list of files needed by SquirrelMail, each of which is a hash ref # containing a name, filename and URL sub script_squirrelmail_files { local ($d, $ver, $opts, $upgrade) = @_; local @files = ( { 'name' => "source", 'file' => "squirrelmail-$ver.tar.gz", 'url' => "http://prdownloads.sourceforge.net/squirrelmail/squirrelmail-webmail-$ver.tar.gz" }, { 'name' => 'set_user_data', 'file' => 'set_user_data.tar.gz', 'nofetch' => 1, 'url' => 'http://scripts.virtualmin.com/set_user_data-1.0.tar.gz' }, { 'name' => 'locales', 'file' => 'locales.tar.gz', 'url' => "http://sourceforge.net/projects/squirrelmail/files/locales/1.4.18-20090526/all_locales-1.4.18-20090526.tar.gz" }, ); return @files; } sub script_squirrelmail_commands { return ("tar", "gunzip"); } # script_squirrelmail_install(&domain, version, &opts, &files, &upgrade-info) # Actually installs SquirrelMail, and returns either 1 and an informational # message, or 0 and an error sub script_squirrelmail_install { local ($d, $version, $opts, $files, $upgrade) = @_; local ($out, $ex); local ($dbtype, $dbname) = split(/_/, $opts->{'db'}, 2); local $dbuser = $dbtype eq "mysql" ? &mysql_user($d) : &postgres_user($d); local $dbpass = $dbtype eq "mysql" ? &mysql_pass($d) : &postgres_pass($d, 1); local $dbphptype = $dbtype eq "mysql" ? "mysql" : "psql"; local $dbhost = &get_database_host($dbtype); if ($dbtype) { local $dberr = &check_script_db_connection($dbtype, $dbname, $dbuser, $dbpass); return (0, "Database connection failed : $dberr") if ($dberr); } # Delete doc/ReleaseNotes, as this changed from a file to a directory! if ($upgrade) { &unlink_file_as_domain_user($d, "$opts->{'dir'}/doc/ReleaseNotes"); } # Extract tar file to temp dir and copy to target local $temp = &transname(); local $err = &extract_script_archive($files->{'source'}, $temp, $d, $opts->{'dir'}, "squirrelmail-webmail-$ver"); $err && return (0, "Failed to extract source : $err"); local $cprog = "$opts->{'dir'}/config/conf.pl"; # Extract locales local $temp2 = &transname(); local $err2 = &extract_script_archive($files->{'locales'}, $temp2, $d, $opts->{'dir'}."/locale", "locale"); $err2 && return (0, "Failed to extract locales : $err2"); if (!$upgrade) { # Run the config program &foreign_require("proc", "proc-lib.pl"); local $confcmd = &command_as_user($d->{'user'}, 0, "$opts->{'dir'}/config/conf.pl"); &clean_environment(); local ($fh, $fpid) = &proc::pty_process_exec($confcmd); &reset_environment(); if (&wait_for($fh, "SquirrelMail", "different one") == 1) { &sysprint($fh, "n\n"); } foreach my $cmd ([ ">>", "D" ], [ ">>", "courier" ], [ "any key|enter", "" ], [ ">>", "S" ], [ "enter", "" ], [ "Q", "Exiting" ]) { local $rv = &wait_for($fh, $cmd->[0]); return (0, "Configuration program failed : $wait_for_input") if ($rv < 0); &sysprint($fh, "$cmd->[1]\n"); } close($fh); # Kill off conf.pl kill('KILL', $fpid); if (&foreign_check("proc")) { &foreign_require("proc", "proc-lib.pl"); local @cprocs = grep { $_->{'user'} eq $d->{'user'} && $_->{'args'} =~ /conf\.pl/ } &proc::list_processes(); foreach my $cproc (@cprocs) { kill('KILL', $cproc->{'pid'}); } } local $cfile = "$opts->{'dir'}/config/config.php"; -r $cfile || return (-1, "Failed to create config file"); # Create data directories local $data_dir = "$opts->{'dir'}/data"; &make_dir_as_domain_user($d, $data_dir, 0700) if (!-d $data_dir); &make_file_php_writable($d, $data_dir, 1, 1); local $attachment_dir = "$opts->{'dir'}/attach"; &make_dir_as_domain_user($d, $attachment_dir, 0700) if (!-d $attachment_dir); &make_file_php_writable($d, $attachment_dir, 1, 1); # Update the config file local $lref = &read_file_lines_as_domain_user($d, $cfile); local $dburl = "$dbphptype://$dbuser:".&php_quotemeta($dbpass, 1). "\@$dbhost/$dbname"; foreach $l (@$lref) { if ($l =~ /^\$domain\s*=\s*/) { $l = "\$domain = '$d->{'dom'}';"; } if ($dbtype && $l =~ /^\$addrbook_dsn\s*=\s*/) { $l = "\$addrbook_dsn = '$dburl';"; } if ($dbtype && $l =~ /^\$addrbook_global_dsn\s*=\s*/) { $l = "\$addrbook_global_dsn = '$dburl';"; } if ($dbtype && $l =~ /^\$prefs_dsn\s*=\s*/) { $l = "\$prefs_dsn = '$dburl';"; } if ($l =~ /^\$optional_delimiter\s*=\s*/) { $l = "\$optional_delimiter = '.';"; } if ($l =~ /^\$default_folder_prefix\s*=\s*/) { $l = "\$default_folder_prefix = '';"; } if ($l =~ /^\$data_dir\s*=\s*/) { $l = "\$data_dir = '$data_dir';"; } if ($l =~ /^\$attachment_dir\s*=\s*/) { $l = "\$attachment_dir = '$attachment_dir';"; } } &flush_file_lines_as_domain_user($d, $cfile); if ($dbname) { # Create the database tables &require_mysql(); &mysql::execute_sql_logged($dbname, " CREATE TABLE address ( owner varchar(128) DEFAULT '' NOT NULL, nickname varchar(16) DEFAULT '' NOT NULL, firstname varchar(128) DEFAULT '' NOT NULL, lastname varchar(128) DEFAULT '' NOT NULL, email varchar(128) DEFAULT '' NOT NULL, label varchar(255), PRIMARY KEY (owner,nickname), KEY firstname (firstname,lastname) )"); &mysql::execute_sql_logged($dbname, " CREATE TABLE global_abook ( owner varchar(128) DEFAULT '' NOT NULL, nickname varchar(16) DEFAULT '' NOT NULL, firstname varchar(128) DEFAULT '' NOT NULL, lastname varchar(128) DEFAULT '' NOT NULL, email varchar(128) DEFAULT '' NOT NULL, label varchar(255), PRIMARY KEY (owner,nickname), KEY firstname (firstname,lastname) )"); &mysql::execute_sql_logged($dbname, " CREATE TABLE userprefs ( user varchar(128) DEFAULT '' NOT NULL, prefkey varchar(64) DEFAULT '' NOT NULL, prefval BLOB DEFAULT '' NOT NULL, PRIMARY KEY (user,prefkey) )"); } # Install the set user data plugin local $vut = &get_mail_virtusertable(); if ($vut) { $out = &run_as_domain_user($d, "cd ".quotemeta("$opts->{'dir'}/plugins"). " && (gunzip -c $files->{'set_user_data'} | tar xf -)"); local $sdir = "$opts->{'dir'}/plugins/set_user_data"; local $scfilesrc = "$sdir/config.php.sample"; -r $scfilesrc || return (0, "Failed to extract set_user_data plugin : ". "<tt>$out</tt>."); # Setup the config file local $scfile = "$sdir/config.php"; ©_source_dest_as_domain_user($d, $scfilesrc, $scfile); local $sc = &read_file_contents_as_domain_user($d, $scfile); $sc =~ s/'passwd'/'passwd+', 'virtual'/; $sc =~ s/\['loginmode'\]\s*=\s*0/\['loginmode'\] = 1/; $sc =~ s/\['loginmethods'\]\s*=\s*array\(/\['loginmethods'\] = array\('virtual'/; &open_tempfile_as_domain_user($d, CONF, ">$scfile"); &print_tempfile(CONF, $sc); &close_tempfile_as_domain_user($d, CONF); # Setup passwd config file ©_source_dest_as_domain_user($d, "$sdir/methods/passwd.php.sample", "$sdir/methods/passwd.php"); local $vc = &read_file_contents_as_domain_user($d, "$sdir/methods/passwd.php"); $vc =~ s/settings\['posix'\]\s*=\s*0/settings\['posix'\] = 1/; &open_tempfile_as_domain_user($d, CONF, ">$sdir/methods/passwd.php"); &print_tempfile(CONF, $vc); &close_tempfile_as_domain_user($d, CONF); # Setup virtual config file ©_source_dest_as_domain_user($d, "$sdir/methods/virtual.php.sample", "$sdir/methods/virtual.php"); local $vc = &read_file_contents_as_domain_user($d, "$sdir/methods/virtual.php"); $vc =~ s/settings\['file'\]\s*=\s*'.*'/settings\['file'\] = '$vut'/g; &open_tempfile_as_domain_user($d, CONF, ">$sdir/methods/virtual.php"); &print_tempfile(CONF, $vc); &close_tempfile_as_domain_user($d, CONF); # Register in squirrelmail config file local $lref = &read_file_lines_as_domain_user($d, $cfile); splice(@$lref, @$lref-1, 0, "\$plugins[0] = 'set_user_data';"); &flush_file_lines_as_domain_user($d, $cfile); } } # Return a URL for the user local $url = &script_path_url($d, $opts); local $rp = $opts->{'dir'}; $rp =~ s/^$d->{'home'}\///; return (1, "SquirrelMail installation complete. It can be accessed at <a target=_blank href='$url'>$url</a>.", $dbname ? "Under $rp using $dbphptype database $dbname" : "Under $rp", $url); } # script_squirrelmail_uninstall(&domain, version, &opts) # Un-installs a SquirrelMail installation, by deleting the directory and database. # Returns 1 on success and a message, or 0 on failure and an error sub script_squirrelmail_uninstall { local ($d, $version, $opts) = @_; # Remove squirrelmail tables from the database &cleanup_script_database($d, $opts->{'db'}, [ "address", "global_abook", "userprefs" ]); # Remove the contents of the target directory local $derr = &delete_script_install_directory($d, $opts); return (0, $derr) if ($derr); return (1, $dbname ? "SquirrelMail directory and tables deleted." : "SquirrelMail directory deleted."); } # script_squirrelmail_check_latest(version) # Checks if some version is the latest for this project, and if not returns # a newer one. Otherwise returns undef. sub script_squirrelmail_check_latest { local ($ver) = @_; local @vers = &osdn_package_versions("squirrelmail", "squirrelmail-webmail-([a-z0-9\\.]+)\\.tar\\.gz"); @vers = grep { !/RC/ } @vers; if (&compare_versions($ver, 1.5) > 0) { @vers = grep { &compare_versions($_, 1.5) > 0 } @vers; } else { @vers = grep { &compare_versions($_, 1.5) < 0 } @vers; } return "Failed to find versions" if (!@vers); return $ver eq $vers[0] ? undef : $vers[0]; } sub script_squirrelmail_site { return 'http://www.squirrelmail.org/'; } sub script_squirrelmail_gpl { return 1; } 1;y~or5J={Eeu磝Qk ᯘG{?+]ן?wM3X^歌>{7پK>on\jy Rg/=fOroNVv~Y+ NGuÝHWyw[eQʨSb> >}Gmx[o[<{Ϯ_qFvM IENDB`