123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- package v1
- import (
- "strconv"
- "strings"
- "time"
- "github.com/IceWhaleTech/CasaOS-Common/utils/logger"
- "github.com/IceWhaleTech/CasaOS/drivers/dropbox"
- "github.com/IceWhaleTech/CasaOS/drivers/google_drive"
- "github.com/IceWhaleTech/CasaOS/drivers/onedrive"
- "github.com/IceWhaleTech/CasaOS/service"
- "github.com/gin-gonic/gin"
- "go.uber.org/zap"
- )
- func GetRecoverStorage(c *gin.Context) {
- c.Header("Content-Type", "text/html; charset=utf-8")
- t := c.Param("type")
- currentTime := time.Now().UTC()
- currentDate := time.Now().UTC().Format("2006-01-02")
- notify := make(map[string]interface{})
- if t == "GoogleDrive" {
- google_drive := google_drive.GetConfig()
- google_drive.Code = c.Query("code")
- if len(google_drive.Code) == 0 {
- c.String(200, `<p>Code cannot be empty</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Code cannot be empty"
- logger.Error("Then code is empty: ", zap.String("code", google_drive.Code), zap.Any("name", "google_drive"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- err := google_drive.Init(c)
- if err != nil {
- c.String(200, `<p>Initialization failure:`+err.Error()+`</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Initialization failure"
- logger.Error("Then init error: ", zap.Error(err), zap.Any("name", "google_drive"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- username, err := google_drive.GetUserInfo(c)
- if err != nil {
- c.String(200, `<p>Failed to get user information:`+err.Error()+`</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Failed to get user information"
- logger.Error("Then get user info error: ", zap.Error(err), zap.Any("name", "google_drive"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- dmap := make(map[string]string)
- dmap["username"] = username
- configs, err := service.MyService.Storage().GetConfig()
- if err != nil {
- c.String(200, `<p>Failed to get rclone config:`+err.Error()+`</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Failed to get rclone config"
- logger.Error("Then get config error: ", zap.Error(err), zap.Any("name", "google_drive"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- for _, v := range configs.Remotes {
- cf, err := service.MyService.Storage().GetConfigByName(v)
- if err != nil {
- logger.Error("then get config by name error: ", zap.Error(err), zap.Any("name", v))
- continue
- }
- if cf["type"] == "drive" && cf["username"] == dmap["username"] {
- c.String(200, `<p>The same configuration has been added</p><script>window.close()</script>`)
- err := service.MyService.Storage().CheckAndMountByName(v)
- if err != nil {
- logger.Error("check and mount by name error: ", zap.Error(err), zap.Any("name", cf["username"]))
- }
- notify["status"] = "warn"
- notify["message"] = "The same configuration has been added"
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- }
- if len(username) > 0 {
- a := strings.Split(username, "@")
- username = a[0]
- }
- //username = fileutil.NameAccumulation(username, "/mnt")
- username += "_google_drive_" + strconv.FormatInt(time.Now().Unix(), 10)
- dmap["client_id"] = google_drive.ClientID
- dmap["client_secret"] = google_drive.ClientSecret
- dmap["scope"] = "drive"
- dmap["mount_point"] = "/mnt/" + username
- dmap["token"] = `{"access_token":"` + google_drive.AccessToken + `","token_type":"Bearer","refresh_token":"` + google_drive.RefreshToken + `","expiry":"` + currentDate + `T` + currentTime.Add(time.Hour*1).Add(time.Minute*50).Format("15:04:05") + `Z"}`
- service.MyService.Storage().CreateConfig(dmap, username, "drive")
- service.MyService.Storage().MountStorage("/mnt/"+username, username+":")
- notify := make(map[string]interface{})
- notify["status"] = "success"
- notify["message"] = "Success"
- notify["driver"] = "GoogleDrive"
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- } else if t == "Dropbox" {
- dropbox := dropbox.GetConfig()
- dropbox.Code = c.Query("code")
- if len(dropbox.Code) == 0 {
- c.String(200, `<p>Code cannot be empty</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Code cannot be empty"
- logger.Error("Then code is empty error: ", zap.String("code", dropbox.Code), zap.Any("name", "dropbox"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- err := dropbox.Init(c)
- if err != nil {
- c.String(200, `<p>Initialization failure:`+err.Error()+`</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Initialization failure"
- logger.Error("Then init error: ", zap.Error(err), zap.Any("name", "dropbox"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- username, err := dropbox.GetUserInfo(c)
- if err != nil {
- c.String(200, `<p>Failed to get user information:`+err.Error()+`</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Failed to get user information"
- logger.Error("Then get user information: ", zap.Error(err), zap.Any("name", "dropbox"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- dmap := make(map[string]string)
- dmap["username"] = username
- configs, err := service.MyService.Storage().GetConfig()
- if err != nil {
- c.String(200, `<p>Failed to get rclone config:`+err.Error()+`</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Failed to get rclone config"
- logger.Error("Then get config error: ", zap.Error(err), zap.Any("name", "dropbox"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- for _, v := range configs.Remotes {
- cf, err := service.MyService.Storage().GetConfigByName(v)
- if err != nil {
- logger.Error("then get config by name error: ", zap.Error(err), zap.Any("name", v))
- continue
- }
- if cf["type"] == "dropbox" && cf["username"] == dmap["username"] {
- c.String(200, `<p>The same configuration has been added</p><script>window.close()</script>`)
- err := service.MyService.Storage().CheckAndMountByName(v)
- if err != nil {
- logger.Error("check and mount by name error: ", zap.Error(err), zap.Any("name", cf["username"]))
- }
- notify["status"] = "warn"
- notify["message"] = "The same configuration has been added"
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- }
- if len(username) > 0 {
- a := strings.Split(username, "@")
- username = a[0]
- }
- username += "_dropbox_" + strconv.FormatInt(time.Now().Unix(), 10)
- dmap["client_id"] = dropbox.AppKey
- dmap["client_secret"] = dropbox.AppSecret
- dmap["token"] = `{"access_token":"` + dropbox.AccessToken + `","token_type":"bearer","refresh_token":"` + dropbox.Addition.RefreshToken + `","expiry":"` + currentDate + `T` + currentTime.Add(time.Hour*3).Add(time.Minute*50).Format("15:04:05") + `.780385354Z"}`
- dmap["mount_point"] = "/mnt/" + username
- // data.SetValue(username, "type", "dropbox")
- // data.SetValue(username, "client_id", add.AppKey)
- // data.SetValue(username, "client_secret", add.AppSecret)
- // data.SetValue(username, "mount_point", "/mnt/"+username)
- // data.SetValue(username, "token", `{"access_token":"`+dropbox.AccessToken+`","token_type":"bearer","refresh_token":"`+dropbox.Addition.RefreshToken+`","expiry":"`+currentDate+`T`+currentTime.Add(time.Hour*3).Format("15:04:05")+`.780385354Z"}`)
- // e = data.Save()
- // if e != nil {
- // c.String(200, `<p>保存配置失败:`+e.Error()+`</p>`)
- // return
- // }
- service.MyService.Storage().CreateConfig(dmap, username, "dropbox")
- service.MyService.Storage().MountStorage("/mnt/"+username, username+":")
- notify["status"] = "success"
- notify["message"] = "Success"
- notify["driver"] = "Dropbox"
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- } else if t == "Onedrive" {
- onedrive := onedrive.GetConfig()
- onedrive.Code = c.Query("code")
- if len(onedrive.Code) == 0 {
- c.String(200, `<p>Code cannot be empty</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Code cannot be empty"
- logger.Error("Then code is empty error: ", zap.String("code", onedrive.Code), zap.Any("name", "onedrive"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- err := onedrive.Init(c)
- if err != nil {
- c.String(200, `<p>Initialization failure:`+err.Error()+`</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Initialization failure"
- logger.Error("Then init error: ", zap.Error(err), zap.Any("name", "onedrive"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- username, driveId, driveType, err := onedrive.GetInfo(c)
- if err != nil {
- c.String(200, `<p>Failed to get user information:`+err.Error()+`</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Failed to get user information"
- logger.Error("Then get user information: ", zap.Error(err), zap.Any("name", "onedrive"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- dmap := make(map[string]string)
- dmap["username"] = username
- configs, err := service.MyService.Storage().GetConfig()
- if err != nil {
- c.String(200, `<p>Failed to get rclone config:`+err.Error()+`</p><script>window.close()</script>`)
- notify["status"] = "fail"
- notify["message"] = "Failed to get rclone config"
- logger.Error("Then get config error: ", zap.Error(err), zap.Any("name", "onedrive"))
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- for _, v := range configs.Remotes {
- cf, err := service.MyService.Storage().GetConfigByName(v)
- if err != nil {
- logger.Error("then get config by name error: ", zap.Error(err), zap.Any("name", v))
- continue
- }
- if cf["type"] == "onedrive" && cf["username"] == dmap["username"] {
- c.String(200, `<p>The same configuration has been added</p><script>window.close()</script>`)
- err := service.MyService.Storage().CheckAndMountByName(v)
- if err != nil {
- logger.Error("check and mount by name error: ", zap.Error(err), zap.Any("name", cf["username"]))
- }
- notify["status"] = "warn"
- notify["message"] = "The same configuration has been added"
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- return
- }
- }
- if len(username) > 0 {
- a := strings.Split(username, "@")
- username = a[0]
- }
- username += "_onedrive_" + strconv.FormatInt(time.Now().Unix(), 10)
- dmap["client_id"] = onedrive.ClientID
- dmap["client_secret"] = onedrive.ClientSecret
- dmap["token"] = `{"access_token":"` + onedrive.AccessToken + `","token_type":"bearer","refresh_token":"` + onedrive.RefreshToken + `","expiry":"` + currentDate + `T` + currentTime.Add(time.Hour*3).Add(time.Minute*50).Format("15:04:05") + `.780385354Z"}`
- dmap["mount_point"] = "/mnt/" + username
- dmap["drive_id"] = driveId
- dmap["drive_type"] = driveType
- // data.SetValue(username, "type", "dropbox")
- // data.SetValue(username, "client_id", add.AppKey)
- // data.SetValue(username, "client_secret", add.AppSecret)
- // data.SetValue(username, "mount_point", "/mnt/"+username)
- // data.SetValue(username, "token", `{"access_token":"`+dropbox.AccessToken+`","token_type":"bearer","refresh_token":"`+dropbox.Addition.RefreshToken+`","expiry":"`+currentDate+`T`+currentTime.Add(time.Hour*3).Format("15:04:05")+`.780385354Z"}`)
- // e = data.Save()
- // if e != nil {
- // c.String(200, `<p>保存配置失败:`+e.Error()+`</p>`)
- // return
- // }
- service.MyService.Storage().CreateConfig(dmap, username, "onedrive")
- service.MyService.Storage().MountStorage("/mnt/"+username, username+":")
- notify["status"] = "success"
- notify["message"] = "Success"
- notify["driver"] = "Onedrive"
- service.MyService.Notify().SendNotify("casaos:file:recover", notify)
- }
- c.String(200, `<p>Just close the page</p><script>window.close()</script>`)
- }
|