// 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 "./TestEmailWidget"; import * as ProviderEditTestSms from "./TestSmsWidget"; import copy from "copy-to-clipboard"; import {CaptchaPreview} from "./common/CaptchaPreview"; import * as OrganizationBackend from "./backend/OrganizationBackend"; import {PhoneNumberInput} from "./common/PhoneNumberInput"; 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((provider) => { this.setState({ provider: provider, }); }); } getOrganizations() { if (Setting.isAdminUser(this.props.account)) { OrganizationBackend.getOrganizations("admin") .then((res) => { this.setState({ organizations: res.msg === undefined ? res : [], }); }); } } 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, }); } 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("login:Password"), i18next.t("login:Password - Tooltip")); case "SMS": if (provider.type === "Volc Engine SMS") { return Setting.getLabel(i18next.t("provider:Secret access key"), i18next.t("provider:SecretAccessKey - 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:SecretAccessKey - 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")); } } 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 === "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("provider: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:Scope"), i18next.t("provider:Scope - Tooltip"))} { this.updateProviderField("customScope", 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:UserInfo URL"), i18next.t("provider:UserInfo URL - Tooltip"))} { this.updateProviderField("customUserInfoUrl", e.target.value); }} /> {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" ? 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.type !== "WeChat" && this.state.provider.type !== "Aliyun Captcha" ? null : ( {this.state.provider.type === "Aliyun Captcha" ? Setting.getLabel(i18next.t("provider:Scene"), i18next.t("provider:Scene - Tooltip")) : Setting.getLabel(i18next.t("provider:Client ID 2"), i18next.t("provider:Client ID 2 - Tooltip"))} { this.updateProviderField("clientId2", e.target.value); }} /> {this.state.provider.type === "Aliyun Captcha" ? Setting.getLabel(i18next.t("provider:App key"), i18next.t("provider:App key - Tooltip")) : Setting.getLabel(i18next.t("provider:Client secret 2"), i18next.t("provider:Client secret 2 - Tooltip"))} { 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 !== "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" ? (
{Setting.getLabel(i18next.t("provider:Endpoint"), i18next.t("provider:Region endpoint for Internet"))} : { this.updateProviderField("endpoint", e.target.value); }} /> {Setting.getLabel(i18next.t("provider:Endpoint (Intranet)"), i18next.t("provider:Region endpoint for Intranet"))} : { this.updateProviderField("intranetEndpoint", e.target.value); }} /> {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:The prefix path of the file - Tooltip"))} : { this.updateProviderField("pathPrefix", e.target.value); }} /> {Setting.getLabel(i18next.t("provider:Domain"), i18next.t("provider:Domain - Tooltip"))} : { this.updateProviderField("domain", e.target.value); }} /> {["AWS S3", "MinIO", "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.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"))} :