From df91ed2aac474ff0c670285d4be249b627b06b72 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 6 Jun 2026 15:34:49 -0500 Subject: [PATCH] fix(wiki): check directory before file lookup to prevent raw redirect Directory paths were being found by wikiEntryByName as non-.md entries, triggering a redirect to /wiki/raw/. Now checks for directories first and handles index file lookup before the file/raw detection. --- routers/web/repo/wiki.go | 59 ++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go index cd05558225..25286fbd67 100644 --- a/routers/web/repo/wiki.go +++ b/routers/web/repo/wiki.go @@ -254,38 +254,39 @@ func renderViewPage(ctx *context.Context) (*git.Repository, *git.TreeEntry) { wikiTree := buildWikiTree(commit) ctx.Data["WikiTree"] = wikiTree + // Check if path is a directory first (before file lookup) + dirEntry, _ := commit.GetTreeEntryByPath(string(pageName)) + if dirEntry != nil && dirEntry.IsDir() { + // Path is a directory - try index files or show folder listing + var entry *git.TreeEntry + foundIndex := false + for _, indexName := range []string{"README", "Home", "index"} { + indexPath := wiki_service.WebPath(string(pageName) + "/" + indexName) + idxEntry, _, idxNoEntry, _ := wikiEntryByName(ctx, commit, indexPath) + if !idxNoEntry && idxEntry != nil { + pageName = indexPath + entry = idxEntry + _, displayName = wiki_service.WebPathToUserTitle(pageName) + ctx.Data["PageURL"] = wiki_service.WebPathToURLPath(pageName) + ctx.Data["Title"] = displayName + foundIndex = true + break + } + } + if !foundIndex { + ctx.Data["IsWikiFolder"] = true + ctx.Data["WikiFolderPath"] = string(pageName) + folderEntries := listWikiFolderEntries(commit, string(pageName)) + ctx.Data["WikiFolderEntries"] = folderEntries + return wikiGitRepo, nil + } + _ = entry // will be used below via pageName lookup + } + // lookup filename in wiki - get gitTree entry , real filename entry, pageFilename, noEntry, isRaw := wikiEntryByName(ctx, commit, pageName) if noEntry { - // Check if path is a directory - try index files or show folder listing - dirEntry, _ := commit.GetTreeEntryByPath(string(pageName)) - if dirEntry != nil && dirEntry.IsDir() { - // Try index files: README.md, Home.md, index.md - for _, indexName := range []string{"README", "Home", "index"} { - indexPath := wiki_service.WebPath(string(pageName) + "/" + indexName) - idxEntry, _, idxNoEntry, _ := wikiEntryByName(ctx, commit, indexPath) - if !idxNoEntry && idxEntry != nil { - // Found index file - render it - pageName = indexPath - entry = idxEntry - _, displayName = wiki_service.WebPathToUserTitle(pageName) - ctx.Data["PageURL"] = wiki_service.WebPathToURLPath(pageName) - ctx.Data["Title"] = displayName - noEntry = false - break - } - } - if noEntry { - // No index file - show folder listing - ctx.Data["IsWikiFolder"] = true - ctx.Data["WikiFolderPath"] = string(pageName) - folderEntries := listWikiFolderEntries(commit, string(pageName)) - ctx.Data["WikiFolderEntries"] = folderEntries - return wikiGitRepo, nil - } - } else { - ctx.Redirect(ctx.Repo.RepoLink + "/wiki/?action=_pages") - } + ctx.Redirect(ctx.Repo.RepoLink + "/wiki/?action=_pages") } if isRaw { ctx.Redirect(ctx.Repo.RepoLink + "/wiki/raw/" + string(pageName)) -- 2.52.0