105 lines
2.9 KiB
Go
105 lines
2.9 KiB
Go
package filesafety
|
|
|
|
import (
|
|
"errors"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/tinode/chat/server/filesafety/aliyun"
|
|
"github.com/tinode/chat/server/store"
|
|
"github.com/tinode/chat/server/store/types"
|
|
)
|
|
|
|
const thirdPartyConfigGroup = "im_third_party"
|
|
|
|
type ContentReviewConfig struct {
|
|
Enabled bool
|
|
Provider string
|
|
Green aliyun.GreenConfig
|
|
}
|
|
|
|
type MalwareReviewConfig struct {
|
|
Enabled bool
|
|
Provider string
|
|
RegionID string
|
|
}
|
|
|
|
type Config struct {
|
|
Content ContentReviewConfig
|
|
Malware MalwareReviewConfig
|
|
}
|
|
|
|
func LoadConfig() (*Config, error) {
|
|
values, err := store.ThirdPartyConfig.Get(thirdPartyConfigGroup,
|
|
"file_review_content_enabled",
|
|
"file_review_content_provider",
|
|
"aliyun_green_region_id",
|
|
"aliyun_green_endpoint",
|
|
"aliyun_green_document_service",
|
|
"file_review_malware_enabled",
|
|
"file_review_malware_provider",
|
|
"aliyun_sas_region_id",
|
|
"aliyun_access_key_id",
|
|
"aliyun_access_key_secret",
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
config := &Config{
|
|
Content: ContentReviewConfig{
|
|
Enabled: boolValue(values["file_review_content_enabled"]),
|
|
Provider: stringDefault(values["file_review_content_provider"], types.FileReviewProviderAliyunGreen),
|
|
Green: aliyun.GreenConfig{
|
|
AccessKeyID: strings.TrimSpace(values["aliyun_access_key_id"]),
|
|
AccessKeySecret: strings.TrimSpace(values["aliyun_access_key_secret"]),
|
|
RegionID: strings.TrimSpace(values["aliyun_green_region_id"]),
|
|
Endpoint: strings.TrimSpace(values["aliyun_green_endpoint"]),
|
|
DocumentService: strings.TrimSpace(values["aliyun_green_document_service"]),
|
|
},
|
|
},
|
|
Malware: MalwareReviewConfig{
|
|
Enabled: boolValue(values["file_review_malware_enabled"]),
|
|
Provider: stringDefault(values["file_review_malware_provider"], types.FileReviewProviderAliyunSAS),
|
|
RegionID: strings.TrimSpace(values["aliyun_sas_region_id"]),
|
|
},
|
|
}
|
|
if config.Content.Enabled && config.Content.Provider != types.FileReviewProviderAliyunGreen {
|
|
return nil, errors.New("unsupported file content review provider: " + config.Content.Provider)
|
|
}
|
|
if config.Malware.Enabled && config.Malware.Provider != types.FileReviewProviderAliyunSAS {
|
|
return nil, errors.New("unsupported malware review provider: " + config.Malware.Provider)
|
|
}
|
|
return config, nil
|
|
}
|
|
|
|
func NewGreenClientFromConfig() (*aliyun.GreenClient, error) {
|
|
config, err := LoadConfig()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !config.Content.Enabled {
|
|
return nil, types.ErrUnsupported
|
|
}
|
|
return aliyun.NewGreenClient(config.Content.Green)
|
|
}
|
|
|
|
func boolValue(value string) bool {
|
|
if parsed, err := strconv.ParseBool(strings.TrimSpace(value)); err == nil {
|
|
return parsed
|
|
}
|
|
switch strings.ToLower(strings.TrimSpace(value)) {
|
|
case "1", "yes", "on":
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func stringDefault(value, fallback string) string {
|
|
if value = strings.TrimSpace(value); value != "" {
|
|
return value
|
|
}
|
|
return fallback
|
|
}
|