casdoor/web/src/Setting.js

1189 lines
32 KiB
JavaScript
Raw Normal View History

2022-02-13 23:39:27 +08:00
// Copyright 2021 The Casdoor Authors. All Rights Reserved.
2021-02-13 12:15:19 +08:00
//
// 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 {Link} from "react-router-dom";
import {Select, Tag, Tooltip, message, theme} from "antd";
2021-06-25 00:13:43 +08:00
import {QuestionCircleTwoTone} from "@ant-design/icons";
2021-02-13 12:15:19 +08:00
import {isMobile as isMobileDevice} from "react-device-detect";
import "./i18n";
import i18next from "i18next";
2021-03-14 23:08:08 +08:00
import copy from "copy-to-clipboard";
2021-04-28 22:40:21 +08:00
import {authConfig} from "./auth/Auth";
2021-04-29 21:28:24 +08:00
import {Helmet} from "react-helmet";
import * as Conf from "./Conf";
import * as phoneNumber from "libphonenumber-js";
2023-05-23 15:09:53 +08:00
import moment from "moment";
2021-02-13 12:15:19 +08:00
2023-02-25 15:25:47 +08:00
const {Option} = Select;
export const ServerUrl = "";
2021-02-13 12:15:19 +08:00
2021-06-12 12:07:24 +08:00
export const StaticBaseUrl = "https://cdn.casbin.org";
2021-06-12 11:52:59 +08:00
export const Countries = [{label: "English", key: "en", country: "US", alt: "English"},
{label: "Español", key: "es", country: "ES", alt: "Español"},
{label: "Français", key: "fr", country: "FR", alt: "Français"},
{label: "Deutsch", key: "de", country: "DE", alt: "Deutsch"},
2023-07-07 00:13:05 +08:00
{label: "中文", key: "zh", country: "CN", alt: "中文"},
2023-03-19 21:47:49 +08:00
{label: "Indonesia", key: "id", country: "ID", alt: "Indonesia"},
{label: "日本語", key: "ja", country: "JP", alt: "日本語"},
{label: "한국어", key: "ko", country: "KR", alt: "한국어"},
{label: "Русский", key: "ru", country: "RU", alt: "Русский"},
2023-04-15 14:16:49 +08:00
{label: "TiếngViệt", key: "vi", country: "VN", alt: "TiếngViệt"},
{label: "Português", key: "pt", country: "BR", alt: "Português"},
{label: "Itariano", key: "it", country: "IT", alt: "Itariano"},
{label: "Marley", key: "ms", country: "MY", alt: "Marley"},
{label: "Tkiš", key: "tr", country: "TR", alt: "Tkiš"},
];
export function getThemeData(organization, application) {
if (application?.themeData?.isEnabled) {
return application.themeData;
} else if (organization?.themeData?.isEnabled) {
return organization.themeData;
} else {
return Conf.ThemeDefault;
}
}
export function getAlgorithm(themeAlgorithmNames) {
return themeAlgorithmNames.map((algorithmName) => {
if (algorithmName === "dark") {
return theme.darkAlgorithm;
}
if (algorithmName === "compact") {
return theme.compactAlgorithm;
}
return theme.defaultAlgorithm;
});
}
export function getAlgorithmNames(themeData) {
const algorithms = [themeData?.themeType !== "dark" ? "default" : "dark"];
if (themeData?.isCompact === true) {
algorithms.push("compact");
}
return algorithms;
}
export const OtherProviderInfo = {
SMS: {
"Aliyun SMS": {
logo: `${StaticBaseUrl}/img/social_aliyun.png`,
url: "https://aliyun.com/product/sms",
},
"Tencent Cloud SMS": {
logo: `${StaticBaseUrl}/img/social_tencent_cloud.jpg`,
url: "https://cloud.tencent.com/product/sms",
},
"Volc Engine SMS": {
logo: `${StaticBaseUrl}/img/social_volc_engine.jpg`,
url: "https://www.volcengine.com/products/cloud-sms",
},
"Huawei Cloud SMS": {
logo: `${StaticBaseUrl}/img/social_huawei.png`,
url: "https://www.huaweicloud.com/product/msgsms.html",
},
2022-09-25 17:58:12 +08:00
"Twilio SMS": {
2023-02-25 15:08:08 +08:00
logo: `${StaticBaseUrl}/img/social_twilio.svg`,
2022-09-25 17:58:12 +08:00
url: "https://www.twilio.com/messaging",
},
"SmsBao SMS": {
logo: `${StaticBaseUrl}/img/social_smsbao.png`,
url: "https://www.smsbao.com/",
},
"SUBMAIL SMS": {
logo: `${StaticBaseUrl}/img/social_submail.svg`,
url: "https://www.mysubmail.com",
},
"Mock SMS": {
logo: `${StaticBaseUrl}/img/social_default.png`,
url: "",
},
},
Email: {
"Default": {
logo: `${StaticBaseUrl}/img/email_default.png`,
url: "",
},
"SUBMAIL": {
logo: `${StaticBaseUrl}/img/social_submail.svg`,
url: "https://www.mysubmail.com",
},
"Mailtrap": {
logo: `${StaticBaseUrl}/img/email_mailtrap.png`,
url: "https://mailtrap.io",
},
},
Storage: {
"Local File System": {
logo: `${StaticBaseUrl}/img/social_file.png`,
url: "",
},
"AWS S3": {
logo: `${StaticBaseUrl}/img/social_aws.png`,
url: "https://aws.amazon.com/s3",
},
"MinIO": {
logo: "https://min.io/resources/img/logo.svg",
url: "https://min.io/",
},
"Aliyun OSS": {
logo: `${StaticBaseUrl}/img/social_aliyun.png`,
url: "https://aliyun.com/product/oss",
},
"Tencent Cloud COS": {
logo: `${StaticBaseUrl}/img/social_tencent_cloud.jpg`,
url: "https://cloud.tencent.com/product/cos",
},
"Azure Blob": {
logo: `${StaticBaseUrl}/img/social_azure.png`,
2022-08-06 23:54:56 +08:00
url: "https://azure.microsoft.com/en-us/services/storage/blobs/",
},
},
SAML: {
"Aliyun IDaaS": {
logo: `${StaticBaseUrl}/img/social_aliyun.png`,
2022-08-06 23:54:56 +08:00
url: "https://aliyun.com/product/idaas",
},
"Keycloak": {
logo: `${StaticBaseUrl}/img/social_keycloak.png`,
2022-08-06 23:54:56 +08:00
url: "https://www.keycloak.org/",
},
},
Payment: {
2023-05-30 23:25:58 +08:00
"Dummy": {
logo: `${StaticBaseUrl}/img/payment_paypal.png`,
url: "",
},
"Alipay": {
logo: `${StaticBaseUrl}/img/payment_alipay.png`,
2022-08-06 23:54:56 +08:00
url: "https://www.alipay.com/",
},
"WeChat Pay": {
logo: `${StaticBaseUrl}/img/payment_wechat_pay.png`,
2022-08-06 23:54:56 +08:00
url: "https://pay.weixin.qq.com/",
},
"PayPal": {
logo: `${StaticBaseUrl}/img/payment_paypal.png`,
2022-08-06 23:54:56 +08:00
url: "https://www.paypal.com/",
},
"GC": {
logo: `${StaticBaseUrl}/img/payment_gc.png`,
2022-08-06 23:54:56 +08:00
url: "https://gc.org",
},
},
Captcha: {
"Default": {
logo: `${StaticBaseUrl}/img/captcha_default.png`,
url: "https://pkg.go.dev/github.com/dchest/captcha",
},
"reCAPTCHA": {
logo: `${StaticBaseUrl}/img/social_recaptcha.png`,
url: "https://www.google.com/recaptcha",
},
"hCaptcha": {
logo: `${StaticBaseUrl}/img/social_hcaptcha.png`,
url: "https://www.hcaptcha.com",
},
"Aliyun Captcha": {
logo: `${StaticBaseUrl}/img/social_aliyun.png`,
url: "https://help.aliyun.com/product/28308.html",
2022-08-04 20:55:04 +08:00
},
"GEETEST": {
logo: `${StaticBaseUrl}/img/social_geetest.png`,
url: "https://www.geetest.com",
2022-08-06 23:54:56 +08:00
},
"Cloudflare Turnstile": {
logo: `${StaticBaseUrl}/img/social_cloudflare.png`,
url: "https://www.cloudflare.com/products/turnstile/",
},
2022-08-06 23:54:56 +08:00
},
2023-04-22 23:18:18 +08:00
AI: {
"OpenAI API - GPT": {
logo: `${StaticBaseUrl}/img/social_openai.svg`,
url: "https://platform.openai.com",
},
},
Web3: {
"MetaMask": {
logo: `${StaticBaseUrl}/img/social_metamask.svg`,
url: "https://metamask.io/",
},
},
};
export function initCountries() {
const countries = require("i18n-iso-countries");
countries.registerLocale(require("i18n-iso-countries/langs/" + getLanguage() + ".json"));
return countries;
}
2023-02-25 15:46:54 +08:00
export function getCountryCode(country) {
if (phoneNumber.isSupportedCountry(country)) {
return phoneNumber.getCountryCallingCode(country);
}
return "";
2023-02-25 15:46:54 +08:00
}
2023-02-25 15:25:47 +08:00
export function getCountryCodeData(countryCodes = phoneNumber.getCountries()) {
return countryCodes?.map((countryCode) => {
if (phoneNumber.isSupportedCountry(countryCode)) {
const name = initCountries().getName(countryCode, getLanguage());
return {
code: countryCode,
name: name || "",
phone: phoneNumber.getCountryCallingCode(countryCode),
};
}
2023-02-25 15:08:08 +08:00
}).filter(item => item.name !== "")
.sort((a, b) => a.phone - b.phone);
}
2023-02-25 15:25:47 +08:00
export function getCountryCodeOption(country) {
return (
<Option key={country.code} value={country.code} label={`+${country.phone}`} text={`${country.name}, ${country.code}, ${country.phone}`} >
<div style={{display: "flex", justifyContent: "space-between", marginRight: "10px"}}>
<div>
{getCountryImage(country)}
{`${country.name}`}
</div>
{`+${country.phone}`}
</div>
</Option>
);
}
export function getCountryImage(country) {
return <img src={`${StaticBaseUrl}/flag-icons/${country.code}.svg`} alt={country.name} height={20} style={{marginRight: 10}} />;
}
2021-02-13 12:15:19 +08:00
export function initServerUrl() {
// const hostname = window.location.hostname;
// if (hostname === "localhost") {
// ServerUrl = `http://${hostname}:8000`;
// }
2021-02-13 12:15:19 +08:00
}
export function isLocalhost() {
2021-05-14 15:55:50 +08:00
const hostname = window.location.hostname;
return hostname === "localhost";
}
export function getFullServerUrl() {
let fullServerUrl = window.location.origin;
if (fullServerUrl === "http://localhost:7001") {
fullServerUrl = "http://localhost:8000";
}
return fullServerUrl;
}
2021-06-14 21:35:19 +08:00
export function isProviderVisible(providerItem) {
if (providerItem.provider === undefined || providerItem.provider === null) {
return false;
}
if (!["OAuth", "SAML", "Web3"].includes(providerItem.provider.category)) {
2021-06-17 01:49:05 +08:00
return false;
2021-05-14 15:55:50 +08:00
}
if (providerItem.provider.type === "WeChatMiniProgram") {
return false;
}
2022-03-19 19:43:54 +08:00
return true;
2021-06-14 21:35:19 +08:00
}
2023-02-18 16:21:12 +08:00
export function isResponseDenied(data) {
if (data.msg === "Unauthorized operation" || data.msg === "未授权的操作") {
return true;
}
return false;
}
2021-06-14 21:35:19 +08:00
export function isProviderVisibleForSignUp(providerItem) {
if (providerItem.canSignUp === false) {
return false;
2021-05-14 15:55:50 +08:00
}
2021-06-14 21:35:19 +08:00
return isProviderVisible(providerItem);
2021-05-14 15:55:50 +08:00
}
2021-06-14 21:35:19 +08:00
export function isProviderVisibleForSignIn(providerItem) {
if (providerItem.canSignIn === false) {
return false;
}
2021-06-14 21:35:19 +08:00
return isProviderVisible(providerItem);
}
2021-06-18 23:43:36 +08:00
export function isProviderPrompted(providerItem) {
return isProviderVisible(providerItem) && providerItem.prompted;
}
export function isSignupItemPrompted(signupItem) {
return signupItem.visible && signupItem.prompted;
}
2021-06-20 09:46:06 +08:00
export function getAllPromptedProviderItems(application) {
2023-05-16 22:17:39 +08:00
return application.providers?.filter(providerItem => isProviderPrompted(providerItem));
2021-06-20 09:46:06 +08:00
}
export function getAllPromptedSignupItems(application) {
2023-05-16 22:17:39 +08:00
return application.signupItems?.filter(signupItem => isSignupItemPrompted(signupItem));
}
2021-06-20 09:46:06 +08:00
export function getSignupItem(application, itemName) {
const signupItems = application.signupItems?.filter(signupItem => signupItem.name === itemName);
2023-05-16 22:17:39 +08:00
if (signupItems?.length > 0) {
return signupItems[0];
2021-06-20 09:46:06 +08:00
}
2023-05-16 22:17:39 +08:00
return null;
2021-06-20 09:46:06 +08:00
}
2022-04-25 21:39:46 +08:00
export function isValidPersonName(personName) {
2022-09-21 21:35:39 +08:00
return personName !== "";
// // https://blog.css8.cn/post/14210975.html
// const personNameRegex = /^[\u4e00-\u9fa5]{2,6}$/;
// return personNameRegex.test(personName);
2022-04-25 21:39:46 +08:00
}
export function isValidIdCard(idCard) {
2022-12-12 01:07:31 +08:00
return idCard !== "";
// const idCardRegex = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9X]$/;
// return idCardRegex.test(idCard);
2022-04-25 21:39:46 +08:00
}
export function isValidEmail(email) {
// https://github.com/yiminghe/async-validator/blob/057b0b047f88fac65457bae691d6cb7c6fe48ce1/src/rule/type.ts#L9
const emailRegex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return emailRegex.test(email);
}
export function isValidPhone(phone, countryCode = "") {
if (countryCode !== "" && countryCode !== "CN") {
return phoneNumber.isValidPhoneNumber(phone, countryCode);
}
2022-04-26 23:56:41 +08:00
// https://learnku.com/articles/31543, `^s*$` filter empty email individually.
const phoneCnRegex = /^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/;
const phoneRegex = /[0-9]{4,15}$/;
return countryCode === "CN" ? phoneCnRegex.test(phone) : phoneRegex.test(phone);
}
2022-04-25 21:39:46 +08:00
export function isValidInvoiceTitle(invoiceTitle) {
2022-12-12 01:07:31 +08:00
return invoiceTitle !== "";
2022-04-26 23:56:41 +08:00
2022-12-12 01:07:31 +08:00
// if (invoiceTitle === "") {
// return false;
// }
//
// // https://blog.css8.cn/post/14210975.html
// const invoiceTitleRegex = /^[()\u4e00-\u9fa5]{0,50}$/;
// return invoiceTitleRegex.test(invoiceTitle);
2022-04-25 21:39:46 +08:00
}
export function isValidTaxId(taxId) {
2022-12-12 01:07:31 +08:00
return taxId !== "";
// // https://www.codetd.com/article/8592083
// const regArr = [/^[\da-z]{10,15}$/i, /^\d{6}[\da-z]{10,12}$/i, /^[a-z]\d{6}[\da-z]{9,11}$/i, /^[a-z]{2}\d{6}[\da-z]{8,10}$/i, /^\d{14}[\dx][\da-z]{4,5}$/i, /^\d{17}[\dx][\da-z]{1,2}$/i, /^[a-z]\d{14}[\dx][\da-z]{3,4}$/i, /^[a-z]\d{17}[\dx][\da-z]{0,1}$/i, /^[\d]{6}[\da-z]{13,14}$/i];
// for (let i = 0; i < regArr.length; i++) {
// if (regArr[i].test(taxId)) {
// return true;
// }
// }
// return false;
2022-04-25 21:39:46 +08:00
}
2021-06-20 09:46:06 +08:00
export function isAffiliationPrompted(application) {
const signupItem = getSignupItem(application, "Affiliation");
if (signupItem === null) {
return false;
}
return signupItem.prompted;
}
export function hasPromptPage(application) {
const providerItems = getAllPromptedProviderItems(application);
2023-05-16 22:17:39 +08:00
if (providerItems?.length > 0) {
2021-06-20 09:46:06 +08:00
return true;
}
const signupItems = getAllPromptedSignupItems(application);
2023-05-16 22:17:39 +08:00
if (signupItems?.length > 0) {
return true;
}
2021-06-20 09:46:06 +08:00
return isAffiliationPrompted(application);
}
2021-06-20 22:17:03 +08:00
function isAffiliationAnswered(user, application) {
if (!isAffiliationPrompted(application)) {
return true;
}
if (user === null) {
return false;
}
return user.affiliation !== "";
}
function isProviderItemAnswered(user, application, providerItem) {
if (user === null) {
return false;
}
const provider = providerItem.provider;
const linkedValue = user[provider.type.toLowerCase()];
return linkedValue !== undefined && linkedValue !== "";
}
function isSignupItemAnswered(user, signupItem) {
if (user === null) {
return false;
}
if (signupItem.name !== "Country/Region") {
return true;
}
const value = user["region"];
return value !== undefined && value !== "";
}
2021-06-20 22:17:03 +08:00
export function isPromptAnswered(user, application) {
if (!isAffiliationAnswered(user, application)) {
return false;
}
const providerItems = getAllPromptedProviderItems(application);
2022-08-06 23:43:09 +08:00
for (let i = 0; i < providerItems.length; i++) {
2021-06-20 22:17:03 +08:00
if (!isProviderItemAnswered(user, application, providerItems[i])) {
return false;
}
}
const signupItems = getAllPromptedSignupItems(application);
for (let i = 0; i < signupItems.length; i++) {
if (!isSignupItemAnswered(user, signupItems[i])) {
return false;
}
}
2021-06-20 22:17:03 +08:00
return true;
}
export const MfaRuleRequired = "Required";
export const MfaRulePrompted = "Prompted";
export const MfaRuleOptional = "Optional";
export function isRequiredEnableMfa(user, organization) {
if (!user || !organization || !organization.mfaItems) {
return false;
}
return getMfaItemsByRules(user, organization, [MfaRuleRequired]).length > 0;
}
export function getMfaItemsByRules(user, organization, mfaRules = []) {
if (!user || !organization || !organization.mfaItems) {
return [];
}
return organization.mfaItems.filter((mfaItem) => mfaRules.includes(mfaItem.rule))
.filter((mfaItem) => user.multiFactorAuths.some((mfa) => mfa.mfaType === mfaItem.name && !mfa.enabled));
}
export function parseObject(s) {
try {
return eval("(" + s + ")");
} catch (e) {
return null;
}
}
2021-02-13 12:15:19 +08:00
export function parseJson(s) {
if (s === "") {
return null;
} else {
return JSON.parse(s);
}
}
export function myParseInt(i) {
const res = parseInt(i);
return isNaN(res) ? 0 : res;
}
export function openLink(link) {
// this.props.history.push(link);
const w = window.open("about:blank");
2021-02-13 12:15:19 +08:00
w.location.href = link;
}
2022-04-26 22:17:45 +08:00
export function openLinkSafe(link) {
// Javascript window.open issue in safari
// https://stackoverflow.com/questions/45569893/javascript-window-open-issue-in-safari
const a = document.createElement("a");
2022-04-26 22:17:45 +08:00
a.href = link;
a.setAttribute("target", "_blank");
2022-04-26 22:17:45 +08:00
a.click();
}
2021-02-13 12:15:19 +08:00
export function goToLink(link) {
window.location.href = link;
}
2021-03-26 21:58:19 +08:00
export function goToLinkSoft(ths, link) {
2022-04-25 13:27:26 +08:00
if (link.startsWith("http")) {
openLink(link);
return;
}
2021-03-26 21:58:19 +08:00
ths.props.history.push(link);
}
2021-02-13 12:15:19 +08:00
export function showMessage(type, text) {
if (type === "success") {
2021-02-13 12:15:19 +08:00
message.success(text);
} else if (type === "error") {
message.error(text);
2022-04-27 21:24:50 +08:00
} else if (type === "info") {
message.info(text);
2021-02-13 12:15:19 +08:00
}
}
2021-02-13 17:34:32 +08:00
export function isAdminUser(account) {
2021-03-28 16:35:59 +08:00
if (account === undefined || account === null) {
2021-03-21 00:44:19 +08:00
return false;
}
2021-02-15 22:14:19 +08:00
return account.owner === "built-in" || account.isGlobalAdmin === true;
2021-02-13 17:34:32 +08:00
}
2022-08-15 14:09:12 +08:00
export function isLocalAdminUser(account) {
if (account === undefined || account === null) {
return false;
}
return account.isAdmin === true || isAdminUser(account);
}
2021-02-13 12:15:19 +08:00
export function deepCopy(obj) {
return Object.assign({}, obj);
}
export function addRow(array, row, position = "end") {
return position === "end" ? [...array, row] : [row, ...array];
2021-02-13 12:15:19 +08:00
}
export function deleteRow(array, i) {
// return array = array.slice(0, i).concat(array.slice(i + 1));
return [...array.slice(0, i), ...array.slice(i + 1)];
}
export function swapRow(array, i, j) {
return [...array.slice(0, i), array[j], ...array.slice(i + 1, j), array[i], ...array.slice(j + 1)];
}
2021-05-24 20:48:04 +08:00
export function trim(str, ch) {
if (str === undefined) {
return undefined;
}
let start = 0;
let end = str.length;
while (start < end && str[start] === ch) {++start;}
2021-05-24 20:48:04 +08:00
while (end > start && str[end - 1] === ch) {--end;}
2021-05-24 20:48:04 +08:00
return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}
2021-02-13 12:15:19 +08:00
export function isMobile() {
// return getIsMobileView();
return isMobileDevice;
}
export function getFormattedDate(date) {
if (date === undefined) {
return null;
}
2023-05-23 15:09:53 +08:00
const m = moment(date).local();
return m.format("YYYY-MM-DD HH:mm:ss");
2021-02-13 12:15:19 +08:00
}
export function getFormattedDateShort(date) {
return date.slice(0, 10);
}
export function getShortName(s) {
return s.split("/").slice(-1)[0];
2021-02-13 12:15:19 +08:00
}
2023-03-18 18:54:05 +08:00
export function getNameAtLeast(s) {
s = getShortName(s);
if (s.length >= 6) {
return s;
}
return (
<React.Fragment>
&nbsp;
{s}
&nbsp;
&nbsp;
</React.Fragment>
);
}
2022-08-06 23:43:09 +08:00
export function getShortText(s, maxLength = 35) {
2021-02-13 23:00:43 +08:00
if (s.length > maxLength) {
return `${s.slice(0, maxLength)}...`;
} else {
return s;
}
}
2021-08-15 00:17:53 +08:00
export function getFriendlyFileSize(size) {
if (size < 1024) {
return size + " B";
2021-08-15 00:17:53 +08:00
}
const i = Math.floor(Math.log(size) / Math.log(1024));
2021-08-15 00:17:53 +08:00
let num = (size / Math.pow(1024, i));
const round = Math.round(num);
2021-08-15 00:17:53 +08:00
num = round < 10 ? num.toFixed(2) : round < 100 ? num.toFixed(1) : round;
2022-08-06 23:43:09 +08:00
return `${num} ${"KMGTPEZY"[i - 1]}B`;
2021-08-15 00:17:53 +08:00
}
function getHashInt(s) {
2021-02-13 12:15:19 +08:00
let hash = 0;
if (s.length !== 0) {
2022-08-06 23:43:09 +08:00
for (let i = 0; i < s.length; i++) {
const char = s.charCodeAt(i);
2021-02-13 12:15:19 +08:00
hash = ((hash << 5) - hash) + char;
hash = hash & hash;
}
}
if (hash < 0) {
hash = -hash;
}
2021-02-13 12:15:19 +08:00
return hash;
}
export function getAvatarColor(s) {
const colorList = ["#f56a00", "#7265e6", "#ffbf00", "#00a2ae"];
const hash = getHashInt(s);
return colorList[hash % 4];
2021-02-13 12:15:19 +08:00
}
2022-12-07 01:53:03 +08:00
export function getLanguageText(text) {
if (!text.includes("|")) {
return text;
}
let res;
const tokens = text.split("|");
if (getLanguage() !== "zh") {
res = trim(tokens[0], "");
} else {
res = trim(tokens[1], "");
}
return res;
}
export function getLanguage() {
2023-06-03 00:29:08 +08:00
return (i18next.language !== undefined && i18next.language !== null && i18next.language !== "" && i18next.language !== "null") ? i18next.language : Conf.DefaultLanguage;
}
2021-09-14 01:22:13 +08:00
export function setLanguage(language) {
localStorage.setItem("language", language);
i18next.changeLanguage(language);
}
export function getAcceptLanguage() {
if (i18next.language === null || i18next.language === "") {
return "en;q=0.9,en;q=0.8";
}
return i18next.language + ";q=0.9,en;q=0.8";
}
2021-03-14 23:08:08 +08:00
export function getClickable(text) {
return (
<a onClick={() => {
copy(text);
showMessage("success", "Copied to clipboard");
2021-03-14 23:08:08 +08:00
}}>
{text}
</a>
);
2021-03-14 23:08:08 +08:00
}
2021-04-18 23:14:46 +08:00
export function getProviderLogoURL(provider) {
if (provider.category === "OAuth") {
2023-07-30 17:31:36 +08:00
if (provider.type === "Custom" && provider.customLogo) {
return provider.customLogo;
}
return `${StaticBaseUrl}/img/social_${provider.type.toLowerCase()}.png`;
} else {
const info = OtherProviderInfo[provider.category][provider.type];
// avoid crash when provider is not found
if (info) {
return info.logo;
}
return "";
}
}
2021-04-19 01:14:41 +08:00
export function getProviderLogo(provider) {
const idp = provider.type.toLowerCase().trim().split(" ")[0];
const url = getProviderLogoURL(provider);
2021-04-18 23:14:46 +08:00
return (
<img width={30} height={30} src={url} alt={idp} />
);
2021-04-18 23:14:46 +08:00
}
2021-04-28 15:54:50 +08:00
export function getProviderTypeOptions(category) {
if (category === "OAuth") {
return (
[
{id: "Google", name: "Google"},
{id: "GitHub", name: "GitHub"},
{id: "QQ", name: "QQ"},
{id: "WeChat", name: "WeChat"},
{id: "WeChatMiniProgram", name: "WeChat Mini Program"},
{id: "Facebook", name: "Facebook"},
{id: "DingTalk", name: "DingTalk"},
{id: "Weibo", name: "Weibo"},
{id: "Gitee", name: "Gitee"},
{id: "LinkedIn", name: "LinkedIn"},
{id: "WeCom", name: "WeCom"},
{id: "Lark", name: "Lark"},
{id: "GitLab", name: "GitLab"},
2023-07-30 17:31:36 +08:00
{id: "ADFS", name: "ADFS"},
{id: "Baidu", name: "Baidu"},
{id: "Alipay", name: "Alipay"},
{id: "Casdoor", name: "Casdoor"},
{id: "Infoflow", name: "Infoflow"},
{id: "Apple", name: "Apple"},
{id: "AzureAD", name: "AzureAD"},
{id: "Slack", name: "Slack"},
{id: "Steam", name: "Steam"},
{id: "Bilibili", name: "Bilibili"},
{id: "Okta", name: "Okta"},
{id: "Douyin", name: "Douyin"},
{id: "Line", name: "Line"},
{id: "Amazon", name: "Amazon"},
{id: "Auth0", name: "Auth0"},
{id: "BattleNet", name: "Battle.net"},
{id: "Bitbucket", name: "Bitbucket"},
{id: "Box", name: "Box"},
{id: "CloudFoundry", name: "Cloud Foundry"},
{id: "Dailymotion", name: "Dailymotion"},
{id: "Deezer", name: "Deezer"},
{id: "DigitalOcean", name: "DigitalOcean"},
{id: "Discord", name: "Discord"},
{id: "Dropbox", name: "Dropbox"},
{id: "EveOnline", name: "Eve Online"},
{id: "Fitbit", name: "Fitbit"},
{id: "Gitea", name: "Gitea"},
{id: "Heroku", name: "Heroku"},
{id: "InfluxCloud", name: "InfluxCloud"},
{id: "Instagram", name: "Instagram"},
{id: "Intercom", name: "Intercom"},
{id: "Kakao", name: "Kakao"},
{id: "Lastfm", name: "Lastfm"},
{id: "Mailru", name: "Mailru"},
{id: "Meetup", name: "Meetup"},
{id: "MicrosoftOnline", name: "MicrosoftOnline"},
{id: "Naver", name: "Naver"},
{id: "Nextcloud", name: "Nextcloud"},
{id: "OneDrive", name: "OneDrive"},
{id: "Oura", name: "Oura"},
{id: "Patreon", name: "Patreon"},
2023-03-18 18:54:05 +08:00
{id: "PayPal", name: "PayPal"},
{id: "SalesForce", name: "SalesForce"},
{id: "Shopify", name: "Shopify"},
{id: "Soundcloud", name: "Soundcloud"},
{id: "Spotify", name: "Spotify"},
{id: "Strava", name: "Strava"},
{id: "Stripe", name: "Stripe"},
{id: "TikTok", name: "TikTok"},
{id: "Tumblr", name: "Tumblr"},
{id: "Twitch", name: "Twitch"},
{id: "Twitter", name: "Twitter"},
{id: "Typetalk", name: "Typetalk"},
{id: "Uber", name: "Uber"},
{id: "VK", name: "VK"},
{id: "Wepay", name: "Wepay"},
{id: "Xero", name: "Xero"},
{id: "Yahoo", name: "Yahoo"},
{id: "Yammer", name: "Yammer"},
{id: "Yandex", name: "Yandex"},
{id: "Zoom", name: "Zoom"},
{id: "Custom", name: "Custom"},
]
);
} else if (category === "Email") {
return (
[
{id: "Default", name: "Default"},
2022-09-04 11:21:20 +08:00
{id: "SUBMAIL", name: "SUBMAIL"},
{id: "Mailtrap", name: "Mailtrap"},
]
);
} else if (category === "SMS") {
return (
[
{id: "Aliyun SMS", name: "Aliyun SMS"},
{id: "Tencent Cloud SMS", name: "Tencent Cloud SMS"},
{id: "Volc Engine SMS", name: "Volc Engine SMS"},
{id: "Huawei Cloud SMS", name: "Huawei Cloud SMS"},
2022-09-25 17:58:12 +08:00
{id: "Twilio SMS", name: "Twilio SMS"},
{id: "SmsBao SMS", name: "SmsBao SMS"},
{id: "SUBMAIL SMS", name: "SUBMAIL SMS"},
]
);
} else if (category === "Storage") {
return (
[
{id: "Local File System", name: "Local File System"},
{id: "AWS S3", name: "AWS S3"},
{id: "MinIO", name: "MinIO"},
{id: "Aliyun OSS", name: "Aliyun OSS"},
{id: "Tencent Cloud COS", name: "Tencent Cloud COS"},
2022-08-06 23:54:56 +08:00
{id: "Azure Blob", name: "Azure Blob"},
]
);
} else if (category === "SAML") {
return ([
{id: "Aliyun IDaaS", name: "Aliyun IDaaS"},
{id: "Keycloak", name: "Keycloak"},
]);
2022-02-05 01:18:13 +08:00
} else if (category === "Payment") {
return ([
2023-05-30 23:25:58 +08:00
{id: "Dummy", name: "Dummy"},
{id: "Alipay", name: "Alipay"},
{id: "WeChat Pay", name: "WeChat Pay"},
{id: "PayPal", name: "PayPal"},
{id: "GC", name: "GC"},
2022-02-05 01:18:13 +08:00
]);
} else if (category === "Captcha") {
return ([
{id: "Default", name: "Default"},
{id: "reCAPTCHA", name: "reCAPTCHA"},
{id: "hCaptcha", name: "hCaptcha"},
{id: "Aliyun Captcha", name: "Aliyun Captcha"},
2022-08-04 20:55:04 +08:00
{id: "GEETEST", name: "GEETEST"},
{id: "Cloudflare Turnstile", name: "Cloudflare Turnstile"},
]);
} else if (category === "Web3") {
return ([
{id: "MetaMask", name: "MetaMask"},
]);
} else {
return [];
}
}
2021-04-28 15:54:50 +08:00
export function renderLogo(application) {
if (application === null) {
return null;
}
if (application.homepageUrl !== "") {
return (
<a target="_blank" rel="noreferrer" href={application.homepageUrl}>
<img className="panel-logo" width={250} src={application.logo} alt={application.displayName} />
2021-04-28 15:54:50 +08:00
</a>
);
2021-04-28 15:54:50 +08:00
} else {
return (
<img className="panel-logo" width={250} src={application.logo} alt={application.displayName} />
2021-04-28 15:54:50 +08:00
);
}
}
2021-04-28 22:40:21 +08:00
export function getLoginLink(application) {
let url;
2021-04-28 22:40:21 +08:00
if (application === null) {
url = null;
} else if (!application.enablePassword && window.location.pathname.includes("/auto-signup/oauth/authorize")) {
url = window.location.href.replace("/auto-signup/oauth/authorize", "/login/oauth/authorize");
} else if (authConfig.appName === application.name) {
url = "/login";
} else if (application.signinUrl === "") {
2023-04-21 23:56:33 +08:00
url = trim(application.homepageUrl, "/") + "/login";
} else {
url = application.signinUrl;
2021-04-28 22:40:21 +08:00
}
return url;
}
2021-04-28 22:40:21 +08:00
export function renderLoginLink(application, text) {
const url = getLoginLink(application);
return renderLink(url, text, null);
}
2021-06-14 23:23:59 +08:00
export function redirectToLoginPage(application, history) {
const loginLink = getLoginLink(application);
2023-04-21 23:56:33 +08:00
if (loginLink.startsWith("http://") || loginLink.startsWith("https://")) {
goToLink(loginLink);
} else {
history.push(loginLink);
}
2021-04-28 22:40:21 +08:00
}
2021-04-29 21:28:24 +08:00
2022-10-22 23:48:59 +08:00
function renderLink(url, text, onClick) {
if (url === null) {
2022-10-22 23:48:59 +08:00
return null;
}
2022-10-22 23:48:59 +08:00
if (url.startsWith("/")) {
2022-10-22 23:48:59 +08:00
return (
<Link style={{float: "right"}} to={url} onClick={() => {
if (onClick !== null) {
onClick();
}
}}>{text}</Link>
);
} else if (url.startsWith("http")) {
2022-10-22 23:48:59 +08:00
return (
<a target="_blank" rel="noopener noreferrer" style={{float: "right"}} href={url} onClick={() => {
if (onClick !== null) {
onClick();
}
}}>{text}</a>
);
} else {
2022-10-22 23:48:59 +08:00
return null;
2021-06-14 23:23:59 +08:00
}
}
2021-06-14 23:23:59 +08:00
export function renderSignupLink(application, text) {
2022-10-22 23:48:59 +08:00
let url;
if (application === null) {
2022-10-22 23:48:59 +08:00
url = null;
} else if (!application.enablePassword && window.location.pathname.includes("/login/oauth/authorize")) {
2022-10-22 23:48:59 +08:00
url = window.location.href.replace("/login/oauth/authorize", "/auto-signup/oauth/authorize");
} else if (authConfig.appName === application.name) {
2022-10-22 23:48:59 +08:00
url = "/signup";
} else {
if (application.signupUrl === "") {
2022-10-22 23:48:59 +08:00
url = `/signup/${application.name}`;
} else {
2022-10-22 23:48:59 +08:00
url = application.signupUrl;
}
}
2022-10-22 23:48:59 +08:00
const storeSigninUrl = () => {
sessionStorage.setItem("signinUrl", window.location.href);
};
return renderLink(url, text, storeSigninUrl);
}
export function renderForgetLink(application, text) {
2022-10-22 23:48:59 +08:00
let url;
if (application === null) {
2022-10-22 23:48:59 +08:00
url = null;
} else if (authConfig.appName === application.name) {
2022-10-22 23:48:59 +08:00
url = "/forget";
} else {
2021-06-04 01:21:53 +08:00
if (application.forgetUrl === "") {
2022-10-22 23:48:59 +08:00
url = `/forget/${application.name}`;
} else {
2022-10-22 23:48:59 +08:00
url = application.forgetUrl;
}
}
2022-10-22 23:48:59 +08:00
return renderLink(url, text, null);
}
2021-04-29 21:28:24 +08:00
export function renderHelmet(application) {
2022-08-06 23:43:09 +08:00
if (application === undefined || application === null || application.organizationObj === undefined || application.organizationObj === null || application.organizationObj === "") {
2021-04-29 21:28:24 +08:00
return null;
}
return (
<Helmet>
<title>{application.organizationObj.displayName}</title>
<link rel="icon" href={application.organizationObj.favicon} />
</Helmet>
);
2021-04-29 21:28:24 +08:00
}
2021-06-25 00:13:43 +08:00
export function getLabel(text, tooltip) {
return (
<React.Fragment>
<span style={{marginRight: 4}}>{text}</span>
2021-06-25 00:13:43 +08:00
<Tooltip placement="top" title={tooltip}>
<QuestionCircleTwoTone twoToneColor="rgb(45,120,213)" />
</Tooltip>
</React.Fragment>
);
}
2021-06-25 21:35:20 +08:00
export function getItem(label, key, icon, children, type) {
2023-08-05 17:41:35 +08:00
return {label: label, key: key, icon: icon, children: children, type: type};
}
export function getOption(label, value) {
return {
label,
value,
};
}
2021-07-09 23:05:50 +08:00
export function getArrayItem(array, key, value) {
const res = array.filter(item => item[key] === value)[0];
return res;
}
export function getDeduplicatedArray(array, filterArray, key) {
const res = array.filter(item => !filterArray.some(tableItem => tableItem[key] === item[key]));
return res;
}
2021-11-07 15:41:24 +08:00
2021-11-28 18:21:34 +08:00
export function getNewRowNameForTable(table, rowName) {
const emptyCount = table.filter(row => row.name.includes(rowName)).length;
let res = rowName;
2022-08-06 23:43:09 +08:00
for (let i = 0; i < emptyCount; i++) {
2021-11-28 18:21:34 +08:00
res = res + " ";
}
return res;
}
2021-11-07 15:41:24 +08:00
export function getTagColor(s) {
2022-01-01 15:11:16 +08:00
return "processing";
2021-11-07 15:41:24 +08:00
}
2023-04-09 14:47:08 +08:00
export function getTags(tags, urlPrefix = null) {
const res = [];
2022-08-21 23:17:14 +08:00
if (!tags) {
return res;
}
2021-11-07 15:41:24 +08:00
tags.forEach((tag, i) => {
2023-04-09 14:47:08 +08:00
if (urlPrefix === null) {
res.push(
<Tag color={getTagColor(tag)}>
{tag}
</Tag>
);
} else {
res.push(
<Link to={`/${urlPrefix}/${tag}`}>
<Tag color={getTagColor(tag)}>
{tag}
</Tag>
</Link>
);
}
2021-11-07 15:41:24 +08:00
});
return res;
}
2021-11-28 20:57:14 +08:00
2022-08-21 23:17:14 +08:00
export function getTag(color, text) {
return (
<Tag color={color}>
{text}
</Tag>
);
}
export function getApplicationName(application) {
return `${application?.owner}/${application?.name}`;
}
2021-12-12 18:51:12 +08:00
export function getRandomName() {
return Math.random().toString(36).slice(-6);
}
2021-12-23 21:28:40 +08:00
export function getRandomNumber() {
return Math.random().toString(10).slice(-11);
}
2022-02-12 09:55:06 +08:00
export function getFromLink() {
const from = sessionStorage.getItem("from");
if (from === null) {
return "/";
}
return from;
}
2022-04-27 01:06:54 +08:00
export function scrollToDiv(divId) {
if (divId) {
const ele = document.getElementById(divId);
2022-04-27 01:06:54 +08:00
if (ele) {
ele.scrollIntoView({behavior: "smooth"});
}
}
}
export function inIframe() {
try {
return window !== window.parent;
} catch (e) {
return true;
}
}
export function getOrganization() {
const organization = localStorage.getItem("organization");
2023-06-30 01:38:48 +08:00
return organization !== null ? organization : "All";
}
export function setOrganization(organization) {
localStorage.setItem("organization", organization);
2023-06-30 01:38:48 +08:00
window.dispatchEvent(new Event("storageOrganizationChanged"));
}
export function getRequestOrganization(account) {
if (isAdminUser(account)) {
2023-06-30 01:38:48 +08:00
return getOrganization() === "All" ? account.owner : getOrganization();
}
return account.owner;
}
export function isDefaultOrganizationSelected(account) {
if (isAdminUser(account)) {
2023-06-30 01:38:48 +08:00
return getOrganization() === "All";
}
return false;
}
const BuiltInObjects = [
"api-enforcer-built-in",
"permission-enforcer-built-in",
"api-model-built-in",
"permission-model-built-in",
"api-adapter-built-in",
"permission-adapter-built-in",
];
export function builtInObject(obj) {
if (obj === undefined || obj === null) {
return false;
}
return obj.owner === "built-in" && BuiltInObjects.includes(obj.name);
}