handlers.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package samba
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "path/filepath"
  6. "strings"
  7. "imuslab.com/arozos/mod/utils"
  8. )
  9. // Get current samba service status
  10. func (s *ShareManager) SmbdStates(w http.ResponseWriter, r *http.Request) {
  11. set, err := utils.PostPara(r, "set")
  12. if err != nil {
  13. //return the current smbd states
  14. smbdRunning, err := IsSmbdRunning()
  15. if err != nil {
  16. utils.SendErrorResponse(w, err.Error())
  17. return
  18. }
  19. js, _ := json.Marshal(smbdRunning)
  20. utils.SendJSONResponse(w, string(js))
  21. return
  22. } else if set == "enable" {
  23. //Set smbd to enable
  24. err = SetSmbdEnableState(true)
  25. if err != nil {
  26. utils.SendErrorResponse(w, err.Error())
  27. return
  28. }
  29. utils.SendOK(w)
  30. return
  31. } else if set == "disable" {
  32. //Set smbd to disable
  33. err = SetSmbdEnableState(false)
  34. if err != nil {
  35. utils.SendErrorResponse(w, err.Error())
  36. return
  37. }
  38. utils.SendOK(w)
  39. return
  40. }
  41. utils.SendErrorResponse(w, "not support set state: "+set+". Only support enable /disable")
  42. }
  43. // List all the samba shares
  44. func (s *ShareManager) ListSambaShares(w http.ResponseWriter, r *http.Request) {
  45. shares, err := s.ReadSambaShares()
  46. if err != nil {
  47. utils.SendErrorResponse(w, err.Error())
  48. return
  49. }
  50. //Remove those shares that is reserved by systems
  51. shares = s.FilterSystemCreatedShares(shares)
  52. js, _ := json.Marshal(shares)
  53. utils.SendJSONResponse(w, string(js))
  54. }
  55. // Add a samba share
  56. func (s *ShareManager) AddSambaShare(w http.ResponseWriter, r *http.Request) {
  57. shareName, err := utils.PostPara(r, "name")
  58. if err != nil {
  59. utils.SendErrorResponse(w, "share name not given")
  60. return
  61. }
  62. shareName = strings.TrimSpace(shareName)
  63. //Check if this share name already been used
  64. shareNameExists, err := s.ShareNameExists(shareName)
  65. if err != nil {
  66. utils.SendErrorResponse(w, err.Error())
  67. return
  68. }
  69. if shareNameExists {
  70. utils.SendErrorResponse(w, "share with identical name already exists")
  71. return
  72. }
  73. sharePath, err := utils.PostPara(r, "path")
  74. if err != nil {
  75. utils.SendErrorResponse(w, "share path not given")
  76. return
  77. }
  78. //Parse the path to absolute path
  79. absoluteSharePath, err := filepath.Abs(sharePath)
  80. if err != nil {
  81. utils.SendErrorResponse(w, err.Error())
  82. return
  83. }
  84. //Check if path exists
  85. if !utils.FileExists(absoluteSharePath) {
  86. utils.SendErrorResponse(w, "target path not exists")
  87. return
  88. }
  89. //Check if target path is a folder
  90. if !utils.IsDir(absoluteSharePath) {
  91. utils.SendErrorResponse(w, "target path is not a directory")
  92. return
  93. }
  94. //Check if it is a reserved / protected path
  95. if isPathInsideImportantFolders(absoluteSharePath) {
  96. utils.SendErrorResponse(w, "system reserved path cannot be shared")
  97. return
  98. }
  99. validUsersJSON, err := utils.PostPara(r, "users")
  100. if err != nil {
  101. utils.SendErrorResponse(w, "no valid user givens")
  102. return
  103. }
  104. //Parse valid users into string slice
  105. validUsers := []string{}
  106. err = json.Unmarshal([]byte(validUsersJSON), &validUsers)
  107. if err != nil {
  108. utils.SendErrorResponse(w, "unable to parse JSON for valid users")
  109. return
  110. }
  111. //Check if all the users exists in the host OS
  112. for _, validUser := range validUsers {
  113. thisUnixUserExists, err := s.SambaUserExists(validUser)
  114. if err != nil {
  115. utils.SendErrorResponse(w, err.Error())
  116. return
  117. }
  118. if !thisUnixUserExists {
  119. //This user not exists
  120. utils.SendErrorResponse(w, validUser+" is not a valid unix user")
  121. return
  122. }
  123. }
  124. readOnly, err := utils.PostBool(r, "readonly")
  125. if err != nil {
  126. readOnly = false
  127. }
  128. browseable, err := utils.PostBool(r, "browseable")
  129. if err != nil {
  130. browseable = true
  131. }
  132. allowGuest, err := utils.PostBool(r, "guestok")
  133. if err != nil {
  134. allowGuest = false
  135. }
  136. shareToCreate := ShareConfig{
  137. Name: shareName,
  138. Path: absoluteSharePath,
  139. ValidUsers: validUsers,
  140. ReadOnly: readOnly,
  141. Browseable: browseable,
  142. GuestOk: allowGuest,
  143. }
  144. //Add the new share to smb.conf
  145. err = s.CreateNewSambaShare(&shareToCreate)
  146. if err != nil {
  147. utils.SendErrorResponse(w, err.Error())
  148. return
  149. }
  150. //Restart smbd
  151. err = restartSmbd()
  152. if err != nil {
  153. utils.SendErrorResponse(w, err.Error())
  154. return
  155. }
  156. utils.SendOK(w)
  157. }
  158. // Remove a samba share by name
  159. func (s *ShareManager) DelSambaShare(w http.ResponseWriter, r *http.Request) {
  160. shareName, err := utils.PostPara(r, "name")
  161. if err != nil {
  162. utils.SendErrorResponse(w, "share name not given")
  163. return
  164. }
  165. //Check if share exists
  166. shareExists, err := s.ShareExists(shareName)
  167. if err != nil {
  168. utils.SendErrorResponse(w, err.Error())
  169. return
  170. }
  171. if !shareExists {
  172. utils.SendErrorResponse(w, "share to be remove not exists")
  173. return
  174. }
  175. //Remove the share from config file
  176. err = s.RemoveSambaShareConfig(shareName)
  177. if err != nil {
  178. utils.SendErrorResponse(w, err.Error())
  179. return
  180. }
  181. //Restart smbd
  182. err = restartSmbd()
  183. if err != nil {
  184. utils.SendErrorResponse(w, err.Error())
  185. return
  186. }
  187. utils.SendOK(w)
  188. }
  189. // Add a new samba user
  190. func (s *ShareManager) NewSambaUser(w http.ResponseWriter, r *http.Request) {
  191. //TODO: Replace the GetPara to Post
  192. username, err := utils.GetPara(r, "username")
  193. if err != nil {
  194. utils.SendErrorResponse(w, "username not given")
  195. return
  196. }
  197. password, err := utils.GetPara(r, "password")
  198. if err != nil {
  199. utils.SendErrorResponse(w, "password not set")
  200. return
  201. }
  202. err = s.AddSambaUser(username, password)
  203. if err != nil {
  204. utils.SendErrorResponse(w, err.Error())
  205. return
  206. }
  207. utils.SendOK(w)
  208. }
  209. // Remove a samba user
  210. func (s *ShareManager) DelSambaUser(w http.ResponseWriter, r *http.Request) {
  211. username, err := utils.GetPara(r, "username")
  212. if err != nil {
  213. utils.SendErrorResponse(w, "username not given")
  214. return
  215. }
  216. //Remove the samba user
  217. err = s.RemoveSmbUser(username)
  218. if err != nil {
  219. utils.SendErrorResponse(w, err.Error())
  220. return
  221. }
  222. utils.SendOK(w)
  223. }
  224. // List all samba users info
  225. func (s *ShareManager) ListSambaUsers(w http.ResponseWriter, r *http.Request) {
  226. userInfo, err := s.ListSambaUsersInfo()
  227. if err != nil {
  228. utils.SendErrorResponse(w, err.Error())
  229. return
  230. }
  231. js, _ := json.Marshal(userInfo)
  232. utils.SendJSONResponse(w, string(js))
  233. }