reset button for auth password

This commit is contained in:
MHSanaei 2026-04-20 17:25:18 +02:00
parent 04b4fb4384
commit 6d0e7ec495
No known key found for this signature in database
GPG key ID: 7E4060F2FBE5AB7A
12 changed files with 1215 additions and 710 deletions

View file

@ -1,5 +1,11 @@
{{define "form/client"}} {{define "form/client"}}
<a-form layout="horizontal" v-if="client" :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
layout="horizontal"
v-if="client"
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-form-item label='{{ i18n "pages.inbounds.enable" }}'> <a-form-item label='{{ i18n "pages.inbounds.enable" }}'>
<a-switch v-model="client.enable"></a-switch> <a-switch v-model="client.enable"></a-switch>
</a-form-item> </a-form-item>
@ -10,23 +16,34 @@
<span>{{ i18n "pages.inbounds.emailDesc" }}</span> <span>{{ i18n "pages.inbounds.emailDesc" }}</span>
</template> </template>
{{ i18n "pages.inbounds.email" }} {{ i18n "pages.inbounds.email" }}
<a-icon type="sync" @click="client.email = RandomUtil.randomLowerAndNum(9)"></a-icon> <a-icon
type="sync"
@click="client.email = RandomUtil.randomLowerAndNum(9)"
></a-icon>
</a-tooltip> </a-tooltip>
</template> </template>
<a-input v-model.trim="client.email"></a-input> <a-input v-model.trim="client.email"></a-input>
</a-form-item> </a-form-item>
<a-form-item v-if="inbound.protocol === Protocols.TROJAN || inbound.protocol === Protocols.SHADOWSOCKS"> <a-form-item
v-if="inbound.protocol === Protocols.TROJAN || inbound.protocol === Protocols.SHADOWSOCKS"
>
<template slot="label"> <template slot="label">
<a-tooltip> <a-tooltip>
<template slot="title"> <template slot="title">
<span>{{ i18n "reset" }}</span> <span>{{ i18n "reset" }}</span>
</template> </template>
{{ i18n "password" }} {{ i18n "password" }}
<a-icon v-if="inbound.protocol === Protocols.SHADOWSOCKS" <a-icon
v-if="inbound.protocol === Protocols.SHADOWSOCKS"
@click="client.password = RandomUtil.randomShadowsocksPassword(inbound.settings.method)" @click="client.password = RandomUtil.randomShadowsocksPassword(inbound.settings.method)"
type="sync"></a-icon> type="sync"
<a-icon v-if="inbound.protocol === Protocols.TROJAN" @click="client.password = RandomUtil.randomSeq(10)" ></a-icon>
type="sync"> </a-icon> <a-icon
v-if="inbound.protocol === Protocols.TROJAN"
@click="client.password = RandomUtil.randomSeq(10)"
type="sync"
>
</a-icon>
</a-tooltip> </a-tooltip>
</template> </template>
<a-input v-model.trim="client.password"></a-input> <a-input v-model.trim="client.password"></a-input>
@ -38,26 +55,42 @@
<span>{{ i18n "reset" }}</span> <span>{{ i18n "reset" }}</span>
</template> </template>
Auth Password Auth Password
<a-icon @click="client.auth = RandomUtil.randomSeq(10)" type="sync"></a-icon> <a-icon
@click="client.auth = RandomUtil.randomSeq(10)"
type="sync"
></a-icon>
</a-tooltip> </a-tooltip>
</template> </template>
<a-input v-model.trim="client.auth"></a-input> <a-input v-model.trim="client.auth"></a-input>
</a-form-item> </a-form-item>
<a-form-item v-if="inbound.protocol === Protocols.VMESS || inbound.protocol === Protocols.VLESS"> <a-form-item
v-if="inbound.protocol === Protocols.VMESS || inbound.protocol === Protocols.VLESS"
>
<template slot="label"> <template slot="label">
<a-tooltip> <a-tooltip>
<template slot="title"> <template slot="title">
<span>{{ i18n "reset" }}</span> <span>{{ i18n "reset" }}</span>
</template> </template>
ID <a-icon @click="client.id = RandomUtil.randomUUID()" type="sync"></a-icon> ID
<a-icon
@click="client.id = RandomUtil.randomUUID()"
type="sync"
></a-icon>
</a-tooltip> </a-tooltip>
</template> </template>
<a-input v-model.trim="client.id"></a-input> <a-input v-model.trim="client.id"></a-input>
</a-form-item> </a-form-item>
<a-form-item v-if="inbound.protocol === Protocols.VMESS" label='{{ i18n "security" }}'> <a-form-item
<a-select v-model="client.security" :dropdown-class-name="themeSwitcher.currentTheme"> v-if="inbound.protocol === Protocols.VMESS"
<a-select-option v-for="key in USERS_SECURITY" :value="key">[[ key label='{{ i18n "security" }}'
]]</a-select-option> >
<a-select
v-model="client.security"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option v-for="key in USERS_SECURITY" :value="key"
>[[ key ]]</a-select-option
>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item v-if="client.email && app.subSettings?.enable"> <a-form-item v-if="client.email && app.subSettings?.enable">
@ -67,7 +100,10 @@
<span>{{ i18n "pages.inbounds.subscriptionDesc" }}</span> <span>{{ i18n "pages.inbounds.subscriptionDesc" }}</span>
</template> </template>
Subscription Subscription
<a-icon @click="client.subId = RandomUtil.randomLowerAndNum(16)" type="sync"></a-icon> <a-icon
@click="client.subId = RandomUtil.randomLowerAndNum(16)"
type="sync"
></a-icon>
</a-tooltip> </a-tooltip>
</template> </template>
<a-input v-model.trim="client.subId"></a-input> <a-input v-model.trim="client.subId"></a-input>
@ -82,7 +118,11 @@
<a-icon type="question-circle"></a-icon> <a-icon type="question-circle"></a-icon>
</a-tooltip> </a-tooltip>
</template> </template>
<a-input-number :style="{ width: '50%' }" v-model.number="client.tgId" min="0"></a-input-number> <a-input-number
:style="{ width: '50%' }"
v-model.number="client.tgId"
min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item v-if="client.email" label='{{ i18n "comment" }}'> <a-form-item v-if="client.email" label='{{ i18n "comment" }}'>
<a-input v-model.trim="client.comment"></a-input> <a-input v-model.trim="client.comment"></a-input>
@ -99,7 +139,9 @@
</template> </template>
<a-input-number v-model.number="client.limitIp" min="0"></a-input-number> <a-input-number v-model.number="client.limitIp" min="0"></a-input-number>
</a-form-item> </a-form-item>
<a-form-item v-if="app.ipLimitEnable && client.limitIp > 0 && client.email && isEdit"> <a-form-item
v-if="app.ipLimitEnable && client.limitIp > 0 && client.email && isEdit"
>
<template slot="label"> <template slot="label">
<a-tooltip> <a-tooltip>
<template slot="title"> <template slot="title">
@ -118,16 +160,25 @@
</span> </span>
</a-tooltip> </a-tooltip>
<a-form layout="block"> <a-form layout="block">
<a-textarea id="clientIPs" readonly @click="getDBClientIps(client.email)" placeholder="Click To Get IPs" <a-textarea
:auto-size="{ minRows: 5, maxRows: 10 }"> id="clientIPs"
readonly
@click="getDBClientIps(client.email)"
placeholder="Click To Get IPs"
:auto-size="{ minRows: 5, maxRows: 10 }"
>
</a-textarea> </a-textarea>
</a-form> </a-form>
</a-form-item> </a-form-item>
<a-form-item v-if="inbound.canEnableTlsFlow()" label='Flow'> <a-form-item v-if="inbound.canEnableTlsFlow()" label="Flow">
<a-select v-model="client.flow" :dropdown-class-name="themeSwitcher.currentTheme"> <a-select
v-model="client.flow"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value selected>{{ i18n "none" }}</a-select-option> <a-select-option value selected>{{ i18n "none" }}</a-select-option>
<a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key">[[ key <a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key"
]]</a-select-option> >[[ key ]]</a-select-option
>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item> <a-form-item>
@ -144,43 +195,57 @@
</a-form-item> </a-form-item>
<a-form-item v-if="isEdit && clientStats" label='{{ i18n "usage" }}'> <a-form-item v-if="isEdit && clientStats" label='{{ i18n "usage" }}'>
<a-tag :color="ColorUtils.clientUsageColor(clientStats, app.trafficDiff)"> <a-tag :color="ColorUtils.clientUsageColor(clientStats, app.trafficDiff)">
[[ SizeFormatter.sizeFormat(clientStats.up) ]] / [[ SizeFormatter.sizeFormat(clientStats.up) ]] / [[
[[ SizeFormatter.sizeFormat(clientStats.down) ]] SizeFormatter.sizeFormat(clientStats.down) ]] ([[
([[ SizeFormatter.sizeFormat(clientStats.up + clientStats.down) ]]) SizeFormatter.sizeFormat(clientStats.up + clientStats.down) ]])
</a-tag> </a-tag>
<a-tooltip> <a-tooltip>
<template slot="title">{{ i18n "pages.inbounds.resetTraffic" <template slot="title">{{ i18n "pages.inbounds.resetTraffic" }}</template>
}}</template> <a-icon
<a-icon type="retweet" @click="resetClientTraffic(client.email,clientStats.inboundId,$event.target)" type="retweet"
v-if="client.email.length > 0"></a-icon> @click="resetClientTraffic(client.email,clientStats.inboundId,$event.target)"
v-if="client.email.length > 0"
></a-icon>
</a-tooltip> </a-tooltip>
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "pages.client.delayedStart" }}'> <a-form-item label='{{ i18n "pages.client.delayedStart" }}'>
<a-switch v-model="delayedStart" @click="client._expiryTime=0"></a-switch> <a-switch v-model="delayedStart" @click="client._expiryTime=0"></a-switch>
</a-form-item> </a-form-item>
<a-form-item v-if="delayedStart" label='{{ i18n "pages.client.expireDays" }}'> <a-form-item v-if="delayedStart" label='{{ i18n "pages.client.expireDays" }}'>
<a-input-number v-model.number="delayedExpireDays" :min="0"></a-input-number> <a-input-number
v-model.number="delayedExpireDays"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item v-else> <a-form-item v-else>
<template slot="label"> <template slot="label">
<a-tooltip> <a-tooltip>
<template slot="title">{{ i18n <template slot="title"
"pages.inbounds.leaveBlankToNeverExpire" }}</template> >{{ i18n "pages.inbounds.leaveBlankToNeverExpire" }}</template
>
{{ i18n "pages.inbounds.expireDate" }} {{ i18n "pages.inbounds.expireDate" }}
<a-icon type="question-circle"></a-icon> <a-icon type="question-circle"></a-icon>
</a-tooltip> </a-tooltip>
</template> </template>
<a-date-picker v-if="datepicker == 'gregorian'" :show-time="{ format: 'HH:mm:ss' }" format="YYYY-MM-DD HH:mm:ss" <a-date-picker
:dropdown-class-name="themeSwitcher.currentTheme" v-model="client._expiryTime"></a-date-picker> v-if="datepicker == 'gregorian'"
<a-persian-datepicker v-else placeholder='{{ i18n "pages.settings.datepickerPlaceholder" }}' :show-time="{ format: 'HH:mm:ss' }"
value="client._expiryTime" v-model="client._expiryTime"></a-persian-datepicker> format="YYYY-MM-DD HH:mm:ss"
:dropdown-class-name="themeSwitcher.currentTheme"
v-model="client._expiryTime"
></a-date-picker>
<a-persian-datepicker
v-else
placeholder='{{ i18n "pages.settings.datepickerPlaceholder" }}'
value="client._expiryTime"
v-model="client._expiryTime"
></a-persian-datepicker>
<a-tag color="red" v-if="isEdit && isExpiry">Expired</a-tag> <a-tag color="red" v-if="isEdit && isExpiry">Expired</a-tag>
</a-form-item> </a-form-item>
<a-form-item v-if="client.expiryTime != 0"> <a-form-item v-if="client.expiryTime != 0">
<template slot="label"> <template slot="label">
<a-tooltip> <a-tooltip>
<template slot="title">{{ i18n "pages.client.renewDesc" <template slot="title">{{ i18n "pages.client.renewDesc" }}</template>
}}</template>
{{ i18n "pages.client.renew" }} {{ i18n "pages.client.renew" }}
<a-icon type="question-circle"></a-icon> <a-icon type="question-circle"></a-icon>
</a-tooltip> </a-tooltip>

