Add new attribute to 'all' rules
This commit is contained in:
		@@ -6,18 +6,6 @@ export interface NWFilterChain {
 | 
			
		||||
  suffix?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface NWFSAllBase {
 | 
			
		||||
  comment?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type NWFSAll = NWFSAllBase & {
 | 
			
		||||
  type: "all";
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export type NWFSAllIPv6 = NWFSAllBase & {
 | 
			
		||||
  type: "allipv6";
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export interface NWFSMac {
 | 
			
		||||
  type: "mac";
 | 
			
		||||
  src_mac_addr?: string;
 | 
			
		||||
@@ -97,9 +85,29 @@ export type NFWSUDPv6 = NWFSLayer4Base & { type: "udpipv6" };
 | 
			
		||||
export type NFWSSCTPv6 = NWFSLayer4Base & { type: "sctpipv6" };
 | 
			
		||||
export type NFWSICMPv6 = NWFSLayer4Base & { type: "icmpipv6" };
 | 
			
		||||
 | 
			
		||||
export interface NWFSAllBase {
 | 
			
		||||
  srcmacaddr?: string;
 | 
			
		||||
  srcipaddr?: string;
 | 
			
		||||
  srcipmask?: number;
 | 
			
		||||
  dstipaddr?: string;
 | 
			
		||||
  dstipmask?: number;
 | 
			
		||||
  srcipfrom?: string;
 | 
			
		||||
  srcipto?: string;
 | 
			
		||||
  dstipfrom?: string;
 | 
			
		||||
  dstipto?: string;
 | 
			
		||||
  state?: Layer4State;
 | 
			
		||||
  comment?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type NWFSAll = NWFSAllBase & {
 | 
			
		||||
  type: "all";
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export type NWFSAllIPv6 = NWFSAllBase & {
 | 
			
		||||
  type: "allipv6";
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export type NWFSelector =
 | 
			
		||||
  | NWFSAll
 | 
			
		||||
  | NWFSAllIPv6
 | 
			
		||||
  | NWFSMac
 | 
			
		||||
  | NWFSArp
 | 
			
		||||
  | NWFSRArp
 | 
			
		||||
@@ -109,10 +117,12 @@ export type NWFSelector =
 | 
			
		||||
  | NFWSUDPv4
 | 
			
		||||
  | NFWSSCTPv4
 | 
			
		||||
  | NFWSICMPv4
 | 
			
		||||
  | NWFSAll
 | 
			
		||||
  | NFWSTCPv6
 | 
			
		||||
  | NFWSUDPv6
 | 
			
		||||
  | NFWSSCTPv6
 | 
			
		||||
  | NFWSICMPv6;
 | 
			
		||||
  | NFWSICMPv6
 | 
			
		||||
  | NWFSAllIPv6;
 | 
			
		||||
 | 
			
		||||
export interface NWFilterRule {
 | 
			
		||||
  action: "drop" | "reject" | "accept" | "return" | "continue";
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								virtweb_frontend/src/widgets/forms/NWFConnStateInput.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								virtweb_frontend/src/widgets/forms/NWFConnStateInput.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
import { Layer4State } from "../../api/NWFilterApi";
 | 
			
		||||
import { SelectInput } from "./SelectInput";
 | 
			
		||||
 | 
			
		||||
export function NWFConnStateInput(p: {
 | 
			
		||||
  editable: boolean;
 | 
			
		||||
  value?: Layer4State;
 | 
			
		||||
  onChange: (s?: Layer4State) => void;
 | 
			
		||||
}): React.ReactElement {
 | 
			
		||||
  return (
 | 
			
		||||
    <SelectInput
 | 
			
		||||
      {...p}
 | 
			
		||||
      label="Connection state"
 | 
			
		||||
      value={p.value}
 | 
			
		||||
      onValueChange={(s) => {
 | 
			
		||||
        p.onChange?.(s as any);
 | 
			
		||||
      }}
 | 
			
		||||
      options={[
 | 
			
		||||
        { label: "None", value: undefined },
 | 
			
		||||
        { label: "NEW", value: "NEW" },
 | 
			
		||||
        { label: "ESTABLISHED", value: "ESTABLISHED" },
 | 
			
		||||
        { label: "RELATED", value: "RELATED" },
 | 
			
		||||
        { label: "INVALID", value: "INVALID" },
 | 
			
		||||
        { label: "NONE", value: "NONE" },
 | 
			
		||||
      ]}
 | 
			
		||||
    />
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
@@ -12,6 +12,7 @@ import {
 | 
			
		||||
  Tooltip,
 | 
			
		||||
} from "@mui/material";
 | 
			
		||||
import {
 | 
			
		||||
  NWFSAllBase,
 | 
			
		||||
  NWFSArpOrRARP,
 | 
			
		||||
  NWFSIPBase,
 | 
			
		||||
  NWFSLayer4Base,
 | 
			
		||||
@@ -23,10 +24,11 @@ import { ServerApi } from "../../api/ServerApi";
 | 
			
		||||
import { EditSection } from "./EditSection";
 | 
			
		||||
import { IPInput, IPInputWithMask } from "./IPInput";
 | 
			
		||||
import { MACInput } from "./MACInput";
 | 
			
		||||
import { NWFConnStateInput } from "./NWFConnStateInput";
 | 
			
		||||
import { NWFilterPriorityInput } from "./NWFilterPriorityInput";
 | 
			
		||||
import { PortInput } from "./PortInput";
 | 
			
		||||
import { SelectInput } from "./SelectInput";
 | 
			
		||||
import { TextInput } from "./TextInput";
 | 
			
		||||
import { NWFilterPriorityInput } from "./NWFilterPriorityInput";
 | 
			
		||||
 | 
			
		||||
export function NWFilterRules(p: {
 | 
			
		||||
  editable: boolean;
 | 
			
		||||
@@ -216,9 +218,6 @@ function NWFSelectorEdit(p: {
 | 
			
		||||
            }}
 | 
			
		||||
            value={p.selector.type}
 | 
			
		||||
            options={[
 | 
			
		||||
              { label: "All over IPv4", value: "all" },
 | 
			
		||||
              { label: "All over IPv6", value: "allipv6" },
 | 
			
		||||
 | 
			
		||||
              { label: "MAC (Ethernet)", value: "mac" },
 | 
			
		||||
 | 
			
		||||
              { label: "ARP", value: "arp" },
 | 
			
		||||
@@ -232,10 +231,14 @@ function NWFSelectorEdit(p: {
 | 
			
		||||
              { label: "SCTP over IPv4", value: "sctp" },
 | 
			
		||||
              { label: "ICMPv4", value: "icmp" },
 | 
			
		||||
 | 
			
		||||
              { label: "All over IPv4", value: "all" },
 | 
			
		||||
 | 
			
		||||
              { label: "TCP over IPv6", value: "tcpipv6" },
 | 
			
		||||
              { label: "UDP over IPv6", value: "udpipv6" },
 | 
			
		||||
              { label: "SCTP over IPv6", value: "sctpipv6" },
 | 
			
		||||
              { label: "ICMPv6", value: "icmpipv6" },
 | 
			
		||||
 | 
			
		||||
              { label: "All over IPv6", value: "allipv6" },
 | 
			
		||||
            ]}
 | 
			
		||||
          />
 | 
			
		||||
 | 
			
		||||
@@ -262,6 +265,10 @@ function NWFSelectorEdit(p: {
 | 
			
		||||
            <NWFSelectorLayer4 {...p} selector={p.selector} version={4} />
 | 
			
		||||
          )}
 | 
			
		||||
 | 
			
		||||
          {p.selector.type === "all" && (
 | 
			
		||||
            <NWFSelectorAll {...p} selector={p.selector} version={4} />
 | 
			
		||||
          )}
 | 
			
		||||
 | 
			
		||||
          {(p.selector.type === "tcpipv6" ||
 | 
			
		||||
            p.selector.type === "udpipv6" ||
 | 
			
		||||
            p.selector.type === "sctpipv6" ||
 | 
			
		||||
@@ -269,6 +276,10 @@ function NWFSelectorEdit(p: {
 | 
			
		||||
            <NWFSelectorLayer4 {...p} selector={p.selector} version={6} />
 | 
			
		||||
          )}
 | 
			
		||||
 | 
			
		||||
          {p.selector.type === "allipv6" && (
 | 
			
		||||
            <NWFSelectorAll {...p} selector={p.selector} version={6} />
 | 
			
		||||
          )}
 | 
			
		||||
 | 
			
		||||
          <TextInput
 | 
			
		||||
            editable={p.editable}
 | 
			
		||||
            label="Comment"
 | 
			
		||||
@@ -599,22 +610,99 @@ function NWFSelectorLayer4(
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
      <SelectInput
 | 
			
		||||
      <NWFConnStateInput
 | 
			
		||||
        {...p}
 | 
			
		||||
        label="Connection state"
 | 
			
		||||
        value={p.selector.state}
 | 
			
		||||
        onValueChange={(s) => {
 | 
			
		||||
          p.selector.state = s as any;
 | 
			
		||||
        onChange={(v) => {
 | 
			
		||||
          p.selector.state = v;
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
    </>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function NWFSelectorAll(
 | 
			
		||||
  p: SpecificSelectorEditorWithIPVersion<NWFSAllBase>
 | 
			
		||||
): React.ReactElement {
 | 
			
		||||
  return (
 | 
			
		||||
    <>
 | 
			
		||||
      <MACInput
 | 
			
		||||
        {...p}
 | 
			
		||||
        label="Src mac address"
 | 
			
		||||
        value={p.selector.srcmacaddr}
 | 
			
		||||
        onValueChange={(v) => {
 | 
			
		||||
          p.selector.srcmacaddr = v;
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
      <IPInputWithMask
 | 
			
		||||
        {...p}
 | 
			
		||||
        label="Source IP address / mask"
 | 
			
		||||
        ip={p.selector.srcipaddr}
 | 
			
		||||
        mask={p.selector.srcipmask}
 | 
			
		||||
        version={p.version}
 | 
			
		||||
        onValueChange={(ip, mask) => {
 | 
			
		||||
          p.selector.srcipaddr = ip;
 | 
			
		||||
          p.selector.srcipmask = mask;
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
      <IPInputWithMask
 | 
			
		||||
        {...p}
 | 
			
		||||
        label="Destination IP address / mask"
 | 
			
		||||
        ip={p.selector.dstipaddr}
 | 
			
		||||
        mask={p.selector.dstipmask}
 | 
			
		||||
        version={p.version}
 | 
			
		||||
        onValueChange={(ip, mask) => {
 | 
			
		||||
          p.selector.dstipaddr = ip;
 | 
			
		||||
          p.selector.dstipmask = mask;
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
      <IPInput
 | 
			
		||||
        {...p}
 | 
			
		||||
        label="Source IP from"
 | 
			
		||||
        value={p.selector.srcipfrom}
 | 
			
		||||
        onValueChange={(ip) => {
 | 
			
		||||
          p.selector.srcipfrom = ip;
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
      <IPInput
 | 
			
		||||
        {...p}
 | 
			
		||||
        label="Source IP to"
 | 
			
		||||
        value={p.selector.srcipto}
 | 
			
		||||
        onValueChange={(ip) => {
 | 
			
		||||
          p.selector.srcipto = ip;
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
      <IPInput
 | 
			
		||||
        {...p}
 | 
			
		||||
        label="Destination IP from"
 | 
			
		||||
        value={p.selector.dstipfrom}
 | 
			
		||||
        onValueChange={(ip) => {
 | 
			
		||||
          p.selector.dstipfrom = ip;
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
      <IPInput
 | 
			
		||||
        {...p}
 | 
			
		||||
        label="Destination IP to"
 | 
			
		||||
        value={p.selector.dstipto}
 | 
			
		||||
        onValueChange={(ip) => {
 | 
			
		||||
          p.selector.dstipto = ip;
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
      />
 | 
			
		||||
      <NWFConnStateInput
 | 
			
		||||
        {...p}
 | 
			
		||||
        value={p.selector.state}
 | 
			
		||||
        onChange={(v) => {
 | 
			
		||||
          p.selector.state = v;
 | 
			
		||||
          p.onChange?.();
 | 
			
		||||
        }}
 | 
			
		||||
        options={[
 | 
			
		||||
          { label: "None", value: undefined },
 | 
			
		||||
          { label: "NEW", value: "NEW" },
 | 
			
		||||
          { label: "ESTABLISHED", value: "ESTABLISHED" },
 | 
			
		||||
          { label: "RELATED", value: "RELATED" },
 | 
			
		||||
          { label: "INVALID", value: "INVALID" },
 | 
			
		||||
          { label: "NONE", value: "NONE" },
 | 
			
		||||
        ]}
 | 
			
		||||
      />
 | 
			
		||||
    </>
 | 
			
		||||
  );
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user