[Plweb-commits] CVS: Web/Web DBTable.pm,NONE,1.1 Config.pm,1.1.1.1,1.2 Session.pm,1.2,1.3 SimpleDB.p
Status: Inactive
Brought to you by:
condordes
From: Josh <con...@us...> - 2001-10-27 09:08:38
|
Update of /cvsroot/plweb/Web/Web In directory usw-pr-cvs1:/tmp/cvs-serv8727/Web Modified Files: Config.pm Session.pm Added Files: DBTable.pm Removed Files: SimpleDB.pm Log Message: Converted things over to use a real RDBMS. Got rid of the stupid GDB files in /tmp. Added a configuration file plweb.conf. Changed everything so the universe looks totally different. Had a mental awakening. Things like that. --- NEW FILE: DBTable.pm --- package Web::DBTable; use DBI; $db = DBI->connect("dbi:" . Config->get("db_provider"), Config->get('db_user'), Config->get('db_passwd')); sub get { my $pkg = shift; my $tbl = shift; return bless { 'name' => $tbl }, $pkg; } sub first { my ($tbl, $fields, $where) = @_; my $qry = $db->prepare("select " . join(',', @$fields) . " from $tbl->{name} where $where"); my $rcd; $qry->execute; return $qry->fetchrow_hashref; } sub select { my ($tbl, $fields, $where, $index_by) = @_; my $qry = $db->prepare("select " . join(',', @$fields) . " from $tbl->{name} where $where"); my $ret = $index_by ? {} : []; my $rcd; $qry->execute; while ($rcd = $qry->fetchrow_hashref) { if ($index_by) { $ret->{$rcd->{$index_by}} = $rcd; } else { push @$ret, $rcd; } } return $index_by ? $ret : @$ret; } sub insert { my $table = shift; my %fields = @_; my @keys = keys %fields; # It's done this way to be ABSOLUTELY safe my @vals = (); my $sql = "insert into $table->{name} (" . join(',', @keys) . ") values("; foreach my $k (@keys) { my $v = $fields{$k}; $v =~ s/\'/\\\'/g; push @vals, "'" . $v . "'"; } $sql .= join(',', @vals) . ")"; $db->do($sql); } sub update { my $table = shift; my $where = shift; my %fields = @_; my @vals = (); my $sql = "update $table->{name} set "; foreach my $key (keys %fields) { my $v = $fields{$key}; $v =~ s/\'/\\\'/g; push @vals, "$key='$v'"; } $sql .= join ',', @vals; $sql .= " where $where" if $where; $db->do($sql); } sub delete { my $table = shift; my $where = shift; my $w; $w = "where $where" if $where; $db->do("delete from $table->{name} $w"); } 1; Index: Config.pm =================================================================== RCS file: /cvsroot/plweb/Web/Web/Config.pm,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -r1.1.1.1 -r1.2 *** Config.pm 2001/05/02 15:28:57 1.1.1.1 --- Config.pm 2001/10/27 09:08:33 1.2 *************** *** 1,26 **** package Config; ! my $cfgdb = Web::SimpleDB->new('/tmp/plweb-cfg.gdb'); ! sub set { ! shift; ! return $cfgdb->set(@_); } sub get { ! shift; ! return $cfgdb->get(@_); } sub keys { ! shift; ! return $cfgdb->keys(@_); } - sub delete { - shift; - return $cfgdb->delete(@_); - } - 1; --- 1,26 ---- package Config; ! my $cfgdb = {}; ! my $line; ! open (WEBCFG, "< /etc/plweb.conf"); ! while (! eof(WEBCFG)) { ! chomp ($line = <WEBCFG>); ! next if $line =~ /\#/; ! $line =~ /(\w+)\s+(.*)/; ! $cfgdb->{$1} = $2; } + close (WEBCFG); sub get { ! shift; ! return $cfgdb->{$_[0]}; } sub keys { ! shift; ! return keys %$cfgdb; } 1; *************** *** 34,59 **** use Web; - - # Store a single value under key 'foo' - Config->set('foo', 'bar'); - $x = Config->get('foo'); ! # Store multiple values under 'bar' ! Config->set('bar', 'foo', 'baz'); ! @y = Config->get('bar'); ! # Delete everything foreach $k (Config->keys) { ! Config->delete($k); } =head1 DESCRIPTION ! This works the same way as Web::SimpleDB. Take a look at that for ! documentation. =head1 SEE ALSO ! Web::SimpleDB =head1 AUTHOR --- 34,52 ---- use Web; ! $y = Config->get('bar'); ! # Enumerate everything foreach $k (Config->keys) { ! Config->get($k); } =head1 DESCRIPTION ! Stores site-specific configuration information. =head1 SEE ALSO ! Web::DBTable =head1 AUTHOR Index: Session.pm =================================================================== RCS file: /cvsroot/plweb/Web/Web/Session.pm,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** Session.pm 2001/09/30 02:37:57 1.2 --- Session.pm 2001/10/27 09:08:33 1.3 *************** *** 1,122 **** package Session; ! my $sessdb = Web::SimpleDB->new('/tmp/plweb-sess.gdb'); ! my $sessvardb = Web::SimpleDB->new('/tmp/plweb-sessvars.gdb'); ! my $uservardb = Web::SimpleDB->new('/tmp/plweb-uservars.gdb'); sub login { ! my $pkg = shift; ! my $user = shift; ! my $pwd = shift; ! my $proto; ! my $sessid = sprintf('%.8x', time) . sprintf('%.8x', rand() * 2**32); ! ! if ($proto = _usr_authenticate($user, $pwd)) { ! ! # Multiple logins aren't allowed ! foreach my $k ($sessdb->keys) { ! my @rcd = $sessdb->get($k); ! if ($rcd[0] eq $proto && $rcd[1] eq $user) { ! $sessid = $k; ! } ! } ! ! Browser->cookie('sessid', $sessid); ! $sessdb->set($sessid, $proto, $user); ! return bless { sessid=>$sessid, proto=>$proto, user=>$user }, $pkg; } ! return undef; } sub get { ! my $pkg = shift; ! my $self; ! my $sid = Browser->cookie('sessid'); ! ! return undef if ! $sid; ! ! my @rec = $sessdb->get($sid); ! if (! @rec) { ! Browser->cookie('sessid', ''); ! return undef; ! } ! ! my $self = bless { ! sessid => $sid, ! proto => $rec[0], ! user => $rec[1] ! }, $pkg; ! return $self; } sub logout { ! my $self = shift; ! $sessdb->delete($self->{'sessid'}); ! $sessvardb->delete($self->{'sessid'}); ! Browser->cookie('sessid', ''); } sub username { ! return $_[0]->{'user'}; } sub proto { ! return $_[0]->{'proto'}; } sub sess_var { ! my $self = shift; ! my $name = shift; ! my $val = shift; ! ! my %sessvars = $sessvardb->get($self->{'sessid'}); ! if (defined $val) { ! $sessvars{$name} = $val; ! $sessvardb->set($self->{'sessid'}, %sessvars); } ! return $sessvars{$name}; } sub user_var { ! my $self = shift; ! my $name = shift; ! my $val = shift; ! ! my %uservars = $uservardb->get($self->{'proto'}.':'.$self->{'user'}); ! if (defined $val) { ! $uservars{$name} = $val; ! $uservardb->set($self->{'proto'}.':'.$self->{'user'}, %uservars); } ! return $uservars{$name}; } sub _usr_authenticate { ! my $user = shift; ! my $pwd = shift; ! ! my $proto; ! ! my @authlist = Config->get(".auth.protolist"); ! ! foreach $proto (@authlist) { ! eval "use $proto\;"; ! die $@ if $@; ! } ! ! foreach $proto (@authlist) { ! return $proto if &{"$proto\::authenticate"}($user, $pwd); ! } ! return undef; } sub _usr_change_pwd { ! my $sess = shift; ! my $oldpw = shift; ! my $newpw = shift; ! ! eval "use $sess->{'proto'}\;"; ! ! return &{$sess->{'proto'} . '::change_pwd'}($sess->{'user'}, ! $oldpw, $newpw); } --- 1,134 ---- package Session; ! my $sessions = Web::DBTable->get('sys_sessions'); ! my $sessvars = Web::DBTable->get('sys_sessvars'); ! my $uservars = Web::DBTable->get('sys_uservars'); sub login { ! my $pkg = shift; ! my $user = shift; ! my $pwd = shift; ! my $proto; ! my $sessid = sprintf('%.8x', time) . sprintf('%.8x', rand() * 2**32); ! ! if ($proto = _usr_authenticate($user, $pwd)) { ! ! # Multiple logins aren't allowed ! my $oldsess; ! if ($oldsess = $sessions->first(['*'], "user='$user'")) { ! Browser->cookie('sessid', $oldsess->{'sessid'}); ! } else { ! $sessions->insert('sessid' => $sessid, ! 'proto' => $proto, 'user' => $user); } ! return bless { sessid=>$sessid, proto=>$proto, user=>$user }, $pkg; ! } ! return undef; } sub get { ! my $pkg = shift; ! my $self; ! my $sid = Browser->cookie('sessid'); ! ! return undef if ! $sid; ! ! my $rec = $sessions->first(['*'], "sessid='$sid'"); ! if (! $rec) { ! Browser->cookie('sessid', ''); ! return undef; ! } ! ! my $self = bless { ! sessid => $rec->{'sessid'}, ! proto => $rec->{'proto'}, ! user => $rec->{'user'} ! }, $pkg; ! return $self; } sub logout { ! my $self = shift; ! $sessions->delete("sessid='$self->{'sessid'}'"); ! $sessvars->delete("sessid='$self->{'sessid'}'"); ! Browser->cookie('sessid', ''); } sub username { ! return $_[0]->{'user'}; } sub proto { ! return $_[0]->{'proto'}; } sub sess_var { ! my $self = shift; ! my $name = shift; ! my $val = shift; ! my $where = "sessid='$self->{'sessid'}' and name='$name'"; ! ! my $sv = $sessvars->first(['*'], $where); ! if (defined $val) { ! if ($sv) { ! $sessvars->update($where, 'value' => $val); ! } else { ! $sessvars->insert('sessid' => $self->{'sessid'}, ! 'name' => $name, 'value' => $val); } ! $sv->{'value'} = $val; ! } ! ! return $sv->{'value'}; } sub user_var { ! my $self = shift; ! my $name = shift; ! my $val = shift; ! my $where = "user='$self->{'user'}' and name='$name'"; ! ! my $sv = $uservars->first(['*'], $where); ! if (defined $val) { ! if ($sv) { ! $uservars->update($where, 'value' => $val); ! } else { ! $uservars->insert('user' => $self->{'user'}, ! 'name' => $name, 'value' => $val); } ! $sv->{'value'} = $val; ! } ! ! return $sv->{'value'}; } sub _usr_authenticate { ! my $user = shift; ! my $pwd = shift; ! ! my $proto; ! ! my @authlist = split ',', Config->get("auth_mode"); ! ! foreach $proto (@authlist) { ! eval "use $proto\;"; ! die $@ if $@; ! } ! ! foreach $proto (@authlist) { ! return $proto if &{"$proto\::authenticate"}($user, $pwd); ! } ! return undef; } sub _usr_change_pwd { ! my $sess = shift; ! my $oldpw = shift; ! my $newpw = shift; ! ! eval "use $sess->{'proto'}\;"; ! ! return &{$sess->{'proto'} . '::change_pwd'}($sess->{'user'}, ! $oldpw, $newpw); } *************** *** 200,202 **** Joshua J. Berry <con...@so...> ! =cut \ No newline at end of file --- 212,214 ---- Joshua J. Berry <con...@so...> ! =cut --- SimpleDB.pm DELETED --- |