View file

@ -1,29 +1,65 @@
{{define "form/externalProxy"}} {{define "form/externalProxy"}}
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-divider :style="{ margin: '5px 0 0' }"></a-divider> <a-divider :style="{ margin: '5px 0 0' }"></a-divider>
<a-form-item label="External Proxy"> <a-form-item label="External Proxy">
<a-switch v-model="externalProxy"></a-switch> <a-switch v-model="externalProxy"></a-switch>
<a-button icon="plus" v-if="externalProxy" type="primary" :style="{ marginLeft: '10px' }" size="small" <a-button
@click="inbound.stream.externalProxy.push({forceTls: 'same', dest: '', port: 443, remark: ''})"></a-button> icon="plus"
v-if="externalProxy"
type="primary"
:style="{ marginLeft: '10px' }"
size="small"
@click="inbound.stream.externalProxy.push({forceTls: 'same', dest: '', port: 443, remark: ''})"
></a-button>
</a-form-item> </a-form-item>
<a-input-group :style="{ margin: '8px 0' }" compact v-for="(row, index) in inbound.stream.externalProxy"> <a-input-group
:style="{ margin: '8px 0' }"
compact
v-for="(row, index) in inbound.stream.externalProxy"
>
<template> <template>
<a-tooltip title="Force TLS"> <a-tooltip title="Force TLS">
<a-select v-model="row.forceTls" :style="{ width: '20%', margin: '0px' }" <a-select
:dropdown-class-name="themeSwitcher.currentTheme"> v-model="row.forceTls"
<a-select-option value="same">{{ i18n "pages.inbounds.same" }}</a-select-option> :style="{ width: '20%', margin: '0px' }"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value="same"
>{{ i18n "pages.inbounds.same" }}</a-select-option
>
<a-select-option value="none">{{ i18n "none" }}</a-select-option> <a-select-option value="none">{{ i18n "none" }}</a-select-option>
<a-select-option value="tls">TLS</a-select-option> <a-select-option value="tls">TLS</a-select-option>
</a-select> </a-select>
</a-tooltip> </a-tooltip>
</template> </template>
<a-input :style="{ width: '30%' }" v-model.trim="row.dest" placeholder='{{ i18n "host" }}'></a-input> <a-input
:style="{ width: '30%' }"
v-model.trim="row.dest"
placeholder='{{ i18n "host" }}'
></a-input>
<a-tooltip title='{{ i18n "pages.inbounds.port" }}'> <a-tooltip title='{{ i18n "pages.inbounds.port" }}'>
<a-input-number :style="{ width: '15%' }" v-model.number="row.port" min="1" max="65535"></a-input-number> <a-input-number
:style="{ width: '15%' }"
v-model.number="row.port"
min="1"
max="65535"
></a-input-number>
</a-tooltip> </a-tooltip>
<a-input :style="{ width: '30%', top: '0' }" v-model.trim="row.remark" placeholder='{{ i18n "remark" }}'> <a-input
:style="{ width: '30%', top: '0' }"
v-model.trim="row.remark"
placeholder='{{ i18n "remark" }}'
>
<template slot="addonAfter"> <template slot="addonAfter">
<a-button icon="minus" size="small" @click="inbound.stream.externalProxy.splice(index, 1)"></a-button> <a-button
icon="minus"
size="small"
@click="inbound.stream.externalProxy.splice(index, 1)"
></a-button>
</template> </template>
</a-input> </a-input>
</a-input-group> </a-input-group>

View file

