casdoor/web/src/Setting.js

472 lines
20 KiB
JavaScript
Raw Normal View History

feat: added avatar tailoring and uploading Signed-off-by: Kininaru <shiftregister233@outlook.com> fixed type errors Signed-off-by: Kininaru <shiftregister233@outlook.com> fixed the wrong folder Signed-off-by: Kininaru <shiftregister233@outlook.com> rewrite login check logic, added unix time to avatar url Signed-off-by: Kininaru <shiftregister233@outlook.com> fixed a bug about strconv Signed-off-by: Kininaru <shiftregister233@outlook.com> supported oss Signed-off-by: Kininaru <shiftregister233@outlook.com> disabled oss provide qiniu Signed-off-by: Kininaru <shiftregister233@outlook.com> Fixed avatar url error Signed-off-by: Kininaru <shiftregister233@outlook.com> Fixed avatar length bug Signed-off-by: Kininaru <shiftregister233@outlook.com> Fixed avatar length bug Signed-off-by: Kininaru <shiftregister233@outlook.com> fixed oss.conf Signed-off-by: Kininaru <shiftregister233@outlook.com> Put uploading avatar into UserEditPage Signed-off-by: Kininaru <shiftregister233@outlook.com> removed avatar dir Signed-off-by: Kininaru <shiftregister233@outlook.com> removed avatar in main.go Signed-off-by: Kininaru <shiftregister233@outlook.com> Made CropperDiv a reusable component, and updated README for OSS config Signed-off-by: Kininaru <shiftregister233@outlook.com> Convert ts to js Signed-off-by: Kininaru <shiftregister233@outlook.com> removed ts Signed-off-by: Kininaru <shiftregister233@outlook.com> fix: set avatar link to string 255 Signed-off-by: Kininaru <shiftregister233@outlook.com> fix: updated yarn lock Signed-off-by: Kininaru <shiftregister233@outlook.com> add: Casbin license Signed-off-by: Kininaru <shiftregister233@outlook.com>
2021-03-14 15:50:36 +08:00
// Copyright 2021 The casbin 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.
2021-06-25 00:13:43 +08:00
import {message, Tooltip} from "antd";
import {QuestionCircleTwoTone} from "@ant-design/icons";
2021-02-13 12:15:19 +08:00
import React from "react";
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";
2021-02-13 12:15:19 +08:00
2021-02-13 21:04:23 +08:00
export let ServerUrl = "";
2021-02-13 12:15:19 +08:00
2021-06-12 12:07:24 +08:00
// export const StaticBaseUrl = "https://cdn.jsdelivr.net/gh/casbin/static";
export const StaticBaseUrl = "https://cdn.casbin.org";
2021-06-12 11:52:59 +08:00
2021-06-25 21:35:20 +08:00
// https://github.com/yiminghe/async-validator/blob/057b0b047f88fac65457bae691d6cb7c6fe48ce1/src/rule/type.ts#L9
export 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,}))$/;
2021-06-25 21:35:20 +08:00
// https://learnku.com/articles/31543, `^s*$` filter empty email individually.
export const PhoneRegEx = /^\s*$|^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/;
// https://catamphetamine.gitlab.io/country-flag-icons/3x2/index.html
export const CountryRegionData = [{name: "Ascension Island", code: "AC"},{name: "Andorra", code: "AD"},{name: "United Arab Emirates", code: "AE"},{name: "Afghanistan", code: "AF"},{name: "Antigua and Barbuda", code: "AG"},{name: "Anguilla", code: "AI"},{name: "Albania", code: "AL"},{name: "Armenia", code: "AM"},{name: "Angola", code: "AO"},{name: "Antarctica", code: "AQ"},{name: "Argentina", code: "AR"},{name: "American Samoa", code: "AS"},{name: "Austria", code: "AT"},{name: "Australia", code: "AU"},{name: "Aruba", code: "AW"},{name: "Åland Islands", code: "AX"},{name: "Azerbaijan", code: "AZ"},{name: "Bosnia and Herzegovina", code: "BA"},{name: "Barbados", code: "BB"},{name: "Bangladesh", code: "BD"},{name: "Belgium", code: "BE"},{name: "Burkina Faso", code: "BF"},{name: "Bulgaria", code: "BG"},{name: "Bahrain", code: "BH"},{name: "Burundi", code: "BI"},{name: "Benin", code: "BJ"},{name: "Saint Barthélemy", code: "BL"},{name: "Bermuda", code: "BM"},{name: "Brunei Darussalam", code: "BN"},{name: "Bolivia", code: "BO"},{name: "Bonaire, Sint Eustatius and Saba", code: "BQ"},{name: "Brazil", code: "BR"},{name: "Bahamas", code: "BS"},{name: "Bhutan", code: "BT"},{name: "Bouvet Island", code: "BV"},{name: "Botswana", code: "BW"},{name: "Belarus", code: "BY"},{name: "Belize", code: "BZ"},{name: "Canada", code: "CA"},{name: "Cocos (Keeling) Islands", code: "CC"},{name: "Congo, Democratic Republic of the", code: "CD"},{name: "Central African Republic", code: "CF"},{name: "Congo", code: "CG"},{name: "Switzerland", code: "CH"},{name: "Cote d'Ivoire", code: "CI"},{name: "Cook Islands", code: "CK"},{name: "Chile", code: "CL"},{name: "Cameroon", code: "CM"},{name: "China", code: "CN"},{name: "Colombia", code: "CO"},{name: "Costa Rica", code: "CR"},{name: "Cuba", code: "CU"},{name: "Cape Verde", code: "CV"},{name: "Curaçao", code: "CW"},{name: "Christmas Island", code: "CX"},{name: "Cyprus", code: "CY"},{name: "Czech Republic", code: "CZ"},{name: "Germany", code: "DE"},{name: "Djibouti", code: "DJ"},{name: "Denmark", code: "DK"},{name: "Dominica", code: "DM"},{name: "Dominican Republic", code: "DO"},{name: "Algeria", code: "DZ"},{name: "Ecuador", code: "EC"},{name: "Estonia", code: "EE"},{name: "Egypt", code: "EG"},{name: "Western Sahara", code: "EH"},{name: "Eritrea", code: "ER"},{name: "Spain", code: "ES"},{name: "Ethiopia", code: "ET"},{name: "Finland", code: "FI"},{name: "Fiji", code: "FJ"},{name: "Falkland Islands", code: "FK"},{name: "Federated States of Micronesia", code: "FM"},{name: "Faroe Islands", code: "FO"},{name: "France", code: "FR"},{name: "Gabon", code: "GA"},{name: "United Kingdom", code: "GB"},{name: "Grenada", code: "GD"},{name: "Georgia", code: "GE"},{name: "French Guiana", code: "GF"},{name: "Guernsey", code: "GG"},{name: "Ghana", code: "GH"},{name: "Gibraltar", code: "GI"},{name: "Greenland", code: "GL"},{name: "Gambia", code: "GM"},{name: "Guinea", code: "GN"},{name: "Guadeloupe", code: "GP"},{name: "Equatorial Guinea", code: "GQ"},{name: "Greece", code: "GR"},{name: "South Georgia and the South Sandwich Islands", code: "GS"},{name: "Guatemala", code: "GT"},{name: "Guam", code: "GU"},{name: "Guinea-Bissau", code: "GW"},{name: "Guyana", code: "GY"},{name: "Hong Kong", code: "HK"},{name: "Heard Island and McDonald Islands", code: "HM"},{name: "Honduras", code: "HN"},{name: "Croatia", code: "HR"},{name: "Haiti", code: "HT"},{name: "Hungary", code: "HU"},{name: "Indonesia", code: "ID"},{name: "Ireland", code: "IE"},{name: "Israel", code: "IL"},{name: "Isle of Man", code: "IM"},{name: "India", code: "IN"},{name: "British Indian Ocean Territory", code: "IO"},{name: "Iraq", code: "IQ"},{name: "Iran", code: "IR"},{name: "Iceland", code: "IS"},{name: "Italy", code: "IT"},{name: "Jersey", code: "JE"},{name: "Jamaica", code: "JM"},{name: "Jordan", code: "JO"},{name: "Japan", code: "JP"},{name: "Kenya", code: "KE"},{name: "Kyrgyzstan", code: "KG"},{name: "Cambodia", code: "KH"},{name: "Kiribati", code: "KI"},{name: "Comoros", code: "KM"},{name: "Saint Kitts and Nevis", code: "KN"},{name: "North Korea", code: "KP"},{na
2021-02-13 12:15:19 +08:00
export function initServerUrl() {
const hostname = window.location.hostname;
2021-02-13 21:04:23 +08:00
if (hostname === "localhost") {
2021-02-13 12:15:19 +08:00
ServerUrl = `http://${hostname}:8000`;
}
}
2021-05-14 15:55:50 +08:00
function isLocalhost() {
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;
}
2021-06-17 01:49:05 +08:00
if (providerItem.provider.category !== "OAuth") {
return false;
2021-05-14 15:55:50 +08:00
}
2021-06-17 01:49:05 +08:00
if (providerItem.provider.type === "GitHub") {
if (isLocalhost()) {
return providerItem.provider.name.includes("localhost");
} else {
return !providerItem.provider.name.includes("localhost");
}
2021-05-14 15:55:50 +08:00
} else {
2021-06-17 01:49:05 +08:00
return true;
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;
}
2021-06-20 09:46:06 +08:00
export function getAllPromptedProviderItems(application) {
return application.providers.filter(providerItem => isProviderPrompted(providerItem));
}
export function getSignupItem(application, itemName) {
const signupItems = application.signupItems?.filter(signupItem => signupItem.name === itemName);
2021-06-20 09:46:06 +08:00
if (signupItems.length === 0) {
return null;
}
return signupItems[0];
}
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);
if (providerItems.length !== 0) {
return true;
}
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 !== "";
}
export function isPromptAnswered(user, application) {
if (!isAffiliationAnswered(user, application)) {
return false;
}
const providerItems = getAllPromptedProviderItems(application);
for (let i = 0; i < providerItems.length; i ++) {
if (!isProviderItemAnswered(user, application, providerItems[i])) {
return false;
}
}
return true;
}
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');
w.location.href = link;
}
export function goToLink(link) {
window.location.href = link;
}
2021-03-26 21:58:19 +08:00
export function goToLinkSoft(ths, link) {
ths.props.history.push(link);
}
2021-02-13 12:15:19 +08:00
export function showMessage(type, text) {
if (type === "") {
return;
} else if (type === "success") {
message.success(text);
} else if (type === "error") {
message.error(text);
}
}
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
}
2021-02-13 12:15:19 +08:00
export function deepCopy(obj) {
return Object.assign({}, obj);
}
export function addRow(array, row) {
return [...array, row];
}
export function prependRow(array, row) {
return [row, ...array];
}
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;
while(end > start && str[end - 1] === ch)
--end;
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;
}
date = date.replace('T', ' ');
date = date.replace('+08:00', ' ');
return date;
}
export function getFormattedDateShort(date) {
return date.slice(0, 10);
}
export function getShortName(s) {
return s.split('/').slice(-1)[0];
}
2021-02-13 23:00:43 +08:00
export function getShortText(s, maxLength=35) {
if (s.length > maxLength) {
return `${s.slice(0, maxLength)}...`;
} else {
return s;
}
}
2021-02-13 12:15:19 +08:00
function getRandomInt(s) {
let hash = 0;
if (s.length !== 0) {
for (let i = 0; i < s.length; i ++) {
let char = s.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash;
}
}
return hash;
}
export function getAvatarColor(s) {
const colorList = ['#f56a00', '#7265e6', '#ffbf00', '#00a2ae'];
let random = getRandomInt(s);
if (random < 0) {
random = -random;
}
return colorList[random % 4];
}
export function setLanguage() {
let language = localStorage.getItem('language');
if (language === undefined) {
language = "en"
}
i18next.changeLanguage(language)
}
export function changeLanguage(language) {
localStorage.setItem("language", language)
i18next.changeLanguage(language)
window.location.reload(true);
}
2021-03-14 23:08:08 +08:00
export function getClickable(text) {
return (
2021-03-27 11:38:15 +08:00
// eslint-disable-next-line jsx-a11y/anchor-is-valid
2021-03-14 23:08:08 +08:00
<a onClick={() => {
copy(text);
showMessage("success", `Copied to clipboard`);
}}>
{text}
</a>
)
}
2021-04-18 23:14:46 +08:00
2021-04-19 01:14:41 +08:00
export function getProviderLogo(provider) {
const idp = provider.type.toLowerCase();
2021-06-12 11:52:59 +08:00
const url = `${StaticBaseUrl}/img/social_${idp}.png`;
2021-04-18 23:14:46 +08:00
return (
<img width={30} height={30} src={url} alt={idp} />
)
}
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 width={250} src={application.logo} alt={application.displayName} style={{marginBottom: '30px'}}/>
</a>
)
} else {
return (
<img width={250} src={application.logo} alt={application.displayName} style={{marginBottom: '30px'}}/>
);
}
}
2021-04-28 22:40:21 +08:00
export function goToLogin(ths, application) {
if (application === null) {
return;
}
2021-06-14 23:23:59 +08:00
if (!application.enablePassword && window.location.pathname.includes("/signup/oauth/authorize")) {
const link = window.location.href.replace("/signup/oauth/authorize", "/login/oauth/authorize");
goToLink(link);
return;
}
2021-04-28 22:40:21 +08:00
if (authConfig.appName === application.name) {
goToLinkSoft(ths, "/login");
} else {
2021-06-14 22:55:08 +08:00
if (application.signinUrl === "") {
goToLink(`${application.homepageUrl}/login`);
} else {
goToLink(application.signinUrl);
}
2021-04-28 22:40:21 +08:00
}
}
2021-04-29 21:28:24 +08:00
export function goToSignup(ths, application) {
if (application === null) {
return;
}
2021-06-14 23:23:59 +08:00
if (!application.enablePassword && window.location.pathname.includes("/login/oauth/authorize")) {
const link = window.location.href.replace("/login/oauth/authorize", "/signup/oauth/authorize");
goToLink(link);
return;
}
if (authConfig.appName === application.name) {
goToLinkSoft(ths, "/signup");
} else {
if (application.signupUrl === "") {
goToLinkSoft(ths, `/signup/${application.name}`);
} else {
goToLink(application.signupUrl);
}
}
}
export function goToForget(ths, application) {
if (application === null) {
return;
}
if (authConfig.appName === application.name) {
goToLinkSoft(ths, "/forget");
} else {
2021-06-04 01:21:53 +08:00
if (application.forgetUrl === "") {
goToLinkSoft(ths, `/forget/${application.name}`);
} else {
goToLink(application.forgetUrl);
}
}
}
2021-04-29 21:28:24 +08:00
export function renderHelmet(application) {
if (application === undefined || application === null || application.organizationObj === undefined || application.organizationObj === null ||application.organizationObj === "") {
return null;
}
return (
<Helmet>
<title>{application.organizationObj.displayName}</title>
<link rel="icon" href={application.organizationObj.favicon} />
</Helmet>
)
}
2021-06-25 00:13:43 +08:00
export function getLabel(text, tooltip) {
return (
<React.Fragment>
<span style={{ marginRight: 4 }}>{text}</span>
<Tooltip placement="top" title={tooltip}>
<QuestionCircleTwoTone twoToneColor="rgb(45,120,213)" />
</Tooltip>
</React.Fragment>
);
}
2021-06-25 21:35:20 +08:00
function repeat(str, len) {
while (str.length < len) {
str += str.substr(0, len - str.length);
}
return str;
}
function maskString(s) {
if (s.length <= 2) {
return s;
} else {
return `${s[0]}${repeat("*", s.length - 2)}${s[s.length - 1]}`;
}
}
export function maskEmail(email) {
if (email === "") return;
2021-06-25 21:35:20 +08:00
const tokens = email.split("@");
let username = tokens[0];
username = maskString(username);
const domain = tokens[1];
let domainTokens = domain.split(".");
domainTokens[domainTokens.length - 2] = maskString(domainTokens[domainTokens.length - 2]);
return `${username}@${domainTokens.join(".")}`;
}
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.filter(filterItem => filterItem[key] === item[key]).length === 0);
return res;
}