module.go 4.3 KB

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