From 4d2e4eaae7a96895db22a553eb1c55e3085eb7b4 Mon Sep 17 00:00:00 2001 From: soasurs Date: Mon, 25 Jan 2021 15:40:36 +0800 Subject: [PATCH 1/3] fix: compatible for old auth header --- leancloud/server.go | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/leancloud/server.go b/leancloud/server.go index 3b69b37..138a1a7 100644 --- a/leancloud/server.go +++ b/leancloud/server.go @@ -295,9 +295,15 @@ func generateMetadata() ([]byte, error) { func validateAppKey(r *http.Request) bool { if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("X-LC-Id") { return false + } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-id") { + return false + } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-uluru-application-id") { + return false } if os.Getenv("LEANCLOUD_APP_KEY") != r.Header.Get("X-LC-Key") { return false + } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-key") { + return false } return true } @@ -305,15 +311,23 @@ func validateAppKey(r *http.Request) bool { func validateMasterKey(r *http.Request) bool { if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("X-LC-Id") { return false + } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-id") { + return false + } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-uluru-application-id") { + return false } if strings.TrimSuffix(r.Header.Get("X-LC-Key"), ",master") != os.Getenv("LEANCLOUD_APP_MASTER_KEY") { return false + } else if r.Header.Get("x-avoscloud-master-key") != os.Getenv("LEANCLOUD_APP_MASTER_KEY") { + return false + } else if r.Header.Get("x-uluru-master-key") != os.Getenv("LEANCLOUD_APP_MASTER_KEY") { + return false } return true } func validateHookKey(r *http.Request) bool { - if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("X-LC-Id") { + if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("X-LC-Id") || os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-id") { return false } if os.Getenv("LEANCLOUD_APP_HOOK_KEY") != r.Header.Get("X-LC-Hook-Key") { @@ -326,8 +340,19 @@ func validateSignature(r *http.Request) (bool, bool) { var master, pass bool if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("X-LC-Id") { return master, pass + } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-id") { + return master, pass + } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-uluru-application-id") { + return master, pass } - sign := r.Header.Get("X-LC-Sign") + + var sign string + if r.Header.Get("X-LC-Sign") != "" { + sign = r.Header.Get("X-LC-Sign") + } else if r.Header.Get("x-avoscloud-request-sign") != "" { + sign = r.Header.Get("x-avoscloud-request-sign") + } + if sign == "" { return master, pass } From 43200cb99a5ee2b1f96356f5d3c73b455b834fc6 Mon Sep 17 00:00:00 2001 From: soasurs Date: Mon, 25 Jan 2021 16:15:08 +0800 Subject: [PATCH 2/3] fix: empty header conditions --- leancloud/server.go | 77 +++++++++++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 27 deletions(-) diff --git a/leancloud/server.go b/leancloud/server.go index 138a1a7..681b7d7 100644 --- a/leancloud/server.go +++ b/leancloud/server.go @@ -69,7 +69,7 @@ func corsHandler(w http.ResponseWriter, r *http.Request) { } func metadataHandler(w http.ResponseWriter, r *http.Request) { - if validateMasterKey(r) { + if !validateMasterKey(r) { errorResponse(w, r, fmt.Errorf("Master Key check failed, request from %s", r.RemoteAddr)) return } @@ -292,44 +292,71 @@ func generateMetadata() ([]byte, error) { return json.Marshal(meta) } +func validateAppID(r *http.Request) bool { + if r.Header.Get("X-LC-Id") != "" { + if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("X-LC-Id") { + return false + } + } else if r.Header.Get("x-avoscloud-application-id") != "" { + if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-id") { + return false + } + } else if r.Header.Get("x-uluru-application-id") != "" { + if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-uluru-application-id") { + return false + } + } + + return true +} + func validateAppKey(r *http.Request) bool { - if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("X-LC-Id") { - return false - } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-id") { - return false - } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-uluru-application-id") { + if !validateAppID(r) { return false } - if os.Getenv("LEANCLOUD_APP_KEY") != r.Header.Get("X-LC-Key") { - return false - } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-key") { - return false + + if r.Header.Get("X-LC-Key") != "" { + if os.Getenv("LEANCLOUD_APP_KEY") != r.Header.Get("X-LC-Key") { + return false + } + } else if r.Header.Get("x-avoscloud-application-key") != "" { + if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-key") { + return false + } + } else if r.Header.Get("x-uluru-application-key") != "" { + if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-uluru-application-key") { + return false + } } return true } func validateMasterKey(r *http.Request) bool { - if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("X-LC-Id") { - return false - } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-id") { - return false - } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-uluru-application-id") { + if !validateAppID(r) { return false } - if strings.TrimSuffix(r.Header.Get("X-LC-Key"), ",master") != os.Getenv("LEANCLOUD_APP_MASTER_KEY") { - return false - } else if r.Header.Get("x-avoscloud-master-key") != os.Getenv("LEANCLOUD_APP_MASTER_KEY") { - return false - } else if r.Header.Get("x-uluru-master-key") != os.Getenv("LEANCLOUD_APP_MASTER_KEY") { - return false + + if r.Header.Get("X-LC-Key") != "" { + if strings.TrimSuffix(r.Header.Get("X-LC-Key"), ",master") != os.Getenv("LEANCLOUD_APP_MASTER_KEY") { + return false + } + } else if r.Header.Get("x-avoscloud-master-key") != "" { + if r.Header.Get("x-avoscloud-master-key") != os.Getenv("LEANCLOUD_APP_MASTER_KEY") { + return false + } + } else if r.Header.Get("x-uluru-master-key") != "" { + if r.Header.Get("x-uluru-master-key") != os.Getenv("LEANCLOUD_APP_MASTER_KEY") { + return false + } } return true } func validateHookKey(r *http.Request) bool { - if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("X-LC-Id") || os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-id") { + if !validateAppID(r) { return false } + if os.Getenv("LEANCLOUD_APP_HOOK_KEY") != r.Header.Get("X-LC-Hook-Key") { return false } @@ -338,11 +365,7 @@ func validateHookKey(r *http.Request) bool { func validateSignature(r *http.Request) (bool, bool) { var master, pass bool - if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("X-LC-Id") { - return master, pass - } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-avoscloud-application-id") { - return master, pass - } else if os.Getenv("LEANCLOUD_APP_ID") != r.Header.Get("x-uluru-application-id") { + if !validateAppID(r) { return master, pass } From f92629e3d7c1e7f19ad34e1f2117bb211d498d50 Mon Sep 17 00:00:00 2001 From: soasurs Date: Mon, 25 Jan 2021 16:32:18 +0800 Subject: [PATCH 3/3] fix: sessionToken header compatibility --- leancloud/server.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/leancloud/server.go b/leancloud/server.go index 681b7d7..151768d 100644 --- a/leancloud/server.go +++ b/leancloud/server.go @@ -235,7 +235,15 @@ func constructRequest(r *http.Request, name string, rpc bool) (*FunctionRequest, request.Meta = map[string]string{ "remoteAddr": r.RemoteAddr, } - sessionToken := r.Header.Get("X-LC-Session") + var sessionToken string + if r.Header.Get("X-LC-Session") != "" { + sessionToken = r.Header.Get("X-LC-Session") + } else if r.Header.Get("x-uluru-session-token") != "" { + sessionToken = r.Header.Get("x-uluru-session-token") + } else if r.Header.Get("x-avoscloud-session-token") != "" { + sessionToken = r.Header.Get("x-avoscloud-session-token") + } + if functions[name].defineOption["fetchUser"] == true && sessionToken != "" { user, err := client.Users.Become(sessionToken) if err != nil {