module.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package main
  2. import (
  3. "log"
  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. //Register setting interface for module configuration
  74. registerSetting(settingModule{
  75. Name: "Module List",
  76. Desc: "A list of module currently loaded in the system",
  77. IconPath: "SystemAO/modules/img/small_icon.png",
  78. Group: "Module",
  79. StartDir: "SystemAO/modules/moduleList.html",
  80. })
  81. registerSetting(settingModule{
  82. Name: "Default Module",
  83. Desc: "Default module use to open a file",
  84. IconPath: "SystemAO/modules/img/small_icon.png",
  85. Group: "Module",
  86. StartDir: "SystemAO/modules/defaultOpener.html",
  87. })
  88. if !*disable_subservices {
  89. registerSetting(settingModule{
  90. Name: "Subservices",
  91. Desc: "Launch and kill subservices",
  92. IconPath: "SystemAO/modules/img/small_icon.png",
  93. Group: "Module",
  94. StartDir: "SystemAO/modules/subservices.html",
  95. RequireAdmin: true,
  96. })
  97. }
  98. err := sysdb.NewTable("module")
  99. if err != nil {
  100. log.Fatal(err)
  101. os.Exit(1)
  102. }
  103. }
  104. /*
  105. Handle endpoint registry for Module installer
  106. */
  107. func ModuleInstallerInit() {
  108. //Register module installation setting
  109. registerSetting(settingModule{
  110. Name: "Add & Remove Module",
  111. Desc: "Install & Remove Module to the system",
  112. IconPath: "SystemAO/modules/img/small_icon.png",
  113. Group: "Module",
  114. StartDir: "SystemAO/modules/addAndRemove.html",
  115. RequireAdmin: true,
  116. })
  117. //Create new permission router
  118. router := prout.NewModuleRouter(prout.RouterOption{
  119. ModuleName: "System Setting",
  120. UserHandler: userHandler,
  121. AdminOnly: true,
  122. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  123. errorHandlePermissionDenied(w, r)
  124. },
  125. })
  126. router.HandleFunc("/system/module/install", HandleModuleInstall)
  127. }
  128. //Handle module installation request
  129. func HandleModuleInstall(w http.ResponseWriter, r *http.Request) {
  130. opr, _ := utils.PostPara(r, "opr")
  131. if opr == "gitinstall" {
  132. //Get URL from request
  133. url, _ := utils.PostPara(r, "url")
  134. if url == "" {
  135. utils.SendErrorResponse(w, "Invalid URL")
  136. return
  137. }
  138. //Install the module using git
  139. err := moduleHandler.InstallModuleViaGit(url, AGIGateway)
  140. if err != nil {
  141. utils.SendErrorResponse(w, err.Error())
  142. return
  143. }
  144. //Reply ok
  145. utils.SendOK(w)
  146. } else if opr == "zipinstall" {
  147. } else if opr == "remove" {
  148. //Get the module name from list
  149. module, _ := utils.PostPara(r, "module")
  150. if module == "" {
  151. utils.SendErrorResponse(w, "Invalid Module Name")
  152. return
  153. }
  154. //Remove the module
  155. err := moduleHandler.UninstallModule(module)
  156. if err != nil {
  157. utils.SendErrorResponse(w, err.Error())
  158. return
  159. }
  160. //Reply ok
  161. utils.SendOK(w)
  162. } else {
  163. //List all the modules
  164. moduleHandler.HandleModuleInstallationListing(w, r)
  165. }
  166. }