New features for 7.1

This commit is contained in:
Roy Johnson 2006-10-11 19:26:10 +00:00
parent 5b5858055a
commit a43577a119
5 changed files with 300 additions and 3 deletions

View file

@ -19,6 +19,11 @@
- fixed a small error in WebGUI::Group documentation.
- Added WebGUI::Text with some CSV functions.
- Added Karma RFE: Thumbnail size can be enterred in CS
- Added diskUsage.pl utility script to show space used by assets in a webgui
site, similar to the unix du utility.
- Added option to WebGUI Auth module to require strong passwords. Admins can
now require users to enter a specific combination of characters, etc.
- Added skeleton code for writing WebGUI utility scripts.
7.0.9
- Removed the need for DateTime::Cron::Simple, which also added the ability

View file

@ -25,9 +25,23 @@ updateProductsTable($session);
makeLdapRecursiveFiltersText($session);
addWikiAssets($session);
addImageStuffToCs($session);
addNewAuthSettings($session);
finish($session); # this line required
#-------------------------------------------------
sub addNewAuthSettings {
my $session = shift;
print "\tAdding new WebGUI auth settings to support strong passwords.\n" unless $quiet;
my $newSettings = {
webguiRequiredDigits => 0,
webguiNonWordCharacters => 0,
webguiRequiredMixedCase => 0,
};
foreach my $setting (keys %{$newSettings}) {
$session->db->write("insert into settings (name,value) values (?,?)",[$setting,$newSettings->{$setting}]);
}
}
#-------------------------------------------------
sub addImageStuffToCs {

View file

@ -24,12 +24,59 @@ use WebGUI::Utility;
our @ISA = qw(WebGUI::Auth);
#-------------------------------------------------------------------
sub _hasNonWordCharacters {
my $self = shift;
my $password = shift;
my $numberRequired = shift;
my @characters = split(//,$password);
my $counter = 0;
foreach my $character (@characters) {
$self->session->errorHandler->warn($character);
$counter++ if ($character =~ /\W/);
return 1 if ($counter == $numberRequired);
}
return 0;
}
#-------------------------------------------------------------------
sub _hasNumberCharacters {
my $self = shift;
my $password = shift;
my $numberRequired = shift;
my @characters = split(//,$password);
my $counter = 0;
foreach my $character (@characters) {
$counter++ if ($character =~ /\d/);
return 1 if ($counter == $numberRequired);
}
return 0;
}
#-------------------------------------------------------------------
sub _hasMixedCaseCharacters {
my $self = shift;
my $password = shift;
my $numberRequired = shift;
my @characters = split(//,$password);
my ($numberOfCaps, $hasLower, $counter);
foreach my $character (@characters) {
$hasLower = 1 if ($character =~ /[a-z]/);
$numberOfCaps++ if ($character =~ /[A-Z]/);
return 1 if ($hasLower && $numberOfCaps == $numberRequired);
}
return 0;
}
#-------------------------------------------------------------------
=head2 _isValidPassword ( )
Validates the password.
Validates the password9.
=cut
@ -41,7 +88,8 @@ sub _isValidPassword {
WebGUI::Macro::negate(\$confirm);
my $error = "";
my $i18n = WebGUI::International->new($self->session,'AuthWebGUI');
my $i18n = WebGUI::International->new($self->session,'AuthWebGUI');
if ($password ne $confirm) {
$error .= '<li>'.$i18n->get(3).'</li>';
}
@ -53,6 +101,18 @@ sub _isValidPassword {
$error .= '<li>'.$i18n->get(7)." ".$self->getSetting("passwordLength").'</li>';
}
if ($self->getSetting("requiredDigits") && !$self->_hasNumberCharacters($password, $self->getSetting("requiredDigits"))) {
$error .= '<li>'.sprintf($i18n->echo("Password must conatain at least %s numeric characters."), $self->getSetting("requiredDigits")).'</li>';
}
if ($self->getSetting("nonWordCharacters") && !$self->_hasNonWordCharacters($password, $self->getSetting("nonWordCharacters"))) {
$error .= '<li>'.sprintf($i18n->echo("Password must contain at least %s non-word characters such as , ! @ etc."), $self->getSetting("nonWordCharacters")).'</li>';
}
if ($self->getSetting("requiredMixedCase") && !$self->_hasMixedCaseCharacters($password, $self->getSetting("requiredMixedCase"))) {
$error .= '<li>'.sprintf($i18n->echo("Password must contain at least %s upper case characters and at least one lowercase character (mixed case)."), $self->getSetting("requiredMixedCase")).'</li>';
}
$self->error($error);
return $error eq "";
}
@ -301,7 +361,7 @@ sub editUserFormSave {
my $userId = $self->session->form->get("uid");
my $properties;
my $userData = $self->getParams($userId);
unless (!$self->session->form->process('authWebGUI.identifier') || $self->session->form->process('authWebGUI.identifier') eq "password") {
unless (!$self->session->form->process('authWebGUI.identifier') || $self->session->form->process('authWebGUI.identifier') eq "password" || !$self->_isValidPassword($self->session->form->get('authWebGUI.identifier'))) {
$properties->{identifier} = Digest::MD5::md5_base64($self->session->form->process('authWebGUI.identifier'));
if($userData->{identifier} ne $properties->{identifier}){
$properties->{passwordLastUpdated} =$self->session->datetime->time();
@ -337,6 +397,21 @@ sub editUserSettingsForm {
-value=>$self->session->setting->get("webguiPasswordLength"),
-label=>$i18n->get(15),
);
$f->integer(
-name => "webguiRequiredDigits",
-label => $i18n->echo("Number of digits required in password"),
-value => $self->session->setting->get("webguiRequiredDigits")
);
$f->integer(
-name => "webguiNonWordCharacters",
-label => $i18n->echo("Number of non-word characters required in password"),
-value => $self->session->setting->get("webguiNonWordCharacters")
);
$f->integer(
-name => "webguiRequiredMixedCase",
-label => $i18n->echo("Number of upper case case characters required in password"),
-value => $self->session->setting->get("webguiRequiredMixedCase")
);
$f->interval(
-name=>"webguiPasswordTimeout",
-label=>$i18n->get(16),
@ -426,6 +501,9 @@ sub editUserSettingsFormSave {
my $f = $self->session->form;
my $s = $self->session->setting;
$s->set("webguiPasswordLength", $f->process("webguiPasswordLength","integer"));
$s->set("webguiRequiredDigits", $f->process("webguiRequiredDigits","integer"));
$s->set("webguiNonWordCharacters", $f->process("webguiNonWordCharacters","integer"));
$s->set("webguiRequiredMixedCase", $f->process("webguiRequiredMixedCase","integer"));
$s->set("webguiPasswordTimeout", $f->process("webguiPasswordTimeout","interval"));
$s->set("webguiExpirePasswordOnCreation", $f->process("webguiExpirePasswordOnCreation","yesNo"));
$s->set("webguiSendWelcomeMessage", $f->process("webguiSendWelcomeMessage","yesNo"));

47
sbin/_utility.skeleton Normal file
View file

@ -0,0 +1,47 @@
use lib "../lib";
use strict;
use Getopt::Long;
use WebGUI::Session;
my $session = start();
# Do your work here
finish($session);
#-------------------------------------------------
# Your sub here
#-------------------------------------------------
sub start {
my $configFile;
$|=1; #disable output buffering
GetOptions(
'configFile=s'=>\$configFile,
);
my $session = WebGUI::Session->open("..",$configFile);
$session->user({userId=>3});
## If your script is adding or changing content you need these lines, otherwise leave them commented
#
# my $versionTag = WebGUI::VersionTag->getWorking($session);
# $versionTag->set({name=>'Name Your Tag'});
#
##
return $session;
}
#-------------------------------------------------
sub finish {
my $session = shift;
my $versionTag = WebGUI::VersionTag->getWorking($session);
## If your script is adding or changing content you need these lines, otherwise leave them commented
#
# my $versionTag = WebGUI::VersionTag->getWorking($session);
# $versionTag->commit;
##
$session->var->end;
$session->close();
}

153
sbin/diskUsage.pl Normal file
View file

@ -0,0 +1,153 @@
#!/data/wre/prereqs/perl/bin/perl
use lib "../lib";
use Getopt::Long;
use strict;
use WebGUI::Session;
use WebGUI::Asset;
my $configFile;
my $quiet;
my $assetId;
my $assetUrl;
my $summarize = 0;
my $blockSize = 1;
my $recurse = 1;
my $help;
$| = 1; # No buffering
GetOptions(
'configFile=s'=>\$configFile, # WebGUI Config file
'assetId=s' =>\$assetId, # AssetId to start with (optional) uses default page if not specified.
'assetUrl=s' =>\$assetUrl, # AssetUrl to start with (optional) uses default page if not specified
'quiet' =>\$quiet, # No output except for numeric file size (default unit is bytes, will use blockSize if specified)
'summary!' =>\$summarize, # Displays total space used for asset and descendants (unless recurse flag is set to false in which case only the asset specified will be used)
'blockSize=i' =>\$blockSize, # Change units in which space used is specified, defaults to bytes.
'recurse!' =>\$recurse, # Flag indicating whether the disk space usage should consider asset and all descendants (default) or just the asset specified.
'help!' =>\$help,
);
if ($help || !$configFile) {
print <<__EOH;
usage perl $0
Description: This utility is modeled after the *nix 'du' utility.
It displays the amount of disk space used by an asset and
it's descendants.
Options:
--assetId AssetId to use as starting point for calculating
disk usage. Defaults to the WebGUI default page
defined in the sites settings.
--assetUrl Relative asset URL to use as starting point for
calculating (i.e., /home) disk usage. Defaults to the
WebGUI default page defined in the sites settings.
--blockSize Numeric value to change the unit of measure for
the amount of disk space used. Defaults to 1
(bytes)
--help Display this help message
--norecurse Returns the disk space used by the starting asset only.
--quiet Display nothing but the amount of disk space used.
This value will respect the blockSize and recurse
parameters when calculating it's output.
--summary Display only the total amount of disk space used in a
human readable format.
--configFile WebGUI config file to use. This parameter is required.
__EOH
exit;
}
my $session = start();
du();
finish($session);
#-------------------------------------------------
sub start {
my $session = WebGUI::Session->open("../",$configFile);
$session->user({userId=>3});
return $session;
}
#-------------------------------------------------
sub finish {
my $session = shift;
$session->var->end();
$session->close();
}
#-------------------------------------------------------
sub du {
my $asset;
my $totalSize; # disk space used
if ($assetId) { # They specified an assetId to start with
$asset = WebGUI::Asset->newByDynamicClass($session,$assetId);
die ("Unable to instanciate asset $assetId") unless defined $asset;
print "\nStarting with asset $assetId...\n" unless $quiet;
}
elsif ($assetUrl) { # They specified an assetUrl to start with
$asset = WebGUI::Asset->newByUrl($session,$assetUrl);
die ("Unable to instanciate asset with URL $assetUrl") unless defined $asset;
print "\nStarting with asset url $assetUrl...\n" unless $quiet;
}
else { # No id specified, assume they want to start with the site's home page
$asset = WebGUI::Asset->getDefault($session);
die ("Unable to instanciate the WebGUI Default Page. Something is seriously broken.") unless defined $asset;
print "\nStarting with the Default Page...\n" unless $quiet;
}
my $lineage = ["self"];
push (@$lineage, "descendants") if $recurse;
my $descendants = $asset->getLineage($lineage,{returnObjects=>1});
foreach my $currentAsset (@$descendants) {
my $size = $currentAsset->get("assetSize");
$size = $size / $blockSize; # convert to blockSize specified
$totalSize += $size;
$size = sprintf("%.2f", $size) unless ($blockSize == 1); # No point in printing .00 after everything
print "$size\t".$currentAsset->getUrl."\n" unless ($quiet || $summarize);
}
# Format to a whole number unless the total is less than 1. If it's less than 1 attempt to display 2 digits of precision to avoid displaying a zero size.
unless ($totalSize < 1) {
$totalSize = sprintf("%d", $totalSize);
}
else {
$totalSize = sprintf("%.2f", $totalSize);
}
unless ($quiet) { # Human readable
# try to come up with an intellegible label for the output
my $units;
if ($blockSize == 1) { # bytes
$units = "bytes";
} elsif ($blockSize == 1000 || $blockSize == 1024) { # kilobytes
$units = "Kb";
} elsif ($blockSize == 1000*1000 || $blockSize == 1024*1024) { # megabytes
$units = "Mb";
} else { # Unknown units
$units = "units";
}
print "\nTotal Space used: $totalSize $units \n\n";
}
else { # return script friendly output of the size only.
print $totalSize;
}
}