diff --git a/src/main.go b/src/main.go index f577d50..219a2a2 100644 --- a/src/main.go +++ b/src/main.go @@ -115,6 +115,7 @@ func main() { //Initiate management interface APIs requireAuth = !(*noauth) initAPIs(webminPanelMux) + initRestAPI(webminPanelMux) //Start the reverse proxy server in go routine go func() { diff --git a/src/plugin_api.go b/src/plugin_api.go new file mode 100644 index 0000000..21550b5 --- /dev/null +++ b/src/plugin_api.go @@ -0,0 +1,135 @@ +package main + +import ( + "net/http" + + "imuslab.com/zoraxy/mod/auth" + "imuslab.com/zoraxy/mod/netstat" +) + +// Register the APIs for HTTP proxy management functions +func RegisterHTTPProxyRestAPI(authMiddleware *auth.PluginAuthMiddleware) { + /* Reverse Proxy Settings & Status */ + authMiddleware.HandleFunc("/api/proxy/status", ReverseProxyStatus) + authMiddleware.HandleFunc("/api/proxy/list", ReverseProxyList) + authMiddleware.HandleFunc("/api/proxy/listTags", ReverseProxyListTags) + authMiddleware.HandleFunc("/api/proxy/detail", ReverseProxyListDetail) + /* Reverse proxy upstream (load balance) */ + authMiddleware.HandleFunc("/api/proxy/upstream/list", ReverseProxyUpstreamList) + /* Reverse proxy virtual directory */ + authMiddleware.HandleFunc("/api/proxy/vdir/list", ReverseProxyListVdir) + /* Reverse proxy user-defined header */ + authMiddleware.HandleFunc("/api/proxy/header/list", HandleCustomHeaderList) + /* Reverse proxy auth related */ + authMiddleware.HandleFunc("/api/proxy/auth/exceptions/list", ListProxyBasicAuthExceptionPaths) +} + +// Register the APIs for redirection rules management functions +func RegisterRedirectionRestAPI(authRouter *auth.PluginAuthMiddleware) { + authRouter.HandleFunc("/api/redirect/list", handleListRedirectionRules) +} + +// Register the APIs for access rules management functions +func RegisterAccessRuleRestAPI(authRouter *auth.PluginAuthMiddleware) { + /* Access Rules Settings & Status */ + authRouter.HandleFunc("/api/access/list", handleListAccessRules) + // authRouter.HandleFunc("/api/access/attach", handleAttachRuleToHost) + // authRouter.HandleFunc("/api/access/create", handleCreateAccessRule) + // authRouter.HandleFunc("/api/access/remove", handleRemoveAccessRule) + // authRouter.HandleFunc("/api/access/update", handleUpadateAccessRule) + /* Blacklist */ + authRouter.HandleFunc("/api/blacklist/list", handleListBlacklisted) + authRouter.HandleFunc("/api/blacklist/country/add", handleCountryBlacklistAdd) + authRouter.HandleFunc("/api/blacklist/country/remove", handleCountryBlacklistRemove) + authRouter.HandleFunc("/api/blacklist/ip/add", handleIpBlacklistAdd) + authRouter.HandleFunc("/api/blacklist/ip/remove", handleIpBlacklistRemove) + authRouter.HandleFunc("/api/blacklist/enable", handleBlacklistEnable) + /* Whitelist */ + authRouter.HandleFunc("/api/whitelist/list", handleListWhitelisted) + authRouter.HandleFunc("/api/whitelist/country/add", handleCountryWhitelistAdd) + authRouter.HandleFunc("/api/whitelist/country/remove", handleCountryWhitelistRemove) + authRouter.HandleFunc("/api/whitelist/ip/add", handleIpWhitelistAdd) + authRouter.HandleFunc("/api/whitelist/ip/remove", handleIpWhitelistRemove) + authRouter.HandleFunc("/api/whitelist/enable", handleWhitelistEnable) + authRouter.HandleFunc("/api/whitelist/allowLocal", handleWhitelistAllowLoopback) + /* Quick Ban List */ + authRouter.HandleFunc("/api/quickban/list", handleListQuickBan) +} + +// Register the APIs for path blocking rules management functions, WIP +func RegisterPathRuleRestAPI(authRouter *auth.PluginAuthMiddleware) { + authRouter.HandleFunc("/api/pathrule/list", pathRuleHandler.HandleListBlockingPath) +} + +// Register the APIs statistic anlysis and uptime monitoring functions +func RegisterStatisticalRestAPI(authRouter *auth.PluginAuthMiddleware) { + /* Traffic Summary */ + authRouter.HandleFunc("/api/stats/summary", statisticCollector.HandleTodayStatLoad) + authRouter.HandleFunc("/api/stats/countries", HandleCountryDistrSummary) + authRouter.HandleFunc("/api/stats/netstat", netstatBuffers.HandleGetNetworkInterfaceStats) + authRouter.HandleFunc("/api/stats/netstatgraph", netstatBuffers.HandleGetBufferedNetworkInterfaceStats) + authRouter.HandleFunc("/api/stats/listnic", netstat.HandleListNetworkInterfaces) + /* Zoraxy Analytic */ + authRouter.HandleFunc("/api/analytic/list", AnalyticLoader.HandleSummaryList) + authRouter.HandleFunc("/api/analytic/load", AnalyticLoader.HandleLoadTargetDaySummary) + authRouter.HandleFunc("/api/analytic/loadRange", AnalyticLoader.HandleLoadTargetRangeSummary) + authRouter.HandleFunc("/api/analytic/exportRange", AnalyticLoader.HandleRangeExport) + authRouter.HandleFunc("/api/analytic/resetRange", AnalyticLoader.HandleRangeReset) + /* UpTime Monitor */ + authRouter.HandleFunc("/api/utm/list", HandleUptimeMonitorListing) +} + +// Register the APIs for Stream (TCP / UDP) Proxy management functions +func RegisterStreamProxyRestAPI(authRouter *auth.PluginAuthMiddleware) { + authRouter.HandleFunc("/api/streamprox/config/list", streamProxyManager.HandleListConfigs) + authRouter.HandleFunc("/api/streamprox/config/status", streamProxyManager.HandleGetProxyStatus) +} + +// Register the APIs for mDNS service management functions +func RegisterMDNSRestAPI(authRouter *auth.PluginAuthMiddleware) { + authRouter.HandleFunc("/api/mdns/list", HandleMdnsListing) +} + +// Register the APIs for Static Web Server management functions +func RegisterStaticWebServerRestAPI(authRouter *auth.PluginAuthMiddleware) { + /* Static Web Server Controls */ + authRouter.HandleFunc("/api/webserv/status", staticWebServer.HandleGetStatus) + + /* File Manager */ + if *allowWebFileManager { + authRouter.HandleFunc("/api/fs/list", staticWebServer.FileManager.HandleList) + } +} + +func RegisterPluginRestAPI(authRouter *auth.PluginAuthMiddleware) { + authRouter.HandleFunc("/api/plugins/list", pluginManager.HandleListPlugins) + authRouter.HandleFunc("/api/plugins/info", pluginManager.HandlePluginInfo) + + authRouter.HandleFunc("/api/plugins/groups/list", pluginManager.HandleListPluginGroups) + + authRouter.HandleFunc("/api/plugins/store/list", pluginManager.HandleListDownloadablePlugins) +} + +/* Register all the APIs */ +func initRestAPI(targetMux *http.ServeMux) { + authMiddleware := auth.NewPluginAuthMiddleware( + auth.PluginMiddlewareOptions{ + TargetMux: targetMux, + ApiKeyManager: pluginApiKeyManager, + DeniedHandler: func(w http.ResponseWriter, r *http.Request) { + http.Error(w, "401 - Unauthorized", http.StatusUnauthorized) + }, + }, + ) + + //Register the APIs + RegisterHTTPProxyRestAPI(authMiddleware) + RegisterRedirectionRestAPI(authMiddleware) + RegisterAccessRuleRestAPI(authMiddleware) + RegisterPathRuleRestAPI(authMiddleware) + RegisterStatisticalRestAPI(authMiddleware) + RegisterStreamProxyRestAPI(authMiddleware) + RegisterMDNSRestAPI(authMiddleware) + RegisterStaticWebServerRestAPI(authMiddleware) + RegisterPluginRestAPI(authMiddleware) +}