@ -1,163 +1,248 @@
{{define "form/streamFinalMask"}} {{define "form/streamFinalMask"}}
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }" <a-form
v-if="inbound.protocol == Protocols.HYSTERIA || inbound.stream.network == 'kcp'"> :colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
v-if="inbound.protocol == Protocols.HYSTERIA || inbound.stream.network == 'kcp'"
>
<a-divider :style="{ margin: '5px 0 0' }"></a-divider> <a-divider :style="{ margin: '5px 0 0' }"></a-divider>
<a-form-item label="UDP Masks"> <a-form-item label="UDP Masks">
<a-button icon="plus" type="primary" size="small" <a-button
@click="inbound.stream.addUdpMask(inbound.protocol === Protocols.HYSTERIA ? 'salamander' : 'mkcp-aes128gcm')"></a-button> icon="plus"
type="primary"
size="small"
@click="inbound.stream.addUdpMask(inbound.protocol === Protocols.HYSTERIA ? 'salamander' : 'mkcp-aes128gcm')"
></a-button>
</a-form-item> </a-form-item>
<template v-if="inbound.stream.finalmask.udp && inbound.stream.finalmask.udp.length > 0"> <template
<a-form v-for="(mask, index) in inbound.stream.finalmask.udp" :key="index" :colon="false" v-if="inbound.stream.finalmask.udp && inbound.stream.finalmask.udp.length > 0"
:label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> >
<a-form
v-for="(mask, index) in inbound.stream.finalmask.udp"
:key="index"
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-divider :style="{ margin: '0' }"> <a-divider :style="{ margin: '0' }">
UDP Mask [[ index + 1 ]] UDP Mask [[ index + 1 ]]
<a-icon type="delete" @click="() => inbound.stream.delUdpMask(index)" <a-icon
:style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"></a-icon> type="delete"
@click="() => inbound.stream.delUdpMask(index)"
:style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
></a-icon>
</a-divider> </a-divider>
<a-form-item label='{{ i18n "pages.xray.outbound.type" }}'> <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
<a-select v-model="mask.type" <a-select
v-model="mask.type"
@change="(type) => { mask.settings = mask._getDefaultSettings(type, {}); if(inbound.stream.network === 'kcp') { inbound.stream.kcp.mtu = type === 'xdns' ? 900 : 1350; } }" @change="(type) => { mask.settings = mask._getDefaultSettings(type, {}); if(inbound.stream.network === 'kcp') { inbound.stream.kcp.mtu = type === 'xdns' ? 900 : 1350; } }"
:dropdown-class-name="themeSwitcher.currentTheme"> :dropdown-class-name="themeSwitcher.currentTheme"
>
<template v-if="inbound.protocol === Protocols.HYSTERIA"> <template v-if="inbound.protocol === Protocols.HYSTERIA">
<a-select-option value="salamander">Salamander (Hysteria2)</a-select-option> <a-select-option value="salamander"
>Salamander (Hysteria2)</a-select-option
>
</template> </template>
<template v-else> <template v-else>
<a-select-option value="mkcp-aes128gcm">mKCP AES-128-GCM</a-select-option> <a-select-option value="mkcp-aes128gcm"
>mKCP AES-128-GCM</a-select-option
>
<a-select-option value="header-dns">Header DNS</a-select-option> <a-select-option value="header-dns">Header DNS</a-select-option>
<a-select-option value="header-dtls">Header DTLS 1.2</a-select-option> <a-select-option value="header-dtls"
>Header DTLS 1.2</a-select-option
>
<a-select-option value="header-srtp">Header SRTP</a-select-option> <a-select-option value="header-srtp">Header SRTP</a-select-option>
<a-select-option value="header-utp">Header uTP</a-select-option> <a-select-option value="header-utp">Header uTP</a-select-option>
<a-select-option value="header-wechat">Header WeChat Video</a-select-option> <a-select-option value="header-wechat"
<a-select-option value="header-wireguard">Header WireGuard</a-select-option> >Header WeChat Video</a-select-option
<a-select-option value="mkcp-original">mKCP Original</a-select-option> >
<a-select-option value="header-wireguard"
>Header WireGuard</a-select-option
>
<a-select-option value="mkcp-original"
>mKCP Original</a-select-option
>
<a-select-option value="xdns">xDNS</a-select-option> <a-select-option value="xdns">xDNS</a-select-option>
<a-select-option value="xicmp">xICMP</a-select-option> <a-select-option value="xicmp">xICMP</a-select-option>
<a-select-option value="header-custom">Header Custom</a-select-option> <a-select-option value="header-custom"
>Header Custom</a-select-option
>
<a-select-option value="noise">Noise</a-select-option> <a-select-option value="noise">Noise</a-select-option>
<a-select-option value="sudoku">Sudoku</a-select-option> <a-select-option value="sudoku">Sudoku</a-select-option>
</template> </template>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="Password" v-if="['mkcp-aes128gcm', 'salamander', 'sudoku'].includes(mask.type)"> <a-form-item
<a-input v-model.trim="mask.settings.password" placeholder="Obfuscation password"></a-input> label="Password"
v-if="['mkcp-aes128gcm', 'salamander', 'sudoku'].includes(mask.type)"
>
<a-input
v-model.trim="mask.settings.password"
placeholder="Obfuscation password"
></a-input>
</a-form-item> </a-form-item>
<a-form-item label="Domain" v-if="['header-dns', 'xdns'].includes(mask.type)"> <a-form-item
<a-input v-model.trim="mask.settings.domain" placeholder="e.g., www.example.com"></a-input> label="Domain"
v-if="['header-dns', 'xdns'].includes(mask.type)"
>
<a-input
v-model.trim="mask.settings.domain"
placeholder="e.g., www.example.com"
></a-input>
</a-form-item> </a-form-item>
<template v-if="mask.type === 'header-custom'"> <template v-if="mask.type === 'header-custom'">
<a-form-item label='Client'> <a-form-item label="Client">
<a-icon type="plus" type="primary" size="small" <a-icon
@click="mask.settings.client.push({rand: 0, randRange: '0-255', type: 'array', packet: []})" /> type="plus"
type="primary"
size="small"
@click="mask.settings.client.push({rand: 0, randRange: '0-255', type: 'array', packet: []})"
/>
</a-form-item> </a-form-item>
<template v-for="(c, index) in mask.settings.client" :key="index"> <template v-for="(c, index) in mask.settings.client" :key="index">
<a-divider :style="{ margin: '0' }"> Client [[ index + 1 ]] <a-divider :style="{ margin: '0' }">
<a-icon type="delete" @click="() => mask.settings.client.splice(index, 1)" Client [[ index + 1 ]]
:style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"></a-icon> <a-icon
type="delete"
@click="() => mask.settings.client.splice(index, 1)"
:style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
></a-icon>
</a-divider> </a-divider>
<a-form-item label='Rand'> <a-form-item label="Rand">
<a-input-number v-model.number="c.rand" /> <a-input-number v-model.number="c.rand" />
</a-form-item> </a-form-item>
<a-form-item label='Rand Range'> <a-form-item label="Rand Range">
<a-input v-model.trim="c.randRange" placeholder="0-255" /> <a-input v-model.trim="c.randRange" placeholder="0-255" />
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "pages.xray.outbound.type" }}'> <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
<a-select v-model="c.type" :dropdown-class-name="themeSwitcher.currentTheme"> <a-select
v-model="c.type"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value="array">Array</a-select-option> <a-select-option value="array">Array</a-select-option>
<a-select-option value="str">String</a-select-option> <a-select-option value="str">String</a-select-option>
<a-select-option value="hex">Hex</a-select-option> <a-select-option value="hex">Hex</a-select-option>
<a-select-option value="base64">Base64</a-select-option> <a-select-option value="base64">Base64</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label='Packet'> <a-form-item label="Packet">
<a-input v-model.trim="c.packet" placeholder="binary data" /> <a-input v-model.trim="c.packet" placeholder="binary data" />
</a-form-item> </a-form-item>
</template> </template>
<a-divider :style="{ margin: '0' }"></a-divider> <a-divider :style="{ margin: '0' }"></a-divider>
<a-form-item label='Server'> <a-form-item label="Server">
<a-icon type="plus" type="primary" size="small" <a-icon
@click="mask.settings.server.push({rand: 0, randRange: '0-255', type: 'array', packet: []})" /> type="plus"
type="primary"
size="small"
@click="mask.settings.server.push({rand: 0, randRange: '0-255', type: 'array', packet: []})"
/>
</a-form-item> </a-form-item>
<template v-for="(s, index) in mask.settings.server" :key="index"> <template v-for="(s, index) in mask.settings.server" :key="index">
<a-divider :style="{ margin: '0' }"> Server [[ index + 1 ]] <a-divider :style="{ margin: '0' }">
<a-icon type="delete" @click="() => mask.settings.server.splice(index, 1)" Server [[ index + 1 ]]
:style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"></a-icon> <a-icon
type="delete"
@click="() => mask.settings.server.splice(index, 1)"
:style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
></a-icon>
</a-divider> </a-divider>
<a-form-item label='Rand'> <a-form-item label="Rand">
<a-input-number v-model.number="s.rand" /> <a-input-number v-model.number="s.rand" />
</a-form-item> </a-form-item>
<a-form-item label='Rand Range'> <a-form-item label="Rand Range">
<a-input v-model.trim="s.randRange" placeholder="0-255" /> <a-input v-model.trim="s.randRange" placeholder="0-255" />
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "pages.xray.outbound.type" }}'> <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
<a-select v-model="s.type" :dropdown-class-name="themeSwitcher.currentTheme"> <a-select
v-model="s.type"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value="array">Array</a-select-option> <a-select-option value="array">Array</a-select-option>
<a-select-option value="str">String</a-select-option> <a-select-option value="str">String</a-select-option>
<a-select-option value="hex">Hex</a-select-option> <a-select-option value="hex">Hex</a-select-option>
<a-select-option value="base64">Base64</a-select-option> <a-select-option value="base64">Base64</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label='Packet'> <a-form-item label="Packet">
<a-input v-model.trim="s.packet" placeholder="binary data" /> <a-input v-model.trim="s.packet" placeholder="binary data" />
</a-form-item> </a-form-item>
</template> </template>
</template> </template>
<template v-if="mask.type === 'noise'"> <template v-if="mask.type === 'noise'">
<a-form-item label='Reset'> <a-form-item label="Reset">
<a-input-number v-model.number="mask.settings.reset" :min="0" /> <a-input-number v-model.number="mask.settings.reset" :min="0" />
</a-form-item> </a-form-item>
<a-form-item label='Noise'> <a-form-item label="Noise">
<a-icon type="plus" type="primary" size="small" <a-icon
@click="mask.settings.noise.push({rand: '1-8192', randRange: '0-255', type: 'array', packet: '', delay: ''})" /> type="plus"
type="primary"
size="small"
@click="mask.settings.noise.push({rand: '1-8192', randRange: '0-255', type: 'array', packet: '', delay: ''})"
/>
</a-form-item> </a-form-item>
<template v-for="(n, index) in mask.settings.noise" :key="index"> <template v-for="(n, index) in mask.settings.noise" :key="index">
<a-divider :style="{ margin: '0' }"> Noise [[ index + 1 ]] <a-divider :style="{ margin: '0' }">
<a-icon type="delete" @click="() => mask.settings.noise.splice(index, 1)" Noise [[ index + 1 ]]
:style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"></a-icon> <a-icon
type="delete"
@click="() => mask.settings.noise.splice(index, 1)"
:style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
></a-icon>
</a-divider> </a-divider>
<a-form-item label='Rand'> <a-form-item label="Rand">
<a-input v-model.trim="n.rand" placeholder="1-8192" /> <a-input v-model.trim="n.rand" placeholder="1-8192" />
</a-form-item> </a-form-item>
<a-form-item label='Rand Range'> <a-form-item label="Rand Range">
<a-input v-model.trim="n.randRange" placeholder="0-255" /> <a-input v-model.trim="n.randRange" placeholder="0-255" />
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "pages.xray.outbound.type" }}'> <a-form-item label='{{ i18n "pages.xray.outbound.type" }}'>
<a-select v-model="n.type" :dropdown-class-name="themeSwitcher.currentTheme"> <a-select
v-model="n.type"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value="array">Array</a-select-option> <a-select-option value="array">Array</a-select-option>
<a-select-option value="str">String</a-select-option> <a-select-option value="str">String</a-select-option>
<a-select-option value="hex">Hex</a-select-option> <a-select-option value="hex">Hex</a-select-option>
<a-select-option value="base64">Base64</a-select-option> <a-select-option value="base64">Base64</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label='Packet'> <a-form-item label="Packet">
<a-input v-model.trim="n.packet" placeholder="binary data" /> <a-input v-model.trim="n.packet" placeholder="binary data" />
</a-form-item> </a-form-item>
<a-form-item label='Delay'> <a-form-item label="Delay">
<a-input v-model.trim="n.delay" placeholder="10-20" /> <a-input v-model.trim="n.delay" placeholder="10-20" />
</a-form-item> </a-form-item>
</template> </template>
</template> </template>
<template v-if="mask.type === 'sudoku'"> <template v-if="mask.type === 'sudoku'">
<a-form-item label='ASCII'> <a-form-item label="ASCII">
<a-input v-model.trim="mask.settings.ascii" placeholder="ASCII" /> <a-input v-model.trim="mask.settings.ascii" placeholder="ASCII" />
</a-form-item> </a-form-item>
<a-form-item label='Custom Table'> <a-form-item label="Custom Table">
<a-input v-model.trim="mask.settings.customTable" placeholder="Custom Table" /> <a-input
v-model.trim="mask.settings.customTable"
placeholder="Custom Table"
/>
</a-form-item> </a-form-item>
<a-form-item label='Custom Tables'> <a-form-item label="Custom Tables">
<a-input v-model.trim="mask.settings.customTables" placeholder="Custom Tables" /> <a-input
v-model.trim="mask.settings.customTables"
placeholder="Custom Tables"
/>
</a-form-item> </a-form-item>
<a-form-item label='Padding Min'> <a-form-item label="Padding Min">
<a-input-number v-model.number="mask.settings.paddingMin" :min="0" /> <a-input-number v-model.number="mask.settings.paddingMin" :min="0" />
</a-form-item> </a-form-item>
<a-form-item label='Padding Max'> <a-form-item label="Padding Max">
<a-input-number v-model.number="mask.settings.paddingMax" :min="0" /> <a-input-number v-model.number="mask.settings.paddingMax" :min="0" />
</a-form-item> </a-form-item>
</template> </template>
<template v-if="mask.type === 'xicmp'"> <template v-if="mask.type === 'xicmp'">
<a-form-item label='IP'> <a-form-item label="IP">
<a-input v-model.trim="mask.settings.ip" placeholder="0.0.0.0" /> <a-input v-model.trim="mask.settings.ip" placeholder="0.0.0.0" />
</a-form-item> </a-form-item>
<a-form-item label='ID'> <a-form-item label="ID">
<a-input-number v-model.number="mask.settings.id" :min="0" /> <a-input-number v-model.number="mask.settings.id" :min="0" />
</a-form-item> </a-form-item>
</template> </template>

View file

@ -1,5 +1,9 @@
{{define "form/streamGRPC"}} {{define "form/streamGRPC"}}
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-form-item label="Service Name"> <a-form-item label="Service Name">
<a-input v-model.trim="inbound.stream.grpc.serviceName"></a-input> <a-input v-model.trim="inbound.stream.grpc.serviceName"></a-input>
</a-form-item> </a-form-item>

View file

@ -1,7 +1,13 @@
{{define "form/streamHTTPUpgrade"}} {{define "form/streamHTTPUpgrade"}}
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-form-item label="Proxy Protocol"> <a-form-item label="Proxy Protocol">
<a-switch v-model="inbound.stream.httpupgrade.acceptProxyProtocol"></a-switch> <a-switch
v-model="inbound.stream.httpupgrade.acceptProxyProtocol"
></a-switch>
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "host" }}'> <a-form-item label='{{ i18n "host" }}'>
<a-input v-model.trim="inbound.stream.httpupgrade.host"></a-input> <a-input v-model.trim="inbound.stream.httpupgrade.host"></a-input>
@ -10,18 +16,37 @@
<a-input v-model.trim="inbound.stream.httpupgrade.path"></a-input> <a-input v-model.trim="inbound.stream.httpupgrade.path"></a-input>
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "pages.inbounds.stream.tcp.requestHeader" }}'> <a-form-item label='{{ i18n "pages.inbounds.stream.tcp.requestHeader" }}'>
<a-button icon="plus" size="small" @click="inbound.stream.httpupgrade.addHeader('', '')"></a-button> <a-button
icon="plus"
size="small"
@click="inbound.stream.httpupgrade.addHeader('', '')"
></a-button>
</a-form-item> </a-form-item>
<a-form-item :wrapper-col="{span:24}"> <a-form-item :wrapper-col="{span:24}">
<a-input-group compact v-for="(header, index) in inbound.stream.httpupgrade.headers"> <a-input-group
<a-input :style="{ width: '50%' }" v-model.trim="header.name" compact
placeholder='{{ i18n "pages.inbounds.stream.general.name"}}'> v-for="(header, index) in inbound.stream.httpupgrade.headers"
<template slot="addonBefore" :style="{ margin: '0' }">[[ index+1 ]]</template> >
<a-input
:style="{ width: '50%' }"
v-model.trim="header.name"
placeholder='{{ i18n "pages.inbounds.stream.general.name"}}'
>
<template slot="addonBefore" :style="{ margin: '0' }"
>[[ index+1 ]]</template
>
</a-input> </a-input>
<a-input :style="{ width: '50%' }" v-model.trim="header.value" <a-input
placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'> :style="{ width: '50%' }"
<a-button icon="minus" slot="addonAfter" size="small" v-model.trim="header.value"
@click="inbound.stream.httpupgrade.removeHeader(index)"></a-button> placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'
>
<a-button
icon="minus"
slot="addonAfter"
size="small"
@click="inbound.stream.httpupgrade.removeHeader(index)"
></a-button>
</a-input> </a-input>
</a-input-group> </a-input-group>
</a-form-item> </a-form-item>

View file

@ -1,60 +1,113 @@
{{define "form/streamHysteria"}} {{define "form/streamHysteria"}}
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
<a-form-item label='Auth Password'> :colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-form-item>
<template slot="label">
<a-tooltip>
<template slot="title">
<span>{{ i18n "reset" }}</span>
</template>
Auth Password
<a-icon
@click="inbound.stream.hysteria.auth = RandomUtil.randomSeq(10)"
type="sync"
></a-icon>
</a-tooltip>
</template>
<a-input v-model.trim="inbound.stream.hysteria.auth"></a-input> <a-input v-model.trim="inbound.stream.hysteria.auth"></a-input>
</a-form-item> </a-form-item>
<a-form-item label='UDP Idle Timeout'> <a-form-item label="UDP Idle Timeout">
<a-input-number v-model.number="inbound.stream.hysteria.udpIdleTimeout" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.hysteria.udpIdleTimeout"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label='Masquerade'> <a-form-item label="Masquerade">
<a-switch v-model="inbound.stream.hysteria.masqueradeSwitch"></a-switch> <a-switch v-model="inbound.stream.hysteria.masqueradeSwitch"></a-switch>
</a-form-item> </a-form-item>
<template v-if="inbound.stream.hysteria.masqueradeSwitch"> <template v-if="inbound.stream.hysteria.masqueradeSwitch">
<a-divider :style="{ margin: '5px 0 0' }">Masquerade</a-divider> <a-divider :style="{ margin: '5px 0 0' }">Masquerade</a-divider>
<a-form-item label='Type'> <a-form-item label="Type">
<a-select v-model="inbound.stream.hysteria.masquerade.type" <a-select
:dropdown-class-name="themeSwitcher.currentTheme"> v-model="inbound.stream.hysteria.masquerade.type"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value="file">File</a-select-option> <a-select-option value="file">File</a-select-option>
<a-select-option value="proxy">Proxy</a-select-option> <a-select-option value="proxy">Proxy</a-select-option>
<a-select-option value="string">String</a-select-option> <a-select-option value="string">String</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label='Dir' v-if="inbound.stream.hysteria.masquerade.type === 'file'"> <a-form-item
label="Dir"
v-if="inbound.stream.hysteria.masquerade.type === 'file'"
>
<a-input v-model.trim="inbound.stream.hysteria.masquerade.dir"></a-input> <a-input v-model.trim="inbound.stream.hysteria.masquerade.dir"></a-input>
</a-form-item> </a-form-item>
<template v-if="inbound.stream.hysteria.masquerade.type === 'proxy'"> <template v-if="inbound.stream.hysteria.masquerade.type === 'proxy'">
<a-form-item label='URL'> <a-form-item label="URL">
<a-input v-model.trim="inbound.stream.hysteria.masquerade.url"></a-input> <a-input
v-model.trim="inbound.stream.hysteria.masquerade.url"
></a-input>
</a-form-item> </a-form-item>
<a-form-item label='Rewrite Host'> <a-form-item label="Rewrite Host">
<a-switch v-model="inbound.stream.hysteria.masquerade.rewriteHost"></a-switch> <a-switch
v-model="inbound.stream.hysteria.masquerade.rewriteHost"
></a-switch>
</a-form-item> </a-form-item>
<a-form-item label='Insecure'> <a-form-item label="Insecure">
<a-switch v-model="inbound.stream.hysteria.masquerade.insecure"></a-switch> <a-switch
v-model="inbound.stream.hysteria.masquerade.insecure"
></a-switch>
</a-form-item> </a-form-item>
</template> </template>
<template v-if="inbound.stream.hysteria.masquerade.type === 'string'"> <template v-if="inbound.stream.hysteria.masquerade.type === 'string'">
<a-form-item label='Content'> <a-form-item label="Content">
<a-input v-model.trim="inbound.stream.hysteria.masquerade.content"></a-input> <a-input
v-model.trim="inbound.stream.hysteria.masquerade.content"
></a-input>
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "pages.inbounds.stream.tcp.requestHeader" }}'> <a-form-item label='{{ i18n "pages.inbounds.stream.tcp.requestHeader" }}'>
<a-button size="small" @click="inbound.stream.hysteria.masquerade.addHeader('', '')">+</a-button> <a-button
size="small"
@click="inbound.stream.hysteria.masquerade.addHeader('', '')"
>+</a-button
>
</a-form-item> </a-form-item>
<a-form-item :wrapper-col="{span:24}"> <a-form-item :wrapper-col="{span:24}">
<a-input-group compact v-for="(header, index) in inbound.stream.hysteria.masquerade.headers"> <a-input-group
<a-input style="width: 50%" v-model.trim="header.name" compact
placeholder='{{ i18n "pages.inbounds.stream.general.name"}}'> v-for="(header, index) in inbound.stream.hysteria.masquerade.headers"
<template slot="addonBefore" style="margin: 0;">[[ index+1 ]]</template> >
<a-input
style="width: 50%"
v-model.trim="header.name"
placeholder='{{ i18n "pages.inbounds.stream.general.name"}}'
>
<template slot="addonBefore" style="margin: 0"
>[[ index+1 ]]</template
>
</a-input> </a-input>
<a-input style="width: 50%" v-model.trim="header.value" <a-input
placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'> style="width: 50%"
<a-button slot="addonAfter" size="small" v-model.trim="header.value"
@click="inbound.stream.hysteria.masquerade.removeHeader(index)">-</a-button> placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'
>
<a-button
slot="addonAfter"
size="small"
@click="inbound.stream.hysteria.masquerade.removeHeader(index)"
>-</a-button
>
</a-input> </a-input>
</a-input-group> </a-input-group>
</a-form-item> </a-form-item>
<a-form-item label='Status Code'> <a-form-item label="Status Code">
<a-input-number v-model.number="inbound.stream.hysteria.masquerade.statusCode"></a-input-number> <a-input-number
v-model.number="inbound.stream.hysteria.masquerade.statusCode"
></a-input-number>
</a-form-item> </a-form-item>
</template> </template>
</template> </template>

View file

@ -1,25 +1,49 @@
{{define "form/streamKCP"}} {{define "form/streamKCP"}}
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
<a-form-item label='MTU'> :colon="false"
<a-input-number v-model.number="inbound.stream.kcp.mtu" :min="576" :max="1460"></a-input-number> :label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-form-item label="MTU">
<a-input-number
v-model.number="inbound.stream.kcp.mtu"
:min="576"
:max="1460"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label='TTI (ms)'> <a-form-item label="TTI (ms)">
<a-input-number v-model.number="inbound.stream.kcp.tti" :min="10" :max="100"></a-input-number> <a-input-number
v-model.number="inbound.stream.kcp.tti"
:min="10"
:max="100"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label='Uplink (MB/s)'> <a-form-item label="Uplink (MB/s)">
<a-input-number v-model.number="inbound.stream.kcp.upCap" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.kcp.upCap"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label='Downlink (MB/s)'> <a-form-item label="Downlink (MB/s)">
<a-input-number v-model.number="inbound.stream.kcp.downCap" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.kcp.downCap"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label='Congestion'> <a-form-item label="Congestion">
<a-switch v-model="inbound.stream.kcp.congestion"></a-switch> <a-switch v-model="inbound.stream.kcp.congestion"></a-switch>
</a-form-item> </a-form-item>
<a-form-item label='Read Buffer (MB)'> <a-form-item label="Read Buffer (MB)">
<a-input-number v-model.number="inbound.stream.kcp.readBuffer" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.kcp.readBuffer"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label='Write Buffer (MB)'> <a-form-item label="Write Buffer (MB)">
<a-input-number v-model.number="inbound.stream.kcp.writeBuffer" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.kcp.writeBuffer"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
</a-form> </a-form>
{{end}} {{end}}

View file

@ -1,10 +1,18 @@
{{define "form/streamSettings"}} {{define "form/streamSettings"}}
<!-- select stream network --> <!-- select stream network -->
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }" <a-form
v-if="inbound.protocol != Protocols.HYSTERIA"> :colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
v-if="inbound.protocol != Protocols.HYSTERIA"
>
<a-form-item label='{{ i18n "transmission" }}'> <a-form-item label='{{ i18n "transmission" }}'>
<a-select v-model="inbound.stream.network" :style="{ width: '75%' }" @change="streamNetworkChange" <a-select
:dropdown-class-name="themeSwitcher.currentTheme"> v-model="inbound.stream.network"
:style="{ width: '75%' }"
@change="streamNetworkChange"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value="tcp">TCP (RAW)</a-select-option> <a-select-option value="tcp">TCP (RAW)</a-select-option>
<a-select-option value="kcp">mKCP</a-select-option> <a-select-option value="kcp">mKCP</a-select-option>
<a-select-option value="ws">WebSocket</a-select-option> <a-select-option value="ws">WebSocket</a-select-option>
@ -51,12 +59,8 @@
</template> </template>
<!-- sockopt --> <!-- sockopt -->
<template> <template> {{template "form/streamSockopt"}} </template>
{{template "form/streamSockopt"}}
</template>
<!-- finalmask --> <!-- finalmask -->
<template> <template> {{template "form/streamFinalMask"}} </template>
{{template "form/streamFinalMask"}}
</template>
{{end}} {{end}}

View file

@ -1,27 +1,49 @@
{{define "form/streamSockopt"}} {{define "form/streamSockopt"}}
<a-divider :style="{ margin: '5px 0 0' }"></a-divider> <a-divider :style="{ margin: '5px 0 0' }"></a-divider>
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-form-item label="Sockopt"> <a-form-item label="Sockopt">
<a-switch v-model="inbound.stream.sockoptSwitch"></a-switch> <a-switch v-model="inbound.stream.sockoptSwitch"></a-switch>
</a-form-item> </a-form-item>
<template v-if="inbound.stream.sockoptSwitch"> <template v-if="inbound.stream.sockoptSwitch">
<a-form-item label="Route Mark"> <a-form-item label="Route Mark">
<a-input-number v-model.number="inbound.stream.sockopt.mark" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.sockopt.mark"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label="TCP Keep Alive Interval"> <a-form-item label="TCP Keep Alive Interval">
<a-input-number v-model.number="inbound.stream.sockopt.tcpKeepAliveInterval" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.sockopt.tcpKeepAliveInterval"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label="TCP Keep Alive Idle"> <a-form-item label="TCP Keep Alive Idle">
<a-input-number v-model.number="inbound.stream.sockopt.tcpKeepAliveIdle" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.sockopt.tcpKeepAliveIdle"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label="TCP Max Seg"> <a-form-item label="TCP Max Seg">
<a-input-number v-model.number="inbound.stream.sockopt.tcpMaxSeg" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.sockopt.tcpMaxSeg"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label="TCP User Timeout"> <a-form-item label="TCP User Timeout">
<a-input-number v-model.number="inbound.stream.sockopt.tcpUserTimeout" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.sockopt.tcpUserTimeout"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label="TCP Window Clamp"> <a-form-item label="TCP Window Clamp">
<a-input-number v-model.number="inbound.stream.sockopt.tcpWindowClamp" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.sockopt.tcpWindowClamp"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label="Proxy Protocol"> <a-form-item label="Proxy Protocol">
<a-switch v-model="inbound.stream.sockopt.acceptProxyProtocol"></a-switch> <a-switch v-model="inbound.stream.sockopt.acceptProxyProtocol"></a-switch>
@ -38,21 +60,34 @@
<a-form-item label="V6 Only"> <a-form-item label="V6 Only">
<a-switch v-model.trim="inbound.stream.sockopt.V6Only"></a-switch> <a-switch v-model.trim="inbound.stream.sockopt.V6Only"></a-switch>
</a-form-item> </a-form-item>
<a-form-item label='Domain Strategy'> <a-form-item label="Domain Strategy">
<a-select v-model="inbound.stream.sockopt.domainStrategy" :style="{ width: '50%' }" <a-select
:dropdown-class-name="themeSwitcher.currentTheme"> v-model="inbound.stream.sockopt.domainStrategy"
<a-select-option v-for="key in DOMAIN_STRATEGY_OPTION" :value="key">[[ key ]]</a-select-option> :style="{ width: '50%' }"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option v-for="key in DOMAIN_STRATEGY_OPTION" :value="key"
>[[ key ]]</a-select-option
>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label='TCP Congestion'> <a-form-item label="TCP Congestion">
<a-select v-model="inbound.stream.sockopt.tcpcongestion" :style="{ width: '50%' }" <a-select
:dropdown-class-name="themeSwitcher.currentTheme"> v-model="inbound.stream.sockopt.tcpcongestion"
<a-select-option v-for="key in TCP_CONGESTION_OPTION" :value="key">[[ key ]]</a-select-option> :style="{ width: '50%' }"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option v-for="key in TCP_CONGESTION_OPTION" :value="key"
>[[ key ]]</a-select-option
>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="TProxy"> <a-form-item label="TProxy">
<a-select v-model="inbound.stream.sockopt.tproxy" :style="{ width: '50%' }" <a-select
:dropdown-class-name="themeSwitcher.currentTheme"> v-model="inbound.stream.sockopt.tproxy"
:style="{ width: '50%' }"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value="off">Off</a-select-option> <a-select-option value="off">Off</a-select-option>
<a-select-option value="redirect">Redirect</a-select-option> <a-select-option value="redirect">Redirect</a-select-option>
<a-select-option value="tproxy">TProxy</a-select-option> <a-select-option value="tproxy">TProxy</a-select-option>
@ -65,9 +100,15 @@
<a-input v-model="inbound.stream.sockopt.interfaceName"></a-input> <a-input v-model="inbound.stream.sockopt.interfaceName"></a-input>
</a-form-item> </a-form-item>
<a-form-item label="Trusted X-Forwarded-For"> <a-form-item label="Trusted X-Forwarded-For">
<a-select mode="tags" v-model="inbound.stream.sockopt.trustedXForwardedFor" :style="{ width: '100%' }" <a-select
:dropdown-class-name="themeSwitcher.currentTheme"> mode="tags"
<a-select-option value="CF-Connecting-IP">CF-Connecting-IP</a-select-option> v-model="inbound.stream.sockopt.trustedXForwardedFor"
:style="{ width: '100%' }"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value="CF-Connecting-IP"
>CF-Connecting-IP</a-select-option
>
<a-select-option value="X-Real-IP">X-Real-IP</a-select-option> <a-select-option value="X-Real-IP">X-Real-IP</a-select-option>
<a-select-option value="True-Client-IP">True-Client-IP</a-select-option> <a-select-option value="True-Client-IP">True-Client-IP</a-select-option>
<a-select-option value="X-Client-IP">X-Client-IP</a-select-option> <a-select-option value="X-Client-IP">X-Client-IP</a-select-option>

View file

@ -1,19 +1,31 @@
{{define "form/streamTCP"}} {{define "form/streamTCP"}}
<!-- tcp type --> <!-- tcp type -->
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-form-item label="Proxy Protocol" v-if="inbound.canEnableTls()"> <a-form-item label="Proxy Protocol" v-if="inbound.canEnableTls()">
<a-switch v-model="inbound.stream.tcp.acceptProxyProtocol"></a-switch> <a-switch v-model="inbound.stream.tcp.acceptProxyProtocol"></a-switch>
</a-form-item> </a-form-item>
<a-form-item label='HTTP {{ i18n "camouflage" }}'> <a-form-item label='HTTP {{ i18n "camouflage" }}'>
<a-switch :checked="inbound.stream.tcp.type === 'http'" <a-switch
@change="checked => inbound.stream.tcp.type = checked ? 'http' : 'none'"></a-switch> :checked="inbound.stream.tcp.type === 'http'"
@change="checked => inbound.stream.tcp.type = checked ? 'http' : 'none'"
></a-switch>
</a-form-item> </a-form-item>
</a-form> </a-form>
<a-form v-if="inbound.stream.tcp.type === 'http'" :colon="false" :label-col="{ md: {span:8} }" <a-form
:wrapper-col="{ md: {span:14} }"> v-if="inbound.stream.tcp.type === 'http'"
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<!-- tcp request --> <!-- tcp request -->
<a-divider :style="{ margin: '0' }">{{ i18n "pages.inbounds.stream.general.request" }}</a-divider> <a-divider :style="{ margin: '0' }"
>{{ i18n "pages.inbounds.stream.general.request" }}</a-divider
>
<a-form-item label='{{ i18n "pages.inbounds.stream.tcp.version" }}'> <a-form-item label='{{ i18n "pages.inbounds.stream.tcp.version" }}'>
<a-input v-model.trim="inbound.stream.tcp.request.version"></a-input> <a-input v-model.trim="inbound.stream.tcp.request.version"></a-input>
</a-form-item> </a-form-item>
@ -21,35 +33,66 @@
<a-input v-model.trim="inbound.stream.tcp.request.method"></a-input> <a-input v-model.trim="inbound.stream.tcp.request.method"></a-input>
</a-form-item> </a-form-item>
<a-form-item> <a-form-item>
<template slot="label">{{ i18n "pages.inbounds.stream.tcp.path" }} <template slot="label"
<a-button icon="plus" size="small" @click="inbound.stream.tcp.request.addPath('/')"></a-button> >{{ i18n "pages.inbounds.stream.tcp.path" }}
<a-button
icon="plus"
size="small"
@click="inbound.stream.tcp.request.addPath('/')"
></a-button>
</template> </template>
<template v-for="(path, index) in inbound.stream.tcp.request.path"> <template v-for="(path, index) in inbound.stream.tcp.request.path">
<a-input v-model.trim="inbound.stream.tcp.request.path[index]"> <a-input v-model.trim="inbound.stream.tcp.request.path[index]">
<a-button icon="minus" size="small" slot="addonAfter" @click="inbound.stream.tcp.request.removePath(index)" <a-button
v-if="inbound.stream.tcp.request.path.length>1"></a-button> icon="minus"
size="small"
slot="addonAfter"
@click="inbound.stream.tcp.request.removePath(index)"
v-if="inbound.stream.tcp.request.path.length>1"
></a-button>
</a-input> </a-input>
</template> </template>
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "pages.inbounds.stream.tcp.requestHeader" }}'> <a-form-item label='{{ i18n "pages.inbounds.stream.tcp.requestHeader" }}'>
<a-button icon="plus" size="small" @click="inbound.stream.tcp.request.addHeader('Host', '')"></a-button> <a-button
icon="plus"
size="small"
@click="inbound.stream.tcp.request.addHeader('Host', '')"
></a-button>
</a-form-item> </a-form-item>
<a-form-item :wrapper-col="{span:24}"> <a-form-item :wrapper-col="{span:24}">
<a-input-group compact v-for="(header, index) in inbound.stream.tcp.request.headers"> <a-input-group
<a-input :style="{ width: '50%' }" v-model.trim="header.name" compact
placeholder='{{ i18n "pages.inbounds.stream.general.name" }}'> v-for="(header, index) in inbound.stream.tcp.request.headers"
<template slot="addonBefore" :style="{ margin: '0' }">[[ index+1 ]]</template> >
<a-input
:style="{ width: '50%' }"
v-model.trim="header.name"
placeholder='{{ i18n "pages.inbounds.stream.general.name" }}'
>
<template slot="addonBefore" :style="{ margin: '0' }"
>[[ index+1 ]]</template
>
</a-input> </a-input>
<a-input :style="{ width: '50%' }" v-model.trim="header.value" <a-input
placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'> :style="{ width: '50%' }"
<a-button icon="minus" slot="addonAfter" size="small" v-model.trim="header.value"
@click="inbound.stream.tcp.request.removeHeader(index)"></a-button> placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'
>
<a-button
icon="minus"
slot="addonAfter"
size="small"
@click="inbound.stream.tcp.request.removeHeader(index)"
></a-button>
</a-input> </a-input>
</a-input-group> </a-input-group>
</a-form-item> </a-form-item>
<!-- tcp response --> <!-- tcp response -->
<a-divider :style="{ margin: '0' }">{{ i18n "pages.inbounds.stream.general.response" }}</a-divider> <a-divider :style="{ margin: '0' }"
>{{ i18n "pages.inbounds.stream.general.response" }}</a-divider
>
<a-form-item label='{{ i18n "pages.inbounds.stream.tcp.version" }}'> <a-form-item label='{{ i18n "pages.inbounds.stream.tcp.version" }}'>
<a-input v-model.trim="inbound.stream.tcp.response.version"></a-input> <a-input v-model.trim="inbound.stream.tcp.response.version"></a-input>
</a-form-item> </a-form-item>
@ -60,19 +103,37 @@
<a-input v-model.trim="inbound.stream.tcp.response.reason"></a-input> <a-input v-model.trim="inbound.stream.tcp.response.reason"></a-input>
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "pages.inbounds.stream.tcp.responseHeader" }}'> <a-form-item label='{{ i18n "pages.inbounds.stream.tcp.responseHeader" }}'>
<a-button icon="plus" size="small" <a-button
@click="inbound.stream.tcp.response.addHeader('Content-Type', 'application/octet-stream')"></a-button> icon="plus"
size="small"
@click="inbound.stream.tcp.response.addHeader('Content-Type', 'application/octet-stream')"
></a-button>
</a-form-item> </a-form-item>
<a-form-item :wrapper-col="{span:24}"> <a-form-item :wrapper-col="{span:24}">
<a-input-group compact v-for="(header, index) in inbound.stream.tcp.response.headers"> <a-input-group
<a-input :style="{ width: '50%' }" v-model.trim="header.name" compact
placeholder='{{ i18n "pages.inbounds.stream.general.name" }}'> v-for="(header, index) in inbound.stream.tcp.response.headers"
<template slot="addonBefore" :style="{ margin: '0' }">[[ index+1 ]]</template> >
<a-input
:style="{ width: '50%' }"
v-model.trim="header.name"
placeholder='{{ i18n "pages.inbounds.stream.general.name" }}'
>
<template slot="addonBefore" :style="{ margin: '0' }"
>[[ index+1 ]]</template
>
</a-input> </a-input>
<a-input :style="{ width: '50%' }" v-model.trim="header.value" <a-input
placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'> :style="{ width: '50%' }"
v-model.trim="header.value"
placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'
>
<template slot="addonAfter"> <template slot="addonAfter">
<a-button icon="minus" size="small" @click="inbound.stream.tcp.response.removeHeader(index)"></a-button> <a-button
icon="minus"
size="small"
@click="inbound.stream.tcp.response.removeHeader(index)"
></a-button>
</template> </template>
</a-input> </a-input>
</a-input-group> </a-input-group>

