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