[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 337 - (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 :     sub connect($$$) {
40 :     my $self = shift;
41 :     my $db = shift;
42 :     my $mode = shift;
43 :     return if defined $self->{$db."_db"};
44 :     $self->{$db."_db"} = $self->{dbModule}->new($db."_file", $mode);
45 :     $self->{$db."_db"}->connect();
46 :     }
47 :    
48 :     sub disconnect($$) {
49 :     my $self = shift;
50 :     my $db = shift;
51 :     return unless defined $self->{$db."_db"};
52 : sh002i 334 $self->{$db."_db"}->disconnect;
53 : sh002i 317 }
54 :    
55 :     # -----
56 :    
57 : sh002i 337 sub getUsers($) {
58 :     my $self = shift;
59 :     return unless $self->{password_db}->connect("ro");
60 :     my @password_users = keys %{$self->{password_db}->hashRef};
61 :     $self->{password_db}->disconnect;
62 :     return unless $self->{permissions_db}->connect("ro");
63 :     my @permissions_users = keys %{$self->{permissions_db}->hashRef};
64 :     $self->{permissions_db}->disconnect;
65 :     return unless $self->{keys_db}->connect("ro");
66 :     my @keys_users = keys %{$self->{keys_db}->hashRef};
67 :     $self->{keys_db}->disconnect;
68 :     my %all_users;
69 :     $all_users{$_}++ foreach (@password_users, @permissions_users, @keys_users);
70 :     return keys %all_users;
71 :     }
72 :    
73 :     # -----
74 :    
75 : sh002i 317 sub getPassword($$) {
76 :     my $self = shift;
77 :     my $user = shift;
78 : sh002i 337 return unless $self->{password_db}->connect("ro");
79 : sh002i 334 my $result = $self->{password_db}->hashRef->{$user};
80 :     $self->{password_db}->disconnect;
81 : sh002i 317 return $result;
82 :     }
83 :    
84 :     sub setPassword($$$) {
85 :     my $self = shift;
86 :     my $user = shift;
87 : sh002i 330 my $password = crypt shift, join "", ('.','/','0'..'9','A'..'Z','a'..'z')[rand 64, rand 64];
88 : sh002i 317 $self->{password_db}->connect("rw");
89 : sh002i 334 $self->{password_db}->hashRef->{$user} = $password;
90 :     $self->{password_db}->disconnect;
91 : sh002i 317 }
92 :    
93 :     sub verifyPassword($$$) {
94 :     my $self = shift;
95 :     my $user = shift;
96 :     my $password = shift;
97 : sh002i 330 my $real_password = $self->getPassword($user);
98 :     $password = crypt $password, $real_password;
99 :     return $password eq $real_password;
100 : sh002i 317 }
101 :    
102 :     sub deletePassword($$) {
103 :     my $self = shift;
104 :     my $user = shift;
105 :     $self->{password_db}->connect("rw");
106 : sh002i 334 delete $self->{password_db}->hashRef->{$user};
107 :     $self->{password_db}->disconnect;
108 : sh002i 317 }
109 :    
110 :     # -----
111 :    
112 :     sub getKey($$) {
113 :     my $self = shift;
114 :     my $user = shift;
115 : sh002i 337 return unless $self->{keys_db}->connect("ro");
116 : sh002i 334 my $result = $self->{keys_db}->hashRef->{$user};
117 :     $self->{keys_db}->disconnect;
118 : sh002i 330 my ($key, $timestamp) = defined $result ? split /\s+/, $result : (undef, undef);
119 :     return defined $result ? split /\s+/, $result : undef;
120 : sh002i 317 }
121 :    
122 :     sub setKey($$$$) {
123 :     my $self = shift;
124 :     my $user = shift;
125 :     my $key = shift;
126 :     my $timestamp = shift;
127 :     my $key_string = "$key $timestamp";
128 :     $self->{keys_db}->connect("rw");
129 : sh002i 334 $self->{keys_db}->hashRef->{$user} = $key_string;
130 :     $self->{keys_db}->disconnect;
131 : sh002i 317 }
132 :    
133 : sh002i 330 sub verifyKey($$$$$) {
134 : sh002i 317 my $self = shift;
135 :     my $user = shift;
136 :     my $key = shift;
137 : sh002i 330 my $timestamp = shift;
138 :    
139 :     my ($real_key, $real_timestamp) = $self->getKey($user);
140 :     if ($key eq $real_key and $timestamp <= $real_timestamp+$self->{key_timeout}) {
141 :     $self->setKey($user, $key, $timestamp);
142 :     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