Skip to content

Commit ec812c9

Browse files
Merge branch '6.0/shred-users-with-attrs' into 6.0-trunk
2 parents 9ccb680 + d52271b commit ec812c9

3 files changed

Lines changed: 81 additions & 1 deletion

File tree

lib/RT/User.pm

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3180,7 +3180,6 @@ sub __DependsOn {
31803180
ACL
31813181
Articles
31823182
Attachments
3183-
Attributes
31843183
CachedGroupMembers
31853184
Classes
31863185
CustomFieldValues
@@ -3215,6 +3214,23 @@ sub __DependsOn {
32153214
push @var_objs, $objs;
32163215
}
32173216
}
3217+
3218+
# Attributes of other objects (not owned by this user) that reference this
3219+
# user in Creator/LastUpdatedBy. The user's own attributes are already
3220+
# handled as direct DEPENDS_ON dependencies via $self->Attributes, so
3221+
# exclude them to avoid a duplicate VARIABLE dependency without a resolver.
3222+
for my $method (qw(Creator LastUpdatedBy)) {
3223+
my $objs = RT::Attributes->new( $self->CurrentUser );
3224+
$objs->Limit( FIELD => $method, VALUE => $self->id );
3225+
$objs->Limit( FIELD => 'ObjectType', OPERATOR => '!=', VALUE => ref $self );
3226+
push @var_objs, $objs;
3227+
3228+
my $other_user_attrs = RT::Attributes->new( $self->CurrentUser );
3229+
$other_user_attrs->Limit( FIELD => $method, VALUE => $self->id );
3230+
$other_user_attrs->Limit( FIELD => 'ObjectType', VALUE => ref $self );
3231+
$other_user_attrs->Limit( FIELD => 'ObjectId', OPERATOR => '!=', VALUE => $self->id );
3232+
push @var_objs, $other_user_attrs;
3233+
}
32183234
$deps->_PushDependencies(
32193235
BaseObject => $self,
32203236
Flags => RT::Shredder::Constants::DEPENDS_ON | RT::Shredder::Constants::VARIABLE,

t/shredder/02user.t

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,22 @@ $test->create_savepoint('aucreate'); # after user create
6767
cmp_deeply( $test->dump_current_and_savepoint('aucreate'), "current DB equal to savepoint");
6868
}
6969

70+
{ # Shred a user who has a RecentlyViewedTickets attribute (their own attribute)
71+
diag "Shred a user with a RecentlyViewedTickets attribute";
72+
73+
my $user = RT::User->new( RT->SystemUser );
74+
my ( $uid, $msg ) = $user->Create( Name => 'user_with_attr', Privileged => 1, Disabled => 0 );
75+
ok( $uid, "created user" ) or diag "error: $msg";
76+
77+
$user->AddRecentlyViewedTicket($ticket);
78+
ok( $user->FirstAttribute('RecentlyViewedTickets'), "user has RecentlyViewedTickets attribute" );
79+
80+
my $shredder = $test->shredder_new();
81+
eval { $shredder->Wipeout( Object => $user ) };
82+
is( $@, '', "shredding user with RecentlyViewedTickets attribute does not throw" );
83+
}
84+
85+
cmp_deeply( $test->dump_current_and_savepoint('aucreate'),
86+
"current DB equal to savepoint after shredding user with own attribute" );
87+
7088
done_testing;

t/shredder/03plugin_users.t

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,4 +193,50 @@ diag "Shred a user who owns 2 tickets";
193193
}
194194
cmp_deeply( $test->dump_current_and_savepoint('clean'), "current DB equal to savepoint");
195195

196+
diag "Shred a user who created an attribute on another user, replacing relations";
197+
{
198+
my $user_a = RT::User->new( RT->SystemUser );
199+
my ( $uid_a, $msg ) = $user_a->Create( Name => 'user_attr_owner', Privileged => 1, Disabled => 0 );
200+
ok( $uid_a, "created user A" ) or diag "error: $msg";
201+
202+
my $user_b = RT::User->new( RT->SystemUser );
203+
my ($uid_b);
204+
( $uid_b, $msg ) = $user_b->Create( Name => 'user_attr_target', Privileged => 1, Disabled => 0 );
205+
ok( $uid_b, "created user B" ) or diag "error: $msg";
206+
207+
# Simulate user_b having an attribute whose Creator is user_a
208+
$user_b->SetAttribute( Name => 'SomeAttr', Content => 'value' );
209+
my $attr = $user_b->FirstAttribute('SomeAttr');
210+
ok( $attr, "attribute created on user B" );
211+
$attr->__Set( Field => 'Creator', Value => $uid_a );
212+
$attr->__Set( Field => 'LastUpdatedBy', Value => $uid_a );
213+
is( $attr->Creator, $uid_a, "attribute Creator is user A" );
214+
215+
my $plugin = RT::Shredder::Plugin::Users->new;
216+
my ($status);
217+
( $status, $msg ) = $plugin->TestArgs( status => 'any', name => 'user_attr_owner', replace_relations => $uid_b );
218+
ok( $status, "plugin arguments ok" ) or diag "error: $msg";
219+
220+
my $shredder = $test->shredder_new();
221+
my @objs;
222+
( $status, @objs ) = $plugin->Run;
223+
ok( $status, "plugin ran ok" ) or diag "error: @objs";
224+
@objs = RT::Shredder->CastObjectsToRecords( Objects => \@objs );
225+
226+
( $status, $msg ) = $plugin->SetResolvers( Shredder => $shredder );
227+
ok( $status, "set resolvers" ) or diag "error: $msg";
228+
229+
$shredder->PutObjects( Objects => \@objs );
230+
eval { $shredder->WipeoutAll };
231+
is( $@, '', "shredding user who created another user's attribute does not throw" );
232+
233+
$attr->Load( $attr->id );
234+
is( $attr->Creator, $uid_b, "attribute Creator updated to user B" );
235+
is( $attr->LastUpdatedBy, $uid_b, "attribute LastUpdatedBy updated to user B" );
236+
237+
$shredder->Wipeout( Object => $user_b );
238+
}
239+
cmp_deeply( $test->dump_current_and_savepoint('clean'),
240+
"current DB equal to savepoint after shredding user who created another's attribute" );
241+
196242
done_testing();

0 commit comments

Comments
 (0)