From 30ebb0f4d40673a1fc3c14a71b382c9fb2acedb2 Mon Sep 17 00:00:00 2001 From: Xhofe Date: Tue, 12 Apr 2022 09:54:22 +0800 Subject: [PATCH] feat: support other region sharepoint with webdav --- drivers/webdav/odrvcookie/fetch.go | 33 +++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/drivers/webdav/odrvcookie/fetch.go b/drivers/webdav/odrvcookie/fetch.go index 3c49dbbc..142e934b 100644 --- a/drivers/webdav/odrvcookie/fetch.go +++ b/drivers/webdav/odrvcookie/fetch.go @@ -4,6 +4,7 @@ package odrvcookie import ( "bytes" "encoding/xml" + "fmt" "html/template" "net/http" "net/http/cookiejar" @@ -52,7 +53,7 @@ xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-util http://www.w3.org/2005/08/addressing/anonymous -https://login.microsoftonline.com/extSTS.srf +{{ .LoginUrl }} @@ -137,11 +138,37 @@ func (ca *CookieAuth) getSPCookie(conf *SuccessResponse) (CookieResponse, error) return cookieResponse, err } +var loginUrlsMap = map[string]string{ + "com": "https://login.microsoftonline.com", + "cn": "https://login.chinacloudapi.cn", + "us": "https://login.microsoftonline.us", + "de": "https://login.microsoftonline.de", +} + +func getLoginUrl(endpoint string) (string, error) { + spRoot, err := url.Parse(endpoint) + if err != nil { + return "", err + } + domains := strings.Split(spRoot.Host, ".") + tld := domains[len(domains)-1] + loginUrl, ok := loginUrlsMap[tld] + if !ok { + return "", fmt.Errorf("tld %s is not supported", tld) + } + return loginUrl + "/extSTS.srf", nil +} + func (ca *CookieAuth) getSPToken() (*SuccessResponse, error) { - reqData := map[string]interface{}{ + loginUrl, err := getLoginUrl(ca.endpoint) + if err != nil { + return nil, err + } + reqData := map[string]string{ "Username": ca.user, "Password": ca.pass, "Address": ca.endpoint, + "LoginUrl": loginUrl, } t := template.Must(template.New("authXML").Parse(reqString)) @@ -153,7 +180,7 @@ func (ca *CookieAuth) getSPToken() (*SuccessResponse, error) { // Execute the first request which gives us an auth token for the sharepoint service // With this token we can authenticate on the login page and save the returned cookies - req, err := http.NewRequest("POST", "https://login.microsoftonline.com/extSTS.srf", buf) + req, err := http.NewRequest("POST", loginUrl, buf) if err != nil { return nil, err }