| @@ -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()); | |||
| } | |||