@@ -0,0 +1,73 @@ | |||
// 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 casdoor | |||
type Provider struct { | |||
Owner string `xorm:"varchar(100) notnull pk" json:"owner"` | |||
Name string `xorm:"varchar(100) notnull pk unique" json:"name"` | |||
CreatedTime string `xorm:"varchar(100)" json:"createdTime"` | |||
DisplayName string `xorm:"varchar(100)" json:"displayName"` | |||
Category string `xorm:"varchar(100)" json:"category"` | |||
Type string `xorm:"varchar(100)" json:"type"` | |||
SubType string `xorm:"varchar(100)" json:"subType"` | |||
Method string `xorm:"varchar(100)" json:"method"` | |||
ClientId string `xorm:"varchar(100)" json:"clientId"` | |||
ClientSecret string `xorm:"varchar(2000)" json:"clientSecret"` | |||
ClientId2 string `xorm:"varchar(100)" json:"clientId2"` | |||
ClientSecret2 string `xorm:"varchar(100)" json:"clientSecret2"` | |||
Cert string `xorm:"varchar(100)" json:"cert"` | |||
CustomAuthUrl string `xorm:"varchar(200)" json:"customAuthUrl"` | |||
CustomTokenUrl string `xorm:"varchar(200)" json:"customTokenUrl"` | |||
CustomUserInfoUrl string `xorm:"varchar(200)" json:"customUserInfoUrl"` | |||
CustomLogo string `xorm:"varchar(200)" json:"customLogo"` | |||
Scopes string `xorm:"varchar(100)" json:"scopes"` | |||
UserMapping map[string]string `xorm:"varchar(500)" json:"userMapping"` | |||
Host string `xorm:"varchar(100)" json:"host"` | |||
Port int `json:"port"` | |||
DisableSsl bool `json:"disableSsl"` // If the provider type is WeChat, DisableSsl means EnableQRCode | |||
Title string `xorm:"varchar(100)" json:"title"` | |||
Content string `xorm:"varchar(1000)" json:"content"` // If provider type is WeChat, Content means QRCode string by Base64 encoding | |||
Receiver string `xorm:"varchar(100)" json:"receiver"` | |||
RegionId string `xorm:"varchar(100)" json:"regionId"` | |||
SignName string `xorm:"varchar(100)" json:"signName"` | |||
TemplateCode string `xorm:"varchar(100)" json:"templateCode"` | |||
AppId string `xorm:"varchar(100)" json:"appId"` | |||
Endpoint string `xorm:"varchar(1000)" json:"endpoint"` | |||
IntranetEndpoint string `xorm:"varchar(100)" json:"intranetEndpoint"` | |||
Domain string `xorm:"varchar(100)" json:"domain"` | |||
Bucket string `xorm:"varchar(100)" json:"bucket"` | |||
PathPrefix string `xorm:"varchar(100)" json:"pathPrefix"` | |||
Metadata string `xorm:"mediumtext" json:"metadata"` | |||
IdP string `xorm:"mediumtext" json:"idP"` | |||
IssuerUrl string `xorm:"varchar(100)" json:"issuerUrl"` | |||
EnableSignAuthnRequest bool `json:"enableSignAuthnRequest"` | |||
ProviderUrl string `xorm:"varchar(200)" json:"providerUrl"` | |||
} | |||
func GetStorageProviders(owner string) ([]*Provider, error) { | |||
providers := []*Provider{} | |||
err := adapter.Engine.Desc("created_time").Find(&providers, &Provider{Owner: owner, Category: "Storage"}) | |||
if err != nil { | |||
return providers, err | |||
} | |||
return providers, nil | |||
} |
@@ -0,0 +1,29 @@ | |||
// 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 controllers | |||
import "github.com/casbin/casibase/casdoor" | |||
func (c *ApiController) GetStorageProviders() { | |||
owner := c.Input().Get("owner") | |||
providers, err := casdoor.GetStorageProviders(owner) | |||
if err != nil { | |||
c.ResponseError(err.Error()) | |||
return | |||
} | |||
c.ResponseOk(providers) | |||
} |
@@ -66,6 +66,8 @@ func initAPI() { | |||
beego.Router("/api/add-store", &controllers.ApiController{}, "POST:AddStore") | |||
beego.Router("/api/delete-store", &controllers.ApiController{}, "POST:DeleteStore") | |||
beego.Router("/api/get-storage-providers", &controllers.ApiController{}, "GET:GetStorageProviders") | |||
beego.Router("/api/get-global-providers", &controllers.ApiController{}, "GET:GetGlobalProviders") | |||
beego.Router("/api/get-providers", &controllers.ApiController{}, "GET:GetProviders") | |||
beego.Router("/api/get-provider", &controllers.ApiController{}, "GET:GetProvider") | |||
@@ -13,8 +13,9 @@ | |||
// limitations under the License. | |||
import React from "react"; | |||
import {Button, Card, Col, Input, Row} from "antd"; | |||
import {Button, Card, Col, Input, Row, Select} from "antd"; | |||
import * as StoreBackend from "./backend/StoreBackend"; | |||
import * as StorageProviderBackend from "./backend/StorageProviderBackend"; | |||
import * as Setting from "./Setting"; | |||
import i18next from "i18next"; | |||
import FileTree from "./FileTree"; | |||
@@ -26,12 +27,14 @@ class StoreEditPage extends React.Component { | |||
classes: props, | |||
owner: props.match.params.owner, | |||
storeName: props.match.params.storeName, | |||
storageProviders: [], | |||
store: null, | |||
}; | |||
} | |||
UNSAFE_componentWillMount() { | |||
this.getStore(); | |||
this.getStorageProviders(); | |||
} | |||
getStore() { | |||
@@ -51,6 +54,19 @@ class StoreEditPage extends React.Component { | |||
}); | |||
} | |||
getStorageProviders() { | |||
StorageProviderBackend.getStorageProviders(this.props.account.name) | |||
.then((res) => { | |||
if (res.status === "ok") { | |||
this.setState({ | |||
storageProviders: res.data, | |||
}); | |||
} else { | |||
Setting.showMessage("error", `Failed to get storage providers: ${res.msg}`); | |||
} | |||
}); | |||
} | |||
parseStoreField(key, value) { | |||
if (["score"].includes(key)) { | |||
value = Setting.myParseInt(value); | |||
@@ -101,9 +117,9 @@ class StoreEditPage extends React.Component { | |||
{i18next.t("store:Storage provider")}: | |||
</Col> | |||
<Col span={22} > | |||
<Input value={this.state.store.storageProvider} onChange={e => { | |||
this.updateStoreField("storageProvider", e.target.value); | |||
}} /> | |||
<Select virtual={false} style={{width: "100%"}} value={this.state.store.storageProvider} onChange={(value => {this.updateStoreField("storageProvider", value);})} | |||
options={this.state.storageProviders.map((provider) => Setting.getOption(`${provider.displayName} (${provider.name})`, `${provider.name}`)) | |||
} /> | |||
</Col> | |||
</Row> | |||
<Row style={{marginTop: "20px"}} > | |||
@@ -0,0 +1,22 @@ | |||
// 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. | |||
import * as Setting from "../Setting"; | |||
export function getStorageProviders(owner) { | |||
return fetch(`${Setting.ServerUrl}/api/get-storage-providers?owner=${owner}`, { | |||
method: "GET", | |||
credentials: "include", | |||
}).then(res => res.json()); | |||
} |