1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
package main
import (
"log"
"net/http"
"net/url"
"path/filepath"
"strings"
)
func wfm(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(10 << 20)
user, rw := auth(w, r)
if user == "" {
return
}
go log.Printf("req from=%q user=%q uri=%q form=%v", r.RemoteAddr, user, r.RequestURI, noText(r.Form))
modern := false
if strings.HasPrefix(r.UserAgent(), "Mozilla/5") {
modern = true
}
uDir := filepath.Clean(r.FormValue("dir"))
if uDir == "" || uDir == "." {
uDir = "/"
}
eSort := url.QueryEscape(r.FormValue("sort"))
uFp := filepath.Clean(r.FormValue("fp"))
uBn := filepath.Base(r.FormValue("file"))
hi := filepath.Base(r.FormValue("hi"))
// button clicked
switch {
case r.FormValue("mkd") != "":
prompt(w, uDir, "", eSort, "mkdir", nil)
return
case r.FormValue("mkf") != "":
prompt(w, uDir, "", eSort, "mkfile", nil)
return
case r.FormValue("mkb") != "":
prompt(w, uDir, "", eSort, "mkurl", nil)
return
case r.FormValue("mdelp") != "":
prompt(w, uDir, "", eSort, "multi_delete", r.Form["mulf"])
return
case r.FormValue("mmovp") != "":
prompt(w, uDir, "", eSort, "multi_move", r.Form["mulf"])
return
case r.FormValue("upload") != "":
f, h, err := r.FormFile("filename")
if err != nil {
htErr(w, "upload", err)
return
}
uploadFile(w, uDir, eSort, h, f, rw)
return
case r.FormValue("save") != "":
saveText(w, uDir, eSort, uFp, r.FormValue("text"), rw)
return
case r.FormValue("home") != "":
listFiles(w, "/", eSort, user, hi, modern)
return
case r.FormValue("up") != "":
listFiles(w, filepath.Dir(uDir), eSort, hi, user, modern)
return
case r.FormValue("cancel") != "":
listFiles(w, uDir, eSort, user, hi, modern)
return
}
// form action
switch r.FormValue("fn") {
case "disp":
dispFile(w, uFp)
case "down":
downFile(w, uFp)
case "edit":
editText(w, uFp, eSort)
case "mkdir":
mkdir(w, uDir, uBn, eSort, rw)
case "mkfile":
mkfile(w, uDir, uBn, eSort, rw)
case "mkurl":
mkurl(w, uDir, uBn, r.FormValue("url"), eSort, rw)
case "rename":
renFile(w, uDir, uBn, r.FormValue("dst"), eSort, rw)
case "renp":
prompt(w, uDir, r.FormValue("oldf"), eSort, "rename", nil)
case "movp":
prompt(w, uDir, uBn, eSort, "move", nil)
case "delp":
prompt(w, uDir, uBn, eSort, "delete", nil)
case "move":
log.Printf("move dir=%v file=%v user=%v@%v", uDir, uFp, user, r.RemoteAddr)
moveFiles(w, uDir, []string{uBn}, r.FormValue("dst"), eSort, rw)
case "delete":
log.Printf("delete dir=%v file=%v user=%v@%v", uDir, uBn, user, r.RemoteAddr)
deleteFiles(w, uDir, []string{uBn}, eSort, rw)
case "multi_delete":
log.Printf("multi_delete dir=%v files=%+v user=%v@%v", uDir, r.Form["mulf"], user, r.RemoteAddr)
deleteFiles(w, uDir, r.Form["mulf"], eSort, rw)
case "multi_move":
log.Printf("multi_move dir=%v files=%+v dest=%v user=%v@%v", uDir, r.Form["mulf"], r.FormValue("dst"), user, r.RemoteAddr)
moveFiles(w, uDir, r.Form["mulf"], r.FormValue("dst"), eSort, rw)
case "logout":
logout(w)
case "about":
about(w, uDir, eSort, r.UserAgent())
default:
listFiles(w, uDir, eSort, hi, user, modern)
}
}
func favicon(w http.ResponseWriter, r *http.Request) {
dispFavIcon(w)
}
func noText(m map[string][]string) map[string][]string {
o := make(map[string][]string)
for k, v := range m {
if k == "text" {
continue
}
o[k] = v
}
return o
}
|