Files
anytunnel/at-api/func.go
T
2019-08-08 17:13:34 +08:00

202 lines
4.2 KiB
Go

package main
import (
utils "anytunnel/at-common"
"anytunnel/at-common/qqwry"
"fmt"
"strings"
"time"
)
func authCheckCS(csType, token string) (userID string, err error) {
rs, err := db.Query(db.AR().From(csType).Where(map[string]interface{}{
"is_delete": 0,
"token": token,
}).Limit(0, 1))
if err != nil {
return
}
if rs.Len() == 0 {
return "", fmt.Errorf("token error")
}
userID = rs.Value("user_id")
return
}
func authCheckUser(userID string) (err error) {
rs, err := db.Query(db.AR().From("user").Where(map[string]interface{}{
"user_id": userID,
//"is_active": 1,
}).Limit(0, 1))
if err != nil {
return
}
fmt.Println(userID)
if rs.Len() == 0 {
return fmt.Errorf("empty user")
}
if rs.Value("is_forbidden") == "1" {
reason := rs.Value("forbidden_reason")
if reason == "" {
reason = "your account was forbidden"
}
return fmt.Errorf(reason)
}
return
}
func authCheckUserTraffic(userID string) (err error) {
now := time.Now().Unix()
rs, err := db.Query(db.AR().From("package").Where(map[string]interface{}{
"user_id": userID,
"start_time <=": now,
"end_time >=": now,
"bytes_left >": 0,
}).Limit(0, 1))
if err != nil {
return
}
if rs.Len() == 0 {
return fmt.Errorf("your traffic has no more")
}
return
}
func authCheckIPWhiteList(ip, csType string) (ok bool, err error) {
rs, err := db.Query(db.AR().From("ip_list").Where(map[string]interface{}{
"ip": ip,
"cs_type": csType,
"is_forbidden": 0,
}).Limit(1))
if err != nil {
return
}
ok = rs.Len() == 1
return
}
func authCheckIPBlackList(ip, csType string) (ok bool, err error) {
rs, err := db.Query(db.AR().From("ip_list").Where(map[string]interface{}{
"ip": ip,
"cs_type": csType,
"is_forbidden": 1,
}).Limit(1))
if err != nil {
return
}
ok = rs.Len() == 0
return
}
func authCheckAreaWhiteList(country, csType string) (ok bool, err error) {
rs, err := db.Query(db.AR().From("area").Where(map[string]interface{}{
"cs_type": csType,
"is_forbidden": 0,
}))
if err != nil {
return
}
for _, v := range rs.Rows() {
if strings.HasPrefix(country, v["name"]) {
ok = true
return
}
}
return
}
func authCheckAreaBlackList(country, csType string) (ok bool, err error) {
rs, err := db.Query(db.AR().From("area").Where(map[string]interface{}{
"cs_type": csType,
"is_forbidden": 1,
}))
if err != nil {
return
}
ok = true
for _, v := range rs.Rows() {
if strings.HasPrefix(country, v["name"]) {
ok = false
return
}
}
return
}
func authCheckRoleArea(userID string, q qqwry.ResultQQwry, csType string) (err error) {
rs, err := db.Query(db.AR().From("user_role").Where(map[string]interface{}{
"user_id": userID,
}))
if err != nil {
return
}
if rs.Len() == 0 {
return fmt.Errorf("empty user role")
}
roleIDs := rs.Values("role_id")
rs, err = db.Query(db.AR().From("role").Where(map[string]interface{}{
"role_id": roleIDs,
}))
if err != nil {
return
}
if rs.Len() == 0 {
return fmt.Errorf("empty role")
}
serverHasAll := false
clientHasAll := false
serverArea := []string{}
clientArea := []string{}
for _, role := range rs.Rows() {
if role["server_area"] == "all" {
serverHasAll = true
}
if role["client_area"] == "all" {
clientHasAll = true
}
serverArea = append(serverArea, role["server_area"])
clientArea = append(clientArea, role["client_area"])
}
//检查server或者client的ip是否在允许的范围内
if csType == "server" {
if !serverHasAll {
serverIPArea := ""
if q.Country != "" {
if utils.IsChina(q.Country) {
serverIPArea = "china"
} else {
serverIPArea = "foreign"
}
}
found := false
for _, v := range serverArea {
if v == serverIPArea {
found = true
break
}
}
if !found {
return fmt.Errorf("Your IP %s was forbidden,%s", q.IP, q.Country)
}
}
}
if csType == "client" {
if !clientHasAll {
clientIPArea := ""
if q.Country != "" {
if utils.IsChina(q.Country) {
clientIPArea = "china"
} else {
clientIPArea = "foreign"
}
}
found := false
for _, v := range clientArea {
if v == clientIPArea {
found = true
break
}
}
if !found {
return fmt.Errorf("Your IP %s was forbidden,%s", q.IP, q.Country)
}
}
}
return
}