--- rpms/smeserver-manager/sme10/smeserver-manager-0.1.0-yum_backup_email_cleanup.patch 2020/04/11 20:28:10 1.2 +++ rpms/smeserver-manager/sme10/smeserver-manager-0.1.0-yum_backup_email_cleanup.patch 2020/04/12 09:02:48 1.3 @@ -7834,12 +7834,14 @@ diff -aurN smeserver-manager-0.1.0.old/r %} diff -aurN smeserver-manager-0.1.0.old/root/etc/e-smith/web/panels/manager2/cgi-bin/srvmngr/themes/default/templates/partials/_header.html.ep smeserver-manager-0.1.0/root/etc/e-smith/web/panels/manager2/cgi-bin/srvmngr/themes/default/templates/partials/_header.html.ep --- smeserver-manager-0.1.0.old/root/etc/e-smith/web/panels/manager2/cgi-bin/srvmngr/themes/default/templates/partials/_header.html.ep 2020-04-08 23:43:15.000000000 +0400 -+++ smeserver-manager-0.1.0/root/etc/e-smith/web/panels/manager2/cgi-bin/srvmngr/themes/default/templates/partials/_header.html.ep 2020-04-11 19:44:27.061000000 +0400 -@@ -4,6 +4,7 @@ ++++ smeserver-manager-0.1.0/root/etc/e-smith/web/panels/manager2/cgi-bin/srvmngr/themes/default/templates/partials/_header.html.ep 2020-04-12 11:13:00.528000000 +0400 +@@ -3,7 +3,8 @@ +
SME Server
-

Server Manager II

-+ (Previous one) +-

Server Manager II

