From c59a0f746eb24da94869fb5b9b29c9da5eba481f Mon Sep 17 00:00:00 2001 From: logikonline Date: Wed, 4 Mar 2026 20:21:14 -0500 Subject: [PATCH] feat(packages): split package list into public and private sections Separate packages into PublicPackages and PrivatePackages arrays for template rendering. Add CanWritePackages flag to determine if viewer has permission to publish packages (admin, owner, or org team member with write access). Revert anonymous user 404 redirect to show proper error page. --- routers/web/user/package.go | 32 ++++++++++++++++++++++++++++ services/context/context_response.go | 6 ------ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/routers/web/user/package.go b/routers/web/user/package.go index 8e58965259..5206adf418 100644 --- a/routers/web/user/package.go +++ b/routers/web/user/package.go @@ -155,6 +155,35 @@ func ListPackages(ctx *context.Context) { return } + // Split packages into public and private lists for the template + var publicPackages, privatePackages []*packages_model.PackageDescriptor + for _, pd := range pds { + if pd.Package.IsPrivate { + privatePackages = append(privatePackages, pd) + } else { + publicPackages = append(publicPackages, pd) + } + } + + // Determine if the viewer can write packages + canWritePackages := false + if ctx.Doer != nil { + if ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID { + canWritePackages = true + } else if ctx.ContextUser.IsOrganization() { + org := org_model.OrgFromUser(ctx.ContextUser) + teams, err := org_model.GetUserOrgTeams(ctx, org.ID, ctx.Doer.ID) + if err == nil { + for _, t := range teams { + if t.UnitAccessMode(ctx, unit.TypePackages) >= perm.AccessModeWrite { + canWritePackages = true + break + } + } + } + } + } + ctx.Data["Title"] = ctx.Tr("packages.title") ctx.Data["IsPackagesPage"] = true ctx.Data["Query"] = query @@ -162,6 +191,9 @@ func ListPackages(ctx *context.Context) { ctx.Data["AvailableTypes"] = packages_model.TypeList ctx.Data["HasPackages"] = hasPackages ctx.Data["PackageDescriptors"] = pds + ctx.Data["PublicPackages"] = publicPackages + ctx.Data["PrivatePackages"] = privatePackages + ctx.Data["CanWritePackages"] = canWritePackages ctx.Data["Total"] = total ctx.Data["RepositoryAccessMap"] = repositoryAccessMap diff --git a/services/context/context_response.go b/services/context/context_response.go index 1ae7779493..dc35b4c7d6 100644 --- a/services/context/context_response.go +++ b/services/context/context_response.go @@ -160,12 +160,6 @@ func (ctx *Context) notFoundInternal(logMsg string, logErr error) { return } - // Anonymous users get redirected to the homepage instead of seeing a 404 - if ctx.Doer == nil { - ctx.Redirect(setting.AppSubURL + "/") - return - } - ctx.Data["IsRepo"] = ctx.Repo.Repository != nil ctx.Data["Title"] = "Page Not Found" ctx.HTML(http.StatusNotFound, "status/404")