Ejemplo n.º 1
0
Archivo: static.go Proyecto: fxnn/gone
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
}
Ejemplo n.º 2
0
func isPathWriteable(p gopath.GoPath) bool {
	if p.IsDirectory() {
		return isDirWriteable(p)
	}

	return isFileWriteable(p)
}
Ejemplo n.º 3
0
Archivo: pathio.go Proyecto: fxnn/gone
// 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
}
Ejemplo n.º 4
0
Archivo: pathio.go Proyecto: fxnn/gone
// 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)
	}
}
Ejemplo n.º 5
0
Archivo: pathio.go Proyecto: fxnn/gone
// 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
}
Ejemplo n.º 6
0
Archivo: gone.go Proyecto: fxnn/gone
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
}
Ejemplo n.º 7
0
// 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
}
Ejemplo n.º 8
0
Archivo: pathio.go Proyecto: fxnn/gone
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
}
Ejemplo n.º 9
0
Archivo: pathio.go Proyecto: fxnn/gone
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
}
Ejemplo n.º 10
0
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]
}
Ejemplo n.º 11
0
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
}
Ejemplo n.º 12
0
Archivo: http.go Proyecto: fxnn/gone
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)
}
Ejemplo n.º 13
0
Archivo: gone.go Proyecto: fxnn/gone
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()
}
Ejemplo n.º 14
0
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)
}
Ejemplo n.º 15
0
// 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()
}
Ejemplo n.º 16
0
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())
}
Ejemplo n.º 17
0
Archivo: file.go Proyecto: fxnn/gone
// 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
}
Ejemplo n.º 18
0
Archivo: pathio.go Proyecto: fxnn/gone
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())
	}
}
Ejemplo n.º 19
0
func isPathWriteable(p gopath.GoPath) bool {
	return unix.Access(p.Path(), unix.W_OK) == nil
}
Ejemplo n.º 20
0
func (a *accessControl) canWriteFile(p gopath.GoPath) bool {
	if p.HasErr() || !p.IsRegular() {
		return false
	}
	return a.hasWorldWritePermission(p.FileMode())
}
Ejemplo n.º 21
0
func (a *accessControl) canEnterDirectory(p gopath.GoPath) bool {
	if p.HasErr() || !p.IsDirectory() {
		return false
	}
	return a.hasWorldExecutePermission(p.FileMode())
}
Ejemplo n.º 22
0
Archivo: pathio.go Proyecto: fxnn/gone
// 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()
}
Ejemplo n.º 23
0
Archivo: pathio.go Proyecto: fxnn/gone
func (i *pathIO) assertPathExists(p gopath.GoPath) {
	i.syncedErrs(p.AssertExists())
	i.prependErr(fmt.Sprintf("required path %s does not exist", p))
}
Ejemplo n.º 24
0
Archivo: pathio.go Proyecto: fxnn/gone
// 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"))
		}
	}
}