odtool / api /onedrive.go
wnm168's picture
Update api/onedrive.go
dfd51fa verified
package api
import (
"alist/utils"
"encoding/base64"
"net/url"
"strings"
"github.com/gin-gonic/gin"
)
type Zone struct {
Oauth string
Api string
}
var zones = map[string]Zone{
"global": {
Oauth: "https://login.microsoftonline.com",
Api: "https://graph.microsoft.com",
},
"cn": {
Oauth: "https://login.chinacloudapi.cn",
Api: "https://microsoftgraph.chinacloudapi.cn",
},
"us": {
Oauth: "https://login.microsoftonline.us",
Api: "https://graph.microsoft.us",
},
"de": {
Oauth: "https://login.microsoftonline.de",
Api: "https://graph.microsoft.de",
},
}
func onedriveToken(c *gin.Context) {
req := struct {
Code string `json:"code"`
Client string `json:"client"`
}{}
err := c.ShouldBind(&req)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
data, err := base64.StdEncoding.DecodeString(req.Client)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
clients := strings.Split(string(data), "::")
if len(clients) < 3 {
c.JSON(400, gin.H{"error": "client error"})
return
}
if zone, ok := zones[clients[2]]; ok {
res, err := utils.RestyClient.R().
SetFormData(map[string]string{
"client_id": clients[0],
"client_secret": clients[1],
"code": req.Code,
"grant_type": "authorization_code",
"redirect_uri": clients[3],
}).
Post(zone.Oauth + "/common/oauth2/v2.0/token")
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.Data(res.StatusCode(), "application/json", res.Body())
return
}
c.JSON(400, gin.H{"error": "zone doesn't exist"})
return
}
func spSiteID(c *gin.Context) {
req := struct {
AccessToken string `json:"access_token"`
SiteUrl string `json:"site_url"`
Zone string `json:"zone"`
}{}
err := c.ShouldBind(&req)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
u, err := url.Parse(req.SiteUrl)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
siteName := u.Path
if zone, ok := zones[req.Zone]; ok {
res, err := utils.RestyClient.R().
SetHeader("Authorization", "Bearer "+req.AccessToken).
Get(zone.Api + "/v1.0/sites/root:/" + siteName)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.Data(res.StatusCode(), "application/json", res.Body())
return
}
c.JSON(400, gin.H{"error": "zone doesn't exist"})
return
}