func (l *StaticLoader) WriteAllTemplates(targetDir gopath.GoPath) error { if err := os.MkdirAll(targetDir.Path(), 0777); err != nil { return fmt.Errorf("couldn't create dir %s: %s", targetDir, err) } for _, name := range resources.AllFileNames { var targetFile = targetDir.JoinPath(name) if targetFile.HasErr() { return fmt.Errorf("couldn't create path for template %s: %s", name, targetFile.Err()) } content, err := resources.FSString(l.useLocalTemplates, name) if err != nil { return fmt.Errorf("couldn't open template %s: %s", name, err) } err = os.MkdirAll(targetFile.Dir().Path(), 0777) if err != nil { return fmt.Errorf("couldn't create directory %s: %s", targetFile.Dir().Path(), err) } out, err := os.Create(targetFile.Path()) if err != nil { return fmt.Errorf("couldn't create file %s: %s", targetFile, err) } out.WriteString(content) if out.Close(); err != nil { return fmt.Errorf("couldn't close file %s: %s", targetFile, err) } } return nil }
func isPathWriteable(p gopath.GoPath) bool { if p.IsDirectory() { return isDirWriteable(p) } return isFileWriteable(p) }
// guessExtension tries to append the file extension, if missing. // If the given path points to a valid file, simply returns the argument. // Otherwise, it looks for all files in the directory beginning with the // filename and a dot ("."), and returns the first match in alphabetic order. func (i *pathIO) guessExtension(p gopath.GoPath) gopath.GoPath { var match = p.Append(".*").GlobAny().PrependErr("couldn't guess extension") if match.Path() != "" { return i.syncedErrs(match) } return p }
// assertPathValidForAnyAccess sets the error flag when the path may not be // accessed through this application in general. // User-specific access permissions are NOT regarded here. func (i *pathIO) assertPathValidForAnyAccess(p gopath.GoPath) { if p.HasErr() { i.syncedErrs(p) } else { i.assertFileIsNotHidden(p) i.assertPathInsideContentRoot(p) } }
// indexForDirectory finds the index document inside the given directory. // On success, it returns the path to the index document, otherwise it simply // returns the given path. // // Doesn't set the Err() value. func (i *pathIO) indexForDirectory(dir gopath.GoPath) gopath.GoPath { var index = dir.JoinPath("index").Do(i.guessExtension).AssertExists() if index.HasErr() { return dir } return index }
func htpasswdFilePath(contentRoot gopath.GoPath) gopath.GoPath { htpasswdFile := contentRoot.JoinPath(".htpasswd") if !htpasswdFile.IsExists() { log.Printf("no .htpasswd found") } else { log.Printf("using authentication data from .htpasswd") } return htpasswdFile }
// syncedErrs couples GoPath's error handling with errStore's error handling. // When the GoPath contained an error, it will be stored in the errStore, so // that all following ops become no-ops. // When however the errStore contains an error, an errorneous GoPath will be // returned. func (s *errStore) syncedErrs(p gopath.GoPath) gopath.GoPath { if s.hasErr() { return gopath.FromErr(s.err) } if p.HasErr() { s.setErr(p.Err()) } return p }
func (i *pathIO) openReaderAtPath(p gopath.GoPath) (reader io.ReadCloser) { i.assertPathValidForAnyAccess(p) if i.hasErr() { i.prependErr(fmt.Sprintf("cannot open reader for '%s'", p)) return nil } reader, err := os.Open(p.Path()) i.setErr(err) i.prependErr(fmt.Sprintf("couldn't open reader for '%s'", p)) return }
func (i *pathIO) openWriterAtPath(p gopath.GoPath) (writer io.WriteCloser) { i.assertPathValidForAnyAccess(p) i.assertPathValidForWriteAccess(p) if i.hasErr() { i.prependErr(fmt.Sprintf("cannot open writer for '%s'", p)) return nil } writer, err := os.Create(p.Path()) i.setErr(err) i.prependErr(fmt.Sprintf("couldn't open writer for '%s'", p)) return }
func (m *mimeDetector) first512BytesForPath(p gopath.GoPath) []byte { if p.HasErr() { return nil } var readCloser = m.openReaderAtPath(p) if m.hasErr() { return nil } var buf = make([]byte, 512) var n int n, m.err = readCloser.Read(buf) readCloser.Close() return buf[:n] }
func isDirWriteable(p gopath.GoPath) bool { var nonExistantFile = p.JoinPath("githubcom-fxnn-gone") for !nonExistantFile.HasErr() && nonExistantFile.IsExists() { nonExistantFile = nonExistantFile.Append("-" + strconv.Itoa(rand.Int())) } if nonExistantFile.HasErr() { return false } var closer, err = os.Create(nonExistantFile.Path()) if closer != nil { closer.Close() os.Remove(nonExistantFile.Path()) } return err == nil }
func createBasicAuth(realmName string, htpasswdFile gopath.GoPath) *auth.BasicAuth { var secretProvider = noSecrets if !htpasswdFile.HasErr() && !htpasswdFile.IsEmpty() { secretProvider = auth.HtpasswdFileProvider(htpasswdFile.Path()) } return auth.NewBasicAuthenticator(realmName, secretProvider) }
func templatePath(contentRoot gopath.GoPath, cfg config.Config) (result gopath.GoPath) { // configuration result = gopath.FromPath(cfg.TemplatePath) if !result.IsEmpty() { if !result.IsDirectory() { log.Fatalf("configured template path is no directory: %s", result.Path()) } log.Printf("using templates from %s (by configuration)", result.Path()) return result } // convention result = contentRoot.JoinPath(defaultTemplateDirectoryName) if result.IsDirectory() { log.Printf("using templates from %s (by convention)", result.Path()) return result } // default log.Printf("using default templates") return gopath.Empty() }
func (m *mimeDetector) mimeTypeForPath(p gopath.GoPath) string { p = p.EvalSymlinks() if p.IsDirectory() || p.HasErr() { return store.FallbackMimeType } var ext = p.Ext() if mimeType := mime.TypeByExtension(ext); mimeType != "" { return mimeType } var first512Bytes = m.first512BytesForPath(p) m.errAndClear() // clear error flag, as DetectContentType always returns something return http.DetectContentType(first512Bytes) }
// getRelevantFileModeForPath returns the FileMode for the given file or, when // the file does not exist, its containing directory. func (a *accessControl) relevantFileModeForPath(p gopath.GoPath) os.FileMode { if a.hasErr() || p.HasErr() { return 0 } var pStat = p.Stat() if !pStat.IsExists() { // HINT: Inspect permissions of containing directory pStat = p.Dir().Stat() } a.setErr(pStat.Err()) return pStat.FileMode() }
func isFileWriteable(p gopath.GoPath) bool { if p.IsExists() { var closer, err = os.OpenFile(p.Path(), os.O_WRONLY, 0) if closer != nil { closer.Close() } return err == nil } return isDirWriteable(p.Dir()) }
// NewFilesystemLoader creates a new instance with templates located in the // given root path. func NewFilesystemLoader(root gopath.GoPath) *FilesystemLoader { if root.HasErr() { panic(fmt.Sprintf("NewFilesystemLoader: root has error: %s", root.Err())) } if !root.IsExists() { panic(fmt.Sprintf("NewFilesystemLoader: root %s does not exist", root.Path())) } watcher, err := fsnotify.NewWatcher() if err != nil { panic(fmt.Sprintf("NewFilesystemLoader: can't open watcher: %s", err)) } var loader = &FilesystemLoader{ root, watcher, make(map[string]chan *template.Template), make(map[string]string)} go loader.processEvents() return loader }
func (i *pathIO) assertFileIsNotHidden(p gopath.GoPath) { if i.hasErr() { return } if p.HasErr() { i.syncedErrs(p) return } if strings.HasPrefix(p.Base(), ".") { i.setErr(store.NewPathNotFoundError(fmt.Sprintf("%s is a hidden file and may not be displayed", p))) } // HINT: recursive call, ending at content root if i.isPathInsideContentRoot(p) { i.assertFileIsNotHidden(p.ToSlash().Dir()) } }
func isPathWriteable(p gopath.GoPath) bool { return unix.Access(p.Path(), unix.W_OK) == nil }
func (a *accessControl) canWriteFile(p gopath.GoPath) bool { if p.HasErr() || !p.IsRegular() { return false } return a.hasWorldWritePermission(p.FileMode()) }
func (a *accessControl) canEnterDirectory(p gopath.GoPath) bool { if p.HasErr() || !p.IsDirectory() { return false } return a.hasWorldExecutePermission(p.FileMode()) }
// normalizePath builds an absolute path and cleans it from ".." and ".", but // doesn't resolve symlinks func (i *pathIO) normalizePath(p gopath.GoPath) gopath.GoPath { return p.Abs().Clean() }
func (i *pathIO) assertPathExists(p gopath.GoPath) { i.syncedErrs(p.AssertExists()) i.prependErr(fmt.Sprintf("required path %s does not exist", p)) }
// assertPathValidForWriteAccess sets the error flag when the path may not be // opened for writing by this process. func (i *pathIO) assertPathValidForWriteAccess(p gopath.GoPath) { if i.hasErr() { return } if p.HasErr() { i.setErr(p.Err()) return } if p.IsExists() { if !p.IsRegular() || !isPathWriteable(p) { i.setErr(store.NewAccessDeniedError(fmt.Sprintf( "path '%s' with mode %s denotes no regular file or no writeable directory", p.Path(), p.FileMode()))) } } else { var d = p.Dir() if !isPathWriteable(d) { i.setErr(store.NewAccessDeniedError( "parent directory of '" + p.Path() + "' is not writeable")) } } }