feat: integrate Storage config into providers (#198)

Signed-off-by: Kininaru <shiftregister233@outlook.com>
This commit is contained in:
Kininaru
2021-07-26 11:39:49 +08:00
committed by GitHub
parent 1c01a34814
commit 3d493b8d8f
12 changed files with 224 additions and 160 deletions

View File

@ -42,6 +42,10 @@ func (application *Application) GetSmsProvider() *Provider {
return application.getProviderByCategory("SMS")
}
func (application *Application) GetStorageProvider() *Provider {
return application.getProviderByCategory("Storage")
}
func (application *Application) getSignupItem(itemName string) *SignupItem {
for _, signupItem := range application.SignupItems {
if signupItem.Name == itemName {

View File

@ -1,130 +0,0 @@
// Copyright 2021 The casbin Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package object
import (
"bytes"
"fmt"
awss3 "github.com/aws/aws-sdk-go/service/s3"
"github.com/qor/oss"
"github.com/qor/oss/aliyun"
//"github.com/qor/oss/qiniu"
"github.com/qor/oss/s3"
"gopkg.in/ini.v1"
)
var storage oss.StorageInterface
var domain string
func AliyunInit(section *ini.Section) string {
endpoint := section.Key("endpoint").String()
accessId := section.Key("accessId").String()
accessKey := section.Key("accessKey").String()
domain = section.Key("domain").String()
bucket := section.Key("bucket").String()
if accessId == "" || accessKey == "" || bucket == "" || endpoint == "" {
return "Config oss.conf wrong"
}
storage = aliyun.New(&aliyun.Config{
AccessID: accessId,
AccessKey: accessKey,
Bucket: bucket,
Endpoint: endpoint,
})
return ""
}
//func QiniuInit(section *ini.Section) string {
// endpoint := section.Key("endpoint").String()
// accessId := section.Key("accessId").String()
// accessKey := section.Key("accessKey").String()
// domain = section.Key("domain").String()
// bucket := section.Key("bucket").String()
// region := section.Key("region").String()
// if accessId == "" || accessKey == "" || bucket == "" || endpoint == "" || region == "" {
// return "Config oss.conf wrong"
// }
// storage = qiniu.New(&qiniu.Config{
// AccessID: accessId,
// AccessKey: accessKey,
// Bucket: bucket,
// Region: region,
// Endpoint: endpoint,
// })
// return ""
//}
func Awss3Init(section *ini.Section) string {
endpoint := section.Key("endpoint").String()
accessId := section.Key("accessId").String()
accessKey := section.Key("accessKey").String()
domain = section.Key("domain").String()
bucket := section.Key("bucket").String()
region := section.Key("region").String()
if accessId == "" || accessKey == "" || bucket == "" || endpoint == "" || region == "" {
return "Config oss.conf wrong"
}
storage = s3.New(&s3.Config{
AccessID: accessId,
AccessKey: accessKey,
Region: region,
Bucket: bucket,
Endpoint: endpoint,
ACL: awss3.BucketCannedACLPublicRead,
})
return ""
}
func InitOssClient() {
if storage != nil {
return
}
ossConf, err := ini.Load("./conf/oss.conf")
if err != nil {
panic(err)
return
}
aliyunSection, _ := ossConf.GetSection("aliyun")
qiniuSection, _ := ossConf.GetSection("qiniu")
awss3Section, _ := ossConf.GetSection("s3")
if aliyunSection != nil {
AliyunInit(aliyunSection)
} else if qiniuSection != nil {
//QiniuInit(qiniuSection)
} else {
Awss3Init(awss3Section)
}
}
func UploadAvatar(username string, avatar []byte) string {
if storage == nil {
InitOssClient()
if storage == nil {
return "oss error"
}
}
path := fmt.Sprintf("/casdoor/avatar/%s.png", username)
_, err := storage.Put(path, bytes.NewReader(avatar))
if err != nil {
panic(err)
}
return ""
}
func GetAvatarPath() string {
return fmt.Sprintf("https://%s/casdoor/avatar/", domain)
}

View File

@ -15,6 +15,8 @@
package object
import (
"fmt"
"github.com/casbin/casdoor/util"
"xorm.io/core"
)
@ -40,6 +42,10 @@ type Provider struct {
TemplateCode string `xorm:"varchar(100)" json:"templateCode"`
AppId string `xorm:"varchar(100)" json:"appId"`
Endpoint string `xorm:"varchar(100)" json:"endpoint"`
Domain string `xorm:"varchar(100)" json:"domain"`
Bucket string `xorm:"varchar(100)" json:"bucket"`
ProviderUrl string `xorm:"varchar(200)" json:"providerUrl"`
}
@ -134,3 +140,7 @@ func DeleteProvider(provider *Provider) bool {
return affected != 0
}
func (p *Provider) GetId() string {
return fmt.Sprintf("%s/%s", p.Owner, p.Name)
}

136
object/storage.go Normal file
View File

@ -0,0 +1,136 @@
// Copyright 2021 The casbin Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package object
import (
"bytes"
"fmt"
awss3 "github.com/aws/aws-sdk-go/service/s3"
"github.com/casbin/casdoor/util"
"github.com/qor/oss"
"github.com/qor/oss/aliyun"
//"github.com/qor/oss/qiniu"
"github.com/qor/oss/s3"
)
func getAliyunClient(provider *Provider) oss.StorageInterface {
if util.IsStrsEmpty(
provider.Endpoint,
provider.ClientId,
provider.ClientSecret,
provider.Bucket) {
return nil
}
ret := aliyun.New(&aliyun.Config{
AccessID: provider.ClientId,
AccessKey: provider.ClientSecret,
Bucket: provider.Bucket,
Endpoint: provider.Endpoint,
})
if len(provider.Domain) == 0 {
provider.Domain = ret.GetEndpoint()
UpdateProvider(provider.GetId(), provider)
}
return ret
}
func getQiniuClient(provider *Provider) oss.StorageInterface {
fmt.Println("Casdoor does not support Qiniu now.")
return nil
// endpoint := section.Key("endpoint").String()
// accessId := section.Key("accessId").String()
// accessKey := section.Key("accessKey").String()
// domain = section.Key("domain").String()
// bucket := section.Key("bucket").String()
// region := section.Key("region").String()
// if accessId == "" || accessKey == "" || bucket == "" || endpoint == "" || region == "" {
// return "Config oss.conf wrong"
// }
// storage = qiniu.New(&qiniu.Config{
// AccessID: accessId,
// AccessKey: accessKey,
// Bucket: bucket,
// Region: region,
// Endpoint: endpoint,
// })
// return ""
}
func getAwss3Client(provider *Provider) oss.StorageInterface {
if util.IsStrsEmpty(
provider.Endpoint,
provider.ClientId,
provider.ClientSecret,
provider.Bucket,
provider.RegionId) {
return nil
}
ret := s3.New(&s3.Config{
AccessID: provider.ClientId,
AccessKey: provider.ClientSecret,
Region: provider.RegionId,
Bucket: provider.Bucket,
Endpoint: provider.Endpoint,
ACL: awss3.BucketCannedACLPublicRead,
})
if len(provider.Domain) == 0 {
provider.Domain = ret.GetEndpoint()
UpdateProvider(provider.GetId(), provider)
}
return ret
}
func getStorageClient(provider *Provider) oss.StorageInterface {
if provider == nil || provider.Category != "Storage" {
return nil
}
switch provider.Type {
case "Aliyun":
return getAliyunClient(provider)
case "Qiniu":
return getQiniuClient(provider)
case "AWSS3":
return getAwss3Client(provider)
}
return nil
}
func UploadAvatar(provider *Provider, username string, avatar []byte) string {
if provider == nil {
return "invalid Storage provider"
}
storage := getStorageClient(provider)
if storage == nil {
return "oss provider not exists"
}
path := fmt.Sprintf("/casdoor/avatar/%s.png", username)
_, err := storage.Put(path, bytes.NewReader(avatar))
if err != nil {
panic(err)
}
return ""
}
func GetAvatarPath(provider *Provider) string {
return fmt.Sprintf("https://%s/casdoor/avatar/", provider.Domain)
}