Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@ import './style.scss';
import clsx from 'clsx';
import { useMemo } from 'react';
import { useAppData } from '../../../../providers/AppDataContext';
import { type LocationInfo, LocationMfaMode } from '../../../../rust-api/types';
import {
ClientTrafficPolicy,
type InstanceInfo,
type LocationInfo,
LocationMfaMode,
} from '../../../../rust-api/types';
import { isPresent } from '../../../../utils/isPresent';
import { mfaToText } from '../../../../utils/mfa';
import { BoxIcon } from '../../../BoxIcon/BoxIcon';
Expand All @@ -11,11 +16,16 @@ import { Icon, IconKind } from '../../../Icon';
interface Props {
variant: 'compact' | 'full';
location: LocationInfo;
instance?: InstanceInfo;
}

export const LocationCardConnectionTiles = ({ location, variant }: Props) => {
export const LocationCardConnectionTiles = ({ location, instance, variant }: Props) => {
const { connectionMfaMethod } = useAppData();

const routeAllTraffic =
location.route_all_traffic ||
instance?.client_traffic_policy === ClientTrafficPolicy.ForceAllTraffic;

const mfaMethod = useMemo(() => {
const key = `${location.connection_type.toLowerCase()}-${location.id}`;
const method = connectionMfaMethod[key];
Expand All @@ -30,7 +40,7 @@ export const LocationCardConnectionTiles = ({ location, variant }: Props) => {
</BoxIcon>
<p className="label">Allowed traffic</p>
<p className="label-value">
{location.route_all_traffic ? 'All traffic' : 'Predefined traffic'}
{routeAllTraffic ? 'All traffic' : 'Predefined traffic'}
</p>
</div>
{location.location_mfa_mode !== LocationMfaMode.Disabled &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,16 @@ import { LocationCardConnectionTiles } from '../../components/LocationCardConnec
import { useLocationCardContext } from '../../context/context';

export const ConnectedView = () => {
const { location } = useLocationCardContext();
const { location, instance } = useLocationCardContext();

return (
<div className="location-view-connected">
<SizedBox height={ThemeSpacing.Md} />
<LocationCardConnectionTiles location={location} variant="compact" />
<LocationCardConnectionTiles
location={location}
instance={instance}
variant="compact"
/>
<Divider spacing={ThemeSpacing.Xl} />
<LocationCardConnectionInfo location={location} />
<SizedBox height={ThemeSpacing.Xl2} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,11 @@ export const OverviewLocationCard = ({ location, instance }: Props) => {
<Divider spacing={ThemeSpacing.Lg} />
<div className="controls">
{location.active && (
<LocationCardConnectionTiles location={location} variant="full" />
<LocationCardConnectionTiles
location={location}
instance={instance}
variant="full"
/>
)}
{!location.active && (
<Fragment>
Expand Down
48 changes: 35 additions & 13 deletions src-tauri/client-cli/src/commands/list.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
use std::collections::HashMap;

use defguard_core::database::models::{instance::Instance, location::Location, tunnel::Tunnel, Id};
use defguard_core::database::models::{
instance::{ClientTrafficPolicy, Instance},
location::Location,
tunnel::Tunnel,
Id,
};
use serde_json::{json, Value};

use crate::{
Expand Down Expand Up @@ -44,10 +49,10 @@ impl CommandOutput for ListResult {
}

fn json(&self) -> Value {
let instance_names = self
let instances_by_id = self
.instances
.iter()
.map(|i| (i.id, i.name.clone()))
.map(|i| (i.id, i))
.collect::<HashMap<_, _>>();

let instances = self
Expand All @@ -63,15 +68,25 @@ impl CommandOutput for ListResult {
let locations = self
.locations
.iter()
.map(|l| LocationEntry {
id: l.id,
name: l.name.clone(),
instance: instance_names.get(&l.instance_id).cloned(),
address: l.address.clone(),
endpoint: l.endpoint.clone(),
mfa_enabled: Some(l.mfa_enabled()),
mfa_method: Some(mfa_label(l.mfa_method).to_string()),
route_all_traffic: Some(l.route_all_traffic),
.map(|l| {
let instance = instances_by_id.get(&l.instance_id);
let route_all_traffic = match instance
.map_or(&ClientTrafficPolicy::None, |i| &i.client_traffic_policy)
{
ClientTrafficPolicy::None => l.route_all_traffic,
ClientTrafficPolicy::DisableAllTraffic => false,
ClientTrafficPolicy::ForceAllTraffic => true,
};
LocationEntry {
id: l.id,
name: l.name.clone(),
instance: instance.map(|i| i.name.clone()),
address: l.address.clone(),
endpoint: l.endpoint.clone(),
mfa_enabled: Some(l.mfa_enabled()),
mfa_method: Some(mfa_label(l.mfa_method).to_string()),
route_all_traffic: Some(route_all_traffic),
}
})
.collect::<Vec<_>>();

Expand Down Expand Up @@ -131,11 +146,18 @@ fn format_list_table(
));
for location in locations {
let mfa = if location.mfa_enabled() { "yes" } else { "no" };
let route_label = if location.route_all_traffic {
let route_all_traffic = match instance.client_traffic_policy {
ClientTrafficPolicy::None => location.route_all_traffic,
ClientTrafficPolicy::DisableAllTraffic => false,
ClientTrafficPolicy::ForceAllTraffic => true,
};

let route_label = if route_all_traffic {
"All-traffic"
} else {
"Predefined"
};

lines.push(format!(
" {:>4} {:<location_name_col_width$} {:<15} {:<endpoint_col_width$} {mfa:>3} {route_label:<11}",
location.id, location.name, location.address, location.endpoint
Expand Down
Loading
Loading