View file

@ -1,5 +1,9 @@
{{define "form/streamWS"}} {{define "form/streamWS"}}
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-form-item label="Proxy Protocol"> <a-form-item label="Proxy Protocol">
<a-switch v-model="inbound.stream.ws.acceptProxyProtocol"></a-switch> <a-switch v-model="inbound.stream.ws.acceptProxyProtocol"></a-switch>
</a-form-item> </a-form-item>
@ -9,21 +13,41 @@
<a-form-item label='{{ i18n "path" }}'> <a-form-item label='{{ i18n "path" }}'>
<a-input v-model.trim="inbound.stream.ws.path"></a-input> <a-input v-model.trim="inbound.stream.ws.path"></a-input>
</a-form-item> </a-form-item>
<a-form-item label='Heartbeat Period'> <a-form-item label="Heartbeat Period">
<a-input-number v-model.number="inbound.stream.ws.heartbeatPeriod" :min="0"></a-input-number> <a-input-number
v-model.number="inbound.stream.ws.heartbeatPeriod"
:min="0"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "pages.inbounds.stream.tcp.requestHeader" }}'> <a-form-item label='{{ i18n "pages.inbounds.stream.tcp.requestHeader" }}'>
<a-button icon="plus" size="small" @click="inbound.stream.ws.addHeader('', '')"></a-button> <a-button
icon="plus"
size="small"
@click="inbound.stream.ws.addHeader('', '')"
></a-button>
</a-form-item> </a-form-item>
<a-form-item :wrapper-col="{span:24}"> <a-form-item :wrapper-col="{span:24}">
<a-input-group compact v-for="(header, index) in inbound.stream.ws.headers"> <a-input-group compact v-for="(header, index) in inbound.stream.ws.headers">
<a-input :style="{ width: '50%' }" v-model.trim="header.name" <a-input
placeholder='{{ i18n "pages.inbounds.stream.general.name"}}'> :style="{ width: '50%' }"
<template slot="addonBefore" :style="{ margin: '0' }">[[ index+1 ]]</template> v-model.trim="header.name"
placeholder='{{ i18n "pages.inbounds.stream.general.name"}}'
>
<template slot="addonBefore" :style="{ margin: '0' }"
>[[ index+1 ]]</template
>
</a-input> </a-input>
<a-input :style="{ width: '50%' }" v-model.trim="header.value" <a-input
placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'> :style="{ width: '50%' }"
<a-button icon="minus" slot="addonAfter" size="small" @click="inbound.stream.ws.removeHeader(index)"></a-button> v-model.trim="header.value"
placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'
>
<a-button
icon="minus"
slot="addonAfter"
size="small"
@click="inbound.stream.ws.removeHeader(index)"
></a-button>
</a-input> </a-input>
</a-input-group> </a-input-group>
</a-form-item> </a-form-item>

View file

@ -1,5 +1,9 @@
{{define "form/streamXHTTP"}} {{define "form/streamXHTTP"}}
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> <a-form
:colon="false"
:label-col="{ md: {span:8} }"
:wrapper-col="{ md: {span:14} }"
>
<a-form-item label='{{ i18n "host" }}'> <a-form-item label='{{ i18n "host" }}'>
<a-input v-model.trim="inbound.stream.xhttp.host"></a-input> <a-input v-model.trim="inbound.stream.xhttp.host"></a-input>
</a-form-item> </a-form-item>
@ -7,36 +11,69 @@
<a-input v-model.trim="inbound.stream.xhttp.path"></a-input> <a-input v-model.trim="inbound.stream.xhttp.path"></a-input>
</a-form-item> </a-form-item>
<a-form-item label='{{ i18n "pages.inbounds.stream.tcp.requestHeader" }}'> <a-form-item label='{{ i18n "pages.inbounds.stream.tcp.requestHeader" }}'>
<a-button icon="plus" size="small" @click="inbound.stream.xhttp.addHeader('', '')"></a-button> <a-button
icon="plus"
size="small"
@click="inbound.stream.xhttp.addHeader('', '')"
></a-button>
</a-form-item> </a-form-item>
<a-form-item :wrapper-col="{span:24}"> <a-form-item :wrapper-col="{span:24}">
<a-input-group compact v-for="(header, index) in inbound.stream.xhttp.headers"> <a-input-group
<a-input :style="{ width: '50%' }" v-model.trim="header.name" compact
placeholder='{{ i18n "pages.inbounds.stream.general.name"}}'> v-for="(header, index) in inbound.stream.xhttp.headers"
<template slot="addonBefore" :style="{ margin: '0' }">[[ index+1 >
]]</template> <a-input
:style="{ width: '50%' }"
v-model.trim="header.name"
placeholder='{{ i18n "pages.inbounds.stream.general.name"}}'
>
<template slot="addonBefore" :style="{ margin: '0' }"
>[[ index+1 ]]</template
>
</a-input> </a-input>
<a-input :style="{ width: '50%' }" v-model.trim="header.value" <a-input
placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'> :style="{ width: '50%' }"
<a-button icon="minus" slot="addonAfter" size="small" v-model.trim="header.value"
@click="inbound.stream.xhttp.removeHeader(index)"></a-button> placeholder='{{ i18n "pages.inbounds.stream.general.value" }}'
>
<a-button
icon="minus"
slot="addonAfter"
size="small"
@click="inbound.stream.xhttp.removeHeader(index)"
></a-button>
</a-input> </a-input>
</a-input-group> </a-input-group>
</a-form-item> </a-form-item>
<a-form-item label='Mode'> <a-form-item label="Mode">
<a-select v-model="inbound.stream.xhttp.mode" :style="{ width: '50%' }" <a-select
:dropdown-class-name="themeSwitcher.currentTheme"> v-model="inbound.stream.xhttp.mode"
<a-select-option v-for="key in MODE_OPTION" :value="key">[[ key :style="{ width: '50%' }"
]]</a-select-option> :dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option v-for="key in MODE_OPTION" :value="key"
>[[ key ]]</a-select-option
>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="Max Buffered Upload" v-if="inbound.stream.xhttp.mode === 'packet-up'"> <a-form-item
<a-input-number v-model.number="inbound.stream.xhttp.scMaxBufferedPosts"></a-input-number> label="Max Buffered Upload"
v-if="inbound.stream.xhttp.mode === 'packet-up'"
>
<a-input-number
v-model.number="inbound.stream.xhttp.scMaxBufferedPosts"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label="Max Upload Size (Byte)" v-if="inbound.stream.xhttp.mode === 'packet-up'"> <a-form-item
label="Max Upload Size (Byte)"
v-if="inbound.stream.xhttp.mode === 'packet-up'"
>
<a-input v-model.trim="inbound.stream.xhttp.scMaxEachPostBytes"></a-input> <a-input v-model.trim="inbound.stream.xhttp.scMaxEachPostBytes"></a-input>
</a-form-item> </a-form-item>
<a-form-item label="Stream-Up Server" v-if="inbound.stream.xhttp.mode === 'stream-up'"> <a-form-item
label="Stream-Up Server"
v-if="inbound.stream.xhttp.mode === 'stream-up'"
>
<a-input v-model.trim="inbound.stream.xhttp.scStreamUpServerSecs"></a-input> <a-input v-model.trim="inbound.stream.xhttp.scStreamUpServerSecs"></a-input>
</a-form-item> </a-form-item>
<a-form-item label="Padding Bytes"> <a-form-item label="Padding Bytes">
@ -47,14 +84,22 @@
</a-form-item> </a-form-item>
<template v-if="inbound.stream.xhttp.xPaddingObfsMode"> <template v-if="inbound.stream.xhttp.xPaddingObfsMode">
<a-form-item label="Padding Key"> <a-form-item label="Padding Key">
<a-input v-model.trim="inbound.stream.xhttp.xPaddingKey" placeholder="x_padding"></a-input> <a-input
v-model.trim="inbound.stream.xhttp.xPaddingKey"
placeholder="x_padding"
></a-input>
</a-form-item> </a-form-item>
<a-form-item label="Padding Header"> <a-form-item label="Padding Header">
<a-input v-model.trim="inbound.stream.xhttp.xPaddingHeader" placeholder="X-Padding"></a-input> <a-input
v-model.trim="inbound.stream.xhttp.xPaddingHeader"
placeholder="X-Padding"
></a-input>
</a-form-item> </a-form-item>
<a-form-item label="Padding Placement"> <a-form-item label="Padding Placement">
<a-select v-model="inbound.stream.xhttp.xPaddingPlacement" <a-select
:dropdown-class-name="themeSwitcher.currentTheme"> v-model="inbound.stream.xhttp.xPaddingPlacement"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value>Default (queryInHeader)</a-select-option> <a-select-option value>Default (queryInHeader)</a-select-option>
<a-select-option value="queryInHeader">queryInHeader</a-select-option> <a-select-option value="queryInHeader">queryInHeader</a-select-option>
<a-select-option value="header">header</a-select-option> <a-select-option value="header">header</a-select-option>
@ -63,7 +108,10 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="Padding Method"> <a-form-item label="Padding Method">
<a-select v-model="inbound.stream.xhttp.xPaddingMethod" :dropdown-class-name="themeSwitcher.currentTheme"> <a-select
v-model="inbound.stream.xhttp.xPaddingMethod"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value>Default (repeat-x)</a-select-option> <a-select-option value>Default (repeat-x)</a-select-option>
<a-select-option value="repeat-x">repeat-x</a-select-option> <a-select-option value="repeat-x">repeat-x</a-select-option>
<a-select-option value="tokenish">tokenish</a-select-option> <a-select-option value="tokenish">tokenish</a-select-option>
@ -71,7 +119,10 @@
</a-form-item> </a-form-item>
</template> </template>
<a-form-item label="Uplink HTTP Method"> <a-form-item label="Uplink HTTP Method">
<a-select v-model="inbound.stream.xhttp.uplinkHTTPMethod" :dropdown-class-name="themeSwitcher.currentTheme"> <a-select
v-model="inbound.stream.xhttp.uplinkHTTPMethod"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value>Default (POST)</a-select-option> <a-select-option value>Default (POST)</a-select-option>
<a-select-option value="POST">POST</a-select-option> <a-select-option value="POST">POST</a-select-option>
<a-select-option value="PUT">PUT</a-select-option> <a-select-option value="PUT">PUT</a-select-option>
@ -79,7 +130,10 @@
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="Session Placement"> <a-form-item label="Session Placement">
<a-select v-model="inbound.stream.xhttp.sessionPlacement" :dropdown-class-name="themeSwitcher.currentTheme"> <a-select
v-model="inbound.stream.xhttp.sessionPlacement"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value>Default (path)</a-select-option> <a-select-option value>Default (path)</a-select-option>
<a-select-option value="path">path</a-select-option> <a-select-option value="path">path</a-select-option>
<a-select-option value="header">header</a-select-option> <a-select-option value="header">header</a-select-option>
@ -87,12 +141,20 @@
<a-select-option value="query">query</a-select-option> <a-select-option value="query">query</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="Session Key" <a-form-item
v-if="inbound.stream.xhttp.sessionPlacement && inbound.stream.xhttp.sessionPlacement !== 'path'"> label="Session Key"
<a-input v-model.trim="inbound.stream.xhttp.sessionKey" placeholder="x_session"></a-input> v-if="inbound.stream.xhttp.sessionPlacement && inbound.stream.xhttp.sessionPlacement !== 'path'"
>
<a-input
v-model.trim="inbound.stream.xhttp.sessionKey"
placeholder="x_session"
></a-input>
</a-form-item> </a-form-item>
<a-form-item label="Sequence Placement"> <a-form-item label="Sequence Placement">
<a-select v-model="inbound.stream.xhttp.seqPlacement" :dropdown-class-name="themeSwitcher.currentTheme"> <a-select
v-model="inbound.stream.xhttp.seqPlacement"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value>Default (path)</a-select-option> <a-select-option value>Default (path)</a-select-option>
<a-select-option value="path">path</a-select-option> <a-select-option value="path">path</a-select-option>
<a-select-option value="header">header</a-select-option> <a-select-option value="header">header</a-select-option>
@ -100,12 +162,23 @@
<a-select-option value="query">query</a-select-option> <a-select-option value="query">query</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="Sequence Key" <a-form-item
v-if="inbound.stream.xhttp.seqPlacement && inbound.stream.xhttp.seqPlacement !== 'path'"> label="Sequence Key"
<a-input v-model.trim="inbound.stream.xhttp.seqKey" placeholder="x_seq"></a-input> v-if="inbound.stream.xhttp.seqPlacement && inbound.stream.xhttp.seqPlacement !== 'path'"
>
<a-input
v-model.trim="inbound.stream.xhttp.seqKey"
placeholder="x_seq"
></a-input>
</a-form-item> </a-form-item>
<a-form-item label="Uplink Data Placement" v-if="inbound.stream.xhttp.mode === 'packet-up'"> <a-form-item
<a-select v-model="inbound.stream.xhttp.uplinkDataPlacement" :dropdown-class-name="themeSwitcher.currentTheme"> label="Uplink Data Placement"
v-if="inbound.stream.xhttp.mode === 'packet-up'"
>
<a-select
v-model="inbound.stream.xhttp.uplinkDataPlacement"
:dropdown-class-name="themeSwitcher.currentTheme"
>
<a-select-option value>Default (body)</a-select-option> <a-select-option value>Default (body)</a-select-option>
<a-select-option value="body">body</a-select-option> <a-select-option value="body">body</a-select-option>
<a-select-option value="header">header</a-select-option> <a-select-option value="header">header</a-select-option>
@ -113,14 +186,24 @@
<a-select-option value="query">query</a-select-option> <a-select-option value="query">query</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
<a-form-item label="Uplink Data Key" <a-form-item
v-if="inbound.stream.xhttp.mode === 'packet-up' && inbound.stream.xhttp.uplinkDataPlacement && inbound.stream.xhttp.uplinkDataPlacement !== 'body'"> label="Uplink Data Key"
<a-input v-model.trim="inbound.stream.xhttp.uplinkDataKey" placeholder="x_data"></a-input> v-if="inbound.stream.xhttp.mode === 'packet-up' && inbound.stream.xhttp.uplinkDataPlacement && inbound.stream.xhttp.uplinkDataPlacement !== 'body'"
>
<a-input
v-model.trim="inbound.stream.xhttp.uplinkDataKey"
placeholder="x_data"
></a-input>
</a-form-item> </a-form-item>
<a-form-item label="Uplink Chunk Size" <a-form-item
v-if="inbound.stream.xhttp.mode === 'packet-up' && inbound.stream.xhttp.uplinkDataPlacement && inbound.stream.xhttp.uplinkDataPlacement !== 'body'"> label="Uplink Chunk Size"
<a-input-number v-model.number="inbound.stream.xhttp.uplinkChunkSize" :min="0" v-if="inbound.stream.xhttp.mode === 'packet-up' && inbound.stream.xhttp.uplinkDataPlacement && inbound.stream.xhttp.uplinkDataPlacement !== 'body'"
placeholder="0 (unlimited)"></a-input-number> >
<a-input-number
v-model.number="inbound.stream.xhttp.uplinkChunkSize"
:min="0"
placeholder="0 (unlimited)"
></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label="No SSE Header"> <a-form-item label="No SSE Header">
<a-switch v-model="inbound.stream.xhttp.noSSEHeader"></a-switch> <a-switch v-model="inbound.stream.xhttp.noSSEHeader"></a-switch>