[system] / trunk / webwork2 / lib / WeBWorK / DB / Auth.pm Repository:
ViewVC logotype

Annotation of /trunk/webwork2/lib/WeBWorK/DB/Auth.pm

Parent Directory Parent Directory | Revision Log 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