X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FPassword_Mixin.pm;h=963fa542b154efba2bef0f10e94cc0e43c80b5de;hb=8b9017962e8f337554f9d15f513ede606f8725e2;hp=65bd3d27bb242c62b9c67bb8a8f107f5c997abd0;hpb=eef47827c287da562ef36ccbb120e64bee798879;p=freeside.git diff --git a/FS/FS/Password_Mixin.pm b/FS/FS/Password_Mixin.pm index 65bd3d27b..963fa542b 100644 --- a/FS/FS/Password_Mixin.pm +++ b/FS/FS/Password_Mixin.pm @@ -54,12 +54,13 @@ sub is_password_allowed { my $cust_pkg = FS::cust_pkg->by_key($self->get('pkgnum')); $cust_main = $cust_pkg->cust_main if $cust_pkg; } + # selfservice signup invokes this without customer, but it checks this conf separately warn "is_password_allowed: no customer could be identified" if !$cust_main; return '' if $cust_main && $conf->config_bool('password-insecure', $cust_main->agentnum); # basic checks using Data::Password; # options for Data::Password - $DICTIONARY = 4; # minimum length of disallowed words + $DICTIONARY = 0; # minimum length of disallowed words, false value disables dictionary checking $MINLEN = $conf->config('passwordmin') || 6; $MAXLEN = $conf->config('passwordmax') || 8; $GROUPS = 4; # must have all 4 'character groups': numbers, symbols, uppercase, lowercase @@ -69,9 +70,23 @@ sub is_password_allowed { # # lists of disallowed words # @DICTIONARIES = qw( /usr/share/dict/web2 /usr/share/dict/words /usr/share/dict/linux.words ); + # first, no dictionary checking but require 4 char groups my $error = IsBadPassword($password); - $error = 'must contain at least one each of numbers, symbols, and lowercase and uppercase letters' - if $error eq 'contains less than 4 character groups'; # avoid confusion + + # but they can get away with 3 char groups, so long as they're not using a word + if ($error eq 'contains less than 4 character groups') { + $DICTIONARY = 4; # default from Data::Password is 5 + $GROUPS = 3; + $error = IsBadPassword($password); + # take note--we never actually report dictionary word errors; + # 4 char groups is the rule, 3 char groups and no dictionary words is an acceptable exception + $error = 'should contain at least one each of numbers, symbols, lowercase and uppercase letters' + if $error; + } + + # maybe also at some point add an exception for any passwords of sufficient length, + # see https://xkcd.com/936/ + $error = 'Invalid password - ' . $error if $error; return $error if $error; @@ -197,8 +212,9 @@ sub insert_password_history { } } else { - warn "unrecognized password encoding '$encoding'; treating as plain text" - unless $encoding eq 'plain'; + if ($encoding and $encoding ne 'plain') { + warn "unrecognized password encoding '$encoding'; treating as plain text"; + } $auth = $self->_blowfishcrypt( $password ); @@ -276,9 +292,10 @@ sub pw_set { && $pw_set =~ /[[:digit:]]/ && $pw_set =~ /[[:punct:]]/ ) { @pw_set = split('', $pw_set); + } else { + warn "password-generated-characters set is insufficient; using default."; + @pw_set = split('', 'abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ23456789()#.,'); } - warn "password-generated-characters set is insufficient; using default."; - @pw_set = split('', 'abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ23456789()#.,'); } return @pw_set; }