network.server.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. package main
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "net/http"
  6. "strconv"
  7. "strings"
  8. "imuslab.com/arozos/mod/common"
  9. prout "imuslab.com/arozos/mod/prouter"
  10. ftp "imuslab.com/arozos/mod/storage/ftp"
  11. awebdav "imuslab.com/arozos/mod/storage/webdav"
  12. )
  13. /*
  14. WebDAV Server
  15. */
  16. var (
  17. WebDavHandler *awebdav.Server
  18. )
  19. func WebDAVInit() {
  20. //Create a database table for webdav service
  21. sysdb.NewTable("webdav")
  22. //Create a new webdav server
  23. newserver := awebdav.NewServer(*host_name, "/webdav", *tmp_directory, *use_tls, userHandler)
  24. WebDavHandler = newserver
  25. //Check the webdav default state
  26. enabled := false
  27. if sysdb.KeyExists("webdav", "enabled") {
  28. sysdb.Read("webdav", "enabled", &enabled)
  29. }
  30. WebDavHandler.Enabled = enabled
  31. /*
  32. http.HandleFunc("/webdav", func(w http.ResponseWriter, r *http.Request) {
  33. WebDavHandler.HandleRequest(w, r)
  34. })
  35. */
  36. http.HandleFunc("/system/network/webdav/list", WebDavHandler.HandleConnectionList)
  37. //Handle setting related functions
  38. router := prout.NewModuleRouter(prout.RouterOption{
  39. ModuleName: "File Manager",
  40. AdminOnly: false,
  41. UserHandler: userHandler,
  42. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  43. common.SendErrorResponse(w, "Permission Denied")
  44. },
  45. })
  46. router.HandleFunc("/system/network/webdav/edit", WebDavHandler.HandlePermissionEdit)
  47. router.HandleFunc("/system/network/webdav/clear", WebDavHandler.HandleClearAllPending)
  48. router.HandleFunc("/system/network/webdav/status", func(w http.ResponseWriter, r *http.Request) {
  49. //Show status for every user, only allow change if admin
  50. userinfo, _ := userHandler.GetUserInfoFromRequest(w, r)
  51. isAdmin := userinfo.IsAdmin()
  52. set, _ := common.Mv(r, "set", false)
  53. if set == "" {
  54. //Return the current status
  55. results := []bool{WebDavHandler.Enabled, isAdmin}
  56. js, _ := json.Marshal(results)
  57. common.SendJSONResponse(w, string(js))
  58. } else if isAdmin && set == "disable" {
  59. WebDavHandler.Enabled = false
  60. sysdb.Write("webdav", "enabled", false)
  61. common.SendOK(w)
  62. } else if isAdmin && set == "enable" {
  63. WebDavHandler.Enabled = true
  64. sysdb.Write("webdav", "enabled", true)
  65. common.SendOK(w)
  66. } else {
  67. common.SendErrorResponse(w, "Permission Denied")
  68. }
  69. })
  70. }
  71. /*
  72. FTP Server
  73. */
  74. var (
  75. ftpServer *ftp.Handler
  76. )
  77. //Handle init of the FTP server endpoints
  78. func FTPServerInit() {
  79. //Register FTP Endpoints
  80. adminRouter := prout.NewModuleRouter(prout.RouterOption{
  81. ModuleName: "System Setting",
  82. AdminOnly: true,
  83. UserHandler: userHandler,
  84. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  85. errorHandlePermissionDenied(w, r)
  86. },
  87. })
  88. //Create database related tables
  89. sysdb.NewTable("ftp")
  90. defaultEnable := false
  91. if sysdb.KeyExists("ftp", "default") {
  92. sysdb.Read("ftp", "default", &defaultEnable)
  93. } else {
  94. sysdb.Write("ftp", "default", false)
  95. }
  96. //Enable this service
  97. if defaultEnable {
  98. storageFTPServerStart()
  99. }
  100. adminRouter.HandleFunc("/system/storage/ftp/start", storageHandleFTPServerStart)
  101. adminRouter.HandleFunc("/system/storage/ftp/stop", storageHandleFTPServerStop)
  102. adminRouter.HandleFunc("/system/storage/ftp/upnp", storageHandleFTPuPnP)
  103. adminRouter.HandleFunc("/system/storage/ftp/status", storageHandleFTPServerStatus)
  104. adminRouter.HandleFunc("/system/storage/ftp/updateGroups", storageHandleFTPAccessUpdate)
  105. adminRouter.HandleFunc("/system/storage/ftp/setPort", storageHandleFTPSetPort)
  106. adminRouter.HandleFunc("/system/storage/ftp/passivemode", storageHandleFTPPassiveModeSettings)
  107. }
  108. /*
  109. Handle the settings for passive mode related files
  110. Example set commands
  111. set=ip&ip=123.456.789.1
  112. set=mode&passive=true
  113. */
  114. func storageHandleFTPPassiveModeSettings(w http.ResponseWriter, r *http.Request) {
  115. set, err := common.Mv(r, "set", true)
  116. if err != nil {
  117. common.SendErrorResponse(w, "Invalid set type")
  118. return
  119. }
  120. if set == "ip" {
  121. //Updat the public up addr
  122. ip, err := common.Mv(r, "ip", true)
  123. if err != nil {
  124. common.SendErrorResponse(w, "Invalid ip given")
  125. return
  126. }
  127. sysdb.Write("ftp", "publicip", ip)
  128. } else if set == "mode" {
  129. //Update the passive mode setting
  130. passive, err := common.Mv(r, "passive", true)
  131. if err != nil {
  132. common.SendErrorResponse(w, "Invalid passive option (true/false)")
  133. return
  134. }
  135. systemWideLogger.PrintAndLog("FTP", "Updating FTP Server PassiveMode to"+passive, nil)
  136. if passive == "true" {
  137. sysdb.Write("ftp", "passive", true)
  138. } else {
  139. sysdb.Write("ftp", "passive", false)
  140. }
  141. } else {
  142. common.SendErrorResponse(w, "Unknown setting filed")
  143. return
  144. }
  145. //Restart the FTP server if it is running now
  146. if ftpServer != nil && ftpServer.ServerRunning {
  147. storageFTPServerStart()
  148. }
  149. }
  150. //Start the FTP Server by request
  151. func storageHandleFTPServerStart(w http.ResponseWriter, r *http.Request) {
  152. err := storageFTPServerStart()
  153. if err != nil {
  154. common.SendErrorResponse(w, err.Error())
  155. }
  156. //Remember the FTP server status
  157. sysdb.Write("ftp", "default", true)
  158. common.SendOK(w)
  159. }
  160. //Stop the FTP server by request
  161. func storageHandleFTPServerStop(w http.ResponseWriter, r *http.Request) {
  162. if ftpServer != nil {
  163. ftpServer.Close()
  164. }
  165. sysdb.Write("ftp", "default", false)
  166. systemWideLogger.PrintAndLog("FTP", "FTP Server Stopped", nil)
  167. common.SendOK(w)
  168. }
  169. //Update UPnP setting on FTP server
  170. func storageHandleFTPuPnP(w http.ResponseWriter, r *http.Request) {
  171. enable, _ := common.Mv(r, "enable", false)
  172. if enable == "true" {
  173. systemWideLogger.PrintAndLog("FTP", "Enabling UPnP on FTP Server Port", nil)
  174. sysdb.Write("ftp", "upnp", true)
  175. } else {
  176. systemWideLogger.PrintAndLog("FTP", "Disabling UPnP on FTP Server Port", nil)
  177. sysdb.Write("ftp", "upnp", false)
  178. }
  179. //Restart FTP Server if server is running
  180. if ftpServer != nil && ftpServer.ServerRunning {
  181. storageFTPServerStart()
  182. }
  183. common.SendOK(w)
  184. }
  185. //Update access permission on FTP server
  186. func storageHandleFTPAccessUpdate(w http.ResponseWriter, r *http.Request) {
  187. //Get groups paramter from post req
  188. groupString, err := common.Mv(r, "groups", true)
  189. if err != nil {
  190. common.SendErrorResponse(w, "groups not defined")
  191. return
  192. }
  193. //Prase it
  194. groups := []string{}
  195. err = json.Unmarshal([]byte(groupString), &groups)
  196. if err != nil {
  197. common.SendErrorResponse(w, "Unable to parse groups")
  198. return
  199. }
  200. systemWideLogger.PrintAndLog("FTP", "Updating FTP Access group to: "+strings.Join(groups, ","), nil)
  201. //Set the accessable group
  202. ftp.UpdateAccessableGroups(sysdb, groups)
  203. common.SendOK(w)
  204. }
  205. func storageHandleFTPSetPort(w http.ResponseWriter, r *http.Request) {
  206. port, err := common.Mv(r, "port", true)
  207. if err != nil {
  208. common.SendErrorResponse(w, "Port not defined")
  209. return
  210. }
  211. //Try parse the port into int
  212. portInt, err := strconv.Atoi(port)
  213. if err != nil {
  214. common.SendErrorResponse(w, "Invalid port number")
  215. return
  216. }
  217. //Update the database port configuration
  218. sysdb.Write("ftp", "port", portInt)
  219. //Restart the FTP server
  220. storageFTPServerStart()
  221. common.SendOK(w)
  222. }
  223. func storageHandleFTPServerStatus(w http.ResponseWriter, r *http.Request) {
  224. type ServerStatus struct {
  225. Enabled bool
  226. Port int
  227. AllowUPNP bool
  228. UPNPEnabled bool
  229. FTPUpnpEnabled bool
  230. PublicAddr string
  231. PassiveMode bool
  232. UserGroups []string
  233. }
  234. enabled := false
  235. if ftpServer != nil && ftpServer.ServerRunning {
  236. enabled = true
  237. }
  238. serverPort := 21
  239. if sysdb.KeyExists("ftp", "port") {
  240. sysdb.Read("ftp", "port", &serverPort)
  241. }
  242. enableUPnP := false
  243. if sysdb.KeyExists("ftp", "upnp") {
  244. sysdb.Read("ftp", "upnp", &enableUPnP)
  245. }
  246. userGroups := []string{}
  247. if sysdb.KeyExists("ftp", "groups") {
  248. sysdb.Read("ftp", "groups", &userGroups)
  249. }
  250. ftpUpnp := false
  251. if ftpServer != nil && ftpServer.UPNPEnabled {
  252. ftpUpnp = true
  253. }
  254. publicAddr := ""
  255. if UPNP != nil && UPNP.ExternalIP != "" && ftpUpnp == true {
  256. publicAddr = UPNP.ExternalIP
  257. } else {
  258. manualPublicIpEntry := ""
  259. if sysdb.KeyExists("ftp", "publicip") {
  260. sysdb.Read("ftp", "publicip", &manualPublicIpEntry)
  261. }
  262. publicAddr = manualPublicIpEntry
  263. }
  264. forcePassiveMode := false
  265. if ftpUpnp == true {
  266. forcePassiveMode = true
  267. } else {
  268. if sysdb.KeyExists("ftp", "passive") {
  269. sysdb.Read("ftp", "passive", &forcePassiveMode)
  270. }
  271. if forcePassiveMode {
  272. //Read the ip setting from database
  273. manualPublicIpEntry := ""
  274. if sysdb.KeyExists("ftp", "publicip") {
  275. sysdb.Read("ftp", "publicip", &manualPublicIpEntry)
  276. }
  277. publicAddr = manualPublicIpEntry
  278. }
  279. }
  280. jsonString, _ := json.Marshal(ServerStatus{
  281. Enabled: enabled,
  282. Port: serverPort,
  283. AllowUPNP: *allow_upnp,
  284. UPNPEnabled: enableUPnP,
  285. FTPUpnpEnabled: ftpUpnp,
  286. PublicAddr: publicAddr,
  287. UserGroups: userGroups,
  288. PassiveMode: forcePassiveMode,
  289. })
  290. common.SendJSONResponse(w, string(jsonString))
  291. }
  292. func storageFTPServerStart() error {
  293. if ftpServer != nil {
  294. //If the previous ftp server is not closed, close it and open a new one
  295. if ftpServer.UPNPEnabled && UPNP != nil {
  296. UPNP.ClosePort(ftpServer.Port)
  297. }
  298. ftpServer.Close()
  299. }
  300. //Load new server config from database
  301. serverPort := int(21)
  302. if sysdb.KeyExists("ftp", "port") {
  303. sysdb.Read("ftp", "port", &serverPort)
  304. }
  305. enableUPnP := false
  306. if sysdb.KeyExists("ftp", "upnp") {
  307. sysdb.Read("ftp", "upnp", &enableUPnP)
  308. }
  309. forcePassiveMode := false
  310. sysdb.Read("ftp", "passive", &forcePassiveMode)
  311. //Create a new FTP Handler
  312. passiveModeIP := ""
  313. if *allow_upnp && enableUPnP {
  314. //Using External IP address from the UPnP router reply
  315. externalIP := UPNP.ExternalIP
  316. if externalIP != "" {
  317. passiveModeIP = externalIP
  318. }
  319. } else if forcePassiveMode {
  320. //Not allowing upnp but still use passive mode (aka manual port forward)
  321. externalIP := ""
  322. if sysdb.KeyExists("ftp", "publicip") {
  323. sysdb.Read("ftp", "publicip", &externalIP)
  324. }
  325. passiveModeIP = externalIP
  326. }
  327. h, err := ftp.NewFTPHandler(userHandler, *host_name, serverPort, *tmp_directory, passiveModeIP)
  328. if err != nil {
  329. return err
  330. }
  331. h.Start()
  332. ftpServer = h
  333. if *allow_upnp {
  334. if enableUPnP {
  335. if UPNP == nil {
  336. return errors.New("UPnP did not started correctly on this host. Ignore this option")
  337. } else {
  338. //Forward the port
  339. err := UPNP.ForwardPort(ftpServer.Port, *host_name+" FTP Server")
  340. if err != nil {
  341. systemWideLogger.PrintAndLog("FTP", "Failed to start FTP Server UPnP ", err)
  342. ftpServer.UPNPEnabled = false
  343. return err
  344. } else {
  345. //Forward other data ports
  346. UPNP.ForwardPort(ftpServer.Port+1, *host_name+" FTP Data 1")
  347. UPNP.ForwardPort(ftpServer.Port+2, *host_name+" FTP Data 2")
  348. ftpServer.UPNPEnabled = true
  349. }
  350. return nil
  351. }
  352. } else {
  353. //UPNP disabled
  354. if UPNP == nil {
  355. return errors.New("UPnP did not started correctly on this host. Ignore this option")
  356. } else {
  357. UPNP.ClosePort(ftpServer.Port)
  358. UPNP.ClosePort(ftpServer.Port + 1)
  359. UPNP.ClosePort(ftpServer.Port + 2)
  360. ftpServer.UPNPEnabled = false
  361. }
  362. }
  363. }
  364. return nil
  365. }