module.go 5.6 KB

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