// Copyright 2021 The Casdoor 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 React from "react"; import {Button, Card, Col, Input, InputNumber, Row, Select, Switch} from "antd"; import {LinkOutlined} from "@ant-design/icons"; import * as ProviderBackend from "./backend/ProviderBackend"; import * as Setting from "./Setting"; import i18next from "i18next"; import {authConfig} from "./auth/Auth"; import * as ProviderEditTestEmail from "./common/TestEmailWidget"; import * as ProviderEditTestSms from "./common/TestSmsWidget"; import copy from "copy-to-clipboard"; import {CaptchaPreview} from "./common/CaptchaPreview"; import * as OrganizationBackend from "./backend/OrganizationBackend"; import {CountryCodeSelect} from "./common/select/CountryCodeSelect"; const {Option} = Select; const {TextArea} = Input; class ProviderEditPage extends React.Component { constructor(props) { super(props); this.state = { classes: props, providerName: props.match.params.providerName, owner: props.organizationName !== undefined ? props.organizationName : props.match.params.organizationName, provider: null, organizations: [], mode: props.location.mode !== undefined ? props.location.mode : "edit", }; } UNSAFE_componentWillMount() { this.getOrganizations(); this.getProvider(); } getProvider() { ProviderBackend.getProvider(this.state.owner, this.state.providerName) .then((res) => { if (res.data === null) { this.props.history.push("/404"); return; } if (res.status === "ok") { const provider = res.data; provider.userMapping = provider.userMapping || {}; this.setState({ provider: provider, }); } else { Setting.showMessage("error", res.msg); } }); } getOrganizations() { if (Setting.isAdminUser(this.props.account)) { OrganizationBackend.getOrganizations("admin") .then((res) => { this.setState({ organizations: res.data || [], }); }); } } parseProviderField(key, value) { if (["port"].includes(key)) { value = Setting.myParseInt(value); } return value; } updateProviderField(key, value) { value = this.parseProviderField(key, value); const provider = this.state.provider; provider[key] = value; this.setState({ provider: provider, }); } updateUserMappingField(key, value) { const provider = this.state.provider; provider.userMapping[key] = value; this.setState({ provider: provider, }); } renderUserMappingInput() { return ( {Setting.getLabel(i18next.t("general:ID"), i18next.t("general:ID - Tooltip"))} : { this.updateUserMappingField("id", e.target.value); }} /> {Setting.getLabel(i18next.t("signup:Username"), i18next.t("signup:Username - Tooltip"))} : { this.updateUserMappingField("username", e.target.value); }} /> {Setting.getLabel(i18next.t("general:Display name"), i18next.t("general:Display name - Tooltip"))} : { this.updateUserMappingField("displayName", e.target.value); }} /> {Setting.getLabel(i18next.t("general:Email"), i18next.t("general:Email - Tooltip"))} : { this.updateUserMappingField("email", e.target.value); }} /> {Setting.getLabel(i18next.t("general:Avatar"), i18next.t("general:Avatar - Tooltip"))} : { this.updateUserMappingField("avatarUrl", e.target.value); }} /> ); } getClientIdLabel(provider) { switch (provider.category) { case "Email": return Setting.getLabel(i18next.t("signup:Username"), i18next.t("signup:Username - Tooltip")); case "SMS": if (provider.type === "Volc Engine SMS") { return Setting.getLabel(i18next.t("provider:Access key"), i18next.t("provider:Access key - Tooltip")); } else if (provider.type === "Huawei Cloud SMS") { return Setting.getLabel(i18next.t("provider:App key"), i18next.t("provider:App key - Tooltip")); } else { return Setting.getLabel(i18next.t("provider:Client ID"), i18next.t("provider:Client ID - Tooltip")); } case "Captcha": if (provider.type === "Aliyun Captcha") { return Setting.getLabel(i18next.t("provider:Access key"), i18next.t("provider:Access key - Tooltip")); } else { return Setting.getLabel(i18next.t("provider:Site key"), i18next.t("provider:Site key - Tooltip")); } default: return Setting.getLabel(i18next.t("provider:Client ID"), i18next.t("provider:Client ID - Tooltip")); } } getClientSecretLabel(provider) { switch (provider.category) { case "Email": return Setting.getLabel(i18next.t("general:Password"), i18next.t("general:Password - Tooltip")); case "SMS": if (provider.type === "Volc Engine SMS") { return Setting.getLabel(i18next.t("provider:Secret access key"), i18next.t("provider:Secret access key - Tooltip")); } else if (provider.type === "Huawei Cloud SMS") { return Setting.getLabel(i18next.t("provider:App secret"), i18next.t("provider:AppSecret - Tooltip")); } else { return Setting.getLabel(i18next.t("provider:Client secret"), i18next.t("provider:Client secret - Tooltip")); } case "Captcha": if (provider.type === "Aliyun Captcha") { return Setting.getLabel(i18next.t("provider:Secret access key"), i18next.t("provider:Secret access key - Tooltip")); } else { return Setting.getLabel(i18next.t("provider:Secret key"), i18next.t("provider:Secret key - Tooltip")); } default: return Setting.getLabel(i18next.t("provider:Client secret"), i18next.t("provider:Client secret - Tooltip")); } } getClientId2Label(provider) { switch (provider.category) { case "Email": return Setting.getLabel(i18next.t("provider:From address"), i18next.t("provider:From address - Tooltip")); default: if (provider.type === "Aliyun Captcha") { return Setting.getLabel(i18next.t("provider:Scene"), i18next.t("provider:Scene - Tooltip")); } else if (provider.type === "WeChat Pay") { return Setting.getLabel(i18next.t("provider:App ID"), i18next.t("provider:App ID - Tooltip")); } else { return Setting.getLabel(i18next.t("provider:Client ID 2"), i18next.t("provider:Client ID 2 - Tooltip")); } } } getClientSecret2Label(provider) { switch (provider.category) { case "Email": return Setting.getLabel(i18next.t("provider:From name"), i18next.t("provider:From name - Tooltip")); default: if (provider.type === "Aliyun Captcha") { return Setting.getLabel(i18next.t("provider:App key"), i18next.t("provider:App key - Tooltip")); } else { return Setting.getLabel(i18next.t("provider:Client secret 2"), i18next.t("provider:Client secret 2 - Tooltip")); } } } getProviderSubTypeOptions(type) { if (type === "WeCom" || type === "Infoflow") { return ( [ {id: "Internal", name: i18next.t("provider:Internal")}, {id: "Third-party", name: i18next.t("provider:Third-party")}, ] ); } else if (type === "Aliyun Captcha") { return [ {id: "nc", name: i18next.t("provider:Sliding Validation")}, {id: "ic", name: i18next.t("provider:Intelligent Validation")}, ]; } else { return []; } } getAppIdRow(provider) { let text = ""; let tooltip = ""; if (provider.category === "OAuth") { if (provider.type === "WeCom" && provider.subType === "Internal") { text = i18next.t("provider:Agent ID"); tooltip = i18next.t("provider:Agent ID - Tooltip"); } else if (provider.type === "Infoflow") { text = i18next.t("provider:Agent ID"); tooltip = i18next.t("provider:Agent ID - Tooltip"); } } else if (provider.category === "SMS") { if (provider.type === "Twilio SMS") { text = i18next.t("provider:Sender number"); tooltip = i18next.t("provider:Sender number - Tooltip"); } else if (provider.type === "Tencent Cloud SMS") { text = i18next.t("provider:App ID"); tooltip = i18next.t("provider:App ID - Tooltip"); } else if (provider.type === "Volc Engine SMS") { text = i18next.t("provider:SMS account"); tooltip = i18next.t("provider:SMS account - Tooltip"); } else if (provider.type === "Huawei Cloud SMS") { text = i18next.t("provider:Channel No."); tooltip = i18next.t("provider:Channel No. - Tooltip"); } } else if (provider.category === "Email") { if (provider.type === "SUBMAIL") { text = i18next.t("provider:App ID"); tooltip = i18next.t("provider:App ID - Tooltip"); } } if (text === "" && tooltip === "") { return null; } else { return ( {Setting.getLabel(text, tooltip)} : { this.updateProviderField("appId", e.target.value); }} /> ); } } loadSamlConfiguration() { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(this.state.provider.metadata, "text/xml"); const cert = xmlDoc.getElementsByTagName("ds:X509Certificate")[0].childNodes[0].nodeValue; const endpoint = xmlDoc.getElementsByTagName("md:SingleSignOnService")[0].getAttribute("Location"); const issuerUrl = xmlDoc.getElementsByTagName("md:EntityDescriptor")[0].getAttribute("entityID"); this.updateProviderField("idP", cert); this.updateProviderField("endpoint", endpoint); this.updateProviderField("issuerUrl", issuerUrl); } renderProvider() { return ( {this.state.mode === "add" ? i18next.t("provider:New Provider") : i18next.t("provider:Edit Provider")}     {this.state.mode === "add" ? : null} } style={(Setting.isMobile()) ? {margin: "5px"} : {}} type="inner"> {Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} : { this.updateProviderField("name", e.target.value); }} /> {Setting.getLabel(i18next.t("general:Display name"), i18next.t("general:Display name - Tooltip"))} : { this.updateProviderField("displayName", e.target.value); }} /> {Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} : {Setting.getLabel(i18next.t("provider:Category"), i18next.t("provider:Category - Tooltip"))} : {Setting.getLabel(i18next.t("provider:Type"), i18next.t("provider:Type - Tooltip"))} : { this.state.provider.type !== "WeCom" && this.state.provider.type !== "Infoflow" && this.state.provider.type !== "Aliyun Captcha" ? null : ( {Setting.getLabel(i18next.t("provider:Sub type"), i18next.t("provider:Sub type - Tooltip"))} : { this.state.provider.type !== "WeCom" ? null : ( {Setting.getLabel(i18next.t("general:Method"), i18next.t("provider:Method - Tooltip"))} : ) } ) } { this.state.provider.type !== "Custom" ? null : ( {Setting.getLabel(i18next.t("provider:Auth URL"), i18next.t("provider:Auth URL - Tooltip"))} { this.updateProviderField("customAuthUrl", e.target.value); }} /> {Setting.getLabel(i18next.t("provider:Token URL"), i18next.t("provider:Token URL - Tooltip"))} { this.updateProviderField("customTokenUrl", e.target.value); }} /> {Setting.getLabel(i18next.t("provider:Scope"), i18next.t("provider:Scope - Tooltip"))} { this.updateProviderField("scopes", e.target.value); }} /> {Setting.getLabel(i18next.t("provider:UserInfo URL"), i18next.t("provider:UserInfo URL - Tooltip"))} { this.updateProviderField("customUserInfoUrl", e.target.value); }} /> {Setting.getLabel(i18next.t("provider:User mapping"), i18next.t("provider:User mapping - Tooltip"))} : {this.renderUserMappingInput()} {Setting.getLabel(i18next.t("general:Favicon"), i18next.t("general:Favicon - Tooltip"))} : {Setting.getLabel(i18next.t("general:URL"), i18next.t("general:URL - Tooltip"))} : } value={this.state.provider.customLogo} onChange={e => { this.updateProviderField("customLogo", e.target.value); }} /> {i18next.t("general:Preview")}: {this.state.provider.customLogo} ) } { (this.state.provider.category === "Captcha" && this.state.provider.type === "Default") || (this.state.provider.category === "Web3") || (this.state.provider.category === "Storage" && this.state.provider.type === "Local File System") ? null : ( {this.getClientIdLabel(this.state.provider)} : { this.updateProviderField("clientId", e.target.value); }} /> {this.getClientSecretLabel(this.state.provider)} : { this.updateProviderField("clientSecret", e.target.value); }} /> ) } { this.state.provider.category !== "Email" && this.state.provider.type !== "WeChat" && this.state.provider.type !== "Aliyun Captcha" && this.state.provider.type !== "WeChat Pay" ? null : ( {this.getClientId2Label(this.state.provider)} : { this.updateProviderField("clientId2", e.target.value); }} /> { this.state.provider.type === "WeChat Pay" ? null : ( {this.getClientSecret2Label(this.state.provider)} : { this.updateProviderField("clientSecret2", e.target.value); }} /> ) } ) } { this.state.provider.type !== "WeChat" ? null : ( {Setting.getLabel(i18next.t("provider:Enable QR code"), i18next.t("provider:Enable QR code - Tooltip"))} : { this.updateProviderField("disableSsl", checked); }} /> ) } { this.state.provider.type !== "Adfs" && this.state.provider.type !== "AzureAD" && this.state.provider.type !== "Casdoor" && this.state.provider.type !== "Okta" ? null : ( {Setting.getLabel(i18next.t("provider:Domain"), i18next.t("provider:Domain - Tooltip"))} : { this.updateProviderField("domain", e.target.value); }} /> ) } {this.state.provider.category === "Storage" ? (
{["Local File System"].includes(this.state.provider.type) ? null : ( {Setting.getLabel(i18next.t("provider:Endpoint"), i18next.t("provider:Region endpoint for Internet"))} : { this.updateProviderField("endpoint", e.target.value); }} /> )} {["Local File System", "MinIO", "Tencent Cloud COS"].includes(this.state.provider.type) ? null : ( {Setting.getLabel(i18next.t("provider:Endpoint (Intranet)"), i18next.t("provider:Region endpoint for Intranet"))} : { this.updateProviderField("intranetEndpoint", e.target.value); }} /> )} {["Local File System"].includes(this.state.provider.type) ? null : ( {Setting.getLabel(i18next.t("provider:Bucket"), i18next.t("provider:Bucket - Tooltip"))} : { this.updateProviderField("bucket", e.target.value); }} /> )} {Setting.getLabel(i18next.t("provider:Path prefix"), i18next.t("provider:Path prefix - Tooltip"))} : { this.updateProviderField("pathPrefix", e.target.value); }} /> {["MinIO"].includes(this.state.provider.type) ? null : ( {Setting.getLabel(i18next.t("provider:Domain"), i18next.t("provider:Domain - Tooltip"))} : { this.updateProviderField("domain", e.target.value); }} /> )} {["AWS S3", "Tencent Cloud COS"].includes(this.state.provider.type) ? ( {Setting.getLabel(i18next.t("provider:Region ID"), i18next.t("provider:Region ID - Tooltip"))} : { this.updateProviderField("regionId", e.target.value); }} /> ) : null}
) : null} {this.getAppIdRow(this.state.provider)} { this.state.provider.category === "Email" ? ( {Setting.getLabel(i18next.t("provider:Host"), i18next.t("provider:Host - Tooltip"))} : } value={this.state.provider.host} onChange={e => { this.updateProviderField("host", e.target.value); }} /> {Setting.getLabel(i18next.t("provider:Port"), i18next.t("provider:Port - Tooltip"))} : { this.updateProviderField("port", value); }} /> {Setting.getLabel(i18next.t("provider:Disable SSL"), i18next.t("provider:Disable SSL - Tooltip"))} : { this.updateProviderField("disableSsl", checked); }} /> {Setting.getLabel(i18next.t("provider:Email title"), i18next.t("provider:Email title - Tooltip"))} : { this.updateProviderField("title", e.target.value); }} /> {Setting.getLabel(i18next.t("provider:Email content"), i18next.t("provider:Email content - Tooltip"))} :