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 }