mirror of
https://github.com/netbirdio/dashboard.git
synced 2026-09-23 00:30:43 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b06cb0ec3d | ||
|
|
0c924f7ded | ||
|
|
f29c915fc2 | ||
|
|
5f8579bfda | ||
|
|
a71389aa29 |
+160
-15
@@ -50,6 +50,7 @@ import { actions as routeActions } from "../store/route";
|
||||
import { actions as userActions } from "../store/user";
|
||||
import {useOidc} from "@axa-fr/react-oidc";
|
||||
import {getConfig} from "../config";
|
||||
import {Link} from "react-router-dom";
|
||||
|
||||
const { Title, Paragraph, Text } = Typography;
|
||||
|
||||
@@ -76,6 +77,7 @@ export const Settings = () => {
|
||||
];
|
||||
|
||||
const [groupsClicked, setGroupsClicked] = useState(false);
|
||||
const [idpCLicked, setIdpClicked] = useState(false);
|
||||
const [billingClicked, setBillingClicked] = useState(false);
|
||||
const [authClicked, setAuthClicked] = useState(true);
|
||||
const [dangerClicked, setDangerClicked] = useState(false);
|
||||
@@ -430,7 +432,7 @@ export const Settings = () => {
|
||||
updatedAccount.data.settings.jwt_groups_claim_name,
|
||||
groups_propagation_enabled:
|
||||
updatedAccount.data.settings.groups_propagation_enabled,
|
||||
peer_approval_enabled: updatedAccount.data.settings.extra.peer_approval_enabled
|
||||
peer_approval_enabled: updatedAccount.data.settings.extra? updatedAccount.data.settings.extra.peer_approval_enabled : false,
|
||||
} as FormAccount;
|
||||
setFormAccount(fAccount);
|
||||
} else if (updatedAccount.error) {
|
||||
@@ -481,21 +483,27 @@ export const Settings = () => {
|
||||
};
|
||||
|
||||
const createAccountToSave = (values: FormAccount): Account => {
|
||||
return {
|
||||
let peer_login_expiration = values.peer_login_expiration_formatted? expiresInToSeconds(
|
||||
values.peer_login_expiration_formatted
|
||||
) : accounts[0].settings.peer_login_expiration;
|
||||
|
||||
|
||||
let accountToSave = {
|
||||
id: formAccount.id,
|
||||
settings: {
|
||||
peer_login_expiration: expiresInToSeconds(
|
||||
values.peer_login_expiration_formatted
|
||||
),
|
||||
peer_login_expiration: peer_login_expiration,
|
||||
peer_login_expiration_enabled: values.peer_login_expiration_enabled,
|
||||
jwt_groups_enabled: jwtGroupsEnabled,
|
||||
jwt_groups_claim_name: jwtGroupsClaimName,
|
||||
groups_propagation_enabled: groupsPropagationEnabled,
|
||||
extra: {
|
||||
peer_approval_enabled: values.peer_approval_enabled
|
||||
}
|
||||
},
|
||||
} as Account;
|
||||
if (isNetBirdHosted() || isLocalDev()) {
|
||||
accountToSave.settings.extra = {
|
||||
peer_approval_enabled: values.peer_approval_enabled
|
||||
}
|
||||
}
|
||||
return accountToSave;
|
||||
};
|
||||
|
||||
const confirmSave = (newValues: FormAccount) => {
|
||||
@@ -651,24 +659,35 @@ export const Settings = () => {
|
||||
setGroupsClicked(false);
|
||||
setBillingClicked(false);
|
||||
setDangerClicked(false);
|
||||
setIdpClicked(false);
|
||||
break;
|
||||
case "groups":
|
||||
setGroupsClicked(true);
|
||||
setBillingClicked(false);
|
||||
setAuthClicked(false);
|
||||
setDangerClicked(false);
|
||||
setIdpClicked(false);
|
||||
break;
|
||||
case "billing":
|
||||
setBillingClicked(true);
|
||||
setAuthClicked(false);
|
||||
setGroupsClicked(false);
|
||||
setDangerClicked(false);
|
||||
setIdpClicked(false);
|
||||
break;
|
||||
case "danger":
|
||||
setBillingClicked(false);
|
||||
setAuthClicked(false);
|
||||
setGroupsClicked(false);
|
||||
setDangerClicked(true);
|
||||
setIdpClicked(false);
|
||||
break;
|
||||
case "idp":
|
||||
setIdpClicked(true);
|
||||
setBillingClicked(false);
|
||||
setAuthClicked(false);
|
||||
setGroupsClicked(false);
|
||||
setDangerClicked(false);
|
||||
break;
|
||||
}
|
||||
};
|
||||
@@ -696,12 +715,12 @@ export const Settings = () => {
|
||||
"System settings",
|
||||
"sub2",
|
||||
<SettingOutlined />,
|
||||
[getItem("Authentication", "auth"), getItem("Groups", "groups"), getItem("Danger zone", "danger", undefined, undefined, undefined, !isOwner)],
|
||||
[getItem("Authentication", "auth"), getItem("Groups", "groups"), getItem("Identity provider", "idp", undefined, undefined, undefined, !(isNetBirdHosted() || isLocalDev())), getItem("Danger zone", "danger", undefined, undefined, undefined, !isOwner)],
|
||||
"group"
|
||||
),
|
||||
];
|
||||
|
||||
useEffect(() => {}, [groupsClicked, billingClicked, authClicked, dangerClicked]);
|
||||
useEffect(() => {}, [groupsClicked, billingClicked, authClicked, dangerClicked, idpCLicked]);
|
||||
const renderGroupsSettingForm = () => {
|
||||
return(
|
||||
<>
|
||||
@@ -903,9 +922,7 @@ export const Settings = () => {
|
||||
>
|
||||
Peer approval{" "}
|
||||
<Tooltip
|
||||
title="Peer approval requires that every newly added peer
|
||||
will require approval by an administrator before it can connect to other peers.
|
||||
You can approve peers in the peers tab."
|
||||
title="When enabled, every newly added peer will require approval by an administrator before it can connect to other peers. You can approve peers in the peers tab."
|
||||
>
|
||||
<Text
|
||||
style={{
|
||||
@@ -1030,9 +1047,10 @@ export const Settings = () => {
|
||||
/>
|
||||
</Form.Item>
|
||||
</div>
|
||||
|
||||
<Col
|
||||
span={24}
|
||||
style={{ marginTop: "10px", marginBottom: "24px" }}
|
||||
style={{ marginTop: "-10px", marginBottom: "24px" }}
|
||||
>
|
||||
<Text type={"secondary"}>
|
||||
Learn more about
|
||||
@@ -1046,6 +1064,125 @@ export const Settings = () => {
|
||||
</a>
|
||||
</Text>
|
||||
</Col>
|
||||
{(isNetBirdHosted() || isLocalDev()) && (
|
||||
<Col span={24}
|
||||
style={{ marginTop: "10px", marginBottom: "24px" }}>
|
||||
<label
|
||||
style={{
|
||||
color: "rgba(0, 0, 0, 0.88)",
|
||||
fontSize: "14px",
|
||||
fontWeight: "500",
|
||||
}}
|
||||
>
|
||||
Multi-factor authentication (MFA)
|
||||
</label>
|
||||
<Paragraph
|
||||
type={"secondary"}
|
||||
style={{
|
||||
marginTop: "-2",
|
||||
fontWeight: "400",
|
||||
marginBottom: "5px",
|
||||
}}
|
||||
>
|
||||
<Text type={"secondary"}>
|
||||
If your IdP supports MFA, it will work automatically with NetBird. Otherwise, contact us at
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
href="mailto:support@netbird.io"
|
||||
>
|
||||
{" "}
|
||||
support@netbird.io
|
||||
{" "}
|
||||
</a>
|
||||
to enable this feature
|
||||
</Text>
|
||||
</Paragraph>
|
||||
</Col>)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
const renderIdpSettingsForm = () => {
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
style={{
|
||||
color: "rgba(0, 0, 0, 0.88)",
|
||||
fontWeight: "500",
|
||||
fontSize: "18px",
|
||||
marginBottom: "20px",
|
||||
}}
|
||||
>
|
||||
Identity provider
|
||||
</div>
|
||||
<div >
|
||||
|
||||
<Row>
|
||||
<Col span={24}>
|
||||
<label
|
||||
style={{
|
||||
color: "rgba(0, 0, 0, 0.88)",
|
||||
fontSize: "14px",
|
||||
fontWeight: "500",
|
||||
}}
|
||||
>
|
||||
User and group sync
|
||||
</label>
|
||||
<Paragraph
|
||||
type={"secondary"}
|
||||
style={{
|
||||
marginTop: "-2",
|
||||
fontWeight: "400",
|
||||
marginBottom: "5px",
|
||||
}}
|
||||
>
|
||||
Sync users and groups from your IdP to use them in access control
|
||||
</Paragraph>
|
||||
</Col>
|
||||
</Row>
|
||||
|
||||
<Col span={24}
|
||||
style={{ marginTop: "10px", marginBottom: "24px" }}>
|
||||
<label
|
||||
style={{
|
||||
color: "rgba(0, 0, 0, 0.88)",
|
||||
fontSize: "14px",
|
||||
fontWeight: "500",
|
||||
}}
|
||||
>
|
||||
Custom IdP
|
||||
</label>
|
||||
<Paragraph
|
||||
type={"secondary"}
|
||||
style={{
|
||||
marginTop: "-2",
|
||||
fontWeight: "400",
|
||||
marginBottom: "5px",
|
||||
}}
|
||||
>
|
||||
Configure your custom IdP like Okta or Jumpcloud
|
||||
</Paragraph>
|
||||
</Col>
|
||||
|
||||
<Col
|
||||
span={24}
|
||||
style={{ marginTop: "10px", marginBottom: "24px" }}
|
||||
>
|
||||
<Text type={"secondary"}>
|
||||
To enable these features, please contact us at
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
href="mailto:support@netbird.io"
|
||||
>
|
||||
{" "}
|
||||
support@netbird.io
|
||||
</a>
|
||||
</Text>
|
||||
</Col>
|
||||
</div>
|
||||
|
||||
</>
|
||||
)
|
||||
}
|
||||
@@ -1121,6 +1258,9 @@ export const Settings = () => {
|
||||
if (dangerClicked) {
|
||||
loaded = renderDangerSettingsForm()
|
||||
}
|
||||
if (idpCLicked) {
|
||||
loaded = renderIdpSettingsForm()
|
||||
}
|
||||
|
||||
return (
|
||||
<Form
|
||||
@@ -1131,7 +1271,7 @@ export const Settings = () => {
|
||||
>
|
||||
<Card loading={loading} defaultValue={"Enabled"}>
|
||||
{loaded}
|
||||
{!dangerClicked && (<Form.Item style={{ marginBottom: "0" }}>
|
||||
{!(dangerClicked || idpCLicked) && (<Form.Item style={{ marginBottom: "0" }}>
|
||||
<Button type="primary" htmlType="submit">
|
||||
Save
|
||||
</Button>
|
||||
@@ -1562,6 +1702,11 @@ export const Settings = () => {
|
||||
<Col span={24}>{renderSettingForm()}</Col>
|
||||
</Row>
|
||||
)}
|
||||
{idpCLicked && (
|
||||
<Row style={{ marginTop: "0", width: "100%" }}>
|
||||
<Col span={24}>{renderSettingForm()}</Col>
|
||||
</Row>
|
||||
)}
|
||||
</Col>
|
||||
</Row>
|
||||
</Container>
|
||||
|
||||
Reference in new issue
Block a user