Parent Directory
|
Revision Log
Revision 317 - (view) (download) (as text)
| 1 : | sh002i | 317 | package WeBWorK::DB::Auth; |
| 2 : | |||
| 3 : | # there should be a `use' line for each database type | ||
| 4 : | use WeBWorK::DB::GDBM; | ||
| 5 : | |||
| 6 : | # params: class, course environment | ||
| 7 : | sub new($$) { | ||
| 8 : | my $proto = shift; | ||
| 9 : | my $class = ref($proto) || $proto; | ||
| 10 : | my $courseEnv = shift; | ||
| 11 : | my $dbModule = fullyQualifiedPackageName($courseEnv->{auth_db_type}); | ||
| 12 : | my $self = { | ||
| 13 : | password_file => $courseEnv->{something}, | ||
| 14 : | permissions_file => $courseEnv->{something}, | ||
| 15 : | keys_file => $courseEnv->{something}, | ||
| 16 : | }; | ||
| 17 : | $self->{password_db} = $self->{dbModule}->new($self->{password_file}); | ||
| 18 : | $self->{permissions_db} = $self->{dbModule}->new($self->{permissions_file}); | ||
| 19 : | $self->{keys_db} = $self->{dbModule}->new($self->{keys_file}); | ||
| 20 : | bless $self, $class; | ||
| 21 : | return $self; | ||
| 22 : | } | ||
| 23 : | |||
| 24 : | sub fullyQualifiedPackageName($) { | ||
| 25 : | my $n = shift; | ||
| 26 : | my $package = "__PACKAGE__"; | ||
| 27 : | $package =~ s/([^:]*)$/$n/; | ||
| 28 : | return $package; | ||
| 29 : | } | ||
| 30 : | |||
| 31 : | sub connect($$$) { | ||
| 32 : | my $self = shift; | ||
| 33 : | my $db = shift; | ||
| 34 : | my $mode = shift; | ||
| 35 : | return if defined $self->{$db."_db"}; | ||
| 36 : | $self->{$db."_db"} = $self->{dbModule}->new($db."_file", $mode); | ||
| 37 : | $self->{$db."_db"}->connect(); | ||
| 38 : | } | ||
| 39 : | |||
| 40 : | sub disconnect($$) { | ||
| 41 : | my $self = shift; | ||
| 42 : | my $db = shift; | ||
| 43 : | return unless defined $self->{$db."_db"}; | ||
| 44 : | $self->{$db."_db"}->disconnect(); | ||
| 45 : | } | ||
| 46 : | |||
| 47 : | # ----- | ||
| 48 : | |||
| 49 : | sub getPassword($$) { | ||
| 50 : | my $self = shift; | ||
| 51 : | my $user = shift; | ||
| 52 : | $self->{password_db}->connect("ro"); | ||
| 53 : | my $result = $self->{password_db}->hashRef()->{$user}; | ||
| 54 : | $self->{password_db}->disconnect(); | ||
| 55 : | return $result; | ||
| 56 : | } | ||
| 57 : | |||
| 58 : | sub setPassword($$$) { | ||
| 59 : | my $self = shift; | ||
| 60 : | my $user = shift; | ||
| 61 : | my $password = shift; | ||
| 62 : | $password = crypt $password, join "", ('.','/','0'..'9','A'..'Z','a'..'z')[rand 64, rand 64] | ||
| 63 : | $self->{password_db}->connect("rw"); | ||
| 64 : | $self->{password_db}->hashRef()->{$user} = $password; | ||
| 65 : | $self->{password_db}->disconnect(); | ||
| 66 : | } | ||
| 67 : | |||
| 68 : | sub verifyPassword($$$) { | ||
| 69 : | my $self = shift; | ||
| 70 : | my $user = shift; | ||
| 71 : | my $password = shift; | ||
| 72 : | $self->{password_db}->connect("ro"); | ||
| 73 : | my $result = $self->{password_db}->hashRef()->{$user} eq $password; | ||
| 74 : | $self->{password_db}->disconnect(); | ||
| 75 : | return $result; | ||
| 76 : | } | ||
| 77 : | |||
| 78 : | sub deletePassword($$) { | ||
| 79 : | my $self = shift; | ||
| 80 : | my $user = shift; | ||
| 81 : | $self->{password_db}->connect("rw"); | ||
| 82 : | delete $self->{password_db}->hashRef()->{$user}; | ||
| 83 : | $self->{password_db}->disconnect(); | ||
| 84 : | } | ||
| 85 : | |||
| 86 : | # ----- | ||
| 87 : | |||
| 88 : | sub getKey($$) { | ||
| 89 : | my $self = shift; | ||
| 90 : | my $user = shift; | ||
| 91 : | $self->{keys_db}->connect("ro"); | ||
| 92 : | my $result = $self->{keys_db}->hashRef()->{$user}; | ||
| 93 : | $self->{keys_db}->disconnect(); | ||
| 94 : | my ($key, $timestamp) = split /\s+/, $result; | ||
| 95 : | return $key, $timestamp; | ||
| 96 : | } | ||
| 97 : | |||
| 98 : | sub setKey($$$$) { | ||
| 99 : | my $self = shift; | ||
| 100 : | my $user = shift; | ||
| 101 : | my $key = shift; | ||
| 102 : | my $timestamp = shift; | ||
| 103 : | my $key_string = "$key $timestamp"; | ||
| 104 : | $self->{keys_db}->connect("rw"); | ||
| 105 : | $self->{keys_db}->hashRef()->{$user} = $key_string; | ||
| 106 : | $self->{keys_db}->disconnect(); | ||
| 107 : | } | ||
| 108 : | |||
| 109 : | sub verifyKey($$$) { | ||
| 110 : | my $self = shift; | ||
| 111 : | my $user = shift; | ||
| 112 : | my $key = shift; | ||
| 113 : | $self->{keys_db}->connect("ro"); | ||
| 114 : | my $result = $self->{keys_db}->hashRef()->{$user}; | ||
| 115 : | $self->{keys_db}->disconnect(); | ||
| 116 : | my ($real_key, $timestamp) = split /\s+/, $result; | ||
| 117 : | return $key eq $real_key; | ||
| 118 : | # DANGER DANGER! this function no longer updates timestamp! | ||
| 119 : | } | ||
| 120 : | |||
| 121 : | sub deleteKey($$) { | ||
| 122 : | my $self = shift; | ||
| 123 : | my $user = shift; | ||
| 124 : | $self->{keys_db}->connect("rw"); | ||
| 125 : | delete $self->{keys_db}->hashRef()->{$user}; | ||
| 126 : | $self->{keys_db}->disconnect(); | ||
| 127 : | } | ||
| 128 : | |||
| 129 : | # ----- | ||
| 130 : | |||
| 131 : | sub getPermissions($$) { | ||
| 132 : | my $self = shift; | ||
| 133 : | my $user = shift; | ||
| 134 : | $self->{permissions_db}->connect("ro"); | ||
| 135 : | my $result = $self->{permissions_db}->hashRef()->{$user}; | ||
| 136 : | $self->{permissions_db}->disconnect(); | ||
| 137 : | return $result; | ||
| 138 : | } | ||
| 139 : | |||
| 140 : | sub setPermissions($$$) { | ||
| 141 : | my $self = shift; | ||
| 142 : | my $user = shift; | ||
| 143 : | my $permissions = shift; | ||
| 144 : | $self->{permissions_db}->connect("rw"); | ||
| 145 : | $self->{permissions_db}->hashRef()->{$user} = $key; | ||
| 146 : | $self->{permissions_db}->disconnect(); | ||
| 147 : | } | ||
| 148 : | |||
| 149 : | sub deletePermissions($$) { | ||
| 150 : | my $self = shift; | ||
| 151 : | my $user = shift; | ||
| 152 : | $self->{permissions_db}->connect("rw"); | ||
| 153 : | delete $self->{permissions_db}->hashRef()->{$user}; | ||
| 154 : | $self->{permissions_db}->disconnect(); | ||
| 155 : | } | ||
| 156 : | |||
| 157 : | # ----- ghetto for stupid functions ----- | ||
| 158 : | |||
| 159 : | sub change_user_in_password_file($$$) { | ||
| 160 : | my $self = shift; | ||
| 161 : | my $user = shift; | ||
| 162 : | my $new_user = shift; | ||
| 163 : | $self->{password_db}->connect("rw"); | ||
| 164 : | my $pwhash = $self->{password_db}->hashRef(); # make things easier | ||
| 165 : | if (exists $pwhash->{user}) { | ||
| 166 : | $pwhash->{new_user} = $pwhash->{user}; | ||
| 167 : | delete $pwhash->{user}; | ||
| 168 : | } | ||
| 169 : | $self->{password_db}->disconnect(); | ||
| 170 : | } | ||
| 171 : | |||
| 172 : | sub change_user_in_permissions_file($$$) { | ||
| 173 : | my $self = shift; | ||
| 174 : | my $user = shift; | ||
| 175 : | my $new_user = shift; | ||
| 176 : | $self->{permissions_db}->connect("rw"); | ||
| 177 : | my $permhash = $self->{permissions_db}->hashRef(); # make things easier | ||
| 178 : | if (exists $permhash->{user}) { | ||
| 179 : | $permhash->{new_user} = $permhash->{user}; | ||
| 180 : | delete $permhash->{user}; | ||
| 181 : | } | ||
| 182 : | $self->disconnect{permissions_db}->(); | ||
| 183 : | } | ||
| 184 : | |||
| 185 : | =pod | ||
| 186 : | sub create_db { | ||
| 187 : | my ($fileName, $permissions) =@_; | ||
| 188 : | my %pwhash; | ||
| 189 : | my $pw_obj; | ||
| 190 : | &Global::tie_hash('PW_FH',\$pw_obj,\%pwhash, $fileName,'W',$permissions); | ||
| 191 : | &Global::untie_hash('PW_FH',\$pw_obj,\%pwhash, $fileName); | ||
| 192 : | |||
| 193 : | chmod($permissions, $fileName) or | ||
| 194 : | wwerror($0, "Can't do chmod($permissions, $fileName)"); | ||
| 195 : | chown(-1,$Global::numericalGroupID,$fileName) or | ||
| 196 : | wwerror($0, "Can't do chown(-1,$Global::numericalGroupID,$fileName)"); | ||
| 197 : | |||
| 198 : | } | ||
| 199 : | =cut |
| aubreyja at gmail dot com | ViewVC Help |
| Powered by ViewVC 1.0.9 |