@@ -19,7 +19,6 @@ import ( | |||
"strings" | |||
"time" | |||
"github.com/aliyun/aliyun-oss-go-sdk/oss" | |||
"github.com/casbin/casibase/storage" | |||
) | |||
@@ -72,7 +71,7 @@ func (store *Store) createPathIfNotExisted(tokens []string, size int64, lastModi | |||
} | |||
} | |||
func isObjectLeaf(object *oss.ObjectProperties) bool { | |||
func isObjectLeaf(object *storage.Object) bool { | |||
isLeaf := true | |||
if object.Key[len(object.Key)-1] == '/' { | |||
isLeaf = false | |||
@@ -97,7 +96,7 @@ func (store *Store) Populate() error { | |||
} | |||
} | |||
sortedObjects := []oss.ObjectProperties{} | |||
sortedObjects := []*storage.Object{} | |||
for _, object := range objects { | |||
if strings.HasSuffix(object.Key, "/_hidden.ini") { | |||
sortedObjects = append(sortedObjects, object) | |||
@@ -111,7 +110,7 @@ func (store *Store) Populate() error { | |||
for _, object := range sortedObjects { | |||
lastModifiedTime := object.LastModified.Local().Format(time.RFC3339) | |||
isLeaf := isObjectLeaf(&object) | |||
isLeaf := isObjectLeaf(object) | |||
size := object.Size | |||
tokens := strings.Split(strings.Trim(object.Key, "/"), "/") | |||
@@ -1,89 +0,0 @@ | |||
// Copyright 2023 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 storage | |||
import ( | |||
"fmt" | |||
"io" | |||
"net/http" | |||
"time" | |||
"github.com/astaxie/beego" | |||
"github.com/casbin/casibase/casdoor" | |||
"github.com/casbin/casibase/util" | |||
"github.com/casdoor/casdoor-go-sdk/casdoorsdk" | |||
) | |||
type casdoorClient struct { | |||
Storage | |||
} | |||
func NewCasdoorStorage() Storage { | |||
return &casdoorClient{} | |||
} | |||
func (s *casdoorClient) Get(key string) (io.ReadCloser, error) { | |||
res, err := casdoor.GetResource(key) | |||
if err != nil { | |||
return nil, err | |||
} | |||
response, err := http.Get(res.Url) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return response.Body, nil | |||
} | |||
func (s *casdoorClient) Put(user, key string, bytes []byte) error { | |||
_, _, err := casdoorsdk.UploadResource(user, "Casibase", "Casibase", | |||
fmt.Sprintf("/resource/%s/%s/%s", | |||
casdoor.Organization, casdoor.Application, key), | |||
bytes) | |||
if err != nil { | |||
return err | |||
} | |||
return nil | |||
} | |||
func (s *casdoorClient) Delete(key string) error { | |||
_, err := casdoorsdk.DeleteResource(util.GetIdFromOwnerAndName(fmt.Sprintf("/resource/%s/%s/casibase", | |||
beego.AppConfig.String("casdoorOrganization"), | |||
beego.AppConfig.String("casdoorApplication")), key)) | |||
if err != nil { | |||
return err | |||
} | |||
return nil | |||
} | |||
func (s *casdoorClient) List(prefix string) ([]*Object, error) { | |||
res, err := casdoor.ListResources(prefix) | |||
if err != nil { | |||
return nil, err | |||
} | |||
result := make([]*Object, 0) | |||
for _, r := range res { | |||
created, _ := time.Parse(time.RFC3339, r.CreatedTime) | |||
result = append(result, &Object{ | |||
Key: util.GetNameFromIdNoCheck(r.Name), | |||
LastModified: &created, | |||
Storage: s, | |||
}) | |||
} | |||
return result, nil | |||
} |
@@ -1,21 +0,0 @@ | |||
// Copyright 2023 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 storage | |||
var ( | |||
endpoint = "" | |||
clientId = "" | |||
clientSecret = "" | |||
) |
@@ -15,28 +15,70 @@ | |||
package storage | |||
import ( | |||
"bytes" | |||
"fmt" | |||
"io" | |||
"net/http" | |||
"time" | |||
) | |||
type Storage interface { | |||
Get(key string) (io.ReadCloser, error) | |||
Put(user, key string, bytes []byte) error | |||
Delete(key string) error | |||
List(prefix string) ([]*Object, error) | |||
} | |||
"github.com/astaxie/beego" | |||
"github.com/casbin/casibase/casdoor" | |||
"github.com/casbin/casibase/util" | |||
"github.com/casdoor/casdoor-go-sdk/casdoorsdk" | |||
) | |||
type Object struct { | |||
Key string | |||
LastModified *time.Time | |||
Storage Storage | |||
Size int64 | |||
} | |||
func ListObjects(bucketName string, prefix string) ([]*Object, error) { | |||
resources, err := casdoor.ListResources(prefix) | |||
if err != nil { | |||
return nil, err | |||
} | |||
res := []*Object{} | |||
for _, resource := range resources { | |||
created, _ := time.Parse(time.RFC3339, resource.CreatedTime) | |||
res = append(res, &Object{ | |||
Key: util.GetNameFromIdNoCheck(resource.Name), | |||
LastModified: &created, | |||
}) | |||
} | |||
return res, nil | |||
} | |||
func GetObject(bucketName string, key string) (io.ReadCloser, error) { | |||
res, err := casdoor.GetResource(key) | |||
if err != nil { | |||
return nil, err | |||
} | |||
response, err := http.Get(res.Url) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return response.Body, nil | |||
} | |||
func PutObject(bucketName string, key string, fileBuffer *bytes.Buffer) error { | |||
_, _, err := casdoorsdk.UploadResource("Casibase", "Casibase", "Casibase", | |||
fmt.Sprintf("/resource/%s/%s/%s", casdoor.Organization, casdoor.Application, key), fileBuffer.Bytes()) | |||
if err != nil { | |||
return err | |||
} | |||
return nil | |||
} | |||
func NewStorageProvider(provider string) Storage { | |||
switch provider { | |||
case "casdoor": | |||
return NewCasdoorStorage() | |||
default: | |||
return nil | |||
func DeleteObject(bucketName string, key string) error { | |||
_, err := casdoorsdk.DeleteResource(util.GetIdFromOwnerAndName(fmt.Sprintf("/resource/%s/%s/casibase", | |||
beego.AppConfig.String("casdoorOrganization"), | |||
beego.AppConfig.String("casdoorApplication")), key)) | |||
if err != nil { | |||
return err | |||
} | |||
return nil | |||
} |
@@ -18,67 +18,21 @@ | |||
package storage_test | |||
import ( | |||
"io" | |||
"testing" | |||
"github.com/casbin/casibase/casdoor" | |||
"github.com/casbin/casibase/controllers" | |||
"github.com/casbin/casibase/object" | |||
"github.com/casbin/casibase/storage" | |||
) | |||
func TestStorage(t *testing.T) { | |||
_, err := storage.ListObjects("casibase", "") | |||
if err != nil { | |||
panic(err) | |||
} | |||
} | |||
func TestCasdoor(t *testing.T) { | |||
controllers.InitAuthConfig() | |||
object.InitConfig() | |||
casdoor.InitCasdoorAdapter() | |||
s := storage.NewCasdoorStorage() | |||
// Test Put | |||
err := s.Put("admin", "test", []byte("test")) | |||
if err != nil { | |||
t.Error(err) | |||
} | |||
// Test List | |||
objs, err := s.List("admin") | |||
if err != nil { | |||
t.Error(err) | |||
} | |||
for _, obj := range objs { | |||
t.Log(obj) | |||
} | |||
// Test Get | |||
in, err := s.Get("test") | |||
objects, err := storage.ListObjects("casibase", "") | |||
if err != nil { | |||
t.Error(err) | |||
} | |||
bytes, err := io.ReadAll(in) | |||
if err != nil { | |||
t.Error(err) | |||
} | |||
t.Log(string(bytes)) | |||
// Test Delete | |||
err = s.Delete("test") | |||
if err != nil { | |||
t.Error(err) | |||
} | |||
objs, err = s.List("test") | |||
if err != nil { | |||
t.Error(err) | |||
panic(err) | |||
} | |||
for _, obj := range objs { | |||
t.Log(obj) | |||
} | |||
println(objects) | |||
} |