← Index
NYTProf Performance Profile   « line view »
For /usr/local/libexec/sympa/task_manager-debug.pl
  Run on Tue Jun 1 22:32:51 2021
Reported on Tue Jun 1 22:35:11 2021

Filename/usr/local/lib/perl5/site_perl/Data/Password.pm
StatementsExecuted 0 statements in 0s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
0000s0sData::Password::::BEGIN@10Data::Password::BEGIN@10
0000s0sData::Password::::BEGIN@8Data::Password::BEGIN@8
0000s0sData::Password::::CheckCharsetData::Password::CheckCharset
0000s0sData::Password::::CheckDictData::Password::CheckDict
0000s0sData::Password::::CheckLengthData::Password::CheckLength
0000s0sData::Password::::CheckSortData::Password::CheckSort
0000s0sData::Password::::CheckTypesData::Password::CheckTypes
0000s0sData::Password::::IsBadPasswordData::Password::IsBadPassword
0000s0sData::Password::::IsBadPasswordForUNIXData::Password::IsBadPasswordForUNIX
0000s0sData::Password::::OpenDictionaryData::Password::OpenDictionary
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Data::Password;
2
3# Ariel Brosh (RIP), January 2002, for Raz Information Systems
4# Oded S. Resnik, 3 April 2004, for Raz Information Systems
5
- -
8use strict;
9require Exporter;
10use vars qw($DICTIONARY $FOLLOWING $GROUPS $MINLEN $MAXLEN $SKIPCHAR
11 $FOLLOWING_KEYBOARD @DICTIONARIES $BADCHARS
12 $VERSION @ISA @EXPORT_OK %EXPORT_TAGS);
13
14@EXPORT_OK = qw($DICTIONARY $FOLLOWING $GROUPS $FOLLOWING_KEYBOARD $SKIPCHAR $BADCHARS
15 @DICTIONARIES $MINLEN $MAXLEN IsBadPassword IsBadPasswordForUNIX);
16%EXPORT_TAGS = ('all' => [@EXPORT_OK]);
17@ISA = qw(Exporter);
18
19$VERSION = '1.12';
20
21# Settings
22$DICTIONARY = 5;
23$FOLLOWING = 3;
24$FOLLOWING_KEYBOARD = 1;
25$GROUPS = 2;
26
27$MINLEN = 6;
28$MAXLEN = 8;
29$SKIPCHAR = 0;
30$BADCHARS = '\0-\x1F\x7F';
31
32@DICTIONARIES = qw(/usr/dict/web2 /usr/dict/words /usr/share/dict/words /usr/share/dict/linux.words);
33
34sub OpenDictionary {
35 foreach my $sym (@DICTIONARIES) {
36 return $sym if -r $sym;
37 }
38 return;
39}
40
41sub CheckDict {
42 return unless $DICTIONARY;
43 my $pass = shift;
44 my $dict = OpenDictionary();
45 return unless $dict;
46 open (DICT,"$dict") || return;
47 $pass = lc($pass);
48
49 while (my $dict_line = <DICT>) {
50 chomp ($dict_line);
51 next if length($dict_line) < $DICTIONARY;
52 $dict_line = lc($dict_line);
53 if (index($pass,$dict_line)>-1) {
54 close(DICT);
55 return $dict_line;
56 }
57 }
58 close(DICT);
59 return;
60}
61
62sub CheckSort {
63 return unless $FOLLOWING;
64 my $pass = shift;
65 foreach (1 .. 2) {
66 my @letters = split(//, $pass);
67 my $diffs;
68 my $last = shift @letters;
69 foreach (@letters) {
70 $diffs .= chr((ord($_) - ord($last) + 256 + 65) % 256);
71 $last = $_;
72 }
73 my $len = $FOLLOWING - 1;
74 return 1 if $diffs =~ /([\@AB])\1{$len}/;
75 return unless $FOLLOWING_KEYBOARD;
76
77 my $mask = $pass;
78 $pass =~ tr/A-Z/a-z/;
79 $mask ^= $pass;
80 $pass =~ tr/qwertyuiopasdfghjklzxcvbnm/abcdefghijKLMNOPQRStuvwxyz/;
81 $pass ^= $mask;
82 }
83 return;
84}
85
86sub CheckTypes {
87 return undef unless $GROUPS;
88 my $pass = shift;
89 my @groups = qw(a-z A-Z 0-9 ^A-Za-z0-9);
90 my $count;
91 foreach (@groups) {
92 $count++ if $pass =~ /[$_]/;
93 }
94 $count < $GROUPS;
95}
96
97sub CheckCharset {
98 my $pass = shift;
99 return 0 if $SKIPCHAR;
100 $pass =~ /[$BADCHARS]/;
101}
102
103sub CheckLength {
104 my $pass = shift;
105 my $len = length($pass);
106 return 1 if ($MINLEN && $len < $MINLEN);
107 return 1 if ($MAXLEN && $len > $MAXLEN);
108 return;
109}
110
111sub IsBadPassword {
112 my $pass = shift;
113 if (CheckLength($pass)) {
114 if ($MAXLEN && $MINLEN) {
115 return "Not between $MINLEN and $MAXLEN characters";
116 }
117 elsif (!$MAXLEN) { return "Not $MINLEN characters or greater"; }
118 else { return "Not less than or equal to $MAXLEN characters"; }
119 }
120 return "contains bad characters" if CheckCharset($pass);
121 return "contains less than $GROUPS character groups"
122 if CheckTypes($pass);
123 return "contains over $FOLLOWING leading characters in sequence"
124 if CheckSort($pass);
125 my $dict = CheckDict($pass);
126 return "contains the dictionary word '$dict'" if $dict;
127 return;
128}
129
130sub IsBadPasswordForUNIX {
131 my ($user, $pass) = @_;
132 my $reason = IsBadPassword($pass);
133 return $reason if $reason;
134 my $tuser = $user;
135 $tuser =~ s/[^a-zA-Z]//g;
136 return "is based on the username" if ($pass =~ /$tuser/i);
137
138 my ($name,$passwd,$uid,$gid,
139 $quota,$comment,$gcos,$dir,$shell,$expire) = getpwnam($user);
140 return unless $comment;
141 foreach ($comment =~ /([A-Z]+)/ig) {
142 return "is based on the finger information" if ($pass =~ /$_/i);
143 }
144 return;
145}
146
1471;
148__END__