Skip to content

Commit 2a179bd

Browse files
authored
Delete avatar when deleting a user (#7495)
1 parent d872624 commit 2a179bd

2 files changed

Lines changed: 27 additions & 19 deletions

File tree

api/src/org/labkey/api/security/UserManager.java

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@
6363
import org.labkey.api.security.permissions.SiteAdminPermission;
6464
import org.labkey.api.security.roles.ApplicationAdminRole;
6565
import org.labkey.api.security.roles.SiteAdminRole;
66+
import org.labkey.api.thumbnail.ThumbnailProvider;
67+
import org.labkey.api.thumbnail.ThumbnailService;
68+
import org.labkey.api.thumbnail.ThumbnailService.ImageType;
6669
import org.labkey.api.util.HeartBeat;
6770
import org.labkey.api.util.HtmlString;
6871
import org.labkey.api.util.LinkBuilder;
@@ -455,7 +458,7 @@ public static Date getMostRecentLogin()
455458
Aggregate maxLoginValue = new Aggregate(createdFk, Aggregate.BaseType.MAX, null, true);
456459

457460
TableSelector logins = getRecentLoginOrOuts(LoggedInOrOut.in, null, uat, Collections.singleton(createdCol));
458-
Aggregate.Result result = logins.getAggregates(Collections.singletonList(maxLoginValue)).get(createdCol.getName()).get(0);
461+
Aggregate.Result result = logins.getAggregates(Collections.singletonList(maxLoginValue)).get(createdCol.getName()).getFirst();
459462
return (Date) result.getValue();
460463
}
461464

@@ -472,7 +475,7 @@ public static int getActiveDaysCount(Date since)
472475
Aggregate countDistinctDates = new Aggregate(datePartCol.getFieldKey(), Aggregate.BaseType.COUNT, null, true);
473476

474477
TableSelector logins = getRecentLoginOrOuts(LoggedInOrOut.in, since, uat, Collections.singleton(datePartCol));
475-
Aggregate.Result result = logins.getAggregates(Collections.singletonList(countDistinctDates)).get(datePartCol.getName()).get(0);
478+
Aggregate.Result result = logins.getAggregates(Collections.singletonList(countDistinctDates)).get(datePartCol.getName()).getFirst();
476479
return Math.toIntExact((long) result.getValue());
477480
}
478481