++
@@ -9883,1776 +9885,3 @@ diff -aurN smeserver-manager-0.1.0.old/r - -app->start; - -diff -aurN smeserver-manager-0.1.0.old/root/usr/share/perl5/vendor_perl/smeserver/Panel/useraccountsNew.pm smeserver-manager-0.1.0/root/usr/share/perl5/vendor_perl/smeserver/Panel/useraccountsNew.pm ---- smeserver-manager-0.1.0.old/root/usr/share/perl5/vendor_perl/smeserver/Panel/useraccountsNew.pm 2020-04-08 23:43:08.000000000 +0400 -+++ smeserver-manager-0.1.0/root/usr/share/perl5/vendor_perl/smeserver/Panel/useraccountsNew.pm 1970-01-01 04:00:00.000000000 +0400 -@@ -1,1310 +0,0 @@ --#!/usr/bin/perl -w -- --#---------------------------------------------------------------------- --# $Id: smeserver-manager-add-basic-files.patch,v 1.1 2019/12/15 22:14:17 jcrisp Exp $ --#---------------------------------------------------------------------- --# copyright (C) 1999-2006 Mitel Networks Corporation --# --# This program is free software; you can redistribute it and/or modify --# it under the terms of the GNU General Public License as published by --# the Free Software Foundation; either version 2 of the License, or --# (at your option) any later version. --# --# This program is distributed in the hope that it will be useful, --# but WITHOUT ANY WARRANTY; without even the implied warranty of --# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --# GNU General Public License for more details. --# --# You should have received a copy of the GNU General Public License --# along with this program; if not, write to the Free Software --# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --#---------------------------------------------------------------------- --package smeserver::Panel::useraccountsNew; -- --use strict; -- --# Get shot of FormMagick and cgi -- -- --use esmith::AccountsDB; --use esmith::ConfigDB; --#use esmith::FormMagick; --#use esmith::cgi; --use esmith::util; --use File::Basename; --use Exporter; --use Carp qw(verbose); -- --# This will have to go - where do we need it ? --our @ISA = qw( Exporter); -- --# Anything with print is a non starter and should be renamed --our @EXPORT = qw( -- get_user_accounts -- print_user_table -- print_acctName_field -- print_groupMemberships_field -- print_page_description -- get_ldap_value -- username_clash -- pseudonym_clash -- handle_user_accounts -- modify_admin -- emailforward -- verifyPasswords -- lock_account -- remove_account -- reset_password -- check_password -- print_save_or_add_button -- get_pptp_value -- print_ipsec_client_section -- get_prop -- -- system_password_compare -- system_valid_password -- system_change_password -- system_check_password -- system_authenticate_password --); -- --our $VERSION = sprintf '%d.%03d', q$Revision: 1.1 $ =~ /: (\d+).(\d+)/; -- --our $accountdb = esmith::AccountsDB->open(); --our $configdb = esmith::ConfigDB->open(); -- --=pod -- --=head1 NAME -- --esmith::FormMagick::Panels::useraccounts - useful panel functions -- --=head1 SYNOPSIS -- --use esmith::FormMagick::Panels::useraccount; -- --my $panel = esmith::FormMagick::Panel::useraccount->new(); --$panel->display(); -- --=head1 DESCRIPTION -- -- --=head2 new(); -- --Exactly as for esmith::FormMagick -- --=begin testing -- --$ENV{ESMITH_ACCOUNT_DB} = "10e-smith-base/accounts.conf"; --$ENV{ESMITH_CONFIG_DB} = "10e-smith-base/configuration.conf"; -- --open DATA, "echo '
'|"; --use_ok('esmith::FormMagick::Panel::useraccounts'); --use vars qw($panel); --ok($panel = esmith::FormMagick::Panel::useraccounts->new(), --"Create panel object"); --close DATA; --isa_ok($panel, 'esmith::FormMagick::Panel::useraccounts'); --$panel->{cgi} = CGI->new(); --$panel->parse_xml(); -- --{ package esmith::FormMagick::Panel::useraccounts; --our $accountdb; --::isa_ok($accountdb, 'esmith::AccountsDB'); --} -- --=end testing -- --=cut -- --# Errrr ? No FormMagick now. --sub new { -- shift; -- my $self = esmith::FormMagick->new(); -- $self->{calling_package} = (caller)[0]; -- bless $self; -- return $self; --} -- --=head1 HTML GENERATION ROUTINES -- --Routines for generating chunks of HTML needed by the panel. -- --=head2 print_user_table -- --Prints out the user table on the front page. -- --=for testing --$panel->print_user_table; --like($_STDOUT_, qr/bart/, "Found usernames in user table output"); --like($_STDOUT_, qr/ff0000/, "Found red 'reset password' output"); -- --=cut -- --# The whole print_user_table routine can go - we just need get_users here -- --sub get_user_accounts { -- #my $self = shift; -- #my $q = $self->{cgi}; -- #my $account = $self->localise('ACCOUNT'); -- #my $acctName = $self->localise('USER_NAME'); -- # -- #my $modify = $self->localise('MODIFY'); -- #my $resetpw = $self->localise('PASSWORD_RESET'); -- #my $lock = $self->localise('LOCK_ACCOUNT'); -- #my $account_locked = $self->localise('ACCOUNT_LOCKED'); -- #my $remove = $self->localise('REMOVE'); -- -- my @users = $accountdb->get('admin'); -- push @users, $accountdb->users(); -- -- unless ( scalar @users ) -- { -- return "No user accounts available"; -- } -- return @users; --} -- --# Not required -- --sub print_user_table { -- my $self = shift; -- my $q = $self->{cgi}; -- my $account = $self->localise('ACCOUNT'); -- my $acctName = $self->localise('USER_NAME'); -- -- my $modify = $self->localise('MODIFY'); -- my $resetpw = $self->localise('PASSWORD_RESET'); -- my $lock = $self->localise('LOCK_ACCOUNT'); -- my $account_locked = $self->localise('ACCOUNT_LOCKED'); -- my $remove = $self->localise('REMOVE'); -- -- my @users = $accountdb->get('admin'); -- push @users, $accountdb->users(); -- -- unless ( scalar @users ) -- { -- print $q->Tr($q->td($self->localise('NO_USER_ACCOUNTS'))); -- return ""; -- } -- print " \n \n "; -- print $q->start_table ({-CLASS => "sme-border"}),"\n "; -- print $q->Tr( -- esmith::cgi::genSmallCell($q, $self->localise($account),"header"), -- esmith::cgi::genSmallCell($q, $self->localise($acctName),"header"), -- esmith::cgi::genSmallCell($q, $self->localise('VPN_CLIENT_ACCESS'), "header"), -- esmith::cgi::genSmallCell($q, $self->localise('FORWARDING_ADDRESS'), "header"), -- esmith::cgi::genSmallCell($q, $self->localise('ACTION'),"header",4)); -- -- my $scriptname = basename($0); -- my $index=0; -- -- foreach my $u (@users) { -- my $username = $u->key(); -- my $first = $u->prop('FirstName'); -- my $last = $u->prop('LastName'); -- my $lockable = $u->prop('Lockable') || 'yes'; -- my $removable = $u->prop('Removable') || 'yes'; -- my $fwd = (($u->prop('EmailForward') || 'local') =~ m/^forward|both$/) ? -- $u->prop('ForwardAddress') : ''; -- my $vpnaccess = $u->prop('VPNClientAccess') || 'no'; -- $vpnaccess = $vpnaccess eq 'yes' ? $self->localise('YES') : -- $self->localise('NO'); -- -- my $params = $self->build_user_cgi_params($username, $u->props()); -- -- my $password_set = $u->prop('PasswordSet'); -- -- my $pagenum = ($username eq "admin") ? $self->get_page_by_name('SystemPasswordDummy') -- : $self->get_page_by_name('ResetPasswordDummy'); -- -- # make normal links -- my $lock_url = ($password_set eq 'yes') ? -- qq(
$lock) : -- qq($account_locked); -- -- $lock_url = "" unless ($lockable eq "yes"); -- -- my $where_next = ($username eq "admin") ? "ModifyAdmin" : "CreateModify"; -- my $action1 = "$modify"; -- -- my $action2 = "$resetpw"; -- -- unless ($password_set eq 'yes') -- { -- $action2 = "" . $action2 . ""; -- } -- -- my $action3 = ($removable eq "yes") ? "$remove" : ''; -- -- print $q->Tr(esmith::cgi::genSmallCell($q, $username,"normal")," ", -- esmith::cgi::genSmallCell($q, "$first $last","normal")," ", -- esmith::cgi::genSmallCell($q, $vpnaccess), -- esmith::cgi::genSmallCell($q, $fwd), -- esmith::cgi::genSmallCell($q, "$action1","normal")," ", -- esmith::cgi::genSmallCell($q, "$action2","normal")," ", -- esmith::cgi::genSmallCell($q, "$lock_url","normal")," ", -- esmith::cgi::genSmallCell($q, "$action3","normal")); -- -- $index++; -- } -- -- print qq(\n); -- -- return ""; --} -- --=head2 print_acctName_field -- --This subroutine is used to generate the Account name field on the form in --the case of "create user", or to make it a plain uneditable string in the case --of "modify user". -- --=begin testing -- --my $self = esmith::FormMagick::Panel::useraccounts->new(); --$self->{cgi} = CGI->new(""); --print_acctName_field($self); --like($_STDOUT_, qr/text.*acctName/, "print text field if acctName not set"); --like($_STDOUT_, qr/create/, "action=create if acctName not set"); --$self->{cgi}->param(-name => 'acctName', -value => 'foo'); --$self->{cgi}->param(-name => 'action', -value => 'modify'); --print_acctName_field($self); --like($_STDOUT_, qr/hidden.*acctName/, "print hidden field if acctName is set"); --like($_STDOUT_, qr/modify/, "action=modify if acctName already set"); -- --=end testing -- --=cut -- --sub print_acctName_field { -- my $self = shift; -- my $cgi = $self->{cgi}; -- my $an = $cgi->param('acctName') || ''; -- print qq() . $self->localise('ACCOUNT_NAME') . qq(\n); -- my $action = $cgi->param('action') || ''; -- if ( $action eq 'modify') { -- print qq( -- $an -- -- -- -- ); -- # if there's no CGI data, fill in the fields with the account db -- # data for this user -- my $rec = $accountdb->get($an); -- my $fn = $cgi->param('FirstName') ? -- $cgi->param('FirstName') : -- ($rec ? ($rec->prop('FirstName')) : ''); -- my $ln = $cgi->param('LastName') ? -- $cgi->param('LastName') : -- ($rec ? ($rec->prop('LastName')) : ''); -- my $dept = $cgi->param('Dept') ? -- $cgi->param('Dept') : -- ($rec ? ($rec->prop('Dept')) : ''); -- my $company = $cgi->param('Company') ? -- $cgi->param('Company') : -- ($rec ? ($rec->prop('Company')) : ''); -- my $street = $cgi->param('Street') ? -- $cgi->param('Street') : -- ($rec ? ($rec->prop('Street')) : ''); -- my $city = $cgi->param('City') ? -- $cgi->param('City') : -- ($rec ? ($rec->prop('City')) : ''); -- my $phone = $cgi->param('Phone') ? -- $cgi->param('Phone') : -- ($rec ? ($rec->prop('Phone')) : ''); -- my $emf = $cgi->param('EmailForward') ? -- $cgi->param('EmailForward') : -- ($rec ? ($rec->prop('EmailForward')) : 'local'); -- my $fwd = $cgi->param('ForwardAddress') ? -- $cgi->param('ForwardAddress') : -- ($rec ? ($rec->prop('ForwardAddress')) : ''); -- my $pptp = $cgi->param('VPNClientAccess') ? -- $cgi->param('VPNClientAccess') : -- ($rec ? ($rec->prop('VPNClientAccess')) : 'no'); -- # now that we're down with the 411, let's set the values -- $cgi->param(-name=>'FirstName', -value=>$fn); -- $cgi->param(-name=>'LastName', -value=>$ln); -- $cgi->param(-name=>'Dept', -value=>$dept); -- $cgi->param(-name=>'Company', -value=>$company); -- $cgi->param(-name=>'Street', -value=>$street); -- $cgi->param(-name=>'City', -value=>$city); -- $cgi->param(-name=>'Phone', -value=>$phone); -- $cgi->param(-name=>'EmailForward', -value=>$emf); -- $cgi->param(-name=>'ForwardAddress', -value=>$fwd); -- $cgi->param(-name=>'VPNClientAccess', -value=>$pptp); -- } else { -- print qq( -- -- -- -- ); -- } -- -- print qq(\n); -- return undef; -- --} -- --=head2 print_groupMemberships_field() -- --Builds a list of groups for the create/modify user screen. -- --=begin testing -- --my $self = esmith::FormMagick::Panel::useraccounts->new(); --$self->{cgi} = CGI->new(""); --$self->print_groupMemberships_field(); --like($_STDOUT_, qr/simpsons/, "Found simpsons in group list"); --like($_STDOUT_, qr/flanders/, "Found flanders in group list"); --$self->{cgi}->param(-name => 'acctName', -value => 'rod'); --$self->print_groupMemberships_field(); --like($_STDOUT_, qr/checked value="flanders"/, "Checked flanders group for user rod"); -- --=end testing -- --=cut -- --sub print_groupMemberships_field { -- my ($self) = @_; -- my $q = $self->{cgi}; -- my $user = $q->param('acctName'); -- -- if (my @groups = $accountdb->groups()) { -- -- print "", -- $self->localise('GROUP_MEMBERSHIPS'), -- "\n"; -- -- print $q->start_table({-class => "sme-border"}),"\n"; -- print $q->Tr( -- esmith::cgi::genSmallCell($q, $self->localise('MEMBER'),"header"), -- esmith::cgi::genSmallCell($q, $self->localise('GROUP'),"header"), -- esmith::cgi::genSmallCell($q, $self->localise('DESCRIPTION'),"header") -- ); -- -- foreach my $g (@groups) { -- my $groupname = $g->key(); -- my $checked; -- if ($user and $accountdb->is_user_in_group($user, $groupname)) { -- $checked = 'checked'; -- } else { -- $checked = ''; -- } -- -- print $q->Tr( -- $q->td( -- "" -- ), -- esmith::cgi::genSmallCell($q, $groupname,"normal"), -- esmith::cgi::genSmallCell( $q, $accountdb->get($groupname)->prop("Description"),"normal") -- ); -- } -- -- print "\n"; -- -- } -- -- return undef; -- --} -- --=head2 print_page_description($self, "reset|lock|remove") -- --Generates the page description for the the somewhat similar Reset --Password, Lock Account and Remove Account pages. -- --=begin testing -- --my $self = esmith::FormMagick::Panel::useraccounts->new(); --$self->{cgi} = CGI->new({ acctName => 'bart' }); --print_page_description($self, "reset"); --like($_STDOUT_, qr/bart/, "print_page_description prints username"); --like($_STDOUT_, qr/Bart Simpson/, "print_page_description prints name"); --like($_STDOUT_, qr/RESET_DESC/, "print_page_description prints description"); -- --=end testing -- --=cut -- --sub print_page_description { -- my ($self, $pagename) = @_; -- unless (grep /^$pagename$/, qw(reset lock remove)) { -- warn "Can't generate page description for invalid pagename $pagename\n"; -- return; -- } -- -- $pagename = uc($pagename); -- -- my $desc = $self->localise("${pagename}_DESC"); -- my $desc2 = $self->localise("${pagename}_DESC2"); -- -- my $acctName = $self->{cgi}->param('acctName'); -- my $name = $accountdb->get($acctName)->prop('FirstName') . " " -- . $accountdb->get($acctName)->prop('LastName'); -- -- print qq{ -- --

$desc "$acctName" ($name)

-- $desc2 -- -- -- }; -- -- return; --} -- --=head1 ROUTINES FOR FILLING IN FIELD DEFAULT VALUES -- --=head2 get_ldap_value($field) -- --This subroutine generates the default field value on the form using the --parameter specified. -- --In this case, the default field values come from LDAP/directory --settings. -- --If a CGI parameter has been passed that contains an account name, we --assume that a value has already been set, as we're modifying a user, and --use that value instead of a default. -- --=for testing --my $self = esmith::FormMagick::Panel::useraccounts->new(); --$self->{cgi} = CGI->new(""); --is(get_ldap_value($self, "Dept"), "Main", "Pick up default value from LDAP"); --$self->{cgi} = CGI->new({ acctName => 'bart' }); --is(get_ldap_value($self, "Dept"), undef, "Don't pick up LDAP data if username provided"); -- --=cut -- --sub get_ldap_value { -- my ($self, $field) = @_; -- -- # don't do the lookup if this is a modification of an existing user -- if ($self->{cgi}->param('acctName')) { -- return $self->{cgi}->param($field); -- } -- -- my %CGIParam2DBfield = ( -- Dept => 'defaultDepartment', -- Company => 'defaultCompany', -- Street => 'defaultStreet', -- City => 'defaultCity', -- Phone => 'defaultPhoneNumber' -- ); -- -- return $configdb->get('ldap')->prop($CGIParam2DBfield{$field}); --} -- --sub get_pptp_value --{ -- return $configdb->get('pptpd')->prop('AccessDefault') || 'no'; --} -- --=head1 VALIDATION ROUTINES -- --=head2 pseudonym_clash -- --Validation routine to check whether a the first/last names clash with --existing pseudonyms. -- --Note that it won't be considered a "clash" if there is an existing --pseudonym which belongs to the same user -- it's only a clash if the --generated pseudonyms are the same but the usernames aren't. -- --=begin testing -- --my $self = esmith::FormMagick::Panel::useraccounts->new(); -- --$self->{cgi} = CGI->new({ -- acctName => 'skud', -- FirstName => 'Kirrily', -- LastName => 'Robert' --}); -- --is (pseudonym_clash($self, 'Kirrily'), "OK", "New name doesn't clash pseudonyms"); -- --$self->{cgi} = CGI->new({ -- acctName => 'bart2', -- FirstName => 'Bart', -- LastName => 'Simpson' --}); -- --isnt(pseudonym_clash($self, 'Bart'), "OK", "Existing pseudonym with non-matching username causes clash"); -- --$self->{cgi} = CGI->new({ -- acctName => 'bart', -- FirstName => 'Bart', -- LastName => 'Simpson' --}); -- --is(pseudonym_clash($self, 'Bart'), "OK", "Existing pseudonym with matching username shouldn't clash"); -- --=end testing -- --=cut -- --sub pseudonym_clash { -- my ($self, $first) = @_; -- $first ||= ""; -- my $last = $self->{cgi}->param('LastName') || ""; -- my $acctName = $self->{cgi}->param('acctName') || ""; -- -- my $up = "$first $last"; -- -- $up =~ s/^\s+//; -- $up =~ s/\s+$//; -- $up =~ s/\s+/ /g; -- $up =~ s/\s/_/g; -- -- my $dp = $up; -- $dp =~ s/_/./g; -- -- $dp = $accountdb->get($dp); -- $up = $accountdb->get($up); -- -- my $da = $dp->prop('Account') if $dp; -- my $ua = $up->prop('Account') if $up; -- if ($dp and $da and $da ne $acctName) -- { -- return $self->localise('PSEUDONYM_CLASH', -- { -- acctName => $acctName, -- clashName => $da, -- pseudonym => $dp->key -- }); -- } -- elsif ($up and $ua and $ua ne $acctName) -- { -- return $self->localise('PSEUDONYM_CLASH', -- { -- acctName => $acctName, -- clashName => $ua, -- pseudonym => $up->key -- }); -- } -- else -- { -- return "OK"; -- } --} -- --=head2 emailforward() -- --Validation routine for email forwarding -- --=cut -- --sub emailforward { -- my ($self, $data) = @_; -- my $response = $self->email_simple($data); -- if ($response eq "OK") -- { -- return "OK"; -- } -- elsif ($data eq "") -- { -- # Blank is ok, only if we're not forwarding, which means that the -- # EmailForward param must be set to 'local'. -- my $email_forward = $self->{cgi}->param('EmailForward') || ''; -- $email_forward =~ s/^\s+|\s+$//g; -- return 'OK' if $email_forward eq 'local'; -- return $self->localise('CANNOT_CONTAIN_WHITESPACE'); -- } -- else -- { -- return $self->localise('CANNOT_CONTAIN_WHITESPACE') -- if ( $data =~ /\s+/ ); -- # Permit a local address. -- return "OK" if $data =~ /^[a-zA-Z][a-zA-Z0-9\._\-]*$/; -- return $self->localise('UNACCEPTABLE_CHARS'); -- } --} -- --=head2 verifyPasswords() -- --Returns an error message if the two new passwords input don't match. -- --=cut -- --sub verifyPasswords { -- my $self = shift; -- my $pass2 = shift; -- -- my $pass1 = $self->{cgi}->param('password1'); -- unless ($pass1 eq $pass2) { -- $self->{cgi}->param( -name => 'wherenext', -value => 'Password' ); -- return "PASSWORD_VERIFY_ERROR"; -- } -- return "OK"; --} -- --=head1 CREATING AND MODIFYING USERS -- --=head2 handle_user_accounts() -- --This is the routine called by the "Save" button on the create/modify page. --It checks the "action" param and calls either create_user() or modify_user() --as appropriate. -- --=cut -- --sub handle_user_accounts { -- my ($self) = @_; -- -- my $cgi = $self->{cgi}; -- -- if ($cgi->param("action") eq "create") { -- my $msg = create_user($self); -- if ($msg eq 'USER_CREATED') -- { -- $self->success($msg); -- } -- else -- { -- $self->error($msg); -- } -- } -- else { -- modify_user($self); -- $self->success('USER_MODIFIED'); -- } --} -- --=head2 print_save_or_add_button() -- --=cut -- --sub print_save_or_add_button { -- -- my ($self) = @_; -- -- my $cgi = $self->{cgi}; -- -- if (($cgi->param("action") || '') eq "modify") { -- $self->print_button("SAVE"); -- } else { -- $self->print_button("ADD"); -- } -- --} -- --=head2 modify_admin($self) -- --=cut -- --sub modify_admin --{ -- my ($self) = @_; -- -- my $acct = $accountdb->get('admin'); -- -- my %newProperties = ( -- 'FirstName' => $self->{cgi}->param('FirstName'), -- 'LastName' => $self->{cgi}->param('LastName'), -- 'EmailForward' => $self->{cgi}->param('EmailForward'), -- 'ForwardAddress' => $self->{cgi}->param('ForwardAddress'), -- 'VPNClientAccess'=> $self->{cgi}->param('VPNClientAccess'), -- ); -- -- $acct->merge_props(%newProperties); -- -- undef $accountdb; -- -- my $status = -- system ("/sbin/e-smith/signal-event", "user-modify-admin", 'admin'); -- -- $accountdb = esmith::AccountsDB->open(); -- -- if ($status == 0) -- { -- $self->success('USER_MODIFIED', 'First'); -- } -- else -- { -- $self->error('CANNOT_MODIFY_USER', 'First'); -- } -- return; --} -- --=head2 modify_user($self) -- --=cut -- --sub modify_user { -- my ($self) = @_; -- my $acctName = $self->{cgi}->param('acctName'); -- -- unless (($acctName) = ($acctName =~ /^(\w[\-\w_\.]*)$/)) { -- return $self->error($self->localise('TAINTED_USER', -- { acctName => $acctName })); -- } -- # Untaint the username before use in system() -- $acctName = $1; -- -- my $acct = $accountdb->get($acctName); -- my $acctType = $acct->prop('type'); -- -- if ($acctType eq "user") -- { -- $accountdb->remove_user_auto_pseudonyms($acctName); -- my %newProperties = ( -- 'FirstName' => $self->{cgi}->param('FirstName'), -- 'LastName' => $self->{cgi}->param('LastName'), -- 'Phone' => $self->{cgi}->param('Phone'), -- 'Company' => $self->{cgi}->param('Company'), -- 'Dept' => $self->{cgi}->param('Dept'), -- 'City' => $self->{cgi}->param('City'), -- 'Street' => $self->{cgi}->param('Street'), -- 'EmailForward' => $self->{cgi}->param('EmailForward'), -- 'ForwardAddress' => $self->{cgi}->param('ForwardAddress'), -- 'VPNClientAccess'=> $self->{cgi}->param('VPNClientAccess'), -- ); -- -- $acct->merge_props(%newProperties); -- -- $accountdb->create_user_auto_pseudonyms($acctName); -- -- my @old_groups = $accountdb->user_group_list($acctName); -- my @new_groups = $self->{cgi}->param("groupMemberships"); -- $accountdb->remove_user_from_groups($acctName, @old_groups); -- $accountdb->add_user_to_groups($acctName, @new_groups); -- -- undef $accountdb; -- -- unless (system ("/sbin/e-smith/signal-event", "user-modify", -- $acctName) == 0) { -- $accountdb = esmith::AccountsDB->open(); -- return $self->error('CANNOT_MODIFY_USER'); -- } -- $accountdb = esmith::AccountsDB->open(); -- } -- $self->success('USER_MODIFIED'); --} -- --=head2 create_user -- --Adds a user to the accounts db. -- --=cut -- --sub create_user { -- my $self = shift; -- my $q = $self->{cgi}; -- -- my $acctName = $q->param('acctName'); -- -- my $msg = $self->validate_acctName($acctName); -- unless ($msg eq "OK") -- { -- return $msg; -- } -- -- $msg = $self->validate_acctName_length($acctName); -- unless ($msg eq "OK") -- { -- return $msg; -- } -- -- $msg = $self->validate_acctName_conflict($acctName); -- unless ($msg eq "OK") -- { -- return $msg; -- } -- -- my %userprops; -- foreach my $field ( qw( FirstName LastName Phone Company Dept -- City Street EmailForward ForwardAddress VPNClientAccess) ) -- { -- $userprops{$field} = $q->param($field); -- } -- $userprops{'PasswordSet'} = "no"; -- $userprops{'type'} = 'user'; -- -- my $acct = $accountdb->new_record($acctName) -- or warn "Can't create new account for $acctName (does it already exist?)\n"; -- $acct->reset_props(%userprops); -- $accountdb->create_user_auto_pseudonyms($acctName); -- my @groups = $self->{cgi}->param("groupMemberships"); -- $accountdb->add_user_to_groups($acctName, @groups); -- -- undef $accountdb; -- -- # Untaint the username before use in system() -- $acctName =~ /^(\w[\-\w_\.]*)$/; -- $acctName = $1; -- -- if (system ("/sbin/e-smith/signal-event", "user-create", $acctName)) -- { -- $accountdb = esmith::AccountsDB->open(); -- return $self->localise("ERR_OCCURRED_CREATING"); -- } -- -- $accountdb = esmith::AccountsDB->open(); -- -- $self->set_groups(); -- return 'USER_CREATED'; --} -- --=head2 set_groups -- --Sets a user's groups in the accounts db. This is called as part of the --create_user() routine. -- --=cut -- --sub set_groups --{ -- my $self = shift; -- my $q = $self->{cgi}; -- my $acctName = $q->param('acctName'); -- -- my @groups = $q->param('groupMemberships'); -- $accountdb->set_user_groups($acctName, @groups); -- --} -- --=head1 REMOVING ACCOUNTS -- --=head2 remove_account() -- --=cut -- --sub remove_account { -- my ($self) = @_; -- my $acctName = $self->{cgi}->param('acctName'); -- -- my $acct = $accountdb->get($acctName); -- if ($acct->prop('type') eq "user") { -- $acct->set_prop('type', "user-deleted"); -- -- undef $accountdb; -- -- # Untaint the username before use in system() -- $acctName =~ /^(\w[\-\w_\.]*)$/; -- $acctName = $1; -- if (system ("/sbin/e-smith/signal-event", "user-delete", $acctName)) -- { -- $accountdb = esmith::AccountsDB->open(); -- return $self->error("ERR_OCCURRED_DELETING"); -- } -- -- $accountdb = esmith::AccountsDB->open(); -- $accountdb->get($acctName)->delete; -- -- } else { -- # FIXME - this should be handled by input validation -- # XXX error message here -- } -- $self->{cgi}->param(-name => 'wherenext', -value => 'First'); --} -- --=head1 RESETTING THE PASSWORD -- --=head2 reset_password() -- --=cut -- --sub reset_password { -- my ($self) = @_; -- my $acctName = $self->{cgi}->param('acctName'); -- -- unless (($acctName) = ($acctName =~ /^(\w[\-\w_\.]*)$/)) { -- return $self->error('TAINTED_USER'); -- } -- $acctName = $1; -- -- my $acct = $accountdb->get($acctName); -- -- if ( $acct->prop('type') eq "user") -- { -- esmith::util::setUserPassword ($acctName, -- $self->{cgi}->param('password1')); -- -- $acct->set_prop("PasswordSet", "yes"); -- undef $accountdb; -- -- if (system("/sbin/e-smith/signal-event", "password-modify", $acctName)) -- { -- $accountdb = esmith::AccountsDB->open(); -- $self->error("ERR_OCCURRED_MODIFYING_PASSWORD"); -- } -- $accountdb = esmith::AccountsDB->open(); -- -- $self->success($self->localise('PASSWORD_CHANGE_SUCCEEDED', -- { acctName => $acctName})); -- } -- else -- { -- $self->error($self->localise('NO_SUCH_USER', -- { acctName => $acctName})); -- } --} -- --=head1 LOCKING AN ACCOUNT -- --=head2 lock_account() -- --=cut -- --sub lock_account { -- my ($self) = @_; -- my $acctName = $self->{cgi}->param('acctName'); -- my $acct = $accountdb->get($acctName); -- if ($acct->prop('type') eq "user") -- { -- undef $accountdb; -- -- # Untaint the username before use in system() -- $acctName =~ /^(\w[\-\w_\.]*)$/; -- $acctName = $1; -- if (system("/sbin/e-smith/signal-event", "user-lock", $acctName)) -- { -- $accountdb = esmith::AccountsDB->open(); -- return $self->error("ERR_OCCURRED_LOCKING"); -- } -- -- $accountdb = esmith::AccountsDB->open(); -- -- $self->success($self->localise('LOCKED_ACCOUNT', -- { acctName => $acctName})); -- } -- else -- { -- $self->error($self->localise('NO_SUCH_USER', -- { acctName => $acctName})); -- } --} -- -- --=head1 MISCELLANEOUS ROUTINES -- --=head2 build_user_cgi_params() -- --Builds a CGI query string based on user data, using various sensible --defaults and esmith::FormMagick's props_to_query_string() method. -- --=cut -- --sub build_user_cgi_params { -- my ($self, $acctName, %oldprops) = @_; -- -- my %props = ( -- page => 0, -- page_stack => "", -- ".id" => $self->{cgi}->param('.id') || "", -- acctName => $acctName, -- #%oldprops -- ); -- -- return $self->props_to_query_string(\%props); --} -- --=pod -- --=head2 validate_acctName -- --Checks that the name supplied does not contain any unacceptable chars. --Returns OK on success or a localised error message otherwise. -- --=for testing --is($panel->validate_acctName('foo'), 'OK', 'validate_acctName'); --isnt($panel->validate_acctName('3amigos'), 'OK', ' .. cannot start with number'); --isnt($panel->validate_acctName('betty ford'), 'OK', ' .. cannot contain space'); -- --=cut -- --sub validate_acctName --{ -- my ($self, $acctName) = @_; -- -- unless ($accountdb->validate_account_name($acctName)) -- { -- return $self->localise('ACCT_NAME_HAS_INVALID_CHARS', -- {acctName => $acctName}); -- } -- return "OK"; --} -- --=head2 validate_account_length FM ACCOUNTNAME -- --returns 'OK' if the account name is shorter than the maximum account name length --returns 'ACCOUNT_TOO_LONG' otherwise -- --=begin testing -- --ok(($panel->validate_acctName_length('foo') eq 'OK'), "a short account name passes"); --ok(($panel->validate_acctName_length('fooooooooooooooooo') eq 'ACCOUNT_TOO_LONG'), "a long account name fails"); -- --=end testing -- --=cut -- --sub validate_acctName_length { -- my $self = shift; -- my $acctName = shift; -- -- -- my $maxAcctNameLength = ($configdb->get('maxAcctNameLength') -- ? $configdb->get('maxAcctNameLength')->prop('type') -- : "") || 12; -- -- if ( length $acctName > $maxAcctNameLength ) { -- -- return $self->localise('ACCOUNT_TOO_LONG', -- {maxLength => $maxAcctNameLength}); -- } -- else { -- return ('OK'); -- } --} -- --=head2 validate_acctName_conflict -- --Returns 'OK' if the account name doesn't yet exist. Returns a localised error --otherwise. -- --=cut -- --sub validate_acctName_conflict --{ -- my $self = shift; -- my $acctName = shift; -- -- my $account = $accountdb->get($acctName); -- my $type; -- -- if (defined $account) -- { -- $type = $account->prop('type'); -- } -- elsif (defined getpwnam($acctName) || defined getgrnam($acctName)) -- { -- $type = "system"; -- } -- else -- { -- return('OK'); -- } -- return $self->localise('ACCOUNT_CONFLICT', -- { account => $acctName, -- type => $type, --}); --} -- --=head2 check_password -- --Validates the password using the desired strength -- --=cut -- --sub check_password { -- my $self = shift; -- my $pass1 = shift; -- -- my $check_type; -- my $rec = $configdb->get('passwordstrength'); -- $check_type = ($rec ? ($rec->prop('Users') || 'none') : 'none'); -- -- return $self->validate_password($check_type,$pass1); --} -- -- --=head2 get_prop ITEM PROP -- --A simple accessor for esmith::ConfigDB::Record::prop -- --=cut -- --sub get_prop --{ -- my ($fm, $item, $prop, $default) = @_; -- -- return $configdb->get_prop($item, $prop) || $default; --} -- -- --=head1 System Password manipulation routines -- --XXX FIXME - These should be merged with the useraccouts versions -- --=head2 system_password_compare -- --=cut -- --sub system_password_compare --{ -- my $self = shift; -- my $pass2 = shift; -- -- my $pass1 = $self->{cgi}->param('pass'); -- unless ($pass1 eq $pass2) { -- $self->{cgi}->param( -name => 'wherenext', -value => 'Password' ); -- return "SYSTEM_PASSWORD_VERIFY_ERROR"; -- } -- return "OK"; --} -- --=head2 system_valid_password -- --Throw an error if the password doesn't consist solely of one or more printable characters. -- --=cut -- --sub system_valid_password --{ -- my $self = shift; -- my $pass1 = shift; -- # If the password contains one or more printable character -- if ($pass1 =~ /^([ -~]+)$/) { -- return('OK'); -- } else { -- $self->{cgi}->param( -name => 'wherenext', -value => 'Password' ); -- return 'SYSTEM_PASSWORD_UNPRINTABLES_IN_PASS'; -- } --} -- --=head2 system_check_password -- --Validates the password using the desired strength -- --=cut -- --sub system_check_password --{ -- my $self = shift; -- my $pass1 = shift; -- -- use esmith::ConfigDB; -- my $conf = esmith::ConfigDB->open(); -- my $check_type; -- my $rec; -- if ($conf) -- { -- $rec = $conf->get('passwordstrength'); -- } -- $check_type = ($rec ? ($rec->prop('Admin') || 'strong') : 'strong'); -- -- return $self->validate_password($check_type,$pass1); --} -- --=head2 authenticate_password -- --Compares the password with the current system password -- --=cut -- --sub system_authenticate_password --{ -- my $self = shift; -- my $pass = shift; -- -- if (esmith::util::authenticateUnixPassword( ($configdb->get_value("AdminIsNotRoot") eq 'enabled') ? 'admin' : 'root', $pass)) -- { -- return "OK"; -- } -- else -- { -- return "SYSTEM_PASSWORD_AUTH_ERROR"; -- } --} -- --=head2 system_change_password -- --If everything has been validated, properly, go ahead and set the new password. -- --=cut -- --sub system_change_password --{ -- my ($self) = @_; -- my $pass = $self->{cgi}->param('pass'); -- -- ($configdb->get_value("AdminIsNotRoot") eq 'enabled') ? esmith::util::setUnixPassword('admin',$pass) : esmith::util::setUnixSystemPassword($pass); -- esmith::util::setServerSystemPassword($pass); -- -- my $result = system("/sbin/e-smith/signal-event password-modify admin"); -- -- if ($result == 0) -- { -- $self->success('SYSTEM_PASSWORD_CHANGED', 'First'); -- } -- else -- { -- $self->error("Error occurred while modifying password for admin.", 'First'); -- } -- -- return; --} -- --sub print_ipsec_client_section --{ -- my $self = shift; -- my $q = $self->cgi; -- -- # Don't show ipsecrw setting unless the status property exists -- return '' unless ($configdb->get('ipsec') -- && $configdb->get('ipsec')->prop('RoadWarriorStatus')); -- # Don't show ipsecrw setting unless /sbin/e-smith/roadwarrior exists -- return '' unless -x '/sbin/e-smith/roadwarrior'; -- my $acct = $q->param('acctName'); -- my $rec = $accountdb->get($acct) if $acct; -- if ($acct and $rec) -- { -- my $pwset = $rec->prop('PasswordSet') || 'no'; -- my $VPNaccess = $rec->prop('VPNClientAccess') || 'no'; -- if ($pwset eq 'yes' and $VPNaccess eq 'yes') -- { -- print $q->Tr( -- $q->td({-class=>'sme-noborders-label'}, -- $self->localise('LABEL_IPSECRW_DOWNLOAD')), -- $q->td({-class=>'sme-noborders-content'}, -- $q->a({-class=>'button-like', -- -href=>"?action=getCert&user=$acct"}, -- $self->localise('DOWNLOAD')))); -- } -- } -- return ''; --} -- --sub get_ipsec_client_cert --{ -- my $self = shift; -- my $q = shift; -- my $user = $q->param('user'); -- ($user) = ($user =~ /^(.*)$/); -- -- die "Invalid user: $user\n" unless getpwnam($user); -- -- open (KID, "/sbin/e-smith/roadwarrior get_client_cert $user |") -- or die "Can't fork: $!"; -- my $certfile = ; -- close KID; -- -- require File::Basename; -- my $certname = File::Basename::basename($certfile); -- -- print "Expires: 0\n"; -- print "Content-type: application/x-pkcs12\n"; -- print "Content-disposition: inline; filename=$certname\n"; -- print "\n"; -- -- open (CERT, "<$certfile"); -- while () -- { -- print; -- } -- close CERT; -- -- return ''; --} -- --sub display_email_forwarding --{ -- return defined $configdb->get('smtpd'); --} -- --1; -diff -aurN smeserver-manager-0.1.0.old/root/usr/share/perl5/vendor_perl/smeserver/Panel/wblNew.pm smeserver-manager-0.1.0/root/usr/share/perl5/vendor_perl/smeserver/Panel/wblNew.pm ---- smeserver-manager-0.1.0.old/root/usr/share/perl5/vendor_perl/smeserver/Panel/wblNew.pm 2020-04-08 23:43:08.000000000 +0400 -+++ smeserver-manager-0.1.0/root/usr/share/perl5/vendor_perl/smeserver/Panel/wblNew.pm 1970-01-01 04:00:00.000000000 +0400 -@@ -1,455 +0,0 @@ --#!/usr/bin/perl -w -- --# package esmith::FormMagick::Panel::wblNew; --package smeserver::Panel::wblNew; -- --use strict; --use warnings; --#use esmith::FormMagick; --#use esmith::cgi; --use esmith::ConfigDB; --use esmith::util; --use File::Basename; --use Exporter; --use Carp qw(verbose); -- --our @ISA = qw( Exporter); -- --our @EXPORT = qw( --get_dnsbl --get_rhsbl --get_uribl --get_sbllist --get_rbllist --get_ubllist --get_badhelo --get_badmailfrom --get_whitelisthosts --get_whitelisthelo --get_whitelistsenders --get_whitelistfrom --create_modify_black --create_modify_white --email_update --get_blacklistfrom --create_modify_rbl --); -- --our $VERSION = sprintf '%d.%03d', q$Revision: 1.1 $ =~ /: (\d+).(\d+)/; -- --our $db = esmith::ConfigDB->open() or die "Couldn't open ConfigDB\n"; --our $wdb = esmith::ConfigDB->open('wbl') or die "Couldn't open wbl dbase\n"; --our $sdb = esmith::ConfigDB->open('spamassassin') or die "Couldn't open spamassassin dbase\n"; -- --sub get_dnsbl --{ -- return ($db->get_prop('qpsmtpd', 'DNSBL') || 'disabled'); --} -- --sub get_rhsbl --{ -- return ($db->get_prop('qpsmtpd', 'RHSBL') || 'disabled'); --} -- --sub get_uribl --{ -- return ($db->get_prop('qpsmtpd', 'URIBL') || 'disabled'); --} -- --sub get_sbllist --{ --my $sbllistform = $db->get_prop('qpsmtpd', 'SBLList') || ''; --$sbllistform =~ s/,/\n/g; --return $sbllistform; --} -- --sub get_rbllist --{ --my $rbllistform = $db->get_prop('qpsmtpd', 'RBLList') || ''; --$rbllistform =~ s/,/\n/g; --return $rbllistform; --} -- --sub get_ubllist --{ --my $rbllistform = $db->get_prop('qpsmtpd', 'UBLList') || ''; --$rbllistform =~ s/,/\n/g; --return $rbllistform; --} -- -- --sub get_badhelo --{ -- my %list = $wdb->get('badhelo')->props; -- -- my @badhelo = (); -- my $parameter = ""; -- my $value = ""; -- while (($parameter,$value) = each(%list)) { -- if ($parameter eq "type") {next;} -- -- if ($value eq "Black") { -- push @badhelo, $parameter; -- } -- } -- -- return "" unless (scalar @badhelo); -- --# return join "\n", sort(@badhelo); -- return sort(@badhelo); --} -- --sub get_badmailfrom --{ -- my %list = $wdb->get('badmailfrom')->props; -- -- my @badmailfrom = (); -- my $parameter = ""; -- my $value = ""; -- while (($parameter,$value) = each(%list)) { -- if ($parameter eq "type") {next;} -- -- if ($value eq "Black") { -- push @badmailfrom, $parameter; -- } -- } -- -- return "" unless (scalar @badmailfrom); -- --# return join "\n", sort(@badmailfrom); -- return sort(@badmailfrom); --} -- --sub get_whitelisthosts --{ -- my %list = $wdb->get('whitelisthosts')->props; -- -- my @whitelisthosts = (); -- my $parameter = ""; -- my $value = ""; -- while (($parameter,$value) = each(%list)) { -- if ($parameter eq "type") {next;} -- -- if ($value eq "White") { -- push @whitelisthosts, $parameter; -- } -- } -- -- return "" unless (scalar @whitelisthosts); -- --# return join "\n", sort(@whitelisthosts); -- return sort(@whitelisthosts); -- --} -- --sub get_whitelisthelo --{ -- my %list = $wdb->get('whitelisthelo')->props; -- -- my @whitelisthelo = (); -- my $parameter = ""; -- my $value = ""; -- while (($parameter,$value) = each(%list)) { -- if ($parameter eq "type") {next;} -- -- if ($value eq "White") { -- push @whitelisthelo, $parameter; -- } -- } -- -- return "" unless (scalar @whitelisthelo); -- --# return join "\n", sort(@whitelisthelo); -- return sort(@whitelisthelo); --} -- --sub get_whitelistsenders --{ -- my %list = $wdb->get('whitelistsenders')->props; -- -- my @whitelistsenders = (); -- my $parameter = ""; -- my $value = ""; -- while (($parameter,$value) = each(%list)) { -- if ($parameter eq "type") {next;} -- -- if ($value eq "White") { -- push @whitelistsenders, $parameter; -- } -- } -- -- return "" unless (scalar @whitelistsenders); -- -- #return join "\n", sort(@whitelistsenders); -- return sort(@whitelistsenders); --} -- --sub get_whitelistfrom --{ -- my %list = $sdb->get('wbl.global')->props; -- -- my @whitelistfrom = (); -- my $parameter = ""; -- my $value = ""; -- while (($parameter,$value) = each(%list)) { -- if ($parameter eq "type") {next;} -- -- if ($value eq "White") { -- push @whitelistfrom, $parameter; -- } -- } -- -- return "" unless (scalar @whitelistfrom); -- --# return join "\n", sort(@whitelistfrom); -- return sort(@whitelistfrom); --} -- --sub create_modify_black --{ -- my $fm = shift; -- my $q = $fm->{'cgi'}; -- -- # qmail badhelo -- my %list = $wdb->get('badhelo')->props; -- my $parameter = ""; -- my $value = ""; -- while (($parameter,$value) = each(%list)) { -- if ($parameter eq "type") {next;} -- -- if ($value eq "Black") { -- $wdb->get_prop_and_delete('badhelo', "$parameter"); -- } -- } -- -- my $BadHelo = $q->param("badhelo"); -- $BadHelo =~ s/\r\n/,/g; -- my @BadHelo = sort(split /,/, $BadHelo); -- foreach $BadHelo (@BadHelo) -- { -- $wdb->set_prop('badhelo', "$BadHelo", 'Black'); -- } -- -- # qmail badmailfrom -- my %list_badmailfrom = $wdb->get('badmailfrom')->props; -- my $parameter_badmailfrom = ""; -- my $value_badmailfrom = ""; -- while (($parameter_badmailfrom,$value_badmailfrom) = each(%list_badmailfrom)) { -- if ($parameter_badmailfrom eq "type") {next;} -- -- if ($value_badmailfrom eq "Black") { -- $wdb->get_prop_and_delete('badmailfrom', "$parameter_badmailfrom"); -- } -- } -- -- my $BadMailFrom = $q->param("badmailfrom"); -- $BadMailFrom =~ s/\r\n/,/g; -- my @BadMailFrom = sort(split /,/, $BadMailFrom); -- foreach $BadMailFrom (@BadMailFrom){ -- $wdb->set_prop('badmailfrom', "$BadMailFrom", 'Black'); -- } -- # spamassassin blacklist_from -- my %list_wblglobal = $sdb->get('wbl.global')->props; -- my $parameter_wblglobal = ""; -- my $value_wblglobal = ""; -- while (($parameter_wblglobal,$value_wblglobal) = each(%list_wblglobal)) { -- if ($parameter_wblglobal eq "type") {next;} -- -- if ($value_wblglobal eq "Black") { -- $sdb->get_prop_and_delete('wbl.global', "$parameter_wblglobal"); -- } -- } -- -- my $BlacklistFrom = $q->param("blacklistfrom"); -- $BlacklistFrom =~ s/\r\n/,/g; -- my @BlacklistFrom = sort(split /,/, $BlacklistFrom); -- foreach $BlacklistFrom (@BlacklistFrom){ -- $sdb->set_prop('wbl.global', "$BlacklistFrom", 'Black'); -- } -- -- ##Update email settings -- unless ( system ("/sbin/e-smith/signal-event", "smeserver-wbl-update") == 0 ){ -- $fm->error('ERROR_UPDATING'); -- return undef; -- } -- -- $fm->success('SUCCESS'); --} -- --sub create_modify_white --{ -- my $fm = shift; -- my $q = $fm->{'cgi'}; -- -- # qpsmtpd whitelisthosts -- my %list = $wdb->get('whitelisthosts')->props; -- my $parameter = ""; -- my $value = ""; -- while (($parameter,$value) = each(%list)) { -- if ($parameter eq "type") {next;} -- -- if ($value eq "White") { -- $wdb->get_prop_and_delete('whitelisthosts', "$parameter"); -- } -- } -- -- my $WhitelistHosts = $q->param("whitelisthosts"); -- $WhitelistHosts =~ s/\r\n/,/g; -- my @WhitelistHosts = sort(split /,/, $WhitelistHosts); -- foreach $WhitelistHosts (@WhitelistHosts) -- { -- $wdb->set_prop('whitelisthosts', "$WhitelistHosts", 'White'); -- } -- -- # qpsmtpd whitelisthelo -- my %list_whitelisthelo = $wdb->get('whitelisthelo')->props; -- my $parameter_whitelisthelo = ""; -- my $value_whitelisthelo = ""; -- while (($parameter_whitelisthelo,$value_whitelisthelo) = each(%list_whitelisthelo)) { -- if ($parameter_whitelisthelo eq "type") {next;} -- -- if ($value_whitelisthelo eq "White") { -- $wdb->get_prop_and_delete('whitelisthelo', "$parameter_whitelisthelo"); -- } -- } -- -- my $WhitelistHelo = $q->param("whitelisthelo"); -- $WhitelistHelo =~ s/\r\n/,/g; -- my @WhitelistHelo = sort(split /,/, $WhitelistHelo); -- foreach $WhitelistHelo (@WhitelistHelo) -- { -- $wdb->set_prop('whitelisthelo', "$WhitelistHelo", 'White'); -- } -- -- # qpsmtpd whitelistsenders -- my %list_whitelistsenders = $wdb->get('whitelistsenders')->props; -- my $parameter_whitelistsenders = ""; -- my $value_whitelistsenders = ""; -- while (($parameter_whitelistsenders,$value_whitelistsenders) = each(%list_whitelistsenders)) { -- if ($parameter_whitelistsenders eq "type") {next;} -- -- if ($value_whitelistsenders eq "White") { -- $wdb->get_prop_and_delete('whitelistsenders', "$parameter_whitelistsenders"); -- } -- } -- -- my $WhitelistSenders = $q->param("whitelistsenders"); -- $WhitelistSenders =~ s/\r\n/,/g; -- my @WhitelistSenders = sort(split /,/, $WhitelistSenders); -- foreach $WhitelistSenders (@WhitelistSenders) -- { -- $wdb->set_prop('whitelistsenders', "$WhitelistSenders", 'White'); -- } -- -- # spamassassin whitelist_from -- my %list_wblglobal = $sdb->get('wbl.global')->props; -- my $parameter_wblglobal = ""; -- my $value_wblglobal = ""; -- while (($parameter_wblglobal,$value_wblglobal) = each(%list_wblglobal)) { -- if ($parameter_wblglobal eq "type") {next;} -- -- if ($value_wblglobal eq "White") { -- $sdb->get_prop_and_delete('wbl.global', "$parameter_wblglobal"); -- } -- } -- -- my $WhitelistFrom = $q->param("whitelistfrom"); -- $WhitelistFrom =~ s/\r\n/,/g; -- my @WhitelistFrom = sort(split /,/, $WhitelistFrom); -- foreach $WhitelistFrom (@WhitelistFrom){ -- $sdb->set_prop('wbl.global', "$WhitelistFrom", 'White'); -- } -- -- ##Update email settings -- unless ( system ("/sbin/e-smith/signal-event", "smeserver-wbl-update") == 0 ){ -- $fm->error('ERROR_UPDATING'); -- return undef; -- } -- -- $fm->success('SUCCESS'); --} -- --sub email_update --{ -- my $fm = shift; -- my $q = $fm->{'cgi'}; -- -- unless ( system ("/sbin/e-smith/signal-event", "smeserver-wbl-update") == 0 ) -- { -- $fm->error('ERROR_UPDATING'); -- return undef; -- } -- -- $fm->success('SUCCESS'); -- --} -- --sub get_blacklistfrom --{ -- my %list = $sdb->get('wbl.global')->props; -- -- my @blacklistfrom = (); -- my $parameter = ""; -- my $value = ""; -- while (($parameter,$value) = each(%list)) { -- if ($parameter eq "type") {next;} -- -- if ($value eq "Black") { -- push @blacklistfrom, $parameter; -- } -- } -- -- return "" unless (scalar @blacklistfrom); -- -- return join "\n", sort(@blacklistfrom); --} --sub create_modify_rbl --{ -- my $fm = shift; -- my $q = $fm->{'cgi'}; -- -- my $dnsbl = $q->param('dnsbl'); -- $db->set_prop('qpsmtpd', 'DNSBL', "$dnsbl"); -- -- my $rhsbl = $q->param('rhsbl'); -- $db->set_prop('qpsmtpd', 'RHSBL', "$rhsbl"); -- -- -- my $sbllistcgi = $q->param('sbllist'); -- my @sbllistcgi = split /\s{2,}/, $sbllistcgi; -- my $sbllistdb = ''; -- foreach (@sbllistcgi) { $sbllistdb = $sbllistdb . ',' . $_; } -- $sbllistdb =~ s/^,//; -- -- $db->set_prop('qpsmtpd', 'SBLList', "$sbllistdb"); -- -- -- my $rbllistcgi = $q->param('rbllist'); -- my @rbllistcgi = split /\s{2,}/, $rbllistcgi; -- my $rbllistdb = ''; -- foreach (@rbllistcgi) { $rbllistdb = $rbllistdb . ',' . $_; } -- $rbllistdb =~ s/^,//; -- -- $db->set_prop('qpsmtpd', 'RBLList', "$rbllistdb"); -- -- ##Update email settings -- -- unless ( system ("/sbin/e-smith/signal-event", "smeserver-wbl-update") == 0 ){ -- $fm->error('ERROR_UPDATING'); -- return undef; -- } -- -- $fm->success('SUCCESS'); --} -- --#Subroutine to display buttons --#sub print_custom_button{ --# my ($fm,$desc,$url) = @_; --# my $q = $fm->{cgi}; --# $url="wbl?page=0&page_stack=&Next=Next&wherenext=".$url; --# print " \n \n"; --# print $q->p($q->a({href => $url, -class => "button-like"},$fm->localise($desc))); --# print qq(\n); --# return undef; --#} --#;