Parent Directory
|
Revision Log
fixed implementation of getUsers -- untested
1 ################################################################################ 2 # WeBWorK mod_perl (c) 1995-2002 WeBWorK Team, Univeristy of Rochester 3 # $Id$ 4 ################################################################################ 5 6 package WeBWorK::DB::Auth; 7 8 # there should be a `use' line for each database type 9 use WeBWorK::DB::GDBM; 10 11 # new($invocant, $courseEnv) 12 # $invocant implicitly set by caller 13 # $courseEnv an instance of CourseEnvironment 14 sub new($$) { 15 my $invocant = shift; 16 my $class = ref($invocant) || $invocant; 17 my $courseEnv = shift; 18 my $dbModule = fullyQualifiedPackageName($courseEnv->{dbInfo}->{auth_type}); 19 my $self = { 20 password_file => $courseEnv->{dbInfo}->{auth_passwd_file}, 21 permissions_file => $courseEnv->{dbInfo}->{auth_perm_file}, 22 keys_file => $courseEnv->{dbInfo}->{auth_keys_file}, 23 key_timeout => $courseEnv->{sessionKeyTimeout}, 24 }; 25 $self->{password_db} = $dbModule->new($self->{password_file}); 26 $self->{permissions_db} = $dbModule->new($self->{permissions_file}); 27 $self->{keys_db} = $dbModule->new($self->{keys_file}); 28 bless $self, $class; 29 return $self; 30 } 31 32 sub fullyQualifiedPackageName($) { 33 my $n = shift; 34 my $package = __PACKAGE__; 35 $package =~ s/([^:]*)$/$n/; 36 return $package; 37 } 38 39 # ----- 40 41 sub getUsers($) { 42 my $self = shift; 43 my %all_users; 44 if ($self->{password_db}->connect("ro")) { 45 $all_users{$_}++ foreach keys %{$self->{password_db}->hashRef}; 46 $self->{password_db}->disconnect; 47 } 48 if ($self->{permissions_db}->connect("ro")) { 49 $all_users{$_}++ foreach keys %{$self->{permissions_db}->hashRef}; 50 $self->{permissions_db}->disconnect; 51 } 52 if ($self->{keys_db}->connect("ro")) { 53 $all_users{$_}++ foreach keys %{$self->{keys_db}->hashRef}; 54 $self->{keys_db}->disconnect; 55 } 56 return keys %all_users; 57 } 58 59 # ----- 60 61 sub getPassword($$) { 62 my $self = shift; 63 my $user = shift; 64 return unless $self->{password_db}->connect("ro"); 65 my $result = $self->{password_db}->hashRef->{$user}; 66 $self->{password_db}->disconnect; 67 return $result; 68 } 69 70 sub setPassword($$$) { 71 my $self = shift; 72 my $user = shift; 73 my $password = crypt shift, join "", ('.','/','0'..'9','A'..'Z','a'..'z')[rand 64, rand 64]; 74 $self->{password_db}->connect("rw"); 75 $self->{password_db}->hashRef->{$user} = $password; 76 $self->{password_db}->disconnect; 77 } 78 79 sub verifyPassword($$$) { 80 my $self = shift; 81 my $user = shift; 82 my $password = shift; 83 my $real_password = $self->getPassword($user); 84 return unless defined $real_password; 85 $password = crypt $password, $real_password; 86 return $password eq $real_password; 87 } 88 89 sub deletePassword($$) { 90 my $self = shift; 91 my $user = shift; 92 $self->{password_db}->connect("rw"); 93 delete $self->{password_db}->hashRef->{$user}; 94 $self->{password_db}->disconnect; 95 } 96 97 # ----- 98 99 sub getKey($$) { 100 my $self = shift; 101 my $user = shift; 102 return unless $self->{keys_db}->connect("ro"); 103 my $result = $self->{keys_db}->hashRef->{$user}; 104 $self->{keys_db}->disconnect; 105 my ($key, $timestamp) = defined $result ? split /\s+/, $result : (undef, undef); 106 if (time <= $timestamp+$self->{key_timeout}) { 107 return $key; 108 } else { 109 $self->deleteKey($user); 110 return 0; 111 } 112 } 113 114 sub setKey($$$) { 115 my $self = shift; 116 my $user = shift; 117 my $key = shift; 118 $self->{keys_db}->connect("rw"); 119 $self->{keys_db}->hashRef->{$user} = "$key " . time; 120 $self->{keys_db}->disconnect; 121 } 122 123 sub verifyKey($$$) { 124 my $self = shift; 125 my $user = shift; 126 my $key = shift; 127 my $real_key = $self->getKey($user); 128 return unless defined $real_key; 129 if ($key eq $real_key) { 130 # update timestamp 131 $self->setKey($user, $real_key); 132 return 1; 133 } else { 134 return 0; 135 } 136 } 137 138 sub deleteKey($$) { 139 my $self = shift; 140 my $user = shift; 141 $self->{keys_db}->connect("rw"); 142 delete $self->{keys_db}->hashRef->{$user}; 143 $self->{keys_db}->disconnect; 144 } 145 146 # ----- 147 148 sub getPermissions($$) { 149 my $self = shift; 150 my $user = shift; 151 return unless $self->{permissions_db}->connect("ro"); 152 my $result = $self->{permissions_db}->hashRef->{$user}; 153 $self->{permissions_db}->disconnect; 154 return $result; 155 } 156 157 sub setPermissions($$$) { 158 my $self = shift; 159 my $user = shift; 160 my $permissions = shift; 161 $self->{permissions_db}->connect("rw"); 162 $self->{permissions_db}->hashRef->{$user} = $permissions; 163 $self->{permissions_db}->disconnect; 164 } 165 166 sub deletePermissions($$) { 167 my $self = shift; 168 my $user = shift; 169 $self->{permissions_db}->connect("rw"); 170 delete $self->{permissions_db}->hashRef->{$user}; 171 $self->{permissions_db}->disconnect; 172 } 173 174 # ----- ghetto for stupid functions ----- 175 176 sub change_user_in_password_file($$$) { 177 my $self = shift; 178 my $user = shift; 179 my $new_user = shift; 180 $self->{password_db}->connect("rw"); 181 my $pwhash = $self->{password_db}->hashRef; # make things easier 182 if (exists $pwhash->{$user}) { 183 $pwhash->{$new_user} = $pwhash->{$user}; 184 delete $pwhash->{$user}; 185 } 186 $self->{password_db}->disconnect; 187 } 188 189 sub change_user_in_permissions_file($$$) { 190 my $self = shift; 191 my $user = shift; 192 my $new_user = shift; 193 $self->{permissions_db}->connect("rw"); 194 my $permhash = $self->{permissions_db}->hashRef; # make things easier 195 if (exists $permhash->{$user}) { 196 $permhash->{$new_user} = $permhash->{$user}; 197 delete $permhash->{$user}; 198 } 199 $self->{permissions_db}->disconnect; 200 } 201 202 1;
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |