fix(backend): make sure user and project name are case-insensitive everywhere

This commit is contained in:
MiniDigger | Martin 2023-01-14 12:38:23 +01:00
parent 589e9db6a9
commit 9e1aed4a72
15 changed files with 28 additions and 31 deletions

View File

@ -51,11 +51,11 @@ public class LogProjectFilter implements Filter<LogProjectFilterInstance, String
@Override
public void createSql(final StringBuilder sb, final SqlStatement<?> q) {
if (StringUtils.isNotBlank(this.authorName)) {
sb.append(" AND la.p_owner_name = :authorName");
sb.append(" AND lower(la.p_owner_name) = lower(:authorName)");
q.bind("authorName", this.authorName);
}
if (StringUtils.isNotBlank(this.projectSlug)) {
sb.append(" AND la.p_slug = :projectSlug");
sb.append(" AND lower(la.p_slug) = lower(:projectSlug)");
q.bind("projectSlug", this.projectSlug);
}
}

View File

@ -43,7 +43,7 @@ public class LogSubjectFilter implements Filter<LogSubjectFilterInstance, String
@Override
public void createSql(final StringBuilder sb, final SqlStatement<?> q) {
if (StringUtils.isNotBlank(this.subjectName)) {
sb.append(" AND la.s_name = :subjectName");
sb.append(" AND lower(la.s_name) = lower(:subjectName)");
q.bind("subjectName", this.subjectName);
}
}

View File

@ -43,7 +43,7 @@ public class LogUserFilter implements Filter<LogUserFilterInstance, String> {
@Override
public void createSql(final StringBuilder sb, final SqlStatement<?> q) {
if (StringUtils.isNotBlank(this.userName)) {
sb.append(" AND la.user_name = :userName");
sb.append(" AND lower(la.user_name) = lower(:userName)");
q.bind("userName", this.userName);
}
}

View File

@ -41,7 +41,7 @@ public class ProjectAuthorFilter implements Filter<ProjectAuthorFilterInstance,
@Override
public void createSql(final StringBuilder sb, final SqlStatement<?> q) {
sb.append(" AND ").append("p.owner_name").append(" = ").append(":ownerName");
sb.append(" AND ").append("lower(p.owner_name)").append(" = ").append("lower(:ownerName)");
q.bind("ownerName", this.ownerName);
}

View File

@ -15,7 +15,7 @@ public interface PermissionsDAO {
@SqlQuery("SELECT coalesce(gt.permission, B'0'::bit(64))::bigint perm_value" +
" FROM users u " +
" LEFT JOIN global_trust gt ON u.id = gt.user_id" +
" WHERE u.id = :userId OR u.name = :userName")
" WHERE u.id = :userId OR lower(u.name) = lower(:userName)")
Permission _getGlobalPermission(Long userId, String userName);
default Permission getGlobalPermission(final long userId) {
@ -29,7 +29,7 @@ public interface PermissionsDAO {
@SqlQuery("SELECT (coalesce(gt.permission, B'0'::bit(64)) | coalesce(pt.permission, B'0'::bit(64)) | coalesce(ot.permission, B'0'::bit(64)))::bigint AS perm_value" +
" FROM users u " +
" LEFT JOIN global_trust gt ON u.id = gt.user_id" +
" LEFT JOIN projects p ON (lower(p.owner_name) = lower(:author) AND p.slug = :slug) OR p.id = :projectId" +
" LEFT JOIN projects p ON (lower(p.owner_name) = lower(:author) AND lower(p.slug) = lower(:slug)) OR p.id = :projectId" +
" LEFT JOIN project_trust pt ON u.id = pt.user_id AND pt.project_id = p.id" +
" LEFT JOIN organization_trust ot ON u.id = ot.user_id AND ot.organization_id = p.owner_id" +
" WHERE u.id = :userId")

View File

@ -39,7 +39,7 @@ public interface UsersDAO {
u.theme,
exists(SELECT 1 FROM organizations o WHERE u.id = o.user_id) AS is_organization
FROM users u
WHERE u.name = :name
WHERE lower(u.name) = lower(:name)
OR u.id = :id
GROUP BY u.id
""")

View File

@ -23,7 +23,7 @@ public interface HangarUsersDAO {
u.uuid o_user_uuid
FROM users u
LEFT JOIN organizations o ON u.id = o.user_id
WHERE u.name = :userName
WHERE lower(u.name) = lower(:userName)
""")
Pair<UserTable, OrganizationTable> getUserAndOrg(String userName);

View File

@ -21,7 +21,7 @@ public interface HangarProjectPagesDAO {
" exists(SELECT 1 FROM project_home_pages php WHERE php.page_id = pp.id AND php.project_id = p.id) AS home" +
" FROM project_pages pp" +
" JOIN projects p ON pp.project_id = p.id" +
" WHERE lower(p.owner_name) = lower(:author) AND lower(p.slug) = lower(:slug) AND pp.slug = :pageSlug")
" WHERE lower(p.owner_name) = lower(:author) AND lower(p.slug) = lower(:slug) AND lower(pp.slug) = lower(:pageSlug)")
ExtendedProjectPage getProjectPage(String author, String slug, String pageSlug);
@SqlQuery("SELECT pp.*," +

View File

@ -55,9 +55,6 @@ public interface UserDAO {
return this._getUserTable(null, null, uuid);
}
@SqlQuery("SELECT * FROM users WHERE email = :email")
UserTable getUserTableByEmail(String email);
@SqlQuery("""
SELECT u.name
FROM users u

View File

@ -37,6 +37,6 @@ public interface OrganizationMembersDAO extends MembersDAO<OrganizationMemberTab
" FROM organization_members uom" +
" JOIN organizations o ON o.id = uom.organization_id" +
" JOIN users u ON uom.user_id = u.id" +
" WHERE u.name = :user")
" WHERE lower(u.name) = lower(:user)")
Map<String, Boolean> getUserOrganizationMembershipVisibility(String user);
}

View File

@ -41,7 +41,7 @@ public interface ProjectPagesDAO {
@SqlQuery("SELECT * FROM project_pages WHERE project_id = :projectId AND parent_id = :parentId AND name = :name")
ProjectPageTable getChildPage(long projectId, long parentId, String name);
@SqlQuery("SELECT * FROM project_pages WHERE project_id = :projectId AND parent_id IS NULL AND slug = :slug")
@SqlQuery("SELECT * FROM project_pages WHERE project_id = :projectId AND parent_id IS NULL AND lower(slug) = lower(:slug)")
ProjectPageTable getRootPage(long projectId, String slug);
@SqlQuery("SELECT * FROM project_pages WHERE project_id = :projectId AND id = :pageId")

View File

@ -62,7 +62,7 @@ public interface OrganizationRolesDAO extends IRolesDAO<OrganizationRoleTable> {
JOIN users u ON uor.user_id = u.id
JOIN users ou ON ou.id = o.user_id
JOIN users ow ON o.owner_id = ow.id
WHERE u.name = :user AND uor.accepted IS TRUE
WHERE lower(u.name) = lower(:user) AND uor.accepted IS TRUE
""")
Map<String, OrganizationRoleTable> getUserOrganizationRoles(String user, Long userId);
}

View File

@ -134,7 +134,7 @@ public interface ProjectsApiDAO {
" JOIN user_project_roles upr ON p.id = upr.project_id " +
" JOIN users u ON upr.user_id = u.id " +
" JOIN roles r ON upr.role_type = r.name " +
" WHERE p.slug = :slug AND p.owner_name = :author " +
" WHERE lower(p.slug) = lower(:slug) AND lower(p.owner_name) = lower(:author) " +
" GROUP BY u.name ORDER BY max(r.permission::bigint) DESC " +
" <offsetLimit>")
List<ProjectMember> getProjectMembers(String author, String slug, @BindPagination RequestPagination pagination);
@ -143,7 +143,7 @@ public interface ProjectsApiDAO {
" FROM projects p " +
" JOIN user_project_roles upr ON p.id = upr.project_id " +
" JOIN users u ON upr.user_id = u.id " +
" WHERE p.slug = :slug AND p.owner_name = :author " +
" WHERE lower(p.slug) = lower(:slug) AND lower(p.owner_name) = lower(:author) " +
" GROUP BY u.name")
long getProjectMembersCount(String author, String slug);
@ -164,7 +164,7 @@ public interface ProjectsApiDAO {
" JOIN users u ON ps.user_id = u.id " +
" LEFT JOIN user_global_roles ugr ON u.id = ugr.user_id" +
" LEFT JOIN roles r ON ugr.role_id = r.id" +
" WHERE p.slug = :slug AND p.owner_name = :author " +
" WHERE lower(p.slug) = lower(:slug) AND lower(p.owner_name) = lower(:author) " +
" GROUP BY u.id" +
" LIMIT :limit OFFSET :offset")
List<User> getProjectStargazers(String author, String slug, long limit, long offset);
@ -172,7 +172,7 @@ public interface ProjectsApiDAO {
@SqlQuery("SELECT count(ps.user_id) " +
" FROM projects p " +
" JOIN project_stars ps ON p.id = ps.project_id " +
" WHERE p.slug = :slug AND p.owner_name = :author " +
" WHERE lower(p.slug) = lower(:slug) AND lower(p.owner_name) = lower(:author) " +
" GROUP BY ps.user_id")
Long getProjectStargazersCount(String author, String slug);
@ -193,7 +193,7 @@ public interface ProjectsApiDAO {
" JOIN users u ON pw.user_id = u.id " +
" LEFT JOIN user_global_roles ugr ON u.id = ugr.user_id" +
" LEFT JOIN roles r ON ugr.role_id = r.id" +
" WHERE p.slug = :slug AND p.owner_name = :author" +
" WHERE lower(p.slug) = lower(:slug) AND lower(p.owner_name) = lower(:author)" +
" GROUP BY u.id" +
" LIMIT :limit OFFSET :offset")
List<User> getProjectWatchers(String author, String slug, long limit, long offset);
@ -201,7 +201,7 @@ public interface ProjectsApiDAO {
@SqlQuery("SELECT count(pw.user_id) " +
" FROM projects p " +
" JOIN project_watchers pw ON p.id = pw.project_id " +
" WHERE p.slug = :slug AND p.owner_name = :author " +
" WHERE lower(p.slug) = lower(:slug) AND lower(p.owner_name) = lower(:author) " +
" GROUP BY pw.user_id")
Long getProjectWatchersCount(String author, String slug);
@ -213,8 +213,8 @@ public interface ProjectsApiDAO {
" LEFT JOIN project_versions_downloads pvd ON dates.day = pvd.day" +
" LEFT JOIN project_views pv ON dates.day = pv.day AND pvd.project_id = pv.project_id" +
" WHERE " +
" p.owner_name = :author AND " +
" p.slug = :slug AND" +
" lower(p.owner_name) = lower(:author) AND " +
" lower(p.slug) = lower(:slug) AND" +
" (pvd IS NULL OR pvd.project_id = p.id)" +
" GROUP BY pv.views, dates.day")
Map<String, DayProjectStats> getProjectStats(String author, String slug, OffsetDateTime fromDate, OffsetDateTime toDate);

View File

@ -40,7 +40,7 @@ public interface UsersApiDAO {
" WHERE " +
" <if(!canSeeHidden)> (hp.visibility = 0" +
" <if(userId)>OR (<userId> = ANY(hp.project_members) AND hp.visibility != 4)<endif>) AND<endif>" +
" u.name = :user" +
" lower(u.name) = lower(:user)" +
" ORDER BY <sortOrder> LIMIT :limit OFFSET :offset")
List<ProjectCompact> getUserStarred(String user, @Define boolean canSeeHidden, @Define Long userId, @Define String sortOrder, long limit, long offset);
@ -52,7 +52,7 @@ public interface UsersApiDAO {
" WHERE " +
" <if(!canSeeHidden)> (hp.visibility = 0" +
" <if(userId)>OR (<userId> = ANY(hp.project_members) AND hp.visibility != 4)<endif>) AND<endif>" +
" u.name = :user")
" lower(u.name) = lower(:user)")
long getUserStarredCount(String user, @Define boolean canSeeHidden, @Define Long userId);
@RegisterConstructorMapper(ProjectCompact.class)
@ -77,7 +77,7 @@ public interface UsersApiDAO {
" WHERE " +
" <if(!canSeeHidden)> (hp.visibility = 0" +
" <if(userId)>OR (<userId> = ANY(hp.project_members) AND hp.visibility != 4)<endif>) AND<endif>" +
" u.name = :user" +
" lower(u.name) = lower(:user)" +
" ORDER BY <sortOrder> LIMIT :limit OFFSET :offset")
List<ProjectCompact> getUserWatching(String user, @Define boolean canSeeHidden, @Define Long userId, @Define String sortOrder, long limit, long offset);
@ -89,7 +89,7 @@ public interface UsersApiDAO {
" WHERE " +
" <if(!canSeeHidden)> (hp.visibility = 0" +
" <if(userId)>OR (<userId> = ANY(hp.project_members) AND hp.visibility != 4)<endif>) AND<endif>" +
" u.name = :user")
" lower(u.name) = lower(:user)")
long getUserWatchingCount(String user, @Define boolean canSeeHidden, @Define Long userId);
@RegisterConstructorMapper(User.class)
@ -140,7 +140,7 @@ public interface UsersApiDAO {
SELECT uh.old_name, uh.new_name, uh.date
FROM users_history uh
JOIN users u ON uh.uuid = u.uuid
WHERE u.name = :name AND uh.date >= :date
WHERE lower(u.name) = lower(:name) AND uh.date >= :date
ORDER BY date DESC
""")
List<UserNameChange> getUserNameHistory(@NotNull String name, @NotNull OffsetDateTime date);

View File

@ -194,8 +194,8 @@ public interface VersionsApiDAO {
" JOIN platform_versions plv ON pvpd.platform_version_id = plv.id," +
" (SELECT generate_series(:fromDate::date, :toDate::date, INTERVAL '1 DAY') AS day) dates" +
" LEFT JOIN project_versions_downloads pvd ON dates.day = pvd.day" +
" WHERE p.owner_name = :author" +
" AND p.slug = :slug" +
" WHERE lower(p.owner_name) = lower(:author)" +
" AND lower(p.slug) = lower(:slug)" +
" AND pv.version_string = :versionString" +
" AND plv.platform = :platform" +
" AND (pvd IS NULL OR (pvd.project_id = p.id AND pvd.version_id = pv.id));")