mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 19:38:23 +00:00 
			
		
		
		
	| @@ -4,18 +4,13 @@ | ||||
| package repo | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"path" | ||||
|  | ||||
| 	"code.gitea.io/gitea/models/renderhelper" | ||||
| 	"code.gitea.io/gitea/modules/charset" | ||||
| 	"code.gitea.io/gitea/modules/git" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"code.gitea.io/gitea/modules/markup" | ||||
| 	"code.gitea.io/gitea/modules/typesniffer" | ||||
| 	"code.gitea.io/gitea/modules/util" | ||||
| 	"code.gitea.io/gitea/services/context" | ||||
| ) | ||||
|  | ||||
| @@ -44,22 +39,8 @@ func RenderFile(ctx *context.Context) { | ||||
| 	} | ||||
| 	defer dataRc.Close() | ||||
|  | ||||
| 	buf := make([]byte, 1024) | ||||
| 	n, _ := util.ReadAtMost(dataRc, buf) | ||||
| 	buf = buf[:n] | ||||
|  | ||||
| 	st := typesniffer.DetectContentType(buf) | ||||
| 	isTextFile := st.IsText() | ||||
|  | ||||
| 	rd := charset.ToUTF8WithFallbackReader(io.MultiReader(bytes.NewReader(buf), dataRc), charset.ConvertOpts{}) | ||||
| 	ctx.Resp.Header().Add("Content-Security-Policy", "frame-src 'self'; sandbox allow-scripts") | ||||
|  | ||||
| 	if markupType := markup.DetectMarkupTypeByFileName(blob.Name()); markupType == "" { | ||||
| 		if isTextFile { | ||||
| 			_, _ = io.Copy(ctx.Resp, rd) | ||||
| 		} else { | ||||
| 			http.Error(ctx.Resp, "Unsupported file type render", http.StatusInternalServerError) | ||||
| 		} | ||||
| 		http.Error(ctx.Resp, "Unsupported file type render", http.StatusBadRequest) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| @@ -68,7 +49,29 @@ func RenderFile(ctx *context.Context) { | ||||
| 		CurrentTreePath: path.Dir(ctx.Repo.TreePath), | ||||
| 	}).WithRelativePath(ctx.Repo.TreePath).WithInStandalonePage(true) | ||||
|  | ||||
| 	err = markup.Render(rctx, rd, ctx.Resp) | ||||
| 	renderer, err := markup.FindRendererByContext(rctx) | ||||
| 	if err != nil { | ||||
| 		http.Error(ctx.Resp, "Unable to find renderer", http.StatusBadRequest) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	extRenderer, ok := renderer.(markup.ExternalRenderer) | ||||
| 	if !ok { | ||||
| 		http.Error(ctx.Resp, "Unable to get external renderer", http.StatusBadRequest) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// To render PDF in iframe, the sandbox must NOT be used (iframe & CSP header). | ||||
| 	// Chrome blocks the PDF rendering when sandboxed, even if all "allow-*" are set. | ||||
| 	// HINT: PDF-RENDER-SANDBOX: PDF won't render in sandboxed context | ||||
| 	extRendererOpts := extRenderer.GetExternalRendererOptions() | ||||
| 	if extRendererOpts.ContentSandbox != "" { | ||||
| 		ctx.Resp.Header().Add("Content-Security-Policy", "frame-src 'self'; sandbox "+extRendererOpts.ContentSandbox) | ||||
| 	} else { | ||||
| 		ctx.Resp.Header().Add("Content-Security-Policy", "frame-src 'self'") | ||||
| 	} | ||||
|  | ||||
| 	err = markup.RenderWithRenderer(rctx, renderer, dataRc, ctx.Resp) | ||||
| 	if err != nil { | ||||
| 		log.Error("Failed to render file %q: %v", ctx.Repo.TreePath, err) | ||||
| 		http.Error(ctx.Resp, "Failed to render file", http.StatusInternalServerError) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user