From 449960098a7053c36cc8cccfab9d50516dfcb53a Mon Sep 17 00:00:00 2001 From: Martin Geno Date: Tue, 20 Dec 2016 00:35:03 +0100 Subject: [PATCH] fix ftp --- cmd/warehost-ftp/auth.go | 4 +-- cmd/warehost-ftp/driver.go | 50 +++++++++++++++++++++++++++++--------- lib/api/main.go | 3 ++- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/cmd/warehost-ftp/auth.go b/cmd/warehost-ftp/auth.go index 9236953..ca81c51 100644 --- a/cmd/warehost-ftp/auth.go +++ b/cmd/warehost-ftp/auth.go @@ -12,10 +12,10 @@ type WarehostAuth struct { db *gorm.DB } -func (this WarehostAuth) CheckPasswd(user, pass string) (returndata bool, err error) { +func (auth WarehostAuth) CheckPasswd(user, pass string) (returndata bool, err error) { returndata = false var login = system.Login{Username: user} - this.db.Where("mail = ?", user).First(&login) + auth.db.Where("mail = ?", user).First(&login) if login.ID <= 0 { liblog.Log.Warn("user not found") return diff --git a/cmd/warehost-ftp/driver.go b/cmd/warehost-ftp/driver.go index c7b3919..95484a9 100644 --- a/cmd/warehost-ftp/driver.go +++ b/cmd/warehost-ftp/driver.go @@ -6,6 +6,7 @@ import ( "io" "os" "path/filepath" + "strconv" "strings" "time" @@ -87,7 +88,7 @@ func (f *FileInfo) Group() string { func (driver *FileDriver) chechLogin() { if driver.login.ID <= 0 && driver.conn.IsLogin() { driver.db.Where("mail = ?", driver.conn.LoginUser()).First(&driver.login) - fmt.Printf("Connection:%s:%d", driver.conn.LoginUser(), driver.login.ID) + fmt.Printf("Connection:%s:%d\n", driver.conn.LoginUser(), driver.login.ID) } } func (driver *FileDriver) realPath(path string) (string, bool) { @@ -99,20 +100,36 @@ func (driver *FileDriver) realPath(path string) (string, bool) { switch paths[1] { case DriverFolderOwn: root = fmt.Sprintf(driver.config.Own, driver.login.ID) - paths = append([]string{paths[0]}, paths[2:]...) + paths = paths[2:] real = true + break case DriverFolderDomain: if len(paths) > 2 { - root = fmt.Sprintf(driver.config.Host, driver.login.ID) - paths = append([]string{paths[0]}, paths[3:]...) - real = true + var web host.Web + domain := paths[2] + if driver.login.Superadmin { + driver.db.Joins("LEFT JOIN host_domain ON host_domain.id=host_web.domain").Where("CONCAT(host_web.subdomain,'.',host_domain.fqdn) = ?", domain).Or("host_web.subdomain='' AND host_domain.fqdn = ?", domain).First(&web) + } else { + driver.db.Joins("LEFT JOIN host_domain ON host_domain.id=host_web.domain").Joins("LEFT JOIN host_web_ftpaccess ftp ON ftp.web=host_web.id AND ftp.login = ?", driver.login.ID).Where("CONCAT(host_web.subdomain,'.',host_domain.fqdn) = ?", domain).Or("host_web.subdomain='' AND host_domain.fqdn = ?", domain).First(&web) + } + if web.ID > 0 { + root = fmt.Sprintf(driver.config.Host, domain) + paths = paths[3:] + real = true + } } + break case DriverFolderWeb: if len(paths) > 2 { - root = fmt.Sprintf(driver.config.Web, driver.login.ID) - paths = append([]string{paths[0]}, paths[3:]...) - real = true + id, _ := strconv.ParseInt(paths[2], 10, 64) + res := driver.db.Where(map[string]int64{"website": id, "login": driver.login.ID}).Find(&web.Manager{}) + if !res.RecordNotFound() || driver.login.Superadmin { + root = fmt.Sprintf(driver.config.Web, id) + paths = paths[3:] + real = true + } } + break } } return filepath.Join(append([]string{root}, paths...)...), real @@ -212,7 +229,12 @@ func (driver *FileDriver) ListDir(path string, callback func(ftpd.FileInfo) erro return nil case fmt.Sprintf("/%s", DriverFolderDomain): var list []*host.Web - driver.db.Preload("Domain.Profil.Login").Order("length(subdomain) asc").Find(&list) + if driver.login.Superadmin { + driver.db.Preload("Domain").Find(&list) + } else { + driver.db.Joins("LEFT JOIN host_web_ftpaccess ftp ON ftp.web=host_web.id AND ftp.login = ?", driver.login.ID).Preload("Domain").Find(&list) + } + for _, i := range list { domain := i.Domain.FQDN if len(i.Subdomain) > 0 { @@ -225,10 +247,14 @@ func (driver *FileDriver) ListDir(path string, callback func(ftpd.FileInfo) erro } return nil case fmt.Sprintf("/%s", DriverFolderWeb): - var list []*web.Website - driver.db.Find(&list) + var list []*web.Manager + if driver.login.Superadmin { + driver.db.Find(&list) + } else { + driver.db.Where("login = ?", driver.login.ID).Find(&list) + } for _, i := range list { - err := callback(&FackFileInfo{name: fmt.Sprintf("%d", i.ID)}) + err := callback(&FackFileInfo{name: fmt.Sprintf("%d", i.WebsiteID)}) if err != nil { return err } diff --git a/lib/api/main.go b/lib/api/main.go index fbf9b60..d093c8a 100644 --- a/lib/api/main.go +++ b/lib/api/main.go @@ -64,7 +64,7 @@ func JSONWrite(w http.ResponseWriter, r *http.Request, data interface{}, errorre //JSONDecoder handle complete request of JSON func JSONDecoder(w http.ResponseWriter, r *http.Request, logger *log.Entry, data interface{}) (returnerr *ErrorResult) { - if r.Header.Get("Content-Type") != "application/json" { + /*if r.Header.Get("Content-Type") != "application/json" { logger.Error("fetch wrong request type") returnerr = &ErrorResult{ Message: "Internal Request Error", @@ -72,6 +72,7 @@ func JSONDecoder(w http.ResponseWriter, r *http.Request, logger *log.Entry, data w.WriteHeader(http.StatusBadRequest) return } + */ err := json.NewDecoder(r.Body).Decode(data) if err != nil { logger.Error("fetch request")