Compare commits

...

7 Commits

38 changed files with 167 additions and 12 deletions

View File

@@ -719,7 +719,8 @@ func (c *ApiController) Login() {
setHttpClient(idProvider, provider.Type)
if authForm.State != conf.GetConfigString("authState") && authForm.State != application.Name {
stateApplicationName := strings.Split(authForm.State, "-org-")[0]
if authForm.State != conf.GetConfigString("authState") && stateApplicationName != application.Name {
c.ResponseError(fmt.Sprintf(c.T("auth:State expected: %s, but got: %s"), conf.GetConfigString("authState"), authForm.State))
return
}

View File

@@ -67,6 +67,7 @@ type Application struct {
DisplayName string `xorm:"varchar(100)" json:"displayName"`
Logo string `xorm:"varchar(200)" json:"logo"`
Order int `json:"order"`
HomepageUrl string `xorm:"varchar(100)" json:"homepageUrl"`
Description string `xorm:"varchar(100)" json:"description"`
Organization string `xorm:"varchar(100)" json:"organization"`

View File

@@ -510,6 +510,8 @@ func GetUserByPhone(owner string, phone string) (*User, error) {
return nil, nil
}
phone = util.GetSeperatedPhone(phone)
user := User{Owner: owner, Phone: phone}
existed, err := ormer.Engine.Get(&user)
if err != nil {
@@ -528,6 +530,8 @@ func GetUserByPhoneOnly(phone string) (*User, error) {
return nil, nil
}
phone = util.GetSeperatedPhone(phone)
user := User{Phone: phone}
existed, err := ormer.Engine.Get(&user)
if err != nil {

View File

@@ -80,7 +80,8 @@ func GetUserByFields(organization string, field string) (*User, error) {
}
// check phone
user, err = GetUserByField(organization, "phone", field)
phone := util.GetSeperatedPhone(field)
user, err = GetUserByField(organization, "phone", phone)
if user != nil || err != nil {
return user, err
}

View File

@@ -30,6 +30,7 @@ import (
"unicode"
"github.com/google/uuid"
"github.com/nyaruka/phonenumbers"
)
func ParseInt(s string) int {
@@ -278,6 +279,19 @@ func GetMaskedPhone(phone string) string {
return rePhone.ReplaceAllString(phone, "$1****$2")
}
func GetSeperatedPhone(phone string) string {
if strings.HasPrefix(phone, "+") {
phoneNumberParsed, err := phonenumbers.Parse(phone, "")
if err != nil {
return phone
}
phone = fmt.Sprintf("%d", phoneNumberParsed.GetNationalNumber())
}
return phone
}
func GetMaskedEmail(email string) string {
if email == "" {
return ""

View File

@@ -468,6 +468,16 @@ class ApplicationEditPage extends React.Component {
</Select>
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("application:Order"), i18next.t("application:Order - Tooltip"))} :
</Col>
<Col span={22} >
<InputNumber style={{width: "150px"}} value={this.state.application.order} min={0} step={1} precision={0} addonAfter="" onChange={value => {
this.updateApplicationField("order", value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("application:Token expire"), i18next.t("application:Token expire - Tooltip"))} :

View File

@@ -42,10 +42,11 @@ class BaseListPage extends React.Component {
handleOrganizationChange = () => {
this.setState({
organizationName: this.props.match?.params.organizationName || Setting.getRequestOrganization(this.props.account),
},
() => {
const {pagination} = this.state;
this.fetch({pagination});
});
const {pagination} = this.state;
this.fetch({pagination});
};
handleTourChange = () => {

View File

@@ -326,7 +326,7 @@ class UserEditPage extends React.Component {
</Col>
<Col span={22} >
<Select virtual={false} mode="multiple" style={{width: "100%"}} disabled={disabled} value={this.state.user.groups ?? []} onChange={(value => {
if (this.state.groups?.filter(group => value.includes(group.name))
if (this.state.groups?.filter(group => value.includes(`${group.owner}/${group.name}`))
.filter(group => group.type === "Physical").length > 1) {
Setting.showMessage("error", i18next.t("general:You can only select one physical group"));
return;

View File

@@ -39,6 +39,7 @@ import {GoogleOneTapLoginVirtualButton} from "./GoogleLoginButton";
import * as ProviderButton from "./ProviderButton";
import {createFormAndSubmit, goToLink} from "../Setting";
import WeChatLoginPanel from "./WeChatLoginPanel";
import {CountryCodeSelect} from "../common/select/CountryCodeSelect";
const FaceRecognitionCommonModal = lazy(() => import("../common/modal/FaceRecognitionCommonModal"));
const FaceRecognitionModal = lazy(() => import("../common/modal/FaceRecognitionModal"));
@@ -677,6 +678,62 @@ class LoginPage extends React.Component {
if (this.state.loginMethod === "wechat") {
return (<WeChatLoginPanel application={application} loginMethod={this.state.loginMethod} />);
}
if (this.state.loginMethod === "verificationCodePhone") {
return <Form.Item className="signin-phone" required={true}>
<Input.Group compact>
<Form.Item
name="countryCode"
noStyle
rules={[
{
required: true,
message: i18next.t("signup:Please select your country code!"),
},
]}
>
<CountryCodeSelect
style={{width: "35%"}}
countryCodes={this.getApplicationObj().organizationObj.countryCodes}
/>
</Form.Item>
<Form.Item
name="username"
dependencies={["countryCode"]}
noStyle
rules={[
{
required: true,
message: i18next.t("signup:Please input your phone number!"),
},
({getFieldValue}) => ({
validator: (_, value) => {
if (!value) {
return Promise.resolve();
}
if (value && !Setting.isValidPhone(value, getFieldValue("countryCode"))) {
this.setState({validEmailOrPhone: false});
return Promise.reject(i18next.t("signup:The input is not valid Phone!"));
}
this.setState({validEmailOrPhone: true});
return Promise.resolve();
},
}),
]}
>
<Input
className="signup-phone-input"
placeholder={signinItem.placeholder}
style={{width: "65%", textAlign: "left"}}
onChange={e => this.setState({username: e.target.value})}
/>
</Form.Item>
</Input.Group>
</Form.Item>;
}
return (
<div key={resultItemKey}>
<div dangerouslySetInnerHTML={{__html: ("<style>" + signinItem.customCss?.replaceAll("<style>", "").replaceAll("</style>", "") + "</style>")}} />
@@ -1122,11 +1179,13 @@ class LoginPage extends React.Component {
{i18next.t("login:Continue with")}&nbsp;:
</div>
<br />
<SelfLoginButton account={this.props.account} onClick={() => {
<div onClick={() => {
const values = {};
values["application"] = application.name;
this.login(values);
}} />
}}>
<SelfLoginButton account={this.props.account} />
</div>
<br />
<br />
<div style={{fontSize: 16, textAlign: "left"}}>

View File

@@ -392,7 +392,11 @@ export function getAuthUrl(application, provider, method, code) {
let redirectUri = `${redirectOrigin}/callback`;
let scope = authInfo[provider.type].scope;
const isShortState = (provider.type === "WeChat" && navigator.userAgent.includes("MicroMessenger")) || (provider.type === "Twitter");
const state = Util.getStateFromQueryParams(application.name, provider.name, method, isShortState);
let applicationName = application.name;
if (application?.isShared) {
applicationName = `${application.name}-org-${application.organization}`;
}
const state = Util.getStateFromQueryParams(applicationName, provider.name, method, isShortState);
const codeChallenge = "P3S-a7dr8bgM4bF6vOyiKkKETDl16rcAzao9F8UIL1Y"; // SHA256(Base64-URL-encode("casdoor-verifier"))
if (provider.type === "AzureAD") {

View File

@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import React from "react";
import React, {memo} from "react";
import {createButton} from "react-social-login-buttons";
class SelfLoginButton extends React.Component {
@@ -44,4 +44,4 @@ class SelfLoginButton extends React.Component {
}
}
export default SelfLoginButton;
export default memo(SelfLoginButton);

View File

@@ -19,13 +19,21 @@ import GridCards from "./GridCards";
const AppListPage = (props) => {
const [applications, setApplications] = React.useState(null);
const sort = (applications) => {
applications.sort((a, b) => {
return a.order - b.order;
});
};
React.useEffect(() => {
if (props.account === null) {
return;
}
ApplicationBackend.getApplicationsByOrganization("admin", props.account.owner)
.then((res) => {
setApplications(res.data || []);
const applications = res.data || [];
sort(applications);
setApplications(applications);
});
}, [props.account]);

View File

@@ -92,6 +92,8 @@
"No verification": "لا توجد مصادقة",
"Normal": "عادي",
"Only signup": "التسجيل فقط",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "وضع اختيار المنظمة",
"Org choice mode - Tooltip": "وضع اختيار المنظمة - تلميح",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "يرجى تشغيل \\\"جلسة الدخول\\\" أولاً قبل تشغيل \\\"الدخول التلقائي\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Doğrulama yox",
"Normal": "Normal",
"Only signup": "Yalnız qeydiyyat",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Təşkilat seçim rejimi",
"Org choice mode - Tooltip": "Təşkilat seçim rejimi - Tooltip",
"Please enable \"Signin session\" first before enabling \"Auto signin\"": "\"Avtomatik giriş\"i aktiv etməzdən əvvəl əvvəlcə \"Giriş sessiyası\"nı aktiv edin",

View File

@@ -92,6 +92,8 @@
"No verification": "Žádná verifikace",
"Normal": "Normální",
"Only signup": "Pouze registrace",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Režim výběru organizace",
"Org choice mode - Tooltip": "Režim výběru organizace - popisek",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Nejprve povolte \\\"Přihlašovací relaci\\\" před povolením \\\"Automatického přihlášení\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Keine Verifizierung",
"Normal": "Normal",
"Only signup": "Nur Registrierung",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Organisationsauswahlmodus",
"Org choice mode - Tooltip": "Organisationsauswahlmodus Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Bitte aktivieren Sie zuerst \\\"Anmeldesitzung\\\", bevor Sie \\\"Automatische Anmeldung\\\" aktivieren.",

View File

@@ -92,6 +92,8 @@
"No verification": "No verification",
"Normal": "Normal",
"Only signup": "Only signup",
"Order": "Order",
"Order - Tooltip": "The smaller the value, the higher it ranks in the Apps page",
"Org choice mode": "Org choice mode",
"Org choice mode - Tooltip": "Org choice mode - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Sin verificación",
"Normal": "Normal",
"Only signup": "Solo registro",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Modo de selección de organización",
"Org choice mode - Tooltip": "Modo de selección de organización - Información adicional",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Por favor, habilita \\\"Sesión de inicio de sesión\\\" primero antes de habilitar \\\"Inicio de sesión automático\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "بدون تأیید",
"Normal": "عادی",
"Only signup": "فقط ثبت‌نام",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "حالت انتخاب سازمان",
"Org choice mode - Tooltip": "حالت انتخاب سازمان - راهنمای ابزار",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "لطفاً قبل فعال‌سازی «ورود خودکار»، ابتدا «جلسه ورود» را فعال کنید",

View File

@@ -92,6 +92,8 @@
"No verification": "Ei vahvistusta",
"Normal": "Normaali",
"Only signup": "Vain rekisteröityminen",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Organisaation valintatila",
"Org choice mode - Tooltip": "Organisaation valintatila - työkalupala",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Ota \\\"Kirjautumisession\\\" käyttöön ennen \\\"Automaattisen kirjautumisen\\\" ottamista käyttöön",

View File

@@ -92,6 +92,8 @@
"No verification": "Aucune vérification",
"Normal": "Normal",
"Only signup": "Inscription uniquement",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Mode de choix d'organisation",
"Org choice mode - Tooltip": "Mode de choix d'organisation - Infobulle",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Veuillez activer \\\"Session de connexion\\\" avant d'activer \\\"Connexion automatique\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "ללא אימות",
"Normal": "רגיל",
"Only signup": "הרשמה בלבד",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "מצב בחירת ארגון",
"Org choice mode - Tooltip": "מצב בחירת ארגון - תיאור",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "אנא הפעל \\\"פתיחת جلسة כניסה\\\" תחילה לפני הפעלת \\\"כניסה אוטומטית\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Tidak ada verifikasi",
"Normal": "Normal",
"Only signup": "Hanya mendaftar",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Mode pilihan organisasi",
"Org choice mode - Tooltip": "Mode pilihan organisasi - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Harap aktifkan \\\"Sesi masuk\\\" terlebih dahulu sebelum mengaktifkan \\\"Masuk otomatis\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Nessuna verifica",
"Normal": "Normale",
"Only signup": "Solo registrazione",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Modalità scelta organizzazione",
"Org choice mode - Tooltip": "Modalità scelta organizzazione - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Abilita prima \\\"Sessione di accesso\\\" prima di abilitare \\\"Accesso automatico\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "検証なし",
"Normal": "通常",
"Only signup": "サインアップのみ",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "組織選択モード",
"Org choice mode - Tooltip": "組織選択モード - ツールチップ",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "\\\"自動サインイン\\\"を有効にする前に、まず\\\"サインインセッション\\\"を有効にしてください",

View File

@@ -92,6 +92,8 @@
"No verification": "Тексерусіз",
"Normal": "Қалыпты",
"Only signup": "Тек тіркелу",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Ұйым таңдау режимі",
"Org choice mode - Tooltip": "Ұйым таңдау режимі - Қысқаша түсінік",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Автоматты кіруді қосу алдында алдымен \\\"Кіру сессиясын\\\" қосыңыз",

View File

@@ -92,6 +92,8 @@
"No verification": "검증 없음",
"Normal": "일반",
"Only signup": "가입만",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "조직 선택 모드",
"Org choice mode - Tooltip": "조직 선택 모드 - 툴팁",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "\\\"자동 로그인\\\"을 활성화하기 전에 \\\"로그인 세션\\\"을 먼저 활성화하세요.",

View File

@@ -92,6 +92,8 @@
"No verification": "Tiada pengesahan",
"Normal": "Biasa",
"Only signup": "Hanya pendaftaran",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Mod pilihan organisasi",
"Org choice mode - Tooltip": "Mod pilihan organisasi - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Sila dayakan \\\"Sesi log masuk\\\" terlebih dahulu sebelum mendayakan \\\"Log masuk automatik\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Geen verificatie",
"Normal": "Normaal",
"Only signup": "Alleen registratie",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Organisatiekeuzemodus",
"Org choice mode - Tooltip": "Organisatiekeuzemodus - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Schakel eerst \\\"Aanmeldsessie\\\" in voordat je \\\"Automatische aanmelding\\\" inschakelt",

View File

@@ -92,6 +92,8 @@
"No verification": "Brak weryfikacji",
"Normal": "Normalny",
"Only signup": "Tylko rejestracja",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Tryb wyboru organizacji",
"Org choice mode - Tooltip": "Tryb wyboru organizacji - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Najpierw włącz \\\"sesję logowania\\\", zanim włączysz \\\"automatyczne logowanie\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Sem verificação",
"Normal": "Normal",
"Only signup": "Apenas cadastro",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Modo de escolha da organização",
"Org choice mode - Tooltip": "Dica: modo de escolha da organização",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Por favor, habilite a \\\"Sessão de login\\\" primeiro antes de habilitar o \\\"Login automático\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Без проверки",
"Normal": "Обычный",
"Only signup": "Только регистрация",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Режим выбора организации",
"Org choice mode - Tooltip": "Подсказка: режим выбора организации",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Пожалуйста, сначала включите «Сессия входа» перед включением «Автоматического входа»",

View File

@@ -92,6 +92,8 @@
"No verification": "Bez overenia",
"Normal": "Normálny",
"Only signup": "Len registrácia",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Režim výberu organizácie",
"Org choice mode - Tooltip": "Režim výberu organizácie - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Najprv povoľte \\\"Reláciu prihlásenia\\\" pred povolením \\\"Automatického prihlásenia\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Tiada pengesahan",
"Normal": "Biasa",
"Only signup": "Hanya pendaftaran",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Mod pilihan organisasi",
"Org choice mode - Tooltip": "Mod pilihan organisasi - Tooltip",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Sila dayakan \\\"Sesi log masuk\\\" terlebih dahulu sebelum mendayakan \\\"Log masuk automatik\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Doğrulama yok",
"Normal": "Normal",
"Only signup": "Yalnızca kayıt",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Organizasyon seçim modu",
"Org choice mode - Tooltip": "Organizasyon seçim modu - Araç ipucu",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Lütfen \\\"Oturum açma oturumu\\\"nu etkinleştirmeden önce \\\"Otomatik oturum açma\\\"yı etkinleştirin",

View File

@@ -92,6 +92,8 @@
"No verification": "Без підтвердження",
"Normal": "нормальний",
"Only signup": "Тільки реєстрація",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Режим вибору організації",
"Org choice mode - Tooltip": "Режим вибору організації підказка",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Спочатку увімкніть \\\"Сесію входу\\\", перш ніж увімкнути \\\"Автоматичний вхід\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "Không xác minh",
"Normal": "Bình thường",
"Only signup": "Chỉ đăng ký",
"Order": "Order",
"Order - Tooltip": "Order - Tooltip",
"Org choice mode": "Chế độ chọn tổ chức",
"Org choice mode - Tooltip": "Gợi ý chế độ chọn tổ chức",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "Vui lòng kích hoạt \\\"Phiên đăng nhập\\\" trước khi kích hoạt \\\"Đăng nhập tự động\\\"",

View File

@@ -92,6 +92,8 @@
"No verification": "不校验",
"Normal": "标准",
"Only signup": "仅注册",
"Order": "Order",
"Order - Tooltip": "数值越小,在应用列表页面中排序越靠前",
"Org choice mode": "组织选择模式",
"Org choice mode - Tooltip": "采用什么方式选择要登录的组织",
"Please enable \\\"Signin session\\\" first before enabling \\\"Auto signin\\\"": "开启 \\\"保持登录会话\\\" 后才能开启 \\\"自动登录\\\"",