module.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "os"
  6. module "imuslab.com/arozos/mod/modules"
  7. prout "imuslab.com/arozos/mod/prouter"
  8. "imuslab.com/arozos/mod/utils"
  9. )
  10. var (
  11. moduleHandler *module.ModuleHandler
  12. )
  13. func ModuleServiceInit() {
  14. //Create a new module handler
  15. moduleHandler = module.NewModuleHandler(userHandler, *tmp_directory)
  16. //Register FTP Endpoints
  17. adminRouter := prout.NewModuleRouter(prout.RouterOption{
  18. AdminOnly: true,
  19. UserHandler: userHandler,
  20. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  21. errorHandlePermissionDenied(w, r)
  22. },
  23. })
  24. //Pass through the endpoint to authAgent
  25. http.HandleFunc("/system/modules/list", func(w http.ResponseWriter, r *http.Request) {
  26. authAgent.HandleCheckAuth(w, r, moduleHandler.ListLoadedModules)
  27. })
  28. http.HandleFunc("/system/modules/getDefault", func(w http.ResponseWriter, r *http.Request) {
  29. authAgent.HandleCheckAuth(w, r, moduleHandler.HandleDefaultLauncher)
  30. })
  31. http.HandleFunc("/system/modules/getLaunchPara", func(w http.ResponseWriter, r *http.Request) {
  32. authAgent.HandleCheckAuth(w, r, moduleHandler.GetLaunchParameter)
  33. })
  34. http.HandleFunc("/system/modules/exticons", func(w http.ResponseWriter, r *http.Request) {
  35. authAgent.HandleCheckAuth(w, r, moduleHandler.HandleGetExtIcons)
  36. })
  37. adminRouter.HandleFunc("/system/modules/reload", func(w http.ResponseWriter, r *http.Request) {
  38. moduleHandler.ReloadAllModules(AGIGateway)
  39. utils.SendOK(w)
  40. })
  41. //Handle module installer. Require admin
  42. http.HandleFunc("/system/modules/installViaZip", func(w http.ResponseWriter, r *http.Request) {
  43. //Check if the user is admin
  44. userinfo, err := userHandler.GetUserInfoFromRequest(w, r)
  45. if err != nil {
  46. utils.SendErrorResponse(w, "User not logged in")
  47. return
  48. }
  49. //Validate the user is admin
  50. if userinfo.IsAdmin() {
  51. //Get the installation file path
  52. installerPath, err := utils.PostPara(r, "path")
  53. if err != nil {
  54. utils.SendErrorResponse(w, "Invalid installer path")
  55. return
  56. }
  57. fsh, subpath, err := GetFSHandlerSubpathFromVpath(installerPath)
  58. if err != nil {
  59. utils.SendErrorResponse(w, "Invalid installer path")
  60. return
  61. }
  62. //Translate it to realpath
  63. rpath, err := fsh.FileSystemAbstraction.VirtualPathToRealPath(subpath, userinfo.Username)
  64. if err != nil {
  65. systemWideLogger.PrintAndLog("Module Installer", "Failed to install module: "+err.Error(), err)
  66. utils.SendErrorResponse(w, "Invalid installer path")
  67. return
  68. }
  69. //Install it
  70. moduleHandler.InstallViaZip(rpath, AGIGateway)
  71. } else {
  72. //Permission denied
  73. utils.SendErrorResponse(w, "Permission Denied")
  74. }
  75. })
  76. // Handle direct zip file upload for module installation (admin only)
  77. http.HandleFunc("/system/modules/uploadAndInstall", func(w http.ResponseWriter, r *http.Request) {
  78. userinfo, err := userHandler.GetUserInfoFromRequest(w, r)
  79. if err != nil {
  80. utils.SendErrorResponse(w, "User not logged in")
  81. return
  82. }
  83. if !userinfo.IsAdmin() {
  84. utils.SendErrorResponse(w, "Permission Denied")
  85. return
  86. }
  87. moduleHandler.HandleUploadAndInstall(w, r, AGIGateway)
  88. })
  89. //Register setting interface for module configuration
  90. registerSetting(settingModule{
  91. Name: "Module List",
  92. Desc: "A list of module currently loaded in the system",
  93. IconPath: "SystemAO/modules/img/small_icon.png",
  94. Group: "Module",
  95. StartDir: "SystemAO/modules/moduleList.html",
  96. })
  97. registerSetting(settingModule{
  98. Name: "Default Module",
  99. Desc: "Default module use to open a file",
  100. IconPath: "SystemAO/modules/img/small_icon.png",
  101. Group: "Module",
  102. StartDir: "SystemAO/modules/defaultOpener.html",
  103. })
  104. if !*disable_subservices {
  105. registerSetting(settingModule{
  106. Name: "Subservices",
  107. Desc: "Launch and kill subservices",
  108. IconPath: "SystemAO/modules/img/small_icon.png",
  109. Group: "Module",
  110. StartDir: "SystemAO/modules/subservices.html",
  111. RequireAdmin: true,
  112. })
  113. }
  114. err := sysdb.NewTable("module")
  115. if err != nil {
  116. systemWideLogger.PrintAndLog("System", fmt.Sprint(err), nil)
  117. os.Exit(1)
  118. }
  119. }
  120. /*
  121. Handle endpoint registry for Module installer
  122. */
  123. func ModuleInstallerInit() {
  124. //Register module installation setting
  125. registerSetting(settingModule{
  126. Name: "Add & Remove Module",
  127. Desc: "Install & Remove Module to the system",
  128. IconPath: "SystemAO/modules/img/small_icon.png",
  129. Group: "Module",
  130. StartDir: "SystemAO/modules/addAndRemove.html",
  131. RequireAdmin: true,
  132. })
  133. //Create new permission router
  134. router := prout.NewModuleRouter(prout.RouterOption{
  135. ModuleName: "System Setting",
  136. UserHandler: userHandler,
  137. AdminOnly: true,
  138. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  139. errorHandlePermissionDenied(w, r)
  140. },
  141. })
  142. router.HandleFunc("/system/module/install", HandleModuleInstall)
  143. }
  144. // Handle module installation request
  145. func HandleModuleInstall(w http.ResponseWriter, r *http.Request) {
  146. opr, _ := utils.PostPara(r, "opr")
  147. if opr == "gitinstall" {
  148. //Get URL from request
  149. url, _ := utils.PostPara(r, "url")
  150. if url == "" {
  151. utils.SendErrorResponse(w, "Invalid URL")
  152. return
  153. }
  154. //Install the module using git
  155. err := moduleHandler.InstallModuleViaGit(url, AGIGateway)
  156. if err != nil {
  157. utils.SendErrorResponse(w, err.Error())
  158. return
  159. }
  160. //Reply ok
  161. utils.SendOK(w)
  162. } else if opr == "zipinstall" {
  163. } else if opr == "remove" {
  164. //Get the module name from list
  165. module, _ := utils.PostPara(r, "module")
  166. if module == "" {
  167. utils.SendErrorResponse(w, "Invalid Module Name")
  168. return
  169. }
  170. //Remove the module
  171. err := moduleHandler.UninstallModule(module)
  172. if err != nil {
  173. utils.SendErrorResponse(w, err.Error())
  174. return
  175. }
  176. //Reply ok
  177. utils.SendOK(w)
  178. } else {
  179. //List all the modules
  180. moduleHandler.HandleModuleInstallationListing(w, r)
  181. }
  182. }