module.go 4.7 KB

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