Mercurial > make_username
changeset 7:462ba4c70c65
Eliminated global vars (undeclared variables suck). Added check for no username available. Cleanup up test code.
author | Eris Caffee <discordia@eldalin.com> |
---|---|
date | Mon, 18 Jul 2011 13:04:44 -0500 |
parents | 065d2beb69a5 |
children | 542b1fb6759d |
files | make-username.pl passwd-huge.gz |
diffstat | 2 files changed, 73 insertions(+), 83 deletions(-) [+] |
line diff
1.1 --- a/make-username.pl Mon Jul 18 10:15:15 2011 -0500 1.2 +++ b/make-username.pl Mon Jul 18 13:04:44 2011 -0500 1.3 @@ -28,6 +28,8 @@ 1.4 use English; 1.5 use File::Basename; 1.6 1.7 +# main is a block. NO GLOBALS! 1.8 +{ 1.9 my $base =""; 1.10 my $user; 1.11 my $debug = 0; 1.12 @@ -56,99 +58,78 @@ 1.13 } 1.14 1.15 if (! $test) { 1.16 - $user = make_username($base); 1.17 - defined $user and printf("%s\n", $user); 1.18 + $user = make_username($base, $maxlen); 1.19 + if (defined $user) { 1.20 + printf("%s\n", $user); 1.21 + } else { 1.22 + printf(STDERR "No username available\n"); 1.23 + } 1.24 exit 0; 1.25 } else { 1.26 my $pwdfile = "passwd"; 1.27 - $base = ""; 1.28 - my $t1 = time; 1.29 - $user = make_username($base, $pwdfile); 1.30 - my $t2 = time; 1.31 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.32 + my ($base, $t1, $t2); 1.33 + my @bases = ("", # should use default "user" as base. user and user1 taken 1.34 + "eightchr", 1.35 + "short", 1.36 + "this *&% is not allowed &^$%&^m", 1.37 + "123digits", 1.38 + "this-is-a-domain.com", 1.39 + '&$%#&$*&$%*&', 1.40 + "testqwer", # testqwer taken 1.41 + "testabc", # all testabc? taken 1.42 + "testzx", # all testzx?? taken 1.43 + "test", # all test??? taken 1.44 + "t" # all z????? taken though 10435 1.45 + ); 1.46 + 1.47 + foreach $base (@bases) { 1.48 + $t1 = time; 1.49 + $user = make_username($base, $maxlen, $pwdfile); 1.50 + $t2 = time; 1.51 + if (defined $user) { 1.52 + printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.53 + } else { 1.54 + printf("%30s No username available\n", $base, $t2 - $t1); 1.55 + } 1.56 + } 1.57 1.58 - $base = "eightchr"; 1.59 + $maxlen = 2; 1.60 + $base = "z"; # all z? taken. Should return no username. 1.61 $t1 = time; 1.62 - $user = make_username($base, $pwdfile); 1.63 + $user = make_username($base, $maxlen, $pwdfile); 1.64 $t2 = time; 1.65 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.66 + if (defined $user) { 1.67 + printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.68 + } else { 1.69 + printf("%30s No username available\n", $base, $t2 - $t1); 1.70 + } 1.71 1.72 - $base = "short"; 1.73 - $t1 = time; 1.74 - $user = make_username($base, $pwdfile); 1.75 - $t2 = time; 1.76 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.77 - 1.78 - $base = "this *&% is not allowed &^$%&^m"; 1.79 - $t1 = time; 1.80 - $user = make_username($base, $pwdfile); 1.81 - $t2 = time; 1.82 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.83 +} 1.84 1.85 - $base = "123digits"; 1.86 - $t1 = time; 1.87 - $user = make_username($base, $pwdfile); 1.88 - $t2 = time; 1.89 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.90 - 1.91 - $base = "this-is-a-domain.com"; 1.92 - $t1 = time; 1.93 - $user = make_username($base, $pwdfile); 1.94 - $t2 = time; 1.95 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.96 - 1.97 - $base = '&$%#&$*&$%*&'; 1.98 - $t1 = time; 1.99 - $user = make_username($base, $pwdfile); 1.100 - $t2 = time; 1.101 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.102 - 1.103 - $base = "testqwer"; 1.104 - $t1 = time; 1.105 - $user = make_username($base, $pwdfile); 1.106 - $t2 = time; 1.107 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.108 - 1.109 - $base = "testabc"; 1.110 - $t1 = time; 1.111 - $user = make_username($base, $pwdfile); 1.112 - $t2 = time; 1.113 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.114 - 1.115 - $base = "testzx"; 1.116 - $t1 = time; 1.117 - $user = make_username($base, $pwdfile); 1.118 - $t2 = time; 1.119 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.120 - 1.121 - $base = "test"; 1.122 - $t1 = time; 1.123 - $user = make_username($base, $pwdfile); 1.124 - $t2 = time; 1.125 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.126 - 1.127 - $base = "t"; 1.128 - $t1 = time; 1.129 - $user = make_username($base, $pwdfile); 1.130 - $t2 = time; 1.131 - defined $user and printf("%30s %-".$maxlen."s in %ds\n", $base, $user, $t2 - $t1); 1.132 } 1.133 +exit 0; 1.134 1.135 ################################################################################ 1.136 sub make_username { 1.137 # Arguments: 1.138 - # The string to use as the basis of the new username. 1.139 - # Can be any string (such as an existing username or a domain name) 1.140 - # But at most 8 characters will be used. Invalid characters will 1.141 - # be removed. 1.142 - # If the first character would be a number, an 'a' is prepended to the name. 1.143 - # If blank, the string "user" will be used. 1.144 + # $base The string to use as the basis of the new username. 1.145 + # Can be any string (such as an existing username or a domain name) 1.146 + # But at most $maxlen characters will be used. Invalid characters will 1.147 + # be removed. 1.148 + # If the first character would be a number, an 'a' is prepended to the name. 1.149 + # If blank, the string "user" will be used. 1.150 + # $maxlen The maximum length of the username to create. If not specified, 1.151 + # it defaults to 8. It must be 2 or more. (If it was 1 then there 1.152 + # would be no way to prepend a number to it without having a digit as 1.153 + # the first character of the new name.) 1.154 + # $pwdfile The name of the passwd file to use for checking for new users. 1.155 + # /etc/passwd by default. This is really a debugging option. 1.156 # 1.157 # Returns: 1.158 # A string containing the new username or undef if no username 1.159 # could be generated (unlikely) 1.160 1.161 - my ($base, $pwdfile) = @_; 1.162 + my ($base, $maxlen, $pwdfile) = @_; 1.163 1.164 if ($base eq "") { 1.165 $base = "user"; 1.166 @@ -156,6 +137,15 @@ 1.167 1.168 ! defined $pwdfile and $pwdfile = "/etc/passwd"; 1.169 1.170 + if (! defined $maxlen) { 1.171 + $maxlen = 8; 1.172 + } else { 1.173 + if ($maxlen !~ /^\d+$/) { 1.174 + printf(STDERR "Error: non-numeric username length specified.\n"); 1.175 + return undef; 1.176 + } 1.177 + } 1.178 + 1.179 if (! -e $pwdfile) { 1.180 printf(STDERR "Error: non-existant passwd file specified: $pwdfile\n"); 1.181 return undef; 1.182 @@ -169,27 +159,27 @@ 1.183 } 1.184 1.185 # Use the specified parameter as the base of the new username. 1.186 - # Print it into a string of exactly 8 characters. 1.187 + # Print it into a string of exactly $maxlen characters. 1.188 # Print the number into the last portion of the new username. 1.189 # Delete spaces (in case the passed username candidate was short). 1.190 # Churn until we find an unused name. 1.191 - my $tries=0; 1.192 my $i=1; 1.193 my $numstr; 1.194 my $newuser = sprintf("%.".$maxlen."s", $base); 1.195 - 1.196 - while ( (user_exists($newuser, $pwdfile)) && ($i < 10000000) ) { 1.197 - $tries = 1; 1.198 + # print "maxlen $maxlen\n"; 1.199 + #print "newuser +$newuser+\n"; 1.200 + while ( (user_exists($newuser, $pwdfile)) && ($i < 10**($maxlen-1)) ) { 1.201 $numstr = sprintf("%d", $i); 1.202 $newuser = sprintf("%-".$maxlen."s", $base); 1.203 +# print "1 newuser $newuser\n"; 1.204 substr($newuser, -length($numstr), length($numstr), $numstr); 1.205 + # print "2 newuser $newuser\n"; 1.206 $newuser =~ s/ //g; 1.207 + # print "3 newuser $newuser\n"; 1.208 $i++; 1.209 - $debug and printf(STDERR "Checking for $newuser\n"); 1.210 } 1.211 1.212 - $i == 10000000 and return undef; 1.213 - $debug and print "final is $newuser in $tries attempts\n"; 1.214 + $i >= 10**($maxlen-1) and return undef; 1.215 return $newuser; 1.216 } 1.217
2.1 Binary file passwd-huge.gz has changed