Code:
--- admin/Links/Table/Users.pm 12 May 2005 20:51:24 -0000 1.5
+++ admin/Links/Table/Users.pm 10 Jul 2009 09:25:48 -0000
@@ -35,7 +35,6 @@
return 1;
}
-
sub add {
# -------------------------------------------------------------------
my ($self, @args) = @_;
@@ -103,48 +102,38 @@
sub _plg_modify {
# -------------------------------------------------------------------
init();
- my $self = shift;
+ my $self = shift;
my $input = $self->common_param(@_) or return $self->error('BADARGS', 'FATAL', '$obj->insert(HASH or HASH_REF or CGI) only.');
- my $id = $input->{Username} or return $self->error("BADARGS", "FATAL", "No primary key passed to modify!");
- my $sth = $self->select('Username', 'Password', { Username => $id });
- my $rec = $sth->fetchrow_hashref;
- if ($rec) {
- if ($input->{Password} ne $rec->{Password}) {
- Links::Authenticate::auth('change_pass', { Username => $rec->{Username}, Password => $rec->{Password}, New_Password => $input->{Password} })
- or return $self->error('AUTHERROR', 'WARN', $Links::Authenticate::error);
- }
- }
-# Connect to the database if we are not already connected
- $self->connect;
+# Unfortunately, the Username column is the primary key, so hackery is needed
+# to change the username.
+ my $new_id = $input->{Username};
+ my $old_id = $input->{orig_username};
+ $old_id = $new_id unless length $old_id;
-# Copy the data and remove anything that doesn't make sense here.
- my $c = $self->{schema}->{cols};
- my $set = {};
- for (keys %$c) {
- $set->{$_} = $input->{$_} if exists $input->{$_};
- }
-
-# Remove primary keys from update clause.
- my $where;
- if ($input->{orig_username}) {
- $where->{Username} = $input->{orig_username};
- }
- else {
- foreach my $key (@{$self->{schema}->{pk}}) {
- $where->{$key} = delete $set->{$key} if exists $set->{$key};
- }
+ return $self->error("BADARGS", "FATAL", "No primary key passed to modify!") unless $old_id;
+
+ my $rec = $self->select('Username', 'Password', { Username => $old_id })->fetchrow_hashref;
+ return $self->error('BADARGS', 'FATAL', 'Non-existent primary key passed to modify!') unless $rec;
+
+ if ($input->{Password} ne $rec->{Password}) {
+ Links::Authenticate::auth('change_pass', { Username => $rec->{Username}, Password => $rec->{Password}, New_Password => $input->{Password} })
+ or return $self->error('AUTHERROR', 'WARN', $Links::Authenticate::error);
}
- return $self->error("NOPKTOMOD", "WARN") unless keys %$where == @{$self->{schema}->{pk}};
-# Remove timestamps - no sense updating.
- $self->_check_timestamp($where, $set) or return;
- foreach my $col (keys %$c) {
- delete $set->{$col} if $c->{$col}->{type} eq 'TIMESTAMP';
+# Check for Username uniqueness if it's changing.
+ if ($new_id ne $old_id) {
+ return $self->error('UNIQUE', 'WARN', 'Username', $new_id) if $self->count({ Username => $new_id });
+ $input->{Username} = $old_id;
}
-# Execute the update
- $self->update($set, $where) or return;
+ $self->SUPER::modify($input) or return;
+
+ if ($new_id ne $old_id) {
+ $self->update({ Username => $new_id }, { Username => $old_id }) or return;
+# Restore Username as the caller might need it (hashref).
+ $input->{Username} = $new_id;
+ }
return 1;
}