@@ -502,7 +505,6 @@ public static int getAuthCount(@Nullable Date since, boolean excludeSystemUsers,
502505
sql.append(" AND uat.Comment LIKE ");
503506
sql.appendStringLiteral("%" + UserAuditEvent.LOGGED_IN + "%", uat.getSqlDialect());
504507

505-
506508
if (apiKeyOnly)
507509
{
508510
sql.append(" AND uat.Comment LIKE ");
@@ -908,17 +910,17 @@ public static void auditBadVerificationToken(int userId, String oldEmail, String
908910

909911
public static void deleteUser(int userId) throws UserManagementException
910912
{
911-
User deletUser = getUser(userId);
912-
if (null == deletUser)
913+
User deleteUser = getUser(userId);
914+
if (null == deleteUser)
913915
return;
914916

915-
removeRecentUser(deletUser);
917+
removeRecentUser(deleteUser);
916918

917-
List<Throwable> errors = fireDeleteUser(deletUser);
919+
List<Throwable> errors = fireDeleteUser(deleteUser);
918920

919921
if (!errors.isEmpty())
920922
{
921-
Throwable first = errors.get(0);
923+
Throwable first = errors.getFirst();
922924
if (first instanceof RuntimeException)
923925
throw (RuntimeException)first;
924926
else
@@ -927,19 +929,25 @@ public static void deleteUser(int userId) throws UserManagementException
927929

928930
try (Transaction transaction = CORE.getScope().ensureTransaction())
929931
{
930-
boolean needToEnsureRootAdmins = SecurityManager.isRootAdmin(deletUser);
932+
boolean needToEnsureRootAdmins = SecurityManager.isRootAdmin(deleteUser);
931933

932934
SqlExecutor executor = new SqlExecutor(CORE.getSchema());
933935
executor.execute("DELETE FROM " + CORE.getTableInfoRoleAssignments() + " WHERE UserId=?", userId);
934936
executor.execute("DELETE FROM " + CORE.getTableInfoMembers() + " WHERE UserId=?", userId);
935-
addToUserHistory(deletUser, deletUser.getEmail() + " was deleted from the system");
937+
addToUserHistory(deleteUser, deleteUser.getEmail() + " was deleted from the system");
936938

937939
executor.execute("DELETE FROM " + CORE.getTableInfoUsersData() + " WHERE UserId=?", userId);
938-
LoginManager.deleteLoginsRow(deletUser, null);
940+
LoginManager.deleteLoginsRow(deleteUser, null);
939941
executor.execute("DELETE FROM " + CORE.getTableInfoPrincipals() + " WHERE UserId=?", userId);
940942
ApiKeyManager.get().deleteKeys(new SimpleFilter(FieldKey.fromParts("CreatedBy"), userId));
941943

942-
OntologyManager.deleteOntologyObject(deletUser.getEntityId(), ContainerManager.getSharedContainer(), true);
944+
OntologyManager.deleteOntologyObject(deleteUser.getEntityId(), ContainerManager.getSharedContainer(), true);
945+
946+
// GitHub Issue #714: Delete the user's avatar. Avatars use ImageType.Large, but delete all types just in case that changes.
947+
ThumbnailService svc = ThumbnailService.get();
948+
ThumbnailProvider provider = new AvatarThumbnailProvider(deleteUser);
949+
Arrays.stream(ImageType.values())
950+
.forEach(imageType -> svc.deleteThumbnail(provider, imageType));
943951

944952
// Clear user list immediately (before the last root admin check) and again after commit/rollback
945953
transaction.addCommitTask(UserManager::clearUserList, CommitTaskOption.IMMEDIATE, CommitTaskOption.POSTCOMMIT, CommitTaskOption.POSTROLLBACK);
@@ -952,7 +960,7 @@ public static void deleteUser(int userId) throws UserManagementException
952960
catch (Exception e)
953961
{
954962
LOG.error("deleteUser", e);
955-
throw new UserManagementException(deletUser.getEmail(), e);
963+
throw new UserManagementException(deleteUser.getEmail(), e);
956964
}
957965

958966
//TODO: Delete User files
@@ -986,7 +994,7 @@ public static void setUserActive(User currentUser, User userToAdjust, boolean ac
986994

987995
if (!errors.isEmpty())
988996
{
989-
Throwable first = errors.get(0);
997+
Throwable first = errors.getFirst();
990998
if (first instanceof RuntimeException)
991999
throw (RuntimeException)first;
9921000
else
@@ -1027,7 +1035,7 @@ public static void setUserActive(User currentUser, User userToAdjust, boolean ac
10271035
}
10281036
catch(RuntimeSQLException e)
10291037
{
1030-
LOG.error("setUserActive: " + e);
1038+
LOG.error("setUserActive", e);
10311039
throw new UserManagementException(userToAdjust.getEmail(), e);
10321040
}
10331041
}

api/src/org/labkey/api/thumbnail/ThumbnailService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.labkey.api.thumbnail;
1717

18+
import org.jetbrains.annotations.NotNull;
1819
import org.jetbrains.annotations.Nullable;
1920
import org.labkey.api.data.CacheableWriter;
2021
import org.labkey.api.data.views.DataViewProvider.EditInfo.ThumbnailType;
@@ -23,18 +24,17 @@
2324
import org.labkey.api.view.ViewContext;
2425

2526
import java.io.IOException;
27+
import java.util.Objects;
2628
import java.util.Set;
2729

2830
/**
2931
* Works with {@link ThumbnailProvider} implementations to cache thumbnails.
30-
* User: adam
31-
* Date: 10/8/11
3232
*/
3333
public interface ThumbnailService
3434
{
35-
static ThumbnailService get()
35+
static @NotNull ThumbnailService get()
3636
{
37-
return ServiceRegistry.get().getService(ThumbnailService.class);
37+
return Objects.requireNonNull(ServiceRegistry.get().getService(ThumbnailService.class));
3838
}
3939

4040
static void setInstance(ThumbnailService impl)

0 commit comments

Comments
 (0)