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