|
@@ -284,7 +284,7 @@ func ReverseProxyHandleAddEndpoint(w http.ResponseWriter, r *http.Request) {
|
|
|
RequireBasicAuth: requireBasicAuth,
|
|
|
BasicAuthCredentials: basicAuthCredentials,
|
|
|
}
|
|
|
- SaveReverseProxyConfig(&thisProxyConfigRecord)
|
|
|
+ SaveReverseProxyConfigToFile(&thisProxyConfigRecord)
|
|
|
|
|
|
//Update utm if exists
|
|
|
if uptimeMonitor != nil {
|
|
@@ -357,7 +357,7 @@ func ReverseProxyHandleEditEndpoint(w http.ResponseWriter, r *http.Request) {
|
|
|
RequireBasicAuth: requireBasicAuth,
|
|
|
BasicAuthCredentials: targetProxyEntry.BasicAuthCredentials,
|
|
|
}
|
|
|
- dynamicProxyRouter.RemoveProxy("vdir", thisOption.RootName)
|
|
|
+ targetProxyEntry.Remove()
|
|
|
dynamicProxyRouter.AddVirtualDirectoryProxyService(&thisOption)
|
|
|
|
|
|
} else if eptype == "subd" {
|
|
@@ -369,7 +369,7 @@ func ReverseProxyHandleEditEndpoint(w http.ResponseWriter, r *http.Request) {
|
|
|
RequireBasicAuth: requireBasicAuth,
|
|
|
BasicAuthCredentials: targetProxyEntry.BasicAuthCredentials,
|
|
|
}
|
|
|
- dynamicProxyRouter.RemoveProxy("subd", thisOption.MatchingDomain)
|
|
|
+ targetProxyEntry.Remove()
|
|
|
dynamicProxyRouter.AddSubdomainRoutingService(&thisOption)
|
|
|
}
|
|
|
|
|
@@ -383,7 +383,7 @@ func ReverseProxyHandleEditEndpoint(w http.ResponseWriter, r *http.Request) {
|
|
|
RequireBasicAuth: requireBasicAuth,
|
|
|
BasicAuthCredentials: targetProxyEntry.BasicAuthCredentials,
|
|
|
}
|
|
|
- SaveReverseProxyConfig(&thisProxyConfigRecord)
|
|
|
+ SaveReverseProxyConfigToFile(&thisProxyConfigRecord)
|
|
|
utils.SendOK(w)
|
|
|
}
|
|
|
|
|
@@ -400,13 +400,15 @@ func DeleteProxyEndpoint(w http.ResponseWriter, r *http.Request) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- err = dynamicProxyRouter.RemoveProxy(ptype, ep)
|
|
|
+ //Remove the config from runtime
|
|
|
+ err = dynamicProxyRouter.RemoveProxyEndpointByRootname(ptype, ep)
|
|
|
if err != nil {
|
|
|
utils.SendErrorResponse(w, err.Error())
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- RemoveReverseProxyConfig(ep)
|
|
|
+ //Remove the config from file
|
|
|
+ RemoveReverseProxyConfigFile(ep)
|
|
|
|
|
|
//Update utm if exists
|
|
|
if uptimeMonitor != nil {
|
|
@@ -530,19 +532,10 @@ func UpdateProxyBasicAuthCredentials(w http.ResponseWriter, r *http.Request) {
|
|
|
targetProxy.BasicAuthCredentials = mergedCredentials
|
|
|
|
|
|
//Save it to file
|
|
|
- thisProxyConfigRecord := Record{
|
|
|
- ProxyType: ptype,
|
|
|
- Rootname: targetProxy.RootOrMatchingDomain,
|
|
|
- ProxyTarget: targetProxy.Domain,
|
|
|
- UseTLS: targetProxy.RequireTLS,
|
|
|
- SkipTlsValidation: targetProxy.SkipCertValidations,
|
|
|
- RequireBasicAuth: targetProxy.RequireBasicAuth,
|
|
|
- BasicAuthCredentials: targetProxy.BasicAuthCredentials,
|
|
|
- }
|
|
|
- SaveReverseProxyConfig(&thisProxyConfigRecord)
|
|
|
+ SaveReverseProxyEndpointToFile(targetProxy)
|
|
|
|
|
|
//Replace runtime configuration
|
|
|
- dynamicProxyRouter.SaveProxy(ptype, ep, targetProxy)
|
|
|
+ targetProxy.UpdateToRuntime()
|
|
|
utils.SendOK(w)
|
|
|
} else {
|
|
|
http.Error(w, "invalid usage", http.StatusMethodNotAllowed)
|
|
@@ -550,6 +543,147 @@ func UpdateProxyBasicAuthCredentials(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+// List, Update or Remove the exception paths for basic auth.
|
|
|
+func ListProxyBasicAuthExceptionPaths(w http.ResponseWriter, r *http.Request) {
|
|
|
+
|
|
|
+ if r.Method != http.MethodGet {
|
|
|
+ http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
|
|
|
+ }
|
|
|
+ ep, err := utils.GetPara(r, "ep")
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, "Invalid ep given")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ ptype, err := utils.GetPara(r, "ptype")
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, "Invalid ptype given")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //Load the target proxy object from router
|
|
|
+ targetProxy, err := dynamicProxyRouter.LoadProxy(ptype, ep)
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //List all the exception paths for this proxy
|
|
|
+ results := targetProxy.BasicAuthExceptionRules
|
|
|
+ if results == nil {
|
|
|
+ //It is a config from a really old version of zoraxy. Overwrite it with empty array
|
|
|
+ results = []*dynamicproxy.BasicAuthExceptionRule{}
|
|
|
+ }
|
|
|
+ js, _ := json.Marshal(results)
|
|
|
+ utils.SendJSONResponse(w, string(js))
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func AddProxyBasicAuthExceptionPaths(w http.ResponseWriter, r *http.Request) {
|
|
|
+ ep, err := utils.PostPara(r, "ep")
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, "Invalid ep given")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ ptype, err := utils.PostPara(r, "ptype")
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, "Invalid ptype given")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ matchingPrefix, err := utils.PostPara(r, "prefix")
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, "Invalid matching prefix given")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //Load the target proxy object from router
|
|
|
+ targetProxy, err := dynamicProxyRouter.LoadProxy(ptype, ep)
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //Check if the prefix starts with /. If not, prepend it
|
|
|
+ if !strings.HasPrefix(matchingPrefix, "/") {
|
|
|
+ matchingPrefix = "/" + matchingPrefix
|
|
|
+ }
|
|
|
+
|
|
|
+ //Add a new exception rule if it is not already exists
|
|
|
+ alreadyExists := false
|
|
|
+ for _, thisExceptionRule := range targetProxy.BasicAuthExceptionRules {
|
|
|
+ if thisExceptionRule.PathPrefix == matchingPrefix {
|
|
|
+ alreadyExists = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if alreadyExists {
|
|
|
+ utils.SendErrorResponse(w, "This matching path already exists")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ targetProxy.BasicAuthExceptionRules = append(targetProxy.BasicAuthExceptionRules, &dynamicproxy.BasicAuthExceptionRule{
|
|
|
+ PathPrefix: strings.TrimSpace(matchingPrefix),
|
|
|
+ })
|
|
|
+
|
|
|
+ //Save configs to runtime and file
|
|
|
+ targetProxy.UpdateToRuntime()
|
|
|
+ SaveReverseProxyEndpointToFile(targetProxy)
|
|
|
+
|
|
|
+ utils.SendOK(w)
|
|
|
+}
|
|
|
+
|
|
|
+func RemoveProxyBasicAuthExceptionPaths(w http.ResponseWriter, r *http.Request) {
|
|
|
+ // Delete a rule
|
|
|
+ ep, err := utils.PostPara(r, "ep")
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, "Invalid ep given")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ ptype, err := utils.PostPara(r, "ptype")
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, "Invalid ptype given")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ matchingPrefix, err := utils.PostPara(r, "prefix")
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, "Invalid matching prefix given")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // Load the target proxy object from router
|
|
|
+ targetProxy, err := dynamicProxyRouter.LoadProxy(ptype, ep)
|
|
|
+ if err != nil {
|
|
|
+ utils.SendErrorResponse(w, err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ newExceptionRuleList := []*dynamicproxy.BasicAuthExceptionRule{}
|
|
|
+ matchingExists := false
|
|
|
+ for _, thisExceptionalRule := range targetProxy.BasicAuthExceptionRules {
|
|
|
+ if thisExceptionalRule.PathPrefix != matchingPrefix {
|
|
|
+ newExceptionRuleList = append(newExceptionRuleList, thisExceptionalRule)
|
|
|
+ } else {
|
|
|
+ matchingExists = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if !matchingExists {
|
|
|
+ utils.SendErrorResponse(w, "target matching rule not exists")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ targetProxy.BasicAuthExceptionRules = newExceptionRuleList
|
|
|
+
|
|
|
+ // Save configs to runtime and file
|
|
|
+ targetProxy.UpdateToRuntime()
|
|
|
+ SaveReverseProxyEndpointToFile(targetProxy)
|
|
|
+
|
|
|
+ utils.SendOK(w)
|
|
|
+}
|
|
|
+
|
|
|
func ReverseProxyStatus(w http.ResponseWriter, r *http.Request) {
|
|
|
js, _ := json.Marshal(dynamicProxyRouter)
|
|
|
utils.SendJSONResponse(w, string(js))
|