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
4 changes: 4 additions & 0 deletions app/protos/grpc.proto
Original file line number Diff line number Diff line change
Expand Up @@ -6679,6 +6679,9 @@ message MITMFilterData {

repeated FilterDataItem ExcludeMethods = 7;
repeated FilterDataItem ExcludeMIME = 8;

// 是否过滤打包/构建产物的静态 JS(默认 true:过滤)
bool FilterBundledStaticJS = 9;
}

message Certificate {
Expand Down Expand Up @@ -8318,6 +8321,7 @@ message MITMV2Request{
bool DisableSystemProxy = 49;
// runtime change system proxy enable/disable
bool SetDisableSystemProxy = 50;

}

message MITMV2Response {
Expand Down
4 changes: 3 additions & 1 deletion app/renderer/src/main/src/defaultConstants/mitm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,7 @@ export const defaultMITMBaseFilter: MITMFilterSchema = {
excludeHostname: [],
includeSuffix: [],
excludeSuffix: [],
filterBundledStaticJS: true,
excludeMethod: [],
excludeContentTypes: [],
excludeUri: [],
Expand All @@ -430,7 +431,8 @@ export const defaultMITMFilterData: MITMFilterData = {
IncludeUri: [],
ExcludeUri: [],
ExcludeMethods: [],
ExcludeMIME: []
ExcludeMIME: [],
FilterBundledStaticJS: true
}

export const MITMHotPatchTempDefault = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,14 @@ import {defaultMITMBaseFilter, defaultMITMAdvancedFilter} from "@/defaultConstan
import cloneDeep from "lodash/cloneDeep"
import {YakitButton} from "@/components/yakitUI/YakitButton/YakitButton"
import {YakitEmpty} from "@/components/yakitUI/YakitEmpty/YakitEmpty"
import {YakitSwitch} from "@/components/yakitUI/YakitSwitch/YakitSwitch"
import {FilterType} from "./MITMFiltersModal"

const {YakitPanel} = YakitCollapse
const {ipcRenderer} = window.require("electron")

export interface MITMFiltersProp {
filterType: FilterType
filter?: MITMFilterSchema
onFinished?: (filter: MITMFilterSchema) => any
onClosed?: () => any
Expand All @@ -35,6 +38,7 @@ export interface MITMFilterSchema {
excludeHostname?: string[]
includeSuffix?: string[]
excludeSuffix?: string[]
filterBundledStaticJS?: boolean
excludeMethod?: string[]
excludeContentTypes?: string[]
excludeUri?: string[]
Expand Down Expand Up @@ -85,10 +89,7 @@ export const MITMFilters: React.FC<MITMFiltersProp> = React.forwardRef((props, r
}}
></YakitSelect>
</Form.Item>
<Form.Item
label='包含 URL 路径'
help={"可理解为 URI 匹配,例如 /main/index.php?a=123"}
>
<Form.Item label='包含 URL 路径' help={"可理解为 URI 匹配,例如 /main/index.php?a=123"}>
<YakitSelect
mode='tags'
value={params?.includeUri || undefined}
Expand Down Expand Up @@ -133,6 +134,16 @@ export const MITMFilters: React.FC<MITMFiltersProp> = React.forwardRef((props, r
}}
></YakitSelect>
</Form.Item>
{props.filterType === "filter" && (
<Form.Item label={"过滤 JS"} help={"开启后过滤打包/构建产物的静态 JS"}>
<YakitSwitch
checked={!!params?.filterBundledStaticJS}
onChange={(checked) => {
setParams({...params, filterBundledStaticJS: checked})
}}
></YakitSwitch>
</Form.Item>
)}
<Form.Item label={"排除 HTTP 方法"}>
<YakitSelect
mode='tags'
Expand Down Expand Up @@ -173,12 +184,18 @@ export interface MITMFilterData {
ExcludeMethods: FilterDataItem[]

ExcludeMIME: FilterDataItem[]

FilterBundledStaticJS?: boolean
}

export interface MITMAdvancedFilter extends FilterDataItem {
Field?: keyof MITMFilterData
Field?: MITMFilterArrayKey
}

export type MITMFilterArrayKey = {
[K in keyof MITMFilterData]-?: MITMFilterData[K] extends FilterDataItem[] ? K : never
}[keyof MITMFilterData]

export const onFilterEmptyMITMAdvancedFilters = (list: FilterDataItem[]) => {
return list.filter((i) => i.MatcherType && !isFilterItemEmpty(i))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ import MITMContext from "../Context/MITMContext"
const MITMAdvancedFilters = React.lazy(() => import("./MITMFilters"))
const {ipcRenderer} = window.require("electron")

export type FilterType = "filter" | "hijackFilter"
interface MITMFiltersModalProps {
filterType: "filter" | "hijackFilter"
filterType: FilterType
isStartMITM: boolean
visible: boolean
setVisible: (b: boolean) => void
Expand All @@ -65,7 +66,13 @@ export const getAdvancedFlag = (advancedFilters: MITMAdvancedFilter[]): boolean
// 是否配置过条件劫持
export const getMitmHijackFilter = (baseFilter: MITMFilterSchema, advancedFilters: MITMAdvancedFilter[]): boolean => {
return (
!!Object.keys(baseFilter).filter((key) => baseFilter[key].length > 0).length ||
!!Object.keys(baseFilter).filter((key) => {
if (key === "filterBundledStaticJS") {
return false
} else {
return baseFilter[key].length > 0
}
}).length ||
!!advancedFilters.filter((ele) =>
["ExcludeHostnames", "IncludeHostnames", "ExcludeUri", "IncludeUri", "ExcludeMethods"].includes(
ele.Field || ""
Expand Down Expand Up @@ -106,15 +113,17 @@ const MITMFiltersModal: React.FC<MITMFiltersModalProps> = React.memo((props) =>
}
})
useEffect(() => {
grpcClientMITMfilter(mitmVersion).on((filter) => {
const value = convertMITMFilterUI(filter)
setMITMFilter({
...value.baseFilter
if (filterType === "filter") {
grpcClientMITMfilter(mitmVersion).on((filter) => {
const value = convertMITMFilterUI(filter)
setMITMFilter({
...value.baseFilter
})
setFilterData([...value.advancedFilters])
})
setFilterData([...value.advancedFilters])
})
return () => {
grpcClientMITMfilter(mitmVersion).remove()
return () => {
grpcClientMITMfilter(mitmVersion).remove()
}
}
}, [])
useEffect(() => {
Expand Down Expand Up @@ -469,6 +478,7 @@ const MITMFiltersModal: React.FC<MITMFiltersModalProps> = React.memo((props) =>
)}
</div>
<MITMFilters
filterType={filterType}
visible={type === "base-setting"}
filter={_mitmFilter}
onFinished={() => onSetFilter()}
Expand Down Expand Up @@ -678,7 +688,7 @@ const ImportFileModal: React.FC<ImportFileModalProps> = (props) => {
onOk={() => onOk(value)}
>
<div className={styles["import-editor"]} onDragOver={handleDragOver} onDrop={handleDrop}>
<YakitEditor value={value} setValue={setValue} type="json"></YakitEditor>
<YakitEditor value={value} setValue={setValue} type='json'></YakitEditor>
</div>
</YakitModal>
)
Expand Down
41 changes: 30 additions & 11 deletions app/renderer/src/main/src/pages/mitm/MITMServerStartForm/utils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import { cloneDeep } from "lodash"
import {FilterDataItem, FilterMatcherType, MITMAdvancedFilter, MITMFilterData, MITMFilterSchema} from "./MITMFilters"
import { defaultMITMFilterData } from "@/defaultConstants/mitm"
import {cloneDeep} from "lodash"
import {
FilterDataItem,
FilterMatcherType,
MITMAdvancedFilter,
MITMFilterArrayKey,
MITMFilterData,
MITMFilterSchema
} from "./MITMFilters"
import {defaultMITMFilterData} from "@/defaultConstants/mitm"

/**首字母是小写转大写,首字母是大写转小写 */
const toggleCase = (str) => {
Expand Down Expand Up @@ -29,10 +36,19 @@ const specialFiledList = ["IncludeSuffix", "ExcludeSuffix", "ExcludeMIME"]

export const convertLocalMITMFilterRequest = (query: MITMFilterUIProps): MITMFilterData => {
const {baseFilter, advancedFilters} = query
let data: MITMFilterData =cloneDeep(defaultMITMFilterData)
let data: MITMFilterData = cloneDeep(defaultMITMFilterData)
/**baseFilter */
Object.entries(baseFilter).forEach(([key, value]) => {
const field: keyof MITMFilterData = getMITMField(key)
if (typeof value === "boolean") {
if (field === "FilterBundledStaticJS") {
data.FilterBundledStaticJS = value
}
return
}
// 非 boolean,只能是数组字段
const arrayField = field as MITMFilterArrayKey
if (!value.length) return
let matcherType: FilterMatcherType = "word"
switch (field) {
case "IncludeSuffix":
Expand All @@ -46,14 +62,11 @@ export const convertLocalMITMFilterRequest = (query: MITMFilterUIProps): MITMFil
matcherType = "word"
break
}

if (!!value.length) {
const item: FilterDataItem = {
MatcherType: matcherType,
Group: value
}
data[field] = [item]
const item: FilterDataItem = {
MatcherType: matcherType,
Group: value
}
data[arrayField] = [item]
})

/**advancedFilters */
Expand Down Expand Up @@ -104,6 +117,7 @@ export const convertMITMFilterUI = (FilterData: MITMFilterData): MITMFilterUIPro
excludeSuffix: [],
includeUri: [],
excludeUri: [],
filterBundledStaticJS: true,
excludeMethod: [],
excludeContentTypes: []
},
Expand All @@ -112,6 +126,11 @@ export const convertMITMFilterUI = (FilterData: MITMFilterData): MITMFilterUIPro
if (!FilterData) return data
let advancedFilters: MITMAdvancedFilter[] = []
Object.entries(FilterData || {}).forEach(([key, value]) => {
if (key === "FilterBundledStaticJS" && typeof value === "boolean") {
data.baseFilter.filterBundledStaticJS = value
return
}
if (key === "_AllowChunkStaticJS") return
const field: keyof Omit<MITMFilterSchema, "FilterData"> = getMITMField(key)
if (specialFiledList.includes(key)) {
data.baseFilter[field] = (value[0] && value[0].Group) || []
Expand Down