@@ -7,11 +7,13 @@ import (
77 "os/exec"
88 "path/filepath"
99 "strings"
10+ "time"
1011
1112 "golang.org/x/text/cases"
1213 "golang.org/x/text/language"
1314 "gopkg.in/yaml.v3"
1415
16+ "github.com/CompassSecurity/pipeleak/pkg/format"
1517 "github.com/rs/zerolog/log"
1618 "github.com/spf13/cobra"
1719 "github.com/spf13/cobra/doc"
@@ -47,14 +49,15 @@ func generateDocs(cmd *cobra.Command, dir string, level int) error {
4749
4850 if len (cmd .Commands ()) > 0 {
4951 dir = filepath .Join (dir , cmd .Name ())
50- if err := os .MkdirAll (dir , os . ModePerm ); err != nil {
52+ if err := os .MkdirAll (dir , format . DirUserGroupRead ); err != nil {
5153 return err
5254 }
5355 filename = filepath .Join (dir , "index.md" )
5456 } else {
5557 filename = filepath .Join (dir , getFileName (cmd , level ))
5658 }
5759
60+ // #nosec G304 - Creating docs markdown file at controlled internal path during docs generation
5861 f , err := os .Create (filename )
5962 if err != nil {
6063 return err
@@ -164,19 +167,21 @@ func writeMkdocsYaml(rootCmd *cobra.Command, outputDir string) error {
164167 nav = append ([]map [string ]interface {}{introEntry , methodologyEntry }, nav ... )
165168
166169 assetsDir := filepath .Join (outputDir , "pipeleak" , "assets" )
167- if err := os .MkdirAll (assetsDir , os . ModePerm ); err != nil {
170+ if err := os .MkdirAll (assetsDir , format . DirUserGroupRead ); err != nil {
168171 return err
169172 }
170173
171174 assetFiles := []string {"logo.png" , "favicon.ico" , "social.png" }
172175 for _ , fname := range assetFiles {
173176 src := filepath .Join (".." , ".." , "docs" , fname )
174177 dst := filepath .Join (assetsDir , fname )
178+ // #nosec G304 - Reading doc assets from controlled internal paths during docs generation
175179 data , err := os .ReadFile (src )
176180 if err != nil {
177181 return err
178182 }
179- if err := os .WriteFile (dst , data , 0644 ); err != nil {
183+ // #nosec G306 - Documentation assets should be world-readable
184+ if err := os .WriteFile (dst , data , format .FilePublicRead ); err != nil {
180185 return err
181186 }
182187 }
@@ -283,7 +288,8 @@ func writeMkdocsYaml(rootCmd *cobra.Command, outputDir string) error {
283288 }
284289
285290 filename := filepath .Join (outputDir , "mkdocs.yml" )
286- return os .WriteFile (filename , yamlData , 0644 )
291+ // #nosec G306 - mkdocs.yml is a public documentation configuration file
292+ return os .WriteFile (filename , yamlData , format .FilePublicRead )
287293}
288294
289295var serve bool
@@ -330,7 +336,7 @@ func copyDir(src, dst string) error {
330336 if err != nil {
331337 return err
332338 }
333- if err := os .MkdirAll (dst , os . ModePerm ); err != nil {
339+ if err := os .MkdirAll (dst , format . DirUserGroupRead ); err != nil {
334340 return err
335341 }
336342 for _ , entry := range entries {
@@ -350,11 +356,13 @@ func copyDir(src, dst string) error {
350356}
351357
352358func copyFile (src , dst string ) error {
359+ // #nosec G304 - Copying docs files between controlled internal paths during docs generation
353360 in , err := os .Open (src )
354361 if err != nil {
355362 return err
356363 }
357364 defer func () { _ = in .Close () }()
365+ // #nosec G304 - Creating docs destination file at controlled internal path during docs generation
358366 out , err := os .Create (dst )
359367 if err != nil {
360368 return err
@@ -382,7 +390,7 @@ func Docs(cmd *cobra.Command, args []string) {
382390 }
383391 }
384392
385- if err := os .MkdirAll (outputDir , os . ModePerm ); err != nil {
393+ if err := os .MkdirAll (outputDir , format . DirUserGroupRead ); err != nil {
386394 log .Fatal ().Err (err ).Msg ("Failed to create pipeleak directory" )
387395 }
388396
@@ -414,7 +422,15 @@ func Docs(cmd *cobra.Command, args []string) {
414422 siteDir := filepath .Join (outputDir , "site" )
415423 log .Info ().Msgf ("Serving docs %s at http://localhost:8000 ... (Ctrl+C to quit)" , siteDir )
416424 http .Handle ("/" , http .FileServer (http .Dir (siteDir )))
417- if err := http .ListenAndServe (":8000" , nil ); err != nil {
425+
426+ server := & http.Server {
427+ Addr : ":8000" ,
428+ ReadTimeout : 15 * time .Second ,
429+ WriteTimeout : 15 * time .Second ,
430+ IdleTimeout : 60 * time .Second ,
431+ }
432+
433+ if err := server .ListenAndServe (); err != nil {
418434 log .Fatal ().Err (err ).Msg ("Failed to start HTTP server" )
419435 }
420436 }
0 commit comments