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" ;
2021-02-19 23:23:59 +08:00
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-09-14 01:22:13 +08:00
import moment from "moment" ;
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-23 11:41:21 +08:00
2021-06-25 21:35:20 +08:00
// https://learnku.com/articles/31543, `^s*$` filter empty email individually.
2021-06-23 11:41:21 +08:00
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}$/ ;
2021-07-31 16:02:48 +08:00
// 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-09-12 12:09:44 +08:00
export function isLocalhost ( ) {
2021-05-14 15:55:50 +08:00
const hostname = window . location . hostname ;
return hostname === "localhost" ;
}
2021-08-08 14:18:44 +08:00
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 ) {
2021-06-09 20:39:43 +08:00
return false ;
}
2021-06-14 21:35:19 +08:00
return isProviderVisible ( providerItem ) ;
2021-06-09 20:39:43 +08:00
}
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 ) {
2021-06-22 11:31:53 +08:00
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-08-15 00:17:53 +08:00
export function getFriendlyFileSize ( size ) {
if ( size < 1024 ) {
return size + ' B' ;
}
let i = Math . floor ( Math . log ( size ) / Math . log ( 1024 ) ) ;
let num = ( size / Math . pow ( 1024 , i ) ) ;
let round = Math . round ( num ) ;
num = round < 10 ? num . toFixed ( 2 ) : round < 100 ? num . toFixed ( 1 ) : round ;
return ` ${ num } ${ 'KMGTPEZY' [ i - 1 ] } B ` ;
}
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 ] ;
}
2021-02-19 23:23:59 +08:00
2021-09-14 01:22:13 +08:00
export function setLanguage ( language ) {
localStorage . setItem ( "language" , language ) ;
changeMomentLanguage ( language ) ;
i18next . changeLanguage ( language ) ;
2021-02-19 23:23:59 +08:00
}
export function changeLanguage ( language ) {
2021-09-14 01:22:13 +08:00
localStorage . setItem ( "language" , language ) ;
changeMomentLanguage ( language ) ;
i18next . changeLanguage ( language ) ;
2021-02-19 23:23:59 +08:00
window . location . reload ( true ) ;
}
2021-03-14 23:08:08 +08:00
2021-09-14 01:22:13 +08:00
export function changeMomentLanguage ( language ) {
return ;
if ( language === "zh" ) {
moment . locale ( "zh" , {
relativeTime : {
future : "%s内" ,
past : "%s前" ,
s : "几秒" ,
ss : "%d秒" ,
m : "1分钟" ,
mm : "%d分钟" ,
h : "1小时" ,
hh : "%d小时" ,
d : "1天" ,
dd : "%d天" ,
M : "1个月" ,
MM : "%d个月" ,
y : "1年" ,
yy : "%d年" ,
} ,
} ) ;
}
}
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
2021-05-03 00:48:02 +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 ;
}
2021-05-03 00:48:02 +08:00
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 === "" ) {
2021-05-03 00:48:02 +08:00
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 } < / t i t l e >
< link rel = "icon" href = { application . organizationObj . favicon } / >
< / H e l m e t >
)
}
2021-06-25 00:13:43 +08:00
export function getLabel ( text , tooltip ) {
return (
< React . Fragment >
< span style = { { marginRight : 4 } } > { text } < / s p a n >
< Tooltip placement = "top" title = { tooltip } >
< QuestionCircleTwoTone twoToneColor = "rgb(45,120,213)" / >
< / T o o l t i p >
< / R e a c t . F r a g m e n t >
) ;
}
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 ) {
2021-07-01 19:22:28 +08:00
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 ;
}
2021-07-09 23:12:13 +08:00
export function getDeduplicatedArray ( array , filterArray , key ) {
const res = array . filter ( item => filterArray . filter ( filterItem => filterItem [ key ] === item [ key ] ) . length === 0 ) ;
return res ;
}