mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-10-08 10:56:13 -08:00
* feat(peer): support protocol-agnostic attached peers Add locally attached peers backed by independent, peer-level portable managers and authenticated in-process ring connections. Carry trusted connection provenance through packet admission so attached relay privileges cannot be forged through packet headers. Let every peer manager own ACL loading, sanitized policy updates, route refresh, and runtime cleanup. In Secure Mode, grant attached identities ephemeral credentials instead of sharing administrator and group secrets. * feat(vpn): add reusable attached-peer portal runtime Add a protocol-neutral portal runtime that converts authenticated client sessions into attached EasyTier peers. Own per-client generations, status, packet forwarding, address translation, and peer cleanup without knowing the transport protocol. Add transactional IPv4 source and destination rewriting with correct IPv4, TCP, UDP, ICMP, and quoted-packet checksum updates. Keep the old production portal path temporarily active until the WireGuard adapter is migrated in the next change. * feat(wireguard): attach named clients through peer portal Replace the monolithic WireGuard portal with a native adapter that owns key derivation, UDP demultiplexing, reauthentication, roaming, and bounded per-client packet queues. Hand authenticated sessions to the generic portal runtime for peer lifecycle and IPv4 translation. Move portal configuration into the core instance model, require a dedicated server key, and preserve existing listener, CLI, and runtime configuration behavior. Reject runtime address conflicts before publishing shared configuration. * feat(vpn): expose per-client portal status Project configured clients and their runtime state through the portal RPC, including generated client configuration, listener, peer identity, endpoint, tunnel address, ACL groups, and errors. Keep private client configuration out of the broad instance-info response and expose the explicit RPC through the CLI and Tauri bridge. * feat(vpn): add portal configuration to web clients Expose WireGuard portal listener, key, client, ACL group, and runtime status fields in the shared frontend library, Web dashboard, and Tauri client. Preserve UUID and uint64 values across protobuf JSON boundaries, keep dynamic client editor rows stable, and document the portal workflow. * test(vpn): cover multi-client and roaming WireGuard portals Add two three-node integration tests for the WireGuard VPN portal. The multi-client test connects two kernel WireGuard clients from separate network namespaces, verifies per-client connectivity to mesh nodes, and exercises cross-client traffic that runs the IPv4 source and destination translation in both directions. A TCP echo exchange through the portal additionally covers the TCP pseudo-header checksum rewrite path that ICMP-only ping tests miss, and portal status snapshots must report both clients online with distinct peer ids and correctly learned tunnel addresses. The roaming test swaps the client namespace address (delete the old address, then add the new one) so the kernel WireGuard source cache is invalidated and the client keeps sending under the same session from the new source, exactly like a real network change. The portal must update the client endpoint on the same peer id via the data path (same generation, no re-handshake, no detach/reconnect) while connectivity to mesh nodes is preserved. Supporting changes: run_wireguard_client now takes an interface name, and the shared namespace topology gains net_f (10.1.2.5) on the portal bridge for the second client.
253 lines
18 KiB
TypeScript
253 lines
18 KiB
TypeScript
/* eslint-disable */
|
|
/* prettier-ignore */
|
|
// @ts-nocheck
|
|
// noinspection JSUnusedGlobalSymbols
|
|
// Generated by unplugin-auto-import
|
|
// biome-ignore lint: disable
|
|
export {}
|
|
declare global {
|
|
const EffectScope: typeof import('vue')['EffectScope']
|
|
const MenuItemExit: typeof import('./composables/tray')['MenuItemExit']
|
|
const MenuItemShow: typeof import('./composables/tray')['MenuItemShow']
|
|
const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
|
|
const collectNetworkInfo: typeof import('./composables/backend')['collectNetworkInfo']
|
|
const computed: typeof import('vue')['computed']
|
|
const createApp: typeof import('vue')['createApp']
|
|
const createPinia: typeof import('pinia')['createPinia']
|
|
const customRef: typeof import('vue')['customRef']
|
|
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
|
|
const defineComponent: typeof import('vue')['defineComponent']
|
|
const defineStore: typeof import('pinia')['defineStore']
|
|
const deleteNetworkInstance: typeof import('./composables/backend')['deleteNetworkInstance']
|
|
const effectScope: typeof import('vue')['effectScope']
|
|
const generateMenuItem: typeof import('./composables/tray')['generateMenuItem']
|
|
const generateNetworkConfig: typeof import('./composables/backend')['generateNetworkConfig']
|
|
const getActivePinia: typeof import('pinia')['getActivePinia']
|
|
const getConfig: typeof import('./composables/backend')['getConfig']
|
|
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
|
|
const getCurrentScope: typeof import('vue')['getCurrentScope']
|
|
const getEasytierVersion: typeof import('./composables/backend')['getEasytierVersion']
|
|
const getNetworkMetas: typeof import('./composables/backend')['getNetworkMetas']
|
|
const getServiceStatus: typeof import('./composables/backend')['getServiceStatus']
|
|
const getVpnPortalInfo: typeof import('./composables/backend')['getVpnPortalInfo']
|
|
const h: typeof import('vue')['h']
|
|
const initMobileVpnService: typeof import('./composables/mobile_vpn')['initMobileVpnService']
|
|
const initRpcConnection: typeof import('./composables/backend')['initRpcConnection']
|
|
const initService: typeof import('./composables/backend')['initService']
|
|
const initWebClient: typeof import('./composables/backend')['initWebClient']
|
|
const inject: typeof import('vue')['inject']
|
|
const isClientRunning: typeof import('./composables/backend')['isClientRunning']
|
|
const isProxy: typeof import('vue')['isProxy']
|
|
const isReactive: typeof import('vue')['isReactive']
|
|
const isReadonly: typeof import('vue')['isReadonly']
|
|
const isRef: typeof import('vue')['isRef']
|
|
const isWebClientConnected: typeof import('./composables/backend')['isWebClientConnected']
|
|
const listNetworkInstanceIds: typeof import('./composables/backend')['listNetworkInstanceIds']
|
|
const listenGlobalEvents: typeof import('./composables/event')['listenGlobalEvents']
|
|
const loadLastNetworkInstanceId: typeof import('./composables/config')['loadLastNetworkInstanceId']
|
|
const loadMode: typeof import('./composables/mode')['loadMode']
|
|
const mapActions: typeof import('pinia')['mapActions']
|
|
const mapGetters: typeof import('pinia')['mapGetters']
|
|
const mapState: typeof import('pinia')['mapState']
|
|
const mapStores: typeof import('pinia')['mapStores']
|
|
const mapWritableState: typeof import('pinia')['mapWritableState']
|
|
const markRaw: typeof import('vue')['markRaw']
|
|
const nextTick: typeof import('vue')['nextTick']
|
|
const normalizeConfigSource: typeof import('./composables/config_source')['normalizeConfigSource']
|
|
const onActivated: typeof import('vue')['onActivated']
|
|
const onBeforeMount: typeof import('vue')['onBeforeMount']
|
|
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
|
|
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
|
|
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
|
|
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
|
|
const onDeactivated: typeof import('vue')['onDeactivated']
|
|
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
|
|
const onMounted: typeof import('vue')['onMounted']
|
|
const onNetworkInstanceChange: typeof import('./composables/mobile_vpn')['onNetworkInstanceChange']
|
|
const onNetworkInstanceUpdate: typeof import('./composables/mobile_vpn')['onNetworkInstanceUpdate']
|
|
const onRenderTracked: typeof import('vue')['onRenderTracked']
|
|
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
|
|
const onScopeDispose: typeof import('vue')['onScopeDispose']
|
|
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
|
|
const onUnmounted: typeof import('vue')['onUnmounted']
|
|
const onUpdated: typeof import('vue')['onUpdated']
|
|
const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
|
|
const parseNetworkConfig: typeof import('./composables/backend')['parseNetworkConfig']
|
|
const prepareVpnService: typeof import('./composables/mobile_vpn')['prepareVpnService']
|
|
const provide: typeof import('vue')['provide']
|
|
const reactive: typeof import('vue')['reactive']
|
|
const readonly: typeof import('vue')['readonly']
|
|
const ref: typeof import('vue')['ref']
|
|
const resolveComponent: typeof import('vue')['resolveComponent']
|
|
const runNetworkInstance: typeof import('./composables/backend')['runNetworkInstance']
|
|
const saveLastNetworkInstanceId: typeof import('./composables/config')['saveLastNetworkInstanceId']
|
|
const saveMode: typeof import('./composables/mode')['saveMode']
|
|
const saveNetworkConfig: typeof import('./composables/backend')['saveNetworkConfig']
|
|
const sendConfigs: typeof import('./composables/backend')['sendConfigs']
|
|
const setActivePinia: typeof import('pinia')['setActivePinia']
|
|
const setLoggingLevel: typeof import('./composables/backend')['setLoggingLevel']
|
|
const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix']
|
|
const setServiceStatus: typeof import('./composables/backend')['setServiceStatus']
|
|
const setTrayMenu: typeof import('./composables/tray')['setTrayMenu']
|
|
const setTrayRunState: typeof import('./composables/tray')['setTrayRunState']
|
|
const setTrayTooltip: typeof import('./composables/tray')['setTrayTooltip']
|
|
const setTunFd: typeof import('./composables/backend')['setTunFd']
|
|
const shallowReactive: typeof import('vue')['shallowReactive']
|
|
const shallowReadonly: typeof import('vue')['shallowReadonly']
|
|
const shallowRef: typeof import('vue')['shallowRef']
|
|
const storeToRefs: typeof import('pinia')['storeToRefs']
|
|
const syncMobileVpnService: typeof import('./composables/mobile_vpn')['syncMobileVpnService']
|
|
const toRaw: typeof import('vue')['toRaw']
|
|
const toRef: typeof import('vue')['toRef']
|
|
const toRefs: typeof import('vue')['toRefs']
|
|
const toValue: typeof import('vue')['toValue']
|
|
const triggerRef: typeof import('vue')['triggerRef']
|
|
const unref: typeof import('vue')['unref']
|
|
const updateNetworkConfigState: typeof import('./composables/backend')['updateNetworkConfigState']
|
|
const useAttrs: typeof import('vue')['useAttrs']
|
|
const useCssModule: typeof import('vue')['useCssModule']
|
|
const useCssVars: typeof import('vue')['useCssVars']
|
|
const useI18n: typeof import('vue-i18n')['useI18n']
|
|
const useId: typeof import('vue')['useId']
|
|
const useLink: typeof import('vue-router/auto')['useLink']
|
|
const useModel: typeof import('vue')['useModel']
|
|
const useRoute: typeof import('vue-router')['useRoute']
|
|
const useRouter: typeof import('vue-router')['useRouter']
|
|
const useSlots: typeof import('vue')['useSlots']
|
|
const useTemplateRef: typeof import('vue')['useTemplateRef']
|
|
const useTray: typeof import('./composables/tray')['useTray']
|
|
const validateConfig: typeof import('./composables/backend')['validateConfig']
|
|
const watch: typeof import('vue')['watch']
|
|
const watchEffect: typeof import('vue')['watchEffect']
|
|
const watchPostEffect: typeof import('vue')['watchPostEffect']
|
|
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
|
|
}
|
|
// for type re-export
|
|
declare global {
|
|
// @ts-ignore
|
|
export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
|
|
import('vue')
|
|
}
|
|
|
|
// for vue template auto import
|
|
import { UnwrapRef } from 'vue'
|
|
declare module 'vue' {
|
|
interface GlobalComponents {}
|
|
interface ComponentCustomProperties {
|
|
readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
|
|
readonly MenuItemExit: UnwrapRef<typeof import('./composables/tray')['MenuItemExit']>
|
|
readonly MenuItemShow: UnwrapRef<typeof import('./composables/tray')['MenuItemShow']>
|
|
readonly acceptHMRUpdate: UnwrapRef<typeof import('pinia')['acceptHMRUpdate']>
|
|
readonly collectNetworkInfo: UnwrapRef<typeof import('./composables/backend')['collectNetworkInfo']>
|
|
readonly computed: UnwrapRef<typeof import('vue')['computed']>
|
|
readonly createApp: UnwrapRef<typeof import('vue')['createApp']>
|
|
readonly createPinia: UnwrapRef<typeof import('pinia')['createPinia']>
|
|
readonly customRef: UnwrapRef<typeof import('vue')['customRef']>
|
|
readonly defineAsyncComponent: UnwrapRef<typeof import('vue')['defineAsyncComponent']>
|
|
readonly defineComponent: UnwrapRef<typeof import('vue')['defineComponent']>
|
|
readonly defineStore: UnwrapRef<typeof import('pinia')['defineStore']>
|
|
readonly deleteNetworkInstance: UnwrapRef<typeof import('./composables/backend')['deleteNetworkInstance']>
|
|
readonly effectScope: UnwrapRef<typeof import('vue')['effectScope']>
|
|
readonly generateMenuItem: UnwrapRef<typeof import('./composables/tray')['generateMenuItem']>
|
|
readonly generateNetworkConfig: UnwrapRef<typeof import('./composables/backend')['generateNetworkConfig']>
|
|
readonly getActivePinia: UnwrapRef<typeof import('pinia')['getActivePinia']>
|
|
readonly getConfig: UnwrapRef<typeof import('./composables/backend')['getConfig']>
|
|
readonly getCurrentInstance: UnwrapRef<typeof import('vue')['getCurrentInstance']>
|
|
readonly getCurrentScope: UnwrapRef<typeof import('vue')['getCurrentScope']>
|
|
readonly getEasytierVersion: UnwrapRef<typeof import('./composables/backend')['getEasytierVersion']>
|
|
readonly getNetworkMetas: UnwrapRef<typeof import('./composables/backend')['getNetworkMetas']>
|
|
readonly getServiceStatus: UnwrapRef<typeof import('./composables/backend')['getServiceStatus']>
|
|
readonly getVpnPortalInfo: UnwrapRef<typeof import('./composables/backend')['getVpnPortalInfo']>
|
|
readonly h: UnwrapRef<typeof import('vue')['h']>
|
|
readonly initMobileVpnService: UnwrapRef<typeof import('./composables/mobile_vpn')['initMobileVpnService']>
|
|
readonly initRpcConnection: UnwrapRef<typeof import('./composables/backend')['initRpcConnection']>
|
|
readonly initService: UnwrapRef<typeof import('./composables/backend')['initService']>
|
|
readonly initWebClient: UnwrapRef<typeof import('./composables/backend')['initWebClient']>
|
|
readonly inject: UnwrapRef<typeof import('vue')['inject']>
|
|
readonly isClientRunning: UnwrapRef<typeof import('./composables/backend')['isClientRunning']>
|
|
readonly isProxy: UnwrapRef<typeof import('vue')['isProxy']>
|
|
readonly isReactive: UnwrapRef<typeof import('vue')['isReactive']>
|
|
readonly isReadonly: UnwrapRef<typeof import('vue')['isReadonly']>
|
|
readonly isRef: UnwrapRef<typeof import('vue')['isRef']>
|
|
readonly isWebClientConnected: UnwrapRef<typeof import('./composables/backend')['isWebClientConnected']>
|
|
readonly listNetworkInstanceIds: UnwrapRef<typeof import('./composables/backend')['listNetworkInstanceIds']>
|
|
readonly listenGlobalEvents: UnwrapRef<typeof import('./composables/event')['listenGlobalEvents']>
|
|
readonly loadLastNetworkInstanceId: UnwrapRef<typeof import('./composables/config')['loadLastNetworkInstanceId']>
|
|
readonly loadMode: UnwrapRef<typeof import('./composables/mode')['loadMode']>
|
|
readonly mapActions: UnwrapRef<typeof import('pinia')['mapActions']>
|
|
readonly mapGetters: UnwrapRef<typeof import('pinia')['mapGetters']>
|
|
readonly mapState: UnwrapRef<typeof import('pinia')['mapState']>
|
|
readonly mapStores: UnwrapRef<typeof import('pinia')['mapStores']>
|
|
readonly mapWritableState: UnwrapRef<typeof import('pinia')['mapWritableState']>
|
|
readonly markRaw: UnwrapRef<typeof import('vue')['markRaw']>
|
|
readonly nextTick: UnwrapRef<typeof import('vue')['nextTick']>
|
|
readonly normalizeConfigSource: UnwrapRef<typeof import('./composables/config_source')['normalizeConfigSource']>
|
|
readonly onActivated: UnwrapRef<typeof import('vue')['onActivated']>
|
|
readonly onBeforeMount: UnwrapRef<typeof import('vue')['onBeforeMount']>
|
|
readonly onBeforeRouteLeave: UnwrapRef<typeof import('vue-router')['onBeforeRouteLeave']>
|
|
readonly onBeforeRouteUpdate: UnwrapRef<typeof import('vue-router')['onBeforeRouteUpdate']>
|
|
readonly onBeforeUnmount: UnwrapRef<typeof import('vue')['onBeforeUnmount']>
|
|
readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']>
|
|
readonly onDeactivated: UnwrapRef<typeof import('vue')['onDeactivated']>
|
|
readonly onErrorCaptured: UnwrapRef<typeof import('vue')['onErrorCaptured']>
|
|
readonly onMounted: UnwrapRef<typeof import('vue')['onMounted']>
|
|
readonly onNetworkInstanceChange: UnwrapRef<typeof import('./composables/mobile_vpn')['onNetworkInstanceChange']>
|
|
readonly onNetworkInstanceUpdate: UnwrapRef<typeof import('./composables/mobile_vpn')['onNetworkInstanceUpdate']>
|
|
readonly onRenderTracked: UnwrapRef<typeof import('vue')['onRenderTracked']>
|
|
readonly onRenderTriggered: UnwrapRef<typeof import('vue')['onRenderTriggered']>
|
|
readonly onScopeDispose: UnwrapRef<typeof import('vue')['onScopeDispose']>
|
|
readonly onServerPrefetch: UnwrapRef<typeof import('vue')['onServerPrefetch']>
|
|
readonly onUnmounted: UnwrapRef<typeof import('vue')['onUnmounted']>
|
|
readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']>
|
|
readonly onWatcherCleanup: UnwrapRef<typeof import('vue')['onWatcherCleanup']>
|
|
readonly parseNetworkConfig: UnwrapRef<typeof import('./composables/backend')['parseNetworkConfig']>
|
|
readonly prepareVpnService: UnwrapRef<typeof import('./composables/mobile_vpn')['prepareVpnService']>
|
|
readonly provide: UnwrapRef<typeof import('vue')['provide']>
|
|
readonly reactive: UnwrapRef<typeof import('vue')['reactive']>
|
|
readonly readonly: UnwrapRef<typeof import('vue')['readonly']>
|
|
readonly ref: UnwrapRef<typeof import('vue')['ref']>
|
|
readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
|
|
readonly runNetworkInstance: UnwrapRef<typeof import('./composables/backend')['runNetworkInstance']>
|
|
readonly saveLastNetworkInstanceId: UnwrapRef<typeof import('./composables/config')['saveLastNetworkInstanceId']>
|
|
readonly saveMode: UnwrapRef<typeof import('./composables/mode')['saveMode']>
|
|
readonly saveNetworkConfig: UnwrapRef<typeof import('./composables/backend')['saveNetworkConfig']>
|
|
readonly sendConfigs: UnwrapRef<typeof import('./composables/backend')['sendConfigs']>
|
|
readonly setActivePinia: UnwrapRef<typeof import('pinia')['setActivePinia']>
|
|
readonly setLoggingLevel: UnwrapRef<typeof import('./composables/backend')['setLoggingLevel']>
|
|
readonly setMapStoreSuffix: UnwrapRef<typeof import('pinia')['setMapStoreSuffix']>
|
|
readonly setServiceStatus: UnwrapRef<typeof import('./composables/backend')['setServiceStatus']>
|
|
readonly setTrayMenu: UnwrapRef<typeof import('./composables/tray')['setTrayMenu']>
|
|
readonly setTrayRunState: UnwrapRef<typeof import('./composables/tray')['setTrayRunState']>
|
|
readonly setTrayTooltip: UnwrapRef<typeof import('./composables/tray')['setTrayTooltip']>
|
|
readonly setTunFd: UnwrapRef<typeof import('./composables/backend')['setTunFd']>
|
|
readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']>
|
|
readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']>
|
|
readonly shallowRef: UnwrapRef<typeof import('vue')['shallowRef']>
|
|
readonly storeToRefs: UnwrapRef<typeof import('pinia')['storeToRefs']>
|
|
readonly syncMobileVpnService: UnwrapRef<typeof import('./composables/mobile_vpn')['syncMobileVpnService']>
|
|
readonly toRaw: UnwrapRef<typeof import('vue')['toRaw']>
|
|
readonly toRef: UnwrapRef<typeof import('vue')['toRef']>
|
|
readonly toRefs: UnwrapRef<typeof import('vue')['toRefs']>
|
|
readonly toValue: UnwrapRef<typeof import('vue')['toValue']>
|
|
readonly triggerRef: UnwrapRef<typeof import('vue')['triggerRef']>
|
|
readonly unref: UnwrapRef<typeof import('vue')['unref']>
|
|
readonly updateNetworkConfigState: UnwrapRef<typeof import('./composables/backend')['updateNetworkConfigState']>
|
|
readonly useAttrs: UnwrapRef<typeof import('vue')['useAttrs']>
|
|
readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']>
|
|
readonly useCssVars: UnwrapRef<typeof import('vue')['useCssVars']>
|
|
readonly useI18n: UnwrapRef<typeof import('vue-i18n')['useI18n']>
|
|
readonly useId: UnwrapRef<typeof import('vue')['useId']>
|
|
readonly useLink: UnwrapRef<typeof import('vue-router/auto')['useLink']>
|
|
readonly useModel: UnwrapRef<typeof import('vue')['useModel']>
|
|
readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']>
|
|
readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']>
|
|
readonly useSlots: UnwrapRef<typeof import('vue')['useSlots']>
|
|
readonly useTemplateRef: UnwrapRef<typeof import('vue')['useTemplateRef']>
|
|
readonly useTray: UnwrapRef<typeof import('./composables/tray')['useTray']>
|
|
readonly validateConfig: UnwrapRef<typeof import('./composables/backend')['validateConfig']>
|
|
readonly watch: UnwrapRef<typeof import('vue')['watch']>
|
|
readonly watchEffect: UnwrapRef<typeof import('vue')['watchEffect']>
|
|
readonly watchPostEffect: UnwrapRef<typeof import('vue')['watchPostEffect']>
|
|
readonly watchSyncEffect: UnwrapRef<typeof import('vue')['watchSyncEffect']>
|
|
}
|
|
} |