Try to get the regex to work
[armadillo.git] / src / paths.go
1 //
2 // Armadillo File Manager
3 // Copyright (c) 2010-2011, Robert Sesek <http://www.bluestatic.org>
4 //
5 // This program is free software: you can redistribute it and/or modify it under
6 // the terms of the GNU General Public License as published by the Free Software
7 // Foundation, either version 3 of the License, or any later version.
8 //
9
10 package paths
11
12 import (
13 "container/vector"
14 "os"
15 "path"
16 "strings"
17 "./config"
18 )
19
20 var gConfig *config.Configuration
21
22 func SetConfig(aConfig *config.Configuration) {
23 gConfig = aConfig
24 }
25
26 func canonicalizePath(raw_path string) string {
27 raw_path = path.Join(gConfig.JailRoot, raw_path)
28 return path.Clean(raw_path)
29 }
30
31 func checkInJail(the_path string) bool {
32 if len(the_path) < len(gConfig.JailRoot) {
33 return false
34 }
35 if the_path[0:len(gConfig.JailRoot)] != gConfig.JailRoot {
36 return false
37 }
38 if strings.Index(the_path, "../") != -1 {
39 return false
40 }
41 return true
42 }
43
44 // Verifies that the path is in the jail and returns the cleaned-up path. Will
45 // return nil on error.
46 func Verify(thePath string) *string {
47 fullPath := canonicalizePath(thePath)
48 if !checkInJail(fullPath) {
49 return nil
50 }
51 return &fullPath
52 }
53
54 func List(the_path string) (files vector.StringVector, err os.Error) {
55 full_path := canonicalizePath(the_path)
56 if !checkInJail(full_path) {
57 return nil, os.NewError("Path outside of jail")
58 }
59
60 fd, file_error := os.Open(full_path, os.O_RDONLY, 0)
61 if file_error != nil {
62 return nil, file_error
63 }
64
65 fileinfos, read_err := fd.Readdir(-1)
66 if read_err != nil {
67 return nil, read_err
68 }
69
70 for _, info := range fileinfos {
71 name := info.Name
72 if info.IsDirectory() {
73 name += "/"
74 }
75 if !gConfig.IncludeDotfiles && name[0] == '.' {
76 continue
77 }
78 files.Push(name)
79 }
80 return files, nil
81 }
82
83 func Remove(the_path string) os.Error {
84 full_path := canonicalizePath(the_path)
85 if !checkInJail(full_path) {
86 return os.NewError("Path outside of jail")
87 }
88 return os.RemoveAll(full_path)
89 }
90
91 func Move(source string, target string) os.Error {
92 source = canonicalizePath(source)
93 target = canonicalizePath(target)
94 if !checkInJail(source) {
95 return os.NewError("Source outside of jail")
96 }
97 if !checkInJail(target) {
98 return os.NewError("Target outside of jail")
99 }
100 return os.Rename(source, target)
101 }