go-common/app/interface/main/app-view/service/view/access.go
2019-04-22 18:49:16 +08:00

118 lines
3.3 KiB
Go

package view
import (
"context"
"go-common/app/interface/main/app-view/model"
account "go-common/app/service/main/account/model"
"go-common/app/service/main/archive/model/archive"
locmdl "go-common/app/service/main/location/model"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
)
// ipLimit ip limit
func (s *Service) ipLimit(c context.Context, mid, aid int64, cdnIP string) (down int64, err error) {
var auth *locmdl.Auth
ip := metadata.String(c, metadata.RemoteIP)
if auth, err = s.locDao.Archive(c, aid, mid, ip, cdnIP); err != nil {
log.Error("%v", err)
err = nil // NOTE: return or ignore err???
}
if auth != nil {
down = auth.Down
switch auth.Play {
case locmdl.Forbidden:
err = ecode.AccessDenied
s.prom.Incr("ip_limit_access")
}
}
return
}
// areaLimit area limit
func (s *Service) areaLimit(c context.Context, plat int8, rid int) (err error) {
ip := metadata.String(c, metadata.RemoteIP)
if rm, ok := s.region[plat]; !ok {
return
} else if r, ok := rm[rid]; ok && r != nil && r.Area != "" {
var auths map[string]*locmdl.Auth
if auths, err = s.locDao.AuthPIDs(c, r.Area, ip); err != nil {
log.Error("error(%v) area(%v) ip(%v)", err, r.Area, ip)
err = nil
return
}
if auth, ok := auths[r.Area]; ok && auth.Play == locmdl.Forbidden {
log.Error("zlimit region area(%s) ip(%v) forbid", r.Area, ip)
err = ecode.NothingFound
s.prom.Incr("region_limit_access")
}
}
return
}
// checkAceess check user Aceess
func (s *Service) checkAceess(c context.Context, mid, aid int64, state, access int, ak string) (err error) {
if state >= 0 && access == 0 {
return
}
if state < 0 {
if state == archive.StateForbidFixed {
log.Warn("archive(%d) is fixed", aid)
} else if state == archive.StateForbidUpDelete {
log.Warn("archive(%d) is deleted", aid)
} else {
log.Warn("mid(%d) have not access view not pass archive(%d) ", mid, aid)
}
err = ecode.NothingFound
return
}
if mid == 0 {
log.Warn("not login can not view(%d) state(%d) access(%d)", aid, state, access)
err = ecode.AccessDenied
s.prom.Incr("no_login_access")
return
}
card, err := s.accDao.Card3(c, mid)
if err != nil || card == nil {
if err != nil {
log.Error("s.accDao.Info(%d) error(%v)", mid, err)
}
err = ecode.AccessDenied
log.Warn("s.accDao.Info failed can not view(%d) state(%d) access(%d)", aid, state, access)
s.prom.Incr("err_login_access")
return
}
if access > 0 && int(card.Rank) < access && (card.Vip.Type == 0 || card.Vip.Status == 0 || card.Vip.Status == 2 || card.Vip.Status == 3) {
err = ecode.AccessDenied
log.Warn("mid(%d) rank(%d) vip(tp:%d,status:%d) have not access(%d) view archive(%d) ", mid, card.Rank, card.Vip.Type, card.Vip.Status, access, aid)
s.prom.Incr("login_access")
}
return
}
// checkVIP check user is vip or no .
func (s *Service) checkVIP(c context.Context, mid int64) (vip bool) {
var (
card *account.Card
err error
)
if mid > 0 {
if card, err = s.accDao.Card3(c, mid); err != nil || card == nil {
log.Warn("s.acc.Info(%d) error(%v)", mid, err)
return
}
vip = card.Vip.Type > 0 && card.Vip.Status == 1
}
return
}
func (s *Service) overseaCheck(a *archive.Archive3, plat int8) bool {
if a.AttrVal(archive.AttrBitOverseaLock) == archive.AttrYes && model.IsOverseas(plat) {
s.prom.Incr("oversea_access")
return true
}
return false
}