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