mirror of
https://github.com/snltty/linker.git
synced 2025-12-18 17:36:45 +08:00
防火墙
This commit is contained in:
8
.github/workflows/docker.yml
vendored
8
.github/workflows/docker.yml
vendored
@@ -57,9 +57,9 @@ jobs:
|
|||||||
docker tag snltty/linker-musl-x64:latest snltty/linker-musl:amd64 && \
|
docker tag snltty/linker-musl-x64:latest snltty/linker-musl:amd64 && \
|
||||||
docker push snltty/linker-musl:amd64 && \
|
docker push snltty/linker-musl:amd64 && \
|
||||||
docker manifest create snltty/linker-musl:latest snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
|
docker manifest create snltty/linker-musl:latest snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
|
||||||
docker manifest create snltty/linker-musl:v1.7.8 snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
|
docker manifest create snltty/linker-musl:v1.7.9 snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
|
||||||
docker manifest push snltty/linker-musl:latest && \
|
docker manifest push snltty/linker-musl:latest && \
|
||||||
docker manifest push snltty/linker-musl:v1.7.8 && \
|
docker manifest push snltty/linker-musl:v1.7.9 && \
|
||||||
docker pull --platform linux/arm/v7 snltty/linker-debian-arm:latest && \
|
docker pull --platform linux/arm/v7 snltty/linker-debian-arm:latest && \
|
||||||
docker tag snltty/linker-debian-arm:latest snltty/linker-debian:arm && \
|
docker tag snltty/linker-debian-arm:latest snltty/linker-debian:arm && \
|
||||||
docker push snltty/linker-debian:arm && \
|
docker push snltty/linker-debian:arm && \
|
||||||
@@ -70,6 +70,6 @@ jobs:
|
|||||||
docker tag snltty/linker-debian-x64:latest snltty/linker-debian:amd64 && \
|
docker tag snltty/linker-debian-x64:latest snltty/linker-debian:amd64 && \
|
||||||
docker push snltty/linker-debian:amd64 && \
|
docker push snltty/linker-debian:amd64 && \
|
||||||
docker manifest create snltty/linker-debian:latest snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
|
docker manifest create snltty/linker-debian:latest snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
|
||||||
docker manifest create snltty/linker-debian:v1.7.8 snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
|
docker manifest create snltty/linker-debian:v1.7.9 snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
|
||||||
docker manifest push snltty/linker-debian:latest && \
|
docker manifest push snltty/linker-debian:latest && \
|
||||||
docker manifest push snltty/linker-debian:v1.7.8
|
docker manifest push snltty/linker-debian:v1.7.9
|
||||||
26
.github/workflows/dotnet.yml
vendored
26
.github/workflows/dotnet.yml
vendored
@@ -33,11 +33,11 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.ACTIONS_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.ACTIONS_TOKEN }}
|
||||||
with:
|
with:
|
||||||
tag_name: v1.7.8
|
tag_name: v1.7.9
|
||||||
release_name: v1.7.8.${{ steps.date.outputs.today }}
|
release_name: v1.7.9.${{ steps.date.outputs.today }}
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
body: "1. 一些累计更新\r\n2. socks5网段映射,请更新所有设备\r\n3. 修复优化入参调用\r\n4. 增加登入在线续期\r\n5. 增加虚拟网卡在线检查,IP冲突检查,抢占IP时更新映射表\r\n6. 如果你设备很多,请尝试升级其中一个成功重启后再升级其它"
|
body: "1. 一些累计更新\r\n2. 优化安卓APP\r\n3. 新增防火墙,用于网卡、端口转发、和socks5\r\n4. 检测密钥是否正确\r\n5. 如果你设备很多,请尝试升级其中一个成功重启后再升级其它"
|
||||||
- name: publish projects
|
- name: publish projects
|
||||||
run: ./publish.bat "C:\\Android\\android-sdk"
|
run: ./publish.bat "C:\\Android\\android-sdk"
|
||||||
- name: upload-win-x86-oss
|
- name: upload-win-x86-oss
|
||||||
@@ -49,7 +49,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-zip/linker-win-x86.zip
|
asset-path: ./public/publish-zip/linker-win-x86.zip
|
||||||
target-path: /downloads/linker/v1.7.8/linker-win-x86.zip
|
target-path: /downloads/linker/v1.7.9/linker-win-x86.zip
|
||||||
- name: upload-win-x86
|
- name: upload-win-x86
|
||||||
id: upload-win-x86
|
id: upload-win-x86
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -69,7 +69,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-zip/linker-win-x64.zip
|
asset-path: ./public/publish-zip/linker-win-x64.zip
|
||||||
target-path: /downloads/linker/v1.7.8/linker-win-x64.zip
|
target-path: /downloads/linker/v1.7.9/linker-win-x64.zip
|
||||||
- name: upload-win-x64
|
- name: upload-win-x64
|
||||||
id: upload-win-x64
|
id: upload-win-x64
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -89,7 +89,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-zip/linker-win-arm64.zip
|
asset-path: ./public/publish-zip/linker-win-arm64.zip
|
||||||
target-path: /downloads/linker/v1.7.8/linker-win-arm64.zip
|
target-path: /downloads/linker/v1.7.9/linker-win-arm64.zip
|
||||||
- name: upload-win-arm64
|
- name: upload-win-arm64
|
||||||
id: upload-win-arm64
|
id: upload-win-arm64
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -109,7 +109,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-zip/linker-linux-x64.zip
|
asset-path: ./public/publish-zip/linker-linux-x64.zip
|
||||||
target-path: /downloads/linker/v1.7.8/linker-linux-x64.zip
|
target-path: /downloads/linker/v1.7.9/linker-linux-x64.zip
|
||||||
- name: upload-linux-x64
|
- name: upload-linux-x64
|
||||||
id: upload-linux-x64
|
id: upload-linux-x64
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -129,7 +129,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-zip/linker-linux-arm.zip
|
asset-path: ./public/publish-zip/linker-linux-arm.zip
|
||||||
target-path: /downloads/linker/v1.7.8/linker-linux-arm.zip
|
target-path: /downloads/linker/v1.7.9/linker-linux-arm.zip
|
||||||
- name: upload-linux-arm
|
- name: upload-linux-arm
|
||||||
id: upload-linux-arm
|
id: upload-linux-arm
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -149,7 +149,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-zip/linker-linux-arm64.zip
|
asset-path: ./public/publish-zip/linker-linux-arm64.zip
|
||||||
target-path: /downloads/linker/v1.7.8/linker-linux-arm64.zip
|
target-path: /downloads/linker/v1.7.9/linker-linux-arm64.zip
|
||||||
- name: upload-linux-arm64
|
- name: upload-linux-arm64
|
||||||
id: upload-linux-arm64
|
id: upload-linux-arm64
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -169,7 +169,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-zip/linker-linux-musl-x64.zip
|
asset-path: ./public/publish-zip/linker-linux-musl-x64.zip
|
||||||
target-path: /downloads/linker/v1.7.8/linker-linux-musl-x64.zip
|
target-path: /downloads/linker/v1.7.9/linker-linux-musl-x64.zip
|
||||||
- name: upload-linux-musl-x64
|
- name: upload-linux-musl-x64
|
||||||
id: upload-linux-musl-x64
|
id: upload-linux-musl-x64
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -189,7 +189,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-zip/linker-linux-musl-arm.zip
|
asset-path: ./public/publish-zip/linker-linux-musl-arm.zip
|
||||||
target-path: /downloads/linker/v1.7.8/linker-linux-musl-arm.zip
|
target-path: /downloads/linker/v1.7.9/linker-linux-musl-arm.zip
|
||||||
- name: upload-linux-musl-arm
|
- name: upload-linux-musl-arm
|
||||||
id: upload-linux-musl-arm
|
id: upload-linux-musl-arm
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -209,7 +209,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-zip/linker-linux-musl-arm64.zip
|
asset-path: ./public/publish-zip/linker-linux-musl-arm64.zip
|
||||||
target-path: /downloads/linker/v1.7.8/linker-linux-musl-arm64.zip
|
target-path: /downloads/linker/v1.7.9/linker-linux-musl-arm64.zip
|
||||||
- name: upload-linux-musl-arm64
|
- name: upload-linux-musl-arm64
|
||||||
id: upload-linux-musl-arm64
|
id: upload-linux-musl-arm64
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -259,7 +259,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-zip/linker.apk
|
asset-path: ./public/publish-zip/linker.apk
|
||||||
target-path: /downloads/linker/v1.7.8/linker.apk
|
target-path: /downloads/linker/v1.7.9/linker.apk
|
||||||
- name: upload-apk
|
- name: upload-apk
|
||||||
id: upload-apk
|
id: upload-apk
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
|
|||||||
6
.github/workflows/ipk.yml
vendored
6
.github/workflows/ipk.yml
vendored
@@ -44,7 +44,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-ipk/x64/linker-x64.ipk
|
asset-path: ./public/publish-ipk/x64/linker-x64.ipk
|
||||||
target-path: /downloads/linker/v1.7.8/linker-x64.ipk
|
target-path: /downloads/linker/v1.7.9/linker-x64.ipk
|
||||||
- name: upload-x64
|
- name: upload-x64
|
||||||
id: upload-x64
|
id: upload-x64
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -64,7 +64,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-ipk/arm/linker-arm.ipk
|
asset-path: ./public/publish-ipk/arm/linker-arm.ipk
|
||||||
target-path: /downloads/linker/v1.7.8/linker-arm.ipk
|
target-path: /downloads/linker/v1.7.9/linker-arm.ipk
|
||||||
- name: upload-arm
|
- name: upload-arm
|
||||||
id: upload-arm
|
id: upload-arm
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
@@ -84,7 +84,7 @@ jobs:
|
|||||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||||
bucket: ide-qbcode
|
bucket: ide-qbcode
|
||||||
asset-path: ./public/publish-ipk/arm64/linker-arm64.ipk
|
asset-path: ./public/publish-ipk/arm64/linker-arm64.ipk
|
||||||
target-path: /downloads/linker/v1.7.8/linker-arm64.ipk
|
target-path: /downloads/linker/v1.7.9/linker-arm64.ipk
|
||||||
- name: upload-arm64
|
- name: upload-arm64
|
||||||
id: upload-arm64
|
id: upload-arm64
|
||||||
uses: actions/upload-release-asset@master
|
uses: actions/upload-release-asset@master
|
||||||
|
|||||||
56
.github/workflows/nuget.yml
vendored
56
.github/workflows/nuget.yml
vendored
@@ -83,31 +83,31 @@ jobs:
|
|||||||
|
|
||||||
- name: Push
|
- name: Push
|
||||||
run: |
|
run: |
|
||||||
dotnet nuget push ./src/linker.libs/bin/release/linker.libs.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.libs/bin/release/linker.libs.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger/bin/release/linker.messenger.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger/bin/release/linker.messenger.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.access/bin/release/linker.messenger.access.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.access/bin/release/linker.messenger.access.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.action/bin/release/linker.messenger.action.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.action/bin/release/linker.messenger.action.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.api/bin/release/linker.messenger.api.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.api/bin/release/linker.messenger.api.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.channel/bin/release/linker.messenger.channel.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.channel/bin/release/linker.messenger.channel.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.decenter/bin/release/linker.messenger.decenter.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.decenter/bin/release/linker.messenger.decenter.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.entry/bin/release/linker.messenger.entry.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.entry/bin/release/linker.messenger.entry.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.exroute/bin/release/linker.messenger.exroute.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.exroute/bin/release/linker.messenger.exroute.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.flow/bin/release/linker.messenger.flow.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.flow/bin/release/linker.messenger.flow.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.forward/bin/release/linker.messenger.forward.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.forward/bin/release/linker.messenger.forward.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.listen/bin/release/linker.messenger.listen.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.listen/bin/release/linker.messenger.listen.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.logger/bin/release/linker.messenger.logger.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.logger/bin/release/linker.messenger.logger.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.pcp/bin/release/linker.messenger.pcp.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.pcp/bin/release/linker.messenger.pcp.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.plan/bin/release/linker.messenger.plan.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.plan/bin/release/linker.messenger.plan.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.relay/bin/release/linker.messenger.relay.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.relay/bin/release/linker.messenger.relay.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.serializer.memorypack/bin/release/linker.messenger.serializer.memorypack.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.serializer.memorypack/bin/release/linker.messenger.serializer.memorypack.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.sforward/bin/release/linker.messenger.sforward.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.sforward/bin/release/linker.messenger.sforward.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.signin/bin/release/linker.messenger.signin.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.signin/bin/release/linker.messenger.signin.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.socks5/bin/release/linker.messenger.socks5.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.socks5/bin/release/linker.messenger.socks5.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.store.file/bin/release/linker.messenger.store.file.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.store.file/bin/release/linker.messenger.store.file.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.sync/bin/release/linker.messenger.sync.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.sync/bin/release/linker.messenger.sync.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.tunnel/bin/release/linker.messenger.tunnel.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.tunnel/bin/release/linker.messenger.tunnel.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.tuntap/bin/release/linker.messenger.tuntap.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.tuntap/bin/release/linker.messenger.tuntap.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.messenger.updater/bin/release/linker.messenger.updater.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.messenger.updater/bin/release/linker.messenger.updater.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.tun/bin/release/linker.tun.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.tun/bin/release/linker.tun.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.snat/bin/release/linker.snat.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.snat/bin/release/linker.snat.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
dotnet nuget push ./src/linker.tunnel/bin/release/linker.tunnel.1.7.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
dotnet nuget push ./src/linker.tunnel/bin/release/linker.tunnel.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||||
|
|||||||
BIN
ipk/libs/arm64/usr/lib/libstdc++.so.6.0.29
Normal file
BIN
ipk/libs/arm64/usr/lib/libstdc++.so.6.0.29
Normal file
Binary file not shown.
61
ipk/libs/arm64/usr/lib/libstdc++.so.6.0.29-gdb.py
Normal file
61
ipk/libs/arm64/usr/lib/libstdc++.so.6.0.29-gdb.py
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# -*- python -*-
|
||||||
|
# Copyright (C) 2009-2017 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import gdb
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
|
||||||
|
pythondir = '/home/lean/Desktop/qsdk12-ng/staging_dir/toolchain-aarch64_cortex-a53_gcc-7.5.0_musl/share/gcc-7.5.0/python'
|
||||||
|
libdir = '/home/lean/Desktop/qsdk12-ng/staging_dir/toolchain-aarch64_cortex-a53_gcc-7.5.0_musl/aarch64-openwrt-linux-musl/lib'
|
||||||
|
|
||||||
|
# This file might be loaded when there is no current objfile. This
|
||||||
|
# can happen if the user loads it manually. In this case we don't
|
||||||
|
# update sys.path; instead we just hope the user managed to do that
|
||||||
|
# beforehand.
|
||||||
|
if gdb.current_objfile () is not None:
|
||||||
|
# Update module path. We want to find the relative path from libdir
|
||||||
|
# to pythondir, and then we want to apply that relative path to the
|
||||||
|
# directory holding the objfile with which this file is associated.
|
||||||
|
# This preserves relocatability of the gcc tree.
|
||||||
|
|
||||||
|
# Do a simple normalization that removes duplicate separators.
|
||||||
|
pythondir = os.path.normpath (pythondir)
|
||||||
|
libdir = os.path.normpath (libdir)
|
||||||
|
|
||||||
|
prefix = os.path.commonprefix ([libdir, pythondir])
|
||||||
|
# In some bizarre configuration we might have found a match in the
|
||||||
|
# middle of a directory name.
|
||||||
|
if prefix[-1] != '/':
|
||||||
|
prefix = os.path.dirname (prefix) + '/'
|
||||||
|
|
||||||
|
# Strip off the prefix.
|
||||||
|
pythondir = pythondir[len (prefix):]
|
||||||
|
libdir = libdir[len (prefix):]
|
||||||
|
|
||||||
|
# Compute the ".."s needed to get from libdir to the prefix.
|
||||||
|
dotdots = ('..' + os.sep) * len (libdir.split (os.sep))
|
||||||
|
|
||||||
|
objfile = gdb.current_objfile ().filename
|
||||||
|
dir_ = os.path.join (os.path.dirname (objfile), dotdots, pythondir)
|
||||||
|
|
||||||
|
if not dir_ in sys.path:
|
||||||
|
sys.path.insert(0, dir_)
|
||||||
|
|
||||||
|
# Call a function as a plain import would not execute body of the included file
|
||||||
|
# on repeated reloads of this object file.
|
||||||
|
from libstdcxx.v6 import register_libstdcxx_printers
|
||||||
|
register_libstdcxx_printers(gdb.current_objfile())
|
||||||
@@ -33,16 +33,16 @@ do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
cd public/publish/docker/linux-${p}-x64/${f}
|
cd public/publish/docker/linux-${p}-x64/${f}
|
||||||
docker buildx build -f ${target}/public/publish/docker/linux-${p}-x64/${f}/Dockerfile-${p} --platform="linux/x86_64" --force-rm -t "${image}-${p}-x64:latest" -t "${image}-${p}-x64:v1.7.8" . --push
|
docker buildx build -f ${target}/public/publish/docker/linux-${p}-x64/${f}/Dockerfile-${p} --platform="linux/x86_64" --force-rm -t "${image}-${p}-x64:latest" -t "${image}-${p}-x64:v1.7.9" . --push
|
||||||
cd ../../../../../
|
cd ../../../../../
|
||||||
|
|
||||||
|
|
||||||
cd public/publish/docker/linux-${p}-arm64/${f}
|
cd public/publish/docker/linux-${p}-arm64/${f}
|
||||||
docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm64/${f}/Dockerfile-${p} --platform="linux/arm64" --force-rm -t "${image}-${p}-arm64:latest" -t "${image}-${p}-arm64:v1.7.8" . --push
|
docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm64/${f}/Dockerfile-${p} --platform="linux/arm64" --force-rm -t "${image}-${p}-arm64:latest" -t "${image}-${p}-arm64:v1.7.9" . --push
|
||||||
cd ../../../../../
|
cd ../../../../../
|
||||||
|
|
||||||
cd public/publish/docker/linux-${p}-arm/${f}
|
cd public/publish/docker/linux-${p}-arm/${f}
|
||||||
docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm/${f}/Dockerfile-${p} --platform="linux/arm/v7" --force-rm -t "${image}-${p}-arm:latest" -t "${image}-${p}-arm:v1.7.8" . --push
|
docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm/${f}/Dockerfile-${p} --platform="linux/arm/v7" --force-rm -t "${image}-${p}-arm:latest" -t "${image}-${p}-arm:v1.7.9" . --push
|
||||||
cd ../../../../../
|
cd ../../../../../
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
@@ -22,7 +22,7 @@ do
|
|||||||
mkdir -p public/publish-ipk/${r}/data/usr/bin/linker
|
mkdir -p public/publish-ipk/${r}/data/usr/bin/linker
|
||||||
cp -rf public/publish/${r}/* public/publish-ipk/${r}/data/usr/bin/linker/
|
cp -rf public/publish/${r}/* public/publish-ipk/${r}/data/usr/bin/linker/
|
||||||
|
|
||||||
sed -i "s|{version}|1.7.8|g" public/publish-ipk/${r}/control/control
|
sed -i "s|{version}|1.7.9|g" public/publish-ipk/${r}/control/control
|
||||||
sed -i 's/\r$//' public/publish-ipk/${r}/data/etc/init.d/linker
|
sed -i 's/\r$//' public/publish-ipk/${r}/data/etc/init.d/linker
|
||||||
sed -i 's/\r$//' public/publish-ipk/${r}/control/control
|
sed -i 's/\r$//' public/publish-ipk/${r}/control/control
|
||||||
sed -i 's/\r$//' public/publish-ipk/${r}/control/postinst
|
sed -i 's/\r$//' public/publish-ipk/${r}/control/postinst
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ using Android.Net;
|
|||||||
using Android.OS;
|
using Android.OS;
|
||||||
using Android.Views;
|
using Android.Views;
|
||||||
using AndroidX.Core.App;
|
using AndroidX.Core.App;
|
||||||
using AndroidX.Core.Content;
|
|
||||||
using AndroidX.Core.View;
|
using AndroidX.Core.View;
|
||||||
using Java.IO;
|
using Java.IO;
|
||||||
using linker.app.Services;
|
using linker.app.Services;
|
||||||
@@ -21,7 +20,6 @@ using linker.tunnel.connection;
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace linker.app
|
namespace linker.app
|
||||||
@@ -29,7 +27,6 @@ namespace linker.app
|
|||||||
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
|
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
|
||||||
public class MainActivity : MauiAppCompatActivity
|
public class MainActivity : MauiAppCompatActivity
|
||||||
{
|
{
|
||||||
public const int VPN_RESULT_CODE = 0x0F;
|
|
||||||
Intent intent;
|
Intent intent;
|
||||||
|
|
||||||
protected override void OnCreate(Bundle savedInstanceState)
|
protected override void OnCreate(Bundle savedInstanceState)
|
||||||
@@ -37,7 +34,9 @@ namespace linker.app
|
|||||||
SetLightStatusBar();
|
SetLightStatusBar();
|
||||||
|
|
||||||
base.OnCreate(savedInstanceState);
|
base.OnCreate(savedInstanceState);
|
||||||
ConfigureVpn();
|
|
||||||
|
intent = new Intent(this, typeof(ForegroundService));
|
||||||
|
StartForegroundService(intent);
|
||||||
}
|
}
|
||||||
public void SetLightStatusBar()
|
public void SetLightStatusBar()
|
||||||
{
|
{
|
||||||
@@ -57,11 +56,6 @@ namespace linker.app
|
|||||||
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
|
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
|
||||||
{
|
{
|
||||||
base.OnActivityResult(requestCode, resultCode, data);
|
base.OnActivityResult(requestCode, resultCode, data);
|
||||||
if (requestCode == VPN_RESULT_CODE && resultCode == Result.Ok)
|
|
||||||
{
|
|
||||||
intent = new Intent(this, typeof(ForegroundService));
|
|
||||||
StartForegroundService(intent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
protected override void OnStart()
|
protected override void OnStart()
|
||||||
{
|
{
|
||||||
@@ -71,23 +65,6 @@ namespace linker.app
|
|||||||
{
|
{
|
||||||
base.OnDestroy();
|
base.OnDestroy();
|
||||||
}
|
}
|
||||||
private void ConfigureVpn()
|
|
||||||
{
|
|
||||||
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.BindVpnService) != Permission.Granted)
|
|
||||||
{
|
|
||||||
ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.BindVpnService }, 0);
|
|
||||||
}
|
|
||||||
var intent = VpnService.Prepare(this);
|
|
||||||
if (intent != null)
|
|
||||||
{
|
|
||||||
StartActivityForResult(intent, VPN_RESULT_CODE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
OnActivityResult(VPN_RESULT_CODE, Result.Ok, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -126,7 +103,7 @@ namespace linker.app
|
|||||||
public override void OnDestroy()
|
public override void OnDestroy()
|
||||||
{
|
{
|
||||||
base.OnDestroy();
|
base.OnDestroy();
|
||||||
tuntapTransfer.Shutdown(false);
|
tuntapTransfer.Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Callback(LinkerTunDevicPacket packet)
|
public async Task Callback(LinkerTunDevicPacket packet)
|
||||||
@@ -193,9 +170,7 @@ namespace linker.app
|
|||||||
StartForeground(SERVICE_ID, CreateNotification());
|
StartForeground(SERVICE_ID, CreateNotification());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return StartCommandResult.NotSticky;
|
||||||
|
|
||||||
return StartCommandResult.Sticky;
|
|
||||||
}
|
}
|
||||||
private Notification CreateNotification()
|
private Notification CreateNotification()
|
||||||
{
|
{
|
||||||
@@ -261,9 +236,30 @@ namespace linker.app
|
|||||||
TuntapTransfer tuntapTransfer = LinkerMessengerEntry.GetService<TuntapTransfer>();
|
TuntapTransfer tuntapTransfer = LinkerMessengerEntry.GetService<TuntapTransfer>();
|
||||||
tuntapTransfer.OnSetupBefore += () =>
|
tuntapTransfer.OnSetupBefore += () =>
|
||||||
{
|
{
|
||||||
vpnIntent = new Intent(Android.App.Application.Context, typeof(VpnServiceLinker));
|
try
|
||||||
Android.App.Application.Context.StartService(vpnIntent);
|
{
|
||||||
Task.Delay(3000).Wait();
|
Intent intent = VpnService.Prepare(Android.App.Application.Context);
|
||||||
|
if (intent != null)
|
||||||
|
{
|
||||||
|
intent.AddFlags(ActivityFlags.NewTask);
|
||||||
|
StartActivity(intent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
vpnIntent = new Intent(Android.App.Application.Context, typeof(VpnServiceLinker));
|
||||||
|
Android.App.Application.Context.StartService(vpnIntent);
|
||||||
|
Task.Delay(3000).Wait();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
}
|
||||||
};
|
};
|
||||||
tuntapTransfer.OnShutdownBefore += () =>
|
tuntapTransfer.OnShutdownBefore += () =>
|
||||||
{
|
{
|
||||||
@@ -318,6 +314,7 @@ namespace linker.app
|
|||||||
{
|
{
|
||||||
error = string.Empty;
|
error = string.Empty;
|
||||||
if (address.Equals(IPAddress.Any)) return false;
|
if (address.Equals(IPAddress.Any)) return false;
|
||||||
|
if (vpnService == null) return false;
|
||||||
|
|
||||||
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@@ -484,7 +481,7 @@ namespace linker.app
|
|||||||
public byte[] Read(string root, string fileName, out DateTime lastModified)
|
public byte[] Read(string root, string fileName, out DateTime lastModified)
|
||||||
{
|
{
|
||||||
lastModified = DateTime.Now;
|
lastModified = DateTime.Now;
|
||||||
fileName = Path.Join("public/web", fileName);
|
fileName = System.IO.Path.Join("public/web", fileName);
|
||||||
using Stream fileStream = FileSystem.Current.OpenAppPackageFileAsync(fileName).Result;
|
using Stream fileStream = FileSystem.Current.OpenAppPackageFileAsync(fileName).Result;
|
||||||
using MemoryStream memoryStream = new MemoryStream();
|
using MemoryStream memoryStream = new MemoryStream();
|
||||||
fileStream.CopyTo(memoryStream);
|
fileStream.CopyTo(memoryStream);
|
||||||
@@ -519,7 +516,7 @@ namespace linker.app
|
|||||||
}
|
}
|
||||||
public override (string, string) DownloadUrlAndSavePath(string version)
|
public override (string, string) DownloadUrlAndSavePath(string version)
|
||||||
{
|
{
|
||||||
return ($"{updaterCommonTransfer.UpdateUrl}/{version}/linker.apk", Path.Join(FileSystem.Current.AppDataDirectory, "linker.apk"));
|
return ($"{updaterCommonTransfer.UpdateUrl}/{version}/linker.apk", System.IO.Path.Join(FileSystem.Current.AppDataDirectory, "linker.apk"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task Install(Action<long, long> processs)
|
public override async Task Install(Action<long, long> processs)
|
||||||
@@ -540,7 +537,7 @@ namespace linker.app
|
|||||||
{
|
{
|
||||||
await MainThread.InvokeOnMainThreadAsync(() =>
|
await MainThread.InvokeOnMainThreadAsync(() =>
|
||||||
{
|
{
|
||||||
var file = new Java.IO.File(Path.Join(FileSystem.Current.AppDataDirectory, "linker.apk"));
|
var file = new Java.IO.File(System.IO.Path.Join(FileSystem.Current.AppDataDirectory, "linker.apk"));
|
||||||
|
|
||||||
if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
|
if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
<ApplicationId>com.snltty.linker.app</ApplicationId>
|
<ApplicationId>com.snltty.linker.app</ApplicationId>
|
||||||
|
|
||||||
<Title>linker.app</Title>
|
<Title>linker.app</Title>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<Authors>snltty</Authors>
|
<Authors>snltty</Authors>
|
||||||
<Company>snltty</Company>
|
<Company>snltty</Company>
|
||||||
<Copyright>snltty</Copyright>
|
<Copyright>snltty</Copyright>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
<PackageReleaseNotes>linker</PackageReleaseNotes>
|
<PackageReleaseNotes>linker</PackageReleaseNotes>
|
||||||
|
|
||||||
<!-- Versions -->
|
<!-- Versions -->
|
||||||
<ApplicationDisplayVersion>1.7.8</ApplicationDisplayVersion>
|
<ApplicationDisplayVersion>1.7.9</ApplicationDisplayVersion>
|
||||||
<ApplicationVersion>1</ApplicationVersion>
|
<ApplicationVersion>1</ApplicationVersion>
|
||||||
|
|
||||||
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
|
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
|
||||||
|
|||||||
@@ -8,8 +8,12 @@ namespace linker.libs
|
|||||||
{
|
{
|
||||||
public sealed class IPAddessCidrManager<T>
|
public sealed class IPAddessCidrManager<T>
|
||||||
{
|
{
|
||||||
private readonly ConcurrentDictionary<uint, T> ip2value = new ConcurrentDictionary<uint, T>();
|
private readonly ConcurrentDictionary<uint, CidrAddInfo<T>> ip2value = new ConcurrentDictionary<uint, CidrAddInfo<T>>();
|
||||||
|
private readonly ConcurrentDictionary<string, T> routes = new ConcurrentDictionary<string, T>();
|
||||||
private HashSet<uint> masks = new HashSet<uint>();
|
private HashSet<uint> masks = new HashSet<uint>();
|
||||||
|
|
||||||
|
public Dictionary<string, T> Routes => routes.ToDictionary();
|
||||||
|
|
||||||
public void Add(CidrAddInfo<T>[] items)
|
public void Add(CidrAddInfo<T>[] items)
|
||||||
{
|
{
|
||||||
foreach (CidrAddInfo<T> item in items)
|
foreach (CidrAddInfo<T> item in items)
|
||||||
@@ -21,20 +25,23 @@ namespace linker.libs
|
|||||||
{
|
{
|
||||||
uint maskValue = NetworkHelper.ToPrefixValue(item.PrefixLength);
|
uint maskValue = NetworkHelper.ToPrefixValue(item.PrefixLength);
|
||||||
uint network = item.IPAddress & maskValue;
|
uint network = item.IPAddress & maskValue;
|
||||||
ip2value.AddOrUpdate(network, item.Value, (a, b) => item.Value);
|
ip2value.AddOrUpdate(network, item, (a, b) => item);
|
||||||
|
routes.AddOrUpdate($"{NetworkHelper.ToIP(item.IPAddress)}/{item.PrefixLength}", item.Value, (a, b) => item.Value);
|
||||||
masks.Add(maskValue);
|
masks.Add(maskValue);
|
||||||
}
|
}
|
||||||
public void Delete(T value, Func<T, T, bool> compare)
|
public void Delete(T value, Func<T, T, bool> compare)
|
||||||
{
|
{
|
||||||
foreach (var item in ip2value.Where(c => compare(c.Value, value)).ToList())
|
foreach (var item in ip2value.Where(c => compare(c.Value.Value, value)).ToList())
|
||||||
{
|
{
|
||||||
ip2value.TryRemove(item.Key, out _);
|
ip2value.TryRemove(item.Key, out _);
|
||||||
|
routes.TryRemove($"{NetworkHelper.ToIP(item.Value.IPAddress)}/{item.Value.PrefixLength}", out _);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
ip2value.Clear();
|
ip2value.Clear();
|
||||||
|
routes.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool FindValue(IPAddress ip, out T value)
|
public bool FindValue(IPAddress ip, out T value)
|
||||||
@@ -43,15 +50,18 @@ namespace linker.libs
|
|||||||
}
|
}
|
||||||
public bool FindValue(uint ip, out T value)
|
public bool FindValue(uint ip, out T value)
|
||||||
{
|
{
|
||||||
if (ip2value.TryGetValue(ip, out value))
|
value = default;
|
||||||
|
if (ip2value.TryGetValue(ip, out CidrAddInfo<T> item))
|
||||||
{
|
{
|
||||||
|
value = item.Value;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
foreach (var item in masks)
|
foreach (var mask in masks)
|
||||||
{
|
{
|
||||||
uint network = ip & item;
|
uint network = ip & mask;
|
||||||
if (ip2value.TryGetValue(network, out value))
|
if (ip2value.TryGetValue(network, out item))
|
||||||
{
|
{
|
||||||
|
value = item.Value;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
<Copyright>snltty</Copyright>
|
<Copyright>snltty</Copyright>
|
||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger api access</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger api access</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger api action</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger api action</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -140,9 +140,9 @@
|
|||||||
RelayCdkey = (ulong)1 << 43,
|
RelayCdkey = (ulong)1 << 43,
|
||||||
|
|
||||||
[AccessDisplay("管理本机防火墙")]
|
[AccessDisplay("管理本机防火墙")]
|
||||||
FirewallSelf = 1 << 44,
|
FirewallSelf = (ulong)1 << 44,
|
||||||
[AccessDisplay("管理所有设备防火墙")]
|
[AccessDisplay("管理所有设备防火墙")]
|
||||||
FirewallOther = 1 << 45,
|
FirewallOther = (ulong)1 << 45,
|
||||||
|
|
||||||
Full = ulong.MaxValue >> 64 - 52,
|
Full = ulong.MaxValue >> 64 - 52,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger api</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger api</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger channel</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger channel</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger decenter</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger decenter</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger entry</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger entry</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger exroute</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger exroute</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -30,15 +30,16 @@ namespace linker.messenger.firewall
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="param"></param>
|
/// <param name="param"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<List<FirewallRuleInfo>> Get(ApiControllerParamsInfo param)
|
public async Task<FirewallListInfo> Get(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
FirewallSearchForwardInfo info = param.Content.DeJson<FirewallSearchForwardInfo>();
|
FirewallSearchForwardInfo info = param.Content.DeJson<FirewallSearchForwardInfo>();
|
||||||
|
info.Data.GroupId = signInClientStore.Group.Id;
|
||||||
if (info.MachineId == signInClientStore.Id)
|
if (info.MachineId == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
if (accessStore.HasAccess(AccessValue.FirewallSelf) == false) return new List<FirewallRuleInfo>();
|
if (accessStore.HasAccess(AccessValue.FirewallSelf) == false) return new FirewallListInfo();
|
||||||
return firewallTransfer.Get(info.Data).ToList();
|
return firewallTransfer.Get(info.Data);
|
||||||
}
|
}
|
||||||
if (accessStore.HasAccess(AccessValue.FirewallOther) == false) return new List<FirewallRuleInfo>();
|
if (accessStore.HasAccess(AccessValue.FirewallOther) == false) return new FirewallListInfo ();
|
||||||
|
|
||||||
var resp = await messengerSender.SendReply(new MessageRequestWrap
|
var resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
@@ -48,9 +49,9 @@ namespace linker.messenger.firewall
|
|||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
if (resp.Code == MessageResponeCodes.OK)
|
if (resp.Code == MessageResponeCodes.OK)
|
||||||
{
|
{
|
||||||
return serializer.Deserialize<List<FirewallRuleInfo>>(resp.Data.Span);
|
return serializer.Deserialize<FirewallListInfo>(resp.Data.Span);
|
||||||
}
|
}
|
||||||
return new List<FirewallRuleInfo>();
|
return new FirewallListInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -47,6 +47,10 @@ namespace linker.messenger.firewall
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
connection.Write(serializer.Serialize(new FirewallListInfo()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加对端的记录
|
/// 添加对端的记录
|
||||||
|
|||||||
@@ -36,9 +36,13 @@ namespace linker.messenger.firewall
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<FirewallRuleInfo> Get(FirewallSearchInfo info)
|
public FirewallListInfo Get(FirewallSearchInfo info)
|
||||||
{
|
{
|
||||||
return firewallClientStore.GetAll(info);
|
return new FirewallListInfo
|
||||||
|
{
|
||||||
|
List = firewallClientStore.GetAll(info).ToList(),
|
||||||
|
State = firewallClientStore.State
|
||||||
|
};
|
||||||
}
|
}
|
||||||
public bool Add(FirewallRuleInfo info)
|
public bool Add(FirewallRuleInfo info)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ namespace linker.messenger.firewall
|
|||||||
public string SrcName { get; set; }
|
public string SrcName { get; set; }
|
||||||
public bool Disabled { get; set; }
|
public bool Disabled { get; set; }
|
||||||
public int OrderBy { get; set; }
|
public int OrderBy { get; set; }
|
||||||
|
public string Remark { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -31,14 +32,16 @@ namespace linker.messenger.firewall
|
|||||||
public sealed partial class FirewallSearchInfo
|
public sealed partial class FirewallSearchInfo
|
||||||
{
|
{
|
||||||
public string GroupId { get; set; }
|
public string GroupId { get; set; }
|
||||||
public string SrcName { get; set; }
|
public string Str { get; set; }
|
||||||
public bool Disabled { get; set; }
|
public int Disabled { get; set; }
|
||||||
public string DstCidr { get; set; }
|
|
||||||
public string DstPort { get; set; }
|
|
||||||
public LinkerFirewallProtocolType Protocol { get; set; }
|
public LinkerFirewallProtocolType Protocol { get; set; }
|
||||||
public LinkerFirewallAction Action { get; set; }
|
public LinkerFirewallAction Action { get; set; }
|
||||||
}
|
}
|
||||||
|
public sealed partial class FirewallListInfo
|
||||||
|
{
|
||||||
|
public LinkerFirewallState State { get; set; } = LinkerFirewallState.Disabled;
|
||||||
|
public List<FirewallRuleInfo> List { get; set; } = new List<FirewallRuleInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
public sealed partial class FirewallAddForwardInfo
|
public sealed partial class FirewallAddForwardInfo
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger firewall</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger firewall</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -59,6 +59,13 @@ namespace linker.messenger.flow
|
|||||||
{
|
{
|
||||||
onlineFlowInfo.Nets = serializer.Deserialize<List<FlowReportNetInfo>>(memory.Slice(8).Span);
|
onlineFlowInfo.Nets = serializer.Deserialize<List<FlowReportNetInfo>>(memory.Slice(8).Span);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long online = (long)servers.Where(c => time - c.Value.Time < 15000).Sum(c => c.Value.Online) << 32;
|
||||||
|
long total = servers.Where(c => time - c.Value.Time < 15000).Sum(c => c.Value.Total);
|
||||||
|
|
||||||
|
ReceiveBytes = online | total;
|
||||||
|
SendtBytes = servers.Count(c => time - c.Value.Time < 15000);
|
||||||
|
Version.Increment();
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
@@ -71,7 +78,7 @@ namespace linker.messenger.flow
|
|||||||
public string GetItems() => string.Empty;
|
public string GetItems() => string.Empty;
|
||||||
public void SetItems(string json) { }
|
public void SetItems(string json) { }
|
||||||
public void SetBytes(long receiveBytes, long sendtBytes) { }
|
public void SetBytes(long receiveBytes, long sendtBytes) { }
|
||||||
public void Clear() { }
|
public void Clear() { }
|
||||||
|
|
||||||
|
|
||||||
public List<FlowReportNetInfo> GetCitys()
|
public List<FlowReportNetInfo> GetCitys()
|
||||||
@@ -91,7 +98,6 @@ namespace linker.messenger.flow
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Counter();
|
|
||||||
Report();
|
Report();
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
@@ -99,23 +105,6 @@ namespace linker.messenger.flow
|
|||||||
}
|
}
|
||||||
}, 5000);
|
}, 5000);
|
||||||
}
|
}
|
||||||
private void Counter()
|
|
||||||
{
|
|
||||||
long time = Environment.TickCount64;
|
|
||||||
List<IPAddress> keys = servers.Where(c => time - c.Value.Time > 15000).Select(c => c.Key).ToList();
|
|
||||||
|
|
||||||
foreach (IPAddress key in keys)
|
|
||||||
{
|
|
||||||
servers.TryRemove(key, out _);
|
|
||||||
}
|
|
||||||
|
|
||||||
long online = (long)servers.Sum(c => c.Value.Online) << 32;
|
|
||||||
long total = servers.Sum(c => c.Value.Total);
|
|
||||||
|
|
||||||
ReceiveBytes = online | total;
|
|
||||||
SendtBytes = servers.Count;
|
|
||||||
Version.Increment();
|
|
||||||
}
|
|
||||||
private void Report()
|
private void Report()
|
||||||
{
|
{
|
||||||
List<FlowReportNetInfo> nets = signCaching.Get().Where(c => c.Args.ContainsKey("tunnelNet")).Select(c => c.Args["tunnelNet"].DeJson<SignInArgsNetInfo>()).GroupBy(c => c.City).Select(c => new FlowReportNetInfo
|
List<FlowReportNetInfo> nets = signCaching.Get().Where(c => c.Args.ContainsKey("tunnelNet")).Select(c => c.Args["tunnelNet"].DeJson<SignInArgsNetInfo>()).GroupBy(c => c.City).Select(c => new FlowReportNetInfo
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger flow</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger flow</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger forward</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger forward</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
@@ -41,6 +41,7 @@
|
|||||||
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.channel\linker.messenger.channel.csproj" />
|
<ProjectReference Include="..\linker.messenger.channel\linker.messenger.channel.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
|
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.firewall\linker.messenger.firewall.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -218,6 +218,11 @@ namespace linker.messenger.forward.proxy
|
|||||||
{
|
{
|
||||||
if (token.Proxy.TargetEP == null) return;
|
if (token.Proxy.TargetEP == null) return;
|
||||||
|
|
||||||
|
if(linkerFirewall.Check(token.Connection.RemoteMachineId, token.Proxy.TargetEP, ProtocolType.Tcp) == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Socket socket = new Socket(token.Proxy.TargetEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
Socket socket = new Socket(token.Proxy.TargetEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
||||||
socket.KeepAlive();
|
socket.KeepAlive();
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using linker.messenger.relay.client;
|
|||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using linker.messenger.channel;
|
using linker.messenger.channel;
|
||||||
using linker.messenger.pcp;
|
using linker.messenger.pcp;
|
||||||
|
using linker.snat;
|
||||||
|
|
||||||
namespace linker.messenger.forward.proxy
|
namespace linker.messenger.forward.proxy
|
||||||
{
|
{
|
||||||
@@ -17,9 +18,13 @@ namespace linker.messenger.forward.proxy
|
|||||||
|
|
||||||
protected override string TransactionId => "forward";
|
protected override string TransactionId => "forward";
|
||||||
|
|
||||||
public ForwardProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, SignInClientTransfer signInClientTransfer, IRelayClientStore relayClientStore)
|
private readonly LinkerFirewall linkerFirewall;
|
||||||
|
|
||||||
|
public ForwardProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer,
|
||||||
|
SignInClientTransfer signInClientTransfer, IRelayClientStore relayClientStore, LinkerFirewall linkerFirewall)
|
||||||
: base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientStore)
|
: base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientStore)
|
||||||
{
|
{
|
||||||
|
this.linkerFirewall = linkerFirewall;
|
||||||
TaskUdp();
|
TaskUdp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -145,16 +145,16 @@ namespace linker.messenger.forward.proxy
|
|||||||
ConnectIdUdp connectId = tunnelToken.GetUdpConnectId();
|
ConnectIdUdp connectId = tunnelToken.GetUdpConnectId();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
IPEndPoint target = new IPEndPoint(tunnelToken.Proxy.TargetEP.Address, tunnelToken.Proxy.TargetEP.Port);
|
|
||||||
if (udpConnections.TryGetValue(connectId, out AsyncUserUdpTokenTarget token))
|
if (udpConnections.TryGetValue(connectId, out AsyncUserUdpTokenTarget token))
|
||||||
{
|
{
|
||||||
token.Connection = tunnelToken.Connection;
|
token.Connection = tunnelToken.Connection;
|
||||||
await token.TargetSocket.SendToAsync(tunnelToken.Proxy.Data, target).ConfigureAwait(false);
|
await token.TargetSocket.SendToAsync(tunnelToken.Proxy.Data, tunnelToken.Proxy.TargetEP).ConfigureAwait(false);
|
||||||
token.LastTicks.Update();
|
token.LastTicks.Update();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = ConnectUdp(tunnelToken, target);
|
_ = ConnectUdp(tunnelToken);
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -188,8 +188,14 @@ namespace linker.messenger.forward.proxy
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private async Task ConnectUdp(AsyncUserTunnelToken tunnelToken, IPEndPoint target)
|
private async Task ConnectUdp(AsyncUserTunnelToken tunnelToken)
|
||||||
{
|
{
|
||||||
|
IPEndPoint target = new IPEndPoint(tunnelToken.Proxy.TargetEP.Address, tunnelToken.Proxy.TargetEP.Port);
|
||||||
|
if (linkerFirewall.Check(tunnelToken.Connection.RemoteMachineId, target, ProtocolType.Udp) == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Socket socket = new Socket(target.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
|
Socket socket = new Socket(target.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
|
||||||
socket.WindowsUdpBug();
|
socket.WindowsUdpBug();
|
||||||
await socket.SendToAsync(tunnelToken.Proxy.Data, target).ConfigureAwait(false);
|
await socket.SendToAsync(tunnelToken.Proxy.Data, target).ConfigureAwait(false);
|
||||||
@@ -273,7 +279,7 @@ namespace linker.messenger.forward.proxy
|
|||||||
{
|
{
|
||||||
TimerHelper.SetIntervalLong(() =>
|
TimerHelper.SetIntervalLong(() =>
|
||||||
{
|
{
|
||||||
if(udpConnections.Count > 0)
|
if (udpConnections.Count > 0)
|
||||||
{
|
{
|
||||||
var connections = udpConnections.Where(c => c.Value.Timeout).Select(c => c.Key).ToList();
|
var connections = udpConnections.Where(c => c.Value.Timeout).Select(c => c.Key).ToList();
|
||||||
foreach (var item in connections)
|
foreach (var item in connections)
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger listen</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger listen</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger logger</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger logger</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger pcp</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger pcp</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger plan</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger plan</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -212,6 +212,18 @@ namespace linker.messenger.relay
|
|||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
|
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<bool> CheckKey(ApiControllerParamsInfo param)
|
||||||
|
{
|
||||||
|
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
|
{
|
||||||
|
Connection = signInClientState.Connection,
|
||||||
|
MessengerId = (ushort)RelayMessengerIds.CheckKey,
|
||||||
|
Payload = serializer.Serialize(param.Content)
|
||||||
|
}).ConfigureAwait(false);
|
||||||
|
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class RelayConnectInfo
|
public sealed class RelayConnectInfo
|
||||||
|
|||||||
@@ -18,9 +18,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger relay</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger relay</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -453,5 +453,13 @@ namespace linker.messenger.relay.messenger
|
|||||||
string result = await relayServerCdkeyStore.Import(info).ConfigureAwait(false);
|
string result = await relayServerCdkeyStore.Import(info).ConfigureAwait(false);
|
||||||
connection.Write(serializer.Serialize(result));
|
connection.Write(serializer.Serialize(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MessengerId((ushort)RelayMessengerIds.CheckKey)]
|
||||||
|
public void CheckKey(IConnection connection)
|
||||||
|
{
|
||||||
|
string key = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
|
connection.Write(relayServerStore.ValidateSecretKey(key) ? Helper.TrueArray : Helper.FalseArray);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,8 @@
|
|||||||
|
|
||||||
SendLastBytes = 2122,
|
SendLastBytes = 2122,
|
||||||
|
|
||||||
|
CheckKey = 2123,
|
||||||
|
|
||||||
Max = 2199
|
Max = 2199
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ namespace linker.messenger.serializer.memorypack
|
|||||||
MemoryPackFormatterProvider.Register(new FirewallRuleInfoFormatter());
|
MemoryPackFormatterProvider.Register(new FirewallRuleInfoFormatter());
|
||||||
MemoryPackFormatterProvider.Register(new FirewallSearchInfoFormatter());
|
MemoryPackFormatterProvider.Register(new FirewallSearchInfoFormatter());
|
||||||
MemoryPackFormatterProvider.Register(new FirewallSearchForwardInfoFormatter());
|
MemoryPackFormatterProvider.Register(new FirewallSearchForwardInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new FirewallListInfoFormatter());
|
||||||
MemoryPackFormatterProvider.Register(new FirewallAddForwardInfoFormatter());
|
MemoryPackFormatterProvider.Register(new FirewallAddForwardInfoFormatter());
|
||||||
MemoryPackFormatterProvider.Register(new FirewallRemoveForwardInfoFormatter());
|
MemoryPackFormatterProvider.Register(new FirewallRemoveForwardInfoFormatter());
|
||||||
MemoryPackFormatterProvider.Register(new FirewallStateForwardInfoFormatter());
|
MemoryPackFormatterProvider.Register(new FirewallStateForwardInfoFormatter());
|
||||||
|
|||||||
@@ -40,8 +40,12 @@ namespace linker.messenger.serializer.memorypack
|
|||||||
[MemoryPackInclude]
|
[MemoryPackInclude]
|
||||||
int OrderBy => info.OrderBy;
|
int OrderBy => info.OrderBy;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Remark => info.Remark;
|
||||||
|
|
||||||
[MemoryPackConstructor]
|
[MemoryPackConstructor]
|
||||||
SerializableFirewallRuleInfo(string id, string srcId, string srcName, string groupId, string dstCIDR, string dstPort, snat.LinkerFirewallProtocolType protocol, snat.LinkerFirewallAction action, bool disabled, int orderby)
|
SerializableFirewallRuleInfo(string id, string srcId, string srcName, string groupId, string dstCIDR, string dstPort,
|
||||||
|
snat.LinkerFirewallProtocolType protocol, snat.LinkerFirewallAction action, bool disabled, int orderby, string remark)
|
||||||
{
|
{
|
||||||
var info = new FirewallRuleInfo
|
var info = new FirewallRuleInfo
|
||||||
{
|
{
|
||||||
@@ -54,7 +58,8 @@ namespace linker.messenger.serializer.memorypack
|
|||||||
Protocol = protocol,
|
Protocol = protocol,
|
||||||
Action = action,
|
Action = action,
|
||||||
Disabled = disabled,
|
Disabled = disabled,
|
||||||
OrderBy = orderby
|
OrderBy = orderby,
|
||||||
|
Remark = remark
|
||||||
};
|
};
|
||||||
this.info = info;
|
this.info = info;
|
||||||
}
|
}
|
||||||
@@ -98,17 +103,16 @@ namespace linker.messenger.serializer.memorypack
|
|||||||
[MemoryPackIgnore]
|
[MemoryPackIgnore]
|
||||||
public readonly FirewallSearchInfo info;
|
public readonly FirewallSearchInfo info;
|
||||||
|
|
||||||
[MemoryPackInclude]
|
|
||||||
string SrcName => info.SrcName;
|
|
||||||
|
|
||||||
[MemoryPackInclude]
|
[MemoryPackInclude]
|
||||||
string GroupId => info.GroupId;
|
string GroupId => info.GroupId;
|
||||||
|
|
||||||
[MemoryPackInclude]
|
[MemoryPackInclude]
|
||||||
string DstCidr => info.DstCidr;
|
string Str => info.Str;
|
||||||
|
|
||||||
[MemoryPackInclude]
|
[MemoryPackInclude]
|
||||||
string DstPort => info.DstPort;
|
int Disabled => info.Disabled;
|
||||||
|
|
||||||
[MemoryPackInclude]
|
[MemoryPackInclude]
|
||||||
snat.LinkerFirewallProtocolType Protocol => info.Protocol;
|
snat.LinkerFirewallProtocolType Protocol => info.Protocol;
|
||||||
@@ -116,18 +120,14 @@ namespace linker.messenger.serializer.memorypack
|
|||||||
[MemoryPackInclude]
|
[MemoryPackInclude]
|
||||||
snat.LinkerFirewallAction Action => info.Action;
|
snat.LinkerFirewallAction Action => info.Action;
|
||||||
|
|
||||||
[MemoryPackInclude]
|
|
||||||
bool Disabled => info.Disabled;
|
|
||||||
|
|
||||||
[MemoryPackConstructor]
|
[MemoryPackConstructor]
|
||||||
SerializableFirewallSearchInfo(string srcName, string groupId, string dstCIDR, string dstPort, snat.LinkerFirewallProtocolType protocol, snat.LinkerFirewallAction action, bool disabled)
|
SerializableFirewallSearchInfo(string groupId, string str, snat.LinkerFirewallProtocolType protocol,
|
||||||
|
snat.LinkerFirewallAction action, int disabled)
|
||||||
{
|
{
|
||||||
var info = new FirewallSearchInfo
|
var info = new FirewallSearchInfo
|
||||||
{
|
{
|
||||||
SrcName = srcName,
|
|
||||||
GroupId = groupId,
|
GroupId = groupId,
|
||||||
DstCidr = dstCIDR,
|
Str = str,
|
||||||
DstPort = dstPort,
|
|
||||||
Protocol = protocol,
|
Protocol = protocol,
|
||||||
Action = action,
|
Action = action,
|
||||||
Disabled = disabled,
|
Disabled = disabled,
|
||||||
@@ -222,6 +222,61 @@ namespace linker.messenger.serializer.memorypack
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableFirewallListInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly FirewallListInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
LinkerFirewallState State => info.State;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
List<FirewallRuleInfo> List => info.List;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableFirewallListInfo(LinkerFirewallState state, List<FirewallRuleInfo> list)
|
||||||
|
{
|
||||||
|
this.info = new FirewallListInfo
|
||||||
|
{
|
||||||
|
List = list,
|
||||||
|
State = state
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableFirewallListInfo(FirewallListInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class FirewallListInfoFormatter : MemoryPackFormatter<FirewallListInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref FirewallListInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableFirewallListInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref FirewallListInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableFirewallListInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
[MemoryPackable]
|
[MemoryPackable]
|
||||||
public readonly partial struct SerializableFirewallAddForwardInfo
|
public readonly partial struct SerializableFirewallAddForwardInfo
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger serializer memorypack</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger serializer memorypack</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -206,6 +206,18 @@ namespace linker.messenger.sforward.client
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<bool> CheckKey(ApiControllerParamsInfo param)
|
||||||
|
{
|
||||||
|
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
|
{
|
||||||
|
Connection = signInClientState.Connection,
|
||||||
|
MessengerId = (ushort)SForwardMessengerIds.CheckKey,
|
||||||
|
Payload = serializer.Serialize(param.Content)
|
||||||
|
}).ConfigureAwait(false);
|
||||||
|
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class SForwardListInfo
|
public sealed class SForwardListInfo
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger sforward</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger sforward</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -419,6 +419,15 @@ namespace linker.plugins.sforward.messenger
|
|||||||
string[] arr = str.Split('/');
|
string[] arr = str.Split('/');
|
||||||
return arr.Length == 2 && int.TryParse(arr[0], out min) && int.TryParse(arr[1], out max);
|
return arr.Length == 2 && int.TryParse(arr[0], out min) && int.TryParse(arr[1], out max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MessengerId((ushort)SForwardMessengerIds.CheckKey)]
|
||||||
|
public void CheckKey(IConnection connection)
|
||||||
|
{
|
||||||
|
string key = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
|
connection.Write(sForwardServerStore.ValidateSecretKey(key) ? Helper.TrueArray : Helper.FalseArray);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -26,6 +26,8 @@
|
|||||||
StopClient = 2315,
|
StopClient = 2315,
|
||||||
StopClientForward = 2316,
|
StopClientForward = 2316,
|
||||||
|
|
||||||
|
CheckKey = 2317,
|
||||||
|
|
||||||
Max = 2399
|
Max = 2399
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,6 +136,18 @@ namespace linker.messenger.signin
|
|||||||
}
|
}
|
||||||
return new List<SignInNamesResponseItemInfo>();
|
return new List<SignInNamesResponseItemInfo>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<bool> CheckKey(ApiControllerParamsInfo param)
|
||||||
|
{
|
||||||
|
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
|
{
|
||||||
|
Connection = signInClientState.Connection,
|
||||||
|
MessengerId = (ushort)SignInMessengerIds.CheckKey,
|
||||||
|
Payload = serializer.Serialize(param.Content)
|
||||||
|
}).ConfigureAwait(false);
|
||||||
|
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class ConfigSetInfo
|
public sealed class ConfigSetInfo
|
||||||
|
|||||||
@@ -37,12 +37,14 @@ namespace linker.messenger.signin
|
|||||||
private readonly SignInServerCaching signCaching;
|
private readonly SignInServerCaching signCaching;
|
||||||
private readonly IMessengerSender messengerSender;
|
private readonly IMessengerSender messengerSender;
|
||||||
private readonly ISerializer serializer;
|
private readonly ISerializer serializer;
|
||||||
|
private readonly ISignInServerStore signInServerStore;
|
||||||
|
|
||||||
public SignInServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer)
|
public SignInServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer, ISignInServerStore signInServerStore)
|
||||||
{
|
{
|
||||||
this.signCaching = signCaching;
|
this.signCaching = signCaching;
|
||||||
this.messengerSender = messengerSender;
|
this.messengerSender = messengerSender;
|
||||||
this.serializer = serializer;
|
this.serializer = serializer;
|
||||||
|
this.signInServerStore = signInServerStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MessengerId((ushort)SignInMessengerIds.SignIn)]
|
[MessengerId((ushort)SignInMessengerIds.SignIn)]
|
||||||
@@ -291,6 +293,13 @@ namespace linker.messenger.signin
|
|||||||
{
|
{
|
||||||
signCaching.Exp(connection.Id);
|
signCaching.Exp(connection.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[MessengerId((ushort)SignInMessengerIds.CheckKey)]
|
||||||
|
public void CheckKey(IConnection connection)
|
||||||
|
{
|
||||||
|
string key = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
|
connection.Write(signInServerStore.ValidateSecretKey(key) ? Helper.TrueArray : Helper.FalseArray);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
Offlines = 16,
|
Offlines = 16,
|
||||||
Exp = 17,
|
Exp = 17,
|
||||||
|
|
||||||
|
CheckKey = 18,
|
||||||
|
|
||||||
None = 99
|
None = 99
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger signin</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger signin</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -25,11 +25,16 @@ namespace linker.messenger.socks5
|
|||||||
|
|
||||||
protected override string TransactionId => "socks5";
|
protected override string TransactionId => "socks5";
|
||||||
|
|
||||||
public TunnelProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, SignInClientTransfer signInClientTransfer, IRelayClientStore relayClientStore)
|
private readonly LinkerFirewall linkerFirewall;
|
||||||
|
|
||||||
|
public TunnelProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer,
|
||||||
|
SignInClientTransfer signInClientTransfer, IRelayClientStore relayClientStore, LinkerFirewall linkerFirewall)
|
||||||
: base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientStore)
|
: base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientStore)
|
||||||
{
|
{
|
||||||
this.signInClientTransfer = signInClientTransfer;
|
this.signInClientTransfer = signInClientTransfer;
|
||||||
|
this.linkerFirewall = linkerFirewall;
|
||||||
TaskUdp();
|
TaskUdp();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -205,15 +205,20 @@ namespace linker.messenger.socks5
|
|||||||
{
|
{
|
||||||
if (token.Proxy.TargetEP == null) return;
|
if (token.Proxy.TargetEP == null) return;
|
||||||
|
|
||||||
|
IPAddress ip = mapping.GetRealDst(token.Proxy.TargetEP.Address);
|
||||||
|
IPEndPoint target = new IPEndPoint(ip, token.Proxy.TargetEP.Port);
|
||||||
|
|
||||||
|
if(linkerFirewall.Check(token.Connection.RemoteMachineId, target, ProtocolType.Tcp) == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Socket socket = new Socket(token.Proxy.TargetEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
Socket socket = new Socket(token.Proxy.TargetEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
||||||
socket.KeepAlive();
|
socket.KeepAlive();
|
||||||
|
|
||||||
ConnectState state = new ConnectState { BufferSize = token.Proxy.BufferSize, Connection = token.Connection, ConnectId = token.Proxy.ConnectId, Socket = socket, IPEndPoint = token.Proxy.TargetEP };
|
ConnectState state = new ConnectState { BufferSize = token.Proxy.BufferSize, Connection = token.Connection, ConnectId = token.Proxy.ConnectId, Socket = socket, IPEndPoint = token.Proxy.TargetEP };
|
||||||
state.CopyData(token.Proxy.Data);
|
state.CopyData(token.Proxy.Data);
|
||||||
|
|
||||||
IPAddress ip = mapping.GetRealDst(token.Proxy.TargetEP.Address);
|
|
||||||
IPEndPoint target = new IPEndPoint(ip, token.Proxy.TargetEP.Port);
|
|
||||||
|
|
||||||
socket.BeginConnect(target, ConnectCallback, state);
|
socket.BeginConnect(target, ConnectCallback, state);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,6 +173,12 @@ namespace linker.messenger.socks5
|
|||||||
IPAddress ip = mapping.GetRealDst(tunnelToken.Proxy.TargetEP.Address);
|
IPAddress ip = mapping.GetRealDst(tunnelToken.Proxy.TargetEP.Address);
|
||||||
IPEndPoint target = new IPEndPoint(ip, tunnelToken.Proxy.TargetEP.Port);
|
IPEndPoint target = new IPEndPoint(ip, tunnelToken.Proxy.TargetEP.Port);
|
||||||
|
|
||||||
|
if (linkerFirewall.Check(tunnelToken.Connection.RemoteMachineId, target, ProtocolType.Udp) == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Socket socket = new Socket(target.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
|
Socket socket = new Socket(target.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
|
||||||
socket.WindowsUdpBug();
|
socket.WindowsUdpBug();
|
||||||
await socket.SendToAsync(tunnelToken.Proxy.Data, target).ConfigureAwait(false);
|
await socket.SendToAsync(tunnelToken.Proxy.Data, target).ConfigureAwait(false);
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger socks5</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger socks5</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
@@ -41,6 +41,7 @@
|
|||||||
<ProjectReference Include="..\linker.messenger.api\linker.messenger.api.csproj" />
|
<ProjectReference Include="..\linker.messenger.api\linker.messenger.api.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.channel\linker.messenger.channel.csproj" />
|
<ProjectReference Include="..\linker.messenger.channel\linker.messenger.channel.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.exroute\linker.messenger.exroute.csproj" />
|
<ProjectReference Include="..\linker.messenger.exroute\linker.messenger.exroute.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.firewall\linker.messenger.firewall.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
<ProjectReference Include="..\linker.snat\linker.snat.csproj" />
|
<ProjectReference Include="..\linker.snat\linker.snat.csproj" />
|
||||||
|
|||||||
@@ -26,21 +26,23 @@ namespace linker.messenger.store.file.firewall
|
|||||||
public IEnumerable<FirewallRuleInfo> GetAll(FirewallSearchInfo info)
|
public IEnumerable<FirewallRuleInfo> GetAll(FirewallSearchInfo info)
|
||||||
{
|
{
|
||||||
IEnumerable<FirewallRuleInfo> list = liteCollection.FindAll()
|
IEnumerable<FirewallRuleInfo> list = liteCollection.FindAll()
|
||||||
.Where(c => c.GroupId == info.GroupId && c.Disabled == info.Disabled)
|
.Where(c => c.GroupId == info.GroupId)
|
||||||
.Where(c=>(c.Protocol & info.Protocol) > 0)
|
.Where(c => (c.Protocol & info.Protocol) > 0)
|
||||||
.Where(c=>(c.Action & info.Action) > 0);
|
.Where(c => (c.Action & info.Action) > 0);
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(info.SrcName) == false)
|
if (info.Disabled != -1)
|
||||||
{
|
{
|
||||||
list = list.Where(c => c.SrcName.Contains(info.SrcName));
|
list = list.Where(c => c.Disabled == Convert.ToBoolean(info.Disabled));
|
||||||
}
|
}
|
||||||
if (string.IsNullOrWhiteSpace(info.DstCidr) == false)
|
|
||||||
|
if (string.IsNullOrWhiteSpace(info.Str) == false)
|
||||||
{
|
{
|
||||||
list = list.Where(c => c.DstCIDR.Contains(info.DstCidr));
|
list = list.Where(c =>
|
||||||
}
|
(c.SrcName != null && c.SrcName.Contains(info.Str)) ||
|
||||||
if (string.IsNullOrWhiteSpace(info.DstPort) == false)
|
(c.DstCIDR != null && c.DstCIDR.Contains(info.Str)) ||
|
||||||
{
|
(c.DstPort != null && c.DstPort.Contains(info.Str)) ||
|
||||||
list = list.Where(c => c.DstPort.Contains(info.DstPort));
|
(c.Remark != null && c.Remark.Contains(info.Str))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return list.OrderBy(c => c.OrderBy);
|
return list.OrderBy(c => c.OrderBy);
|
||||||
@@ -55,6 +57,7 @@ namespace linker.messenger.store.file.firewall
|
|||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(rule.Id))
|
if (string.IsNullOrWhiteSpace(rule.Id))
|
||||||
{
|
{
|
||||||
|
rule.Id = ObjectId.NewObjectId().ToString();
|
||||||
return liteCollection.Insert(rule) != null;
|
return liteCollection.Insert(rule) != null;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -69,7 +72,8 @@ namespace linker.messenger.store.file.firewall
|
|||||||
Protocol = rule.Protocol,
|
Protocol = rule.Protocol,
|
||||||
Action = rule.Action,
|
Action = rule.Action,
|
||||||
OrderBy = rule.OrderBy,
|
OrderBy = rule.OrderBy,
|
||||||
Disabled = rule.Disabled
|
Disabled = rule.Disabled,
|
||||||
|
Remark = rule.Remark
|
||||||
}, c => c.Id == rule.Id) > 0;
|
}, c => c.Id == rule.Id) > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger store file</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger store file</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ namespace linker.messenger.store.file
|
|||||||
{
|
{
|
||||||
public bool OnlyNode { get; set; }
|
public bool OnlyNode { get; set; }
|
||||||
|
|
||||||
|
public string ImportKey { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
|
||||||
private SignInClientServerInfo[] servers = new SignInClientServerInfo[] {
|
private SignInClientServerInfo[] servers = new SignInClientServerInfo[] {
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
|||||||
@@ -18,9 +18,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger sync</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger sync</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger tunnel</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger tunnel</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -35,7 +35,10 @@ namespace linker.messenger.tuntap
|
|||||||
this.exRouteTransfer = exRouteTransfer;
|
this.exRouteTransfer = exRouteTransfer;
|
||||||
|
|
||||||
//与服务器连接,刷新一下IP
|
//与服务器连接,刷新一下IP
|
||||||
signInClientState.OnSignInSuccess += (times) => tuntapConfigTransfer.RefreshIP();
|
signInClientState.OnSignInSuccess += (times) =>
|
||||||
|
{
|
||||||
|
_ = CheckDevice();
|
||||||
|
};
|
||||||
|
|
||||||
//初始化网卡
|
//初始化网卡
|
||||||
tuntapTransfer.Initialize(this);
|
tuntapTransfer.Initialize(this);
|
||||||
@@ -70,7 +73,6 @@ namespace linker.messenger.tuntap
|
|||||||
tuntapDecenter.Refresh(); DeleteForward();
|
tuntapDecenter.Refresh(); DeleteForward();
|
||||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
LoggerHelper.Instance.Warning("tuntap shutdown after");
|
LoggerHelper.Instance.Warning("tuntap shutdown after");
|
||||||
tuntapConfigTransfer.SetRunning(false);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//配置有更新,去同步一下
|
//配置有更新,去同步一下
|
||||||
@@ -87,6 +89,19 @@ namespace linker.messenger.tuntap
|
|||||||
tuntapProxy.Callback = this;
|
tuntapProxy.Callback = this;
|
||||||
CheckDeviceTask();
|
CheckDeviceTask();
|
||||||
}
|
}
|
||||||
|
public async Task Callback(LinkerTunDevicPacket packet)
|
||||||
|
{
|
||||||
|
await tuntapProxy.InputPacket(packet).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
public async ValueTask Close(ITunnelConnection connection)
|
||||||
|
{
|
||||||
|
tuntapDecenter.Refresh();
|
||||||
|
await ValueTask.CompletedTask.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
public void Receive(ITunnelConnection connection, ReadOnlyMemory<byte> buffer)
|
||||||
|
{
|
||||||
|
tuntapTransfer.Write(connection.RemoteMachineId, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private OperatingManager checking = new OperatingManager();
|
private OperatingManager checking = new OperatingManager();
|
||||||
@@ -120,21 +135,6 @@ namespace linker.messenger.tuntap
|
|||||||
checking.StopOperation();
|
checking.StopOperation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Callback(LinkerTunDevicPacket packet)
|
|
||||||
{
|
|
||||||
await tuntapProxy.InputPacket(packet).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
public async ValueTask Close(ITunnelConnection connection)
|
|
||||||
{
|
|
||||||
tuntapDecenter.Refresh();
|
|
||||||
await ValueTask.CompletedTask.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
public void Receive(ITunnelConnection connection, ReadOnlyMemory<byte> buffer)
|
|
||||||
{
|
|
||||||
tuntapTransfer.Write(connection.RemoteMachineId, buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 重启网卡
|
/// 重启网卡
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -154,7 +154,10 @@ namespace linker.messenger.tuntap
|
|||||||
{
|
{
|
||||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
LoggerHelper.Instance.Warning($"stop device");
|
LoggerHelper.Instance.Warning($"stop device");
|
||||||
tuntapTransfer.Shutdown();
|
if (tuntapTransfer.Shutdown())
|
||||||
|
{
|
||||||
|
tuntapConfigTransfer.SetRunning(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -43,6 +43,11 @@ namespace linker.messenger.tuntap
|
|||||||
this.serializer = serializer;
|
this.serializer = serializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 连接
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="param"></param>
|
||||||
|
/// <returns></returns>
|
||||||
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
|
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
ulong hashCode = ulong.Parse(param.Content);
|
ulong hashCode = ulong.Parse(param.Content);
|
||||||
@@ -57,12 +62,45 @@ namespace linker.messenger.tuntap
|
|||||||
return new ConnectionListInfo { HashCode = version };
|
return new ConnectionListInfo { HashCode = version };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除连接
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="param"></param>
|
||||||
[Access(AccessValue.TunnelRemove)]
|
[Access(AccessValue.TunnelRemove)]
|
||||||
public void RemoveConnection(ApiControllerParamsInfo param)
|
public void RemoveConnection(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
tuntapProxy.RemoveConnection(param.Content);
|
tuntapProxy.RemoveConnection(param.Content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 路由表
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="param"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<Dictionary<string, string>> Routes(ApiControllerParamsInfo param)
|
||||||
|
{
|
||||||
|
if (param.Content == signInClientStore.Id)
|
||||||
|
{
|
||||||
|
return tuntapProxy.GetRoutes();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
|
{
|
||||||
|
Connection = signInClientState.Connection,
|
||||||
|
MessengerId = (ushort)TuntapMessengerIds.RoutesForward,
|
||||||
|
Payload = serializer.Serialize(param.Content)
|
||||||
|
}).ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
|
||||||
|
{
|
||||||
|
return serializer.Deserialize<Dictionary<string, string>>(resp.Data.Span);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Dictionary<string, string>();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取所有客户端的网卡信息
|
/// 获取所有客户端的网卡信息
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -152,7 +152,6 @@ namespace linker.messenger.tuntap
|
|||||||
LoggerHelper.Instance.Debug($"tuntap cache clear");
|
LoggerHelper.Instance.Debug($"tuntap cache clear");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置IP,等下有连接进来,用IP匹配,才能知道这个连接是要连谁
|
/// 设置IP,等下有连接进来,用IP匹配,才能知道这个连接是要连谁
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -199,5 +198,13 @@ namespace linker.messenger.tuntap
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取路由表
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public Dictionary<string, string> GetRoutes()
|
||||||
|
{
|
||||||
|
return cidrManager.Routes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,14 +31,14 @@ namespace linker.messenger.tuntap
|
|||||||
Helper.OnAppExit += Helper_OnAppExit;
|
Helper.OnAppExit += Helper_OnAppExit;
|
||||||
if (OperatingSystem.IsAndroid() == false)
|
if (OperatingSystem.IsAndroid() == false)
|
||||||
{
|
{
|
||||||
AppDomain.CurrentDomain.ProcessExit += (s, e) => linkerTunDeviceAdapter.Shutdown();
|
AppDomain.CurrentDomain.ProcessExit += (s, e) => Shutdown();
|
||||||
Console.CancelKeyPress += (s, e) => linkerTunDeviceAdapter.Shutdown();
|
Console.CancelKeyPress += (s, e) => Shutdown();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Helper_OnAppExit(object sender, EventArgs e)
|
private void Helper_OnAppExit(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
linkerTunDeviceAdapter.Shutdown();
|
Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialize(ILinkerTunDeviceCallback linkerTunDeviceCallback)
|
public void Initialize(ILinkerTunDeviceCallback linkerTunDeviceCallback)
|
||||||
@@ -51,7 +51,7 @@ namespace linker.messenger.tuntap
|
|||||||
linkerTunDeviceAdapter.Initialize(linkerTunDevice, linkerTunDeviceCallback);
|
linkerTunDeviceAdapter.Initialize(linkerTunDevice, linkerTunDeviceCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Write(string srcId,ReadOnlyMemory<byte> buffer)
|
public bool Write(string srcId, ReadOnlyMemory<byte> buffer)
|
||||||
{
|
{
|
||||||
return linkerTunDeviceAdapter.Write(srcId, buffer);
|
return linkerTunDeviceAdapter.Write(srcId, buffer);
|
||||||
}
|
}
|
||||||
@@ -110,17 +110,17 @@ namespace linker.messenger.tuntap
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 停止网卡
|
/// 停止网卡
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void Shutdown(bool notify = true)
|
public bool Shutdown()
|
||||||
{
|
{
|
||||||
if (operatingManager.StartOperation() == false)
|
if (operatingManager.StartOperation() == false)
|
||||||
{
|
{
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (notify) OnShutdownBefore();
|
OnShutdownBefore();
|
||||||
linkerTunDeviceAdapter.Shutdown();
|
linkerTunDeviceAdapter.Shutdown();
|
||||||
if (notify) OnShutdownSuccess();
|
OnShutdownSuccess();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -131,10 +131,10 @@ namespace linker.messenger.tuntap
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if (notify)
|
OnShutdownAfter();
|
||||||
OnShutdownAfter();
|
|
||||||
operatingManager.StopOperation();
|
operatingManager.StopOperation();
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 刷新网卡
|
/// 刷新网卡
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger tuntap</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger tuntap</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -90,6 +90,13 @@ namespace linker.messenger.tuntap.messenger
|
|||||||
}, (ushort)TuntapMessengerIds.SubscribeForwardTest);
|
}, (ushort)TuntapMessengerIds.SubscribeForwardTest);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MessengerId((ushort)TuntapMessengerIds.Routes)]
|
||||||
|
public void Routes(IConnection connection)
|
||||||
|
{
|
||||||
|
connection.Write(serializer.Serialize(tuntapProxy.GetRoutes()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -285,5 +292,41 @@ namespace linker.messenger.tuntap.messenger
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MessengerId((ushort)TuntapMessengerIds.RoutesForward)]
|
||||||
|
public void RoutesForward(IConnection connection)
|
||||||
|
{
|
||||||
|
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
||||||
|
string machineid = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
|
if (signCaching.TryGet(machineid, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
|
||||||
|
{
|
||||||
|
|
||||||
|
messengerSender.SendReply(new MessageRequestWrap
|
||||||
|
{
|
||||||
|
Connection = cache.Connection,
|
||||||
|
MessengerId = (ushort)TuntapMessengerIds.Routes,
|
||||||
|
}).ContinueWith((result) =>
|
||||||
|
{
|
||||||
|
messengerSender.ReplyOnly(new MessageResponseWrap
|
||||||
|
{
|
||||||
|
Connection = connection,
|
||||||
|
RequestId = requestid,
|
||||||
|
Code = MessageResponeCodes.OK,
|
||||||
|
Payload = result.Result.Data
|
||||||
|
}, (ushort)TuntapMessengerIds.RoutesForward);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
messengerSender.ReplyOnly(new MessageResponseWrap
|
||||||
|
{
|
||||||
|
Connection = connection,
|
||||||
|
RequestId = requestid,
|
||||||
|
Code = MessageResponeCodes.OK,
|
||||||
|
Payload = Helper.EmptyArray
|
||||||
|
}, (ushort)TuntapMessengerIds.RoutesForward);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,10 @@
|
|||||||
SubscribeForwardTest = 2214,
|
SubscribeForwardTest = 2214,
|
||||||
SubscribeForwardTestForward = 2215,
|
SubscribeForwardTestForward = 2215,
|
||||||
|
|
||||||
|
|
||||||
|
Routes = 2216,
|
||||||
|
RoutesForward = 2217,
|
||||||
|
|
||||||
None = 2299
|
None = 2299
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -177,6 +177,17 @@ namespace linker.messenger.updater
|
|||||||
updaterTransfer.Check();
|
updaterTransfer.Check();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<bool> CheckKey(ApiControllerParamsInfo param)
|
||||||
|
{
|
||||||
|
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
|
{
|
||||||
|
Connection = signInClientState.Connection,
|
||||||
|
MessengerId = (ushort)UpdaterMessengerIds.CheckKey,
|
||||||
|
Payload = serializer.Serialize(param.Content)
|
||||||
|
}).ConfigureAwait(false);
|
||||||
|
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ namespace linker.messenger.updater
|
|||||||
{
|
{
|
||||||
private readonly UpdaterClientTransfer updaterTransfer;
|
private readonly UpdaterClientTransfer updaterTransfer;
|
||||||
private readonly ISerializer serializer;
|
private readonly ISerializer serializer;
|
||||||
|
|
||||||
public UpdaterClientMessenger(UpdaterClientTransfer updaterTransfer, ISerializer serializer)
|
public UpdaterClientMessenger(UpdaterClientTransfer updaterTransfer, ISerializer serializer)
|
||||||
{
|
{
|
||||||
this.updaterTransfer = updaterTransfer;
|
this.updaterTransfer = updaterTransfer;
|
||||||
@@ -86,6 +87,8 @@ namespace linker.messenger.updater
|
|||||||
{
|
{
|
||||||
updaterTransfer.Check();
|
updaterTransfer.Check();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -347,5 +350,13 @@ namespace linker.messenger.updater
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MessengerId((ushort)UpdaterMessengerIds.CheckKey)]
|
||||||
|
public void CheckKey(IConnection connection)
|
||||||
|
{
|
||||||
|
string key = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
|
connection.Write(updaterServerStore.ValidateSecretKey(key) ? Helper.TrueArray : Helper.FalseArray);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
Update170 = 2616,
|
Update170 = 2616,
|
||||||
UpdateServer170 = 2617,
|
UpdateServer170 = 2617,
|
||||||
|
|
||||||
|
CheckKey = 2618,
|
||||||
|
|
||||||
Max = 2299
|
Max = 2299
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger updater</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger updater</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker messenger</PackageReleaseNotes>
|
<PackageReleaseNotes>linker messenger</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Frozen;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using static linker.snat.LinkerSrcNat;
|
using static linker.snat.LinkerSrcNat;
|
||||||
namespace linker.snat
|
namespace linker.snat
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 开启后默认阻止
|
||||||
|
/// </summary>
|
||||||
public sealed class LinkerFirewall
|
public sealed class LinkerFirewall
|
||||||
{
|
{
|
||||||
private ConcurrentDictionary<(string srcId, uint dst, ushort dstPort, ProtocolType pro), bool> cacheMap = new ConcurrentDictionary<(string srcId, uint dst, ushort dstPort, ProtocolType pro), bool>();
|
private ConcurrentDictionary<(string srcId, uint dst, ushort dstPort, ProtocolType pro), bool> cacheMap = new ConcurrentDictionary<(string srcId, uint dst, ushort dstPort, ProtocolType pro), bool>();
|
||||||
@@ -14,7 +18,6 @@ namespace linker.snat
|
|||||||
|
|
||||||
public LinkerFirewall()
|
public LinkerFirewall()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -39,6 +42,7 @@ namespace linker.snat
|
|||||||
}
|
}
|
||||||
|
|
||||||
//末尾有一条默认允许所有的规则
|
//末尾有一条默认允许所有的规则
|
||||||
|
/*
|
||||||
rules.Add(new LinkerFirewallRuleInfo
|
rules.Add(new LinkerFirewallRuleInfo
|
||||||
{
|
{
|
||||||
SrcId = string.Empty,
|
SrcId = string.Empty,
|
||||||
@@ -47,39 +51,63 @@ namespace linker.snat
|
|||||||
Protocol = LinkerFirewallProtocolType.All,
|
Protocol = LinkerFirewallProtocolType.All,
|
||||||
Action = LinkerFirewallAction.Allow,
|
Action = LinkerFirewallAction.Allow,
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
buildedRules = rules.Select(c =>
|
buildedRules = rules.Select(c =>
|
||||||
{
|
{
|
||||||
string[] ports = c.DstPort.Split('-');
|
try
|
||||||
int portStart = int.Parse(ports[0]), portEnd = portStart;
|
|
||||||
if (ports.Length == 2)
|
|
||||||
{
|
{
|
||||||
portEnd = int.Parse(ports[1]);
|
int portStart = 0, portEnd = 65535;
|
||||||
}
|
HashSet<int> ports = new HashSet<int>();
|
||||||
else if (portStart == 0)
|
if (c.DstPort != "0" && c.DstPort != "*")
|
||||||
{
|
{
|
||||||
portEnd = 65535;
|
if (c.DstPort.Contains('-'))
|
||||||
}
|
{
|
||||||
|
string[] arr = c.DstPort.Split('-');
|
||||||
|
portStart = int.Parse(arr[0]);
|
||||||
|
portEnd = int.Parse(arr[1]);
|
||||||
|
}
|
||||||
|
else if (c.DstPort.Contains(','))
|
||||||
|
{
|
||||||
|
ports = c.DstPort.Split(',').Select(c => int.Parse(c)).ToHashSet();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
portEnd = portStart = int.Parse(c.DstPort);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
string[] cidr = c.DstCIDR.Split('/');
|
IPAddress ip = IPAddress.Any;
|
||||||
IPAddress ip = IPAddress.Parse(cidr[0]);
|
byte prefixLength = 0;
|
||||||
byte prefixLength = 32;
|
if (c.DstCIDR != "0" && c.DstCIDR != "*")
|
||||||
if (cidr.Length == 2)
|
{
|
||||||
{
|
string[] cidr = c.DstCIDR.Split('/');
|
||||||
prefixLength = byte.Parse(cidr[1]);
|
ip = IPAddress.Parse(cidr[0]);
|
||||||
}
|
prefixLength = 32;
|
||||||
|
if (cidr.Length == 2)
|
||||||
|
{
|
||||||
|
prefixLength = byte.Parse(cidr[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return new LinkerFirewallRuleBuildInfo
|
return new LinkerFirewallRuleBuildInfo
|
||||||
|
{
|
||||||
|
SrcId = c.SrcId,
|
||||||
|
DstNetwork = NetworkHelper.ToNetworkValue(ip, prefixLength),
|
||||||
|
DstPrefixLength = NetworkHelper.ToPrefixValue(prefixLength),
|
||||||
|
DstPortStart = portStart,
|
||||||
|
DstPortEnd = portEnd,
|
||||||
|
DstPorts = ports,
|
||||||
|
Protocol = c.Protocol,
|
||||||
|
Action = c.Action
|
||||||
|
};
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
{
|
{
|
||||||
SrcId = c.SrcId,
|
}
|
||||||
DstNetwork = NetworkHelper.ToNetworkValue(ip, prefixLength),
|
return null;
|
||||||
DstPrefixLength = NetworkHelper.ToPrefixValue(prefixLength),
|
|
||||||
DstPortStart = portStart,
|
}).Where(c => c != null).ToList();
|
||||||
DstPortEnd = portEnd,
|
|
||||||
Protocol = c.Protocol,
|
|
||||||
Action = c.Action
|
|
||||||
};
|
|
||||||
}).ToList();
|
|
||||||
|
|
||||||
cacheMap.Clear();
|
cacheMap.Clear();
|
||||||
}
|
}
|
||||||
@@ -93,9 +121,12 @@ namespace linker.snat
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool Check(string srcId, IPEndPoint dstEP, ProtocolType protocol)
|
public bool Check(string srcId, IPEndPoint dstEP, ProtocolType protocol)
|
||||||
{
|
{
|
||||||
|
if (this.state != LinkerFirewallState.Enabled) return true;
|
||||||
|
if (dstEP.AddressFamily != AddressFamily.InterNetwork) return false;
|
||||||
|
|
||||||
uint dst = NetworkHelper.ToValue(dstEP.Address);
|
uint dst = NetworkHelper.ToValue(dstEP.Address);
|
||||||
ushort dstPort = (ushort)dstEP.Port;
|
ushort dstPort = (ushort)dstEP.Port;
|
||||||
return Check(srcId, dst, dstPort, (byte)(dstEP.AddressFamily == AddressFamily.InterNetwork ? 4 : 6), protocol);
|
return Check(srcId, dst, dstPort, protocol);
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 检查数据包是否符合规则
|
/// 检查数据包是否符合规则
|
||||||
@@ -105,7 +136,11 @@ namespace linker.snat
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool Check(string srcId, ReadOnlyMemory<byte> packet)
|
public bool Check(string srcId, ReadOnlyMemory<byte> packet)
|
||||||
{
|
{
|
||||||
|
if (this.state != LinkerFirewallState.Enabled) return true;
|
||||||
|
|
||||||
IPV4Packet ipv4 = new IPV4Packet(packet.Span);
|
IPV4Packet ipv4 = new IPV4Packet(packet.Span);
|
||||||
|
if (ipv4.Version != 4) return true;
|
||||||
|
|
||||||
uint dst = ipv4.DstAddr;
|
uint dst = ipv4.DstAddr;
|
||||||
ushort dstPort = ipv4.Protocol switch
|
ushort dstPort = ipv4.Protocol switch
|
||||||
{
|
{
|
||||||
@@ -113,39 +148,18 @@ namespace linker.snat
|
|||||||
ProtocolType.Tcp => ipv4.DstPort,
|
ProtocolType.Tcp => ipv4.DstPort,
|
||||||
_ => 0,
|
_ => 0,
|
||||||
};
|
};
|
||||||
return Check(srcId, dst, dstPort, ipv4.Version, ipv4.Protocol);
|
return Check(srcId, dst, dstPort, ipv4.Protocol);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool Check(string srcId, uint ip, ushort port, byte version, ProtocolType protocol)
|
private bool Check(string srcId, uint ip, ushort port, ProtocolType protocol)
|
||||||
{
|
{
|
||||||
//防火墙未启用
|
|
||||||
if (this.state != LinkerFirewallState.Enabled)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//没有配置规则
|
|
||||||
if (buildedRules.Count == 0)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//仅IPV4
|
|
||||||
if (version != 4)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
LinkerFirewallProtocolType _rotocol = protocol switch
|
LinkerFirewallProtocolType _rotocol = protocol switch
|
||||||
{
|
{
|
||||||
ProtocolType.Icmp => LinkerFirewallProtocolType.ICMP,
|
|
||||||
ProtocolType.Tcp => LinkerFirewallProtocolType.TCP,
|
ProtocolType.Tcp => LinkerFirewallProtocolType.TCP,
|
||||||
ProtocolType.Udp => LinkerFirewallProtocolType.UDP,
|
ProtocolType.Udp => LinkerFirewallProtocolType.UDP,
|
||||||
_ => LinkerFirewallProtocolType.None,
|
_ => LinkerFirewallProtocolType.None,
|
||||||
};
|
};
|
||||||
//不在协议列表内
|
if (_rotocol == LinkerFirewallProtocolType.None) return true; //不支持的协议
|
||||||
if (_rotocol == LinkerFirewallProtocolType.None)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//之前已经检查过
|
//之前已经检查过
|
||||||
(string srcId, uint dst, ushort dstPort, ProtocolType pro) key = (srcId, ip, port, protocol);
|
(string srcId, uint dst, ushort dstPort, ProtocolType pro) key = (srcId, ip, port, protocol);
|
||||||
@@ -157,9 +171,9 @@ namespace linker.snat
|
|||||||
//按顺序匹配规则
|
//按顺序匹配规则
|
||||||
foreach (LinkerFirewallRuleBuildInfo item in buildedRules)
|
foreach (LinkerFirewallRuleBuildInfo item in buildedRules)
|
||||||
{
|
{
|
||||||
bool match = (string.IsNullOrWhiteSpace(item.SrcId) || item.SrcId == srcId)
|
bool match = (item.SrcId == "*" || item.SrcId == srcId)
|
||||||
&& ((ip & item.DstPrefixLength) == item.DstNetwork)
|
&& ((ip & item.DstPrefixLength) == item.DstNetwork)
|
||||||
&& (port >= item.DstPortStart && port <= item.DstPortEnd)
|
&& ((port >= item.DstPortStart && port <= item.DstPortEnd) || item.DstPorts.Contains(port))
|
||||||
&& item.Protocol.HasFlag(_rotocol);
|
&& item.Protocol.HasFlag(_rotocol);
|
||||||
if (match)
|
if (match)
|
||||||
{
|
{
|
||||||
@@ -168,10 +182,9 @@ namespace linker.snat
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sealed class LinkerFirewallRuleBuildInfo
|
sealed class LinkerFirewallRuleBuildInfo
|
||||||
{
|
{
|
||||||
public string SrcId { get; set; } = string.Empty;
|
public string SrcId { get; set; } = string.Empty;
|
||||||
@@ -181,6 +194,8 @@ namespace linker.snat
|
|||||||
public int DstPortStart { get; set; }
|
public int DstPortStart { get; set; }
|
||||||
public int DstPortEnd { get; set; }
|
public int DstPortEnd { get; set; }
|
||||||
|
|
||||||
|
public HashSet<int> DstPorts { get; set; }
|
||||||
|
|
||||||
public LinkerFirewallProtocolType Protocol { get; set; }
|
public LinkerFirewallProtocolType Protocol { get; set; }
|
||||||
public LinkerFirewallAction Action { get; set; }
|
public LinkerFirewallAction Action { get; set; }
|
||||||
}
|
}
|
||||||
@@ -201,9 +216,7 @@ namespace linker.snat
|
|||||||
None = 0,
|
None = 0,
|
||||||
TCP = 1,
|
TCP = 1,
|
||||||
UDP = 2,
|
UDP = 2,
|
||||||
ICMP = 4,
|
All = TCP | UDP
|
||||||
|
|
||||||
All = TCP | UDP | ICMP
|
|
||||||
}
|
}
|
||||||
public enum LinkerFirewallAction
|
public enum LinkerFirewallAction
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker snat</PackageReleaseNotes>
|
<PackageReleaseNotes>linker snat</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ namespace linker.tun
|
|||||||
if (ProtocolType == ProtocolType.Tcp || ProtocolType == ProtocolType.Udp)
|
if (ProtocolType == ProtocolType.Tcp || ProtocolType == ProtocolType.Udp)
|
||||||
{
|
{
|
||||||
SourcePort = BinaryPrimitives.ReverseEndianness(ipPacket.Slice(42, 2).ToUInt16());
|
SourcePort = BinaryPrimitives.ReverseEndianness(ipPacket.Slice(42, 2).ToUInt16());
|
||||||
DistPort = BinaryPrimitives.ReverseEndianness(ipPacket.Slice(24, 2).ToUInt16());
|
DistPort = BinaryPrimitives.ReverseEndianness(ipPacket.Slice(44, 2).ToUInt16());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using System.Net.NetworkInformation;
|
|||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Runtime.Versioning;
|
using System.Runtime.Versioning;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||||
|
|
||||||
namespace linker.tun
|
namespace linker.tun
|
||||||
{
|
{
|
||||||
@@ -29,7 +30,7 @@ namespace linker.tun
|
|||||||
|
|
||||||
private CancellationTokenSource tokenSource;
|
private CancellationTokenSource tokenSource;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public LinkerWinTunDevice()
|
public LinkerWinTunDevice()
|
||||||
{
|
{
|
||||||
@@ -202,12 +203,11 @@ namespace linker.tun
|
|||||||
error = "NetNat need CIDR,like 10.18.18.0/24";
|
error = "NetNat need CIDR,like 10.18.18.0/24";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CommandHelper.PowerShell($"start-service WinNat", [], out error);
|
|
||||||
CommandHelper.PowerShell($"Install-WindowsFeature -Name Routing -IncludeManagementTools", [], out error);
|
|
||||||
CommandHelper.PowerShell($"Set-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\" -Name \"IPEnableRouter\" -Value 1", [], out error);
|
|
||||||
CommandHelper.PowerShell($"Remove-NetNat -Name {Name} -Confirm:$false", [], out error);
|
|
||||||
|
|
||||||
|
SetupNat();
|
||||||
IPAddress network = NetworkHelper.ToNetworkIP(this.address, NetworkHelper.ToPrefixValue(prefixLength));
|
IPAddress network = NetworkHelper.ToNetworkIP(this.address, NetworkHelper.ToPrefixValue(prefixLength));
|
||||||
|
RemoveOldNat($"{network}/{prefixLength}");
|
||||||
|
|
||||||
CommandHelper.PowerShell($"New-NetNat -Name {Name} -InternalIPInterfaceAddressPrefix {network}/{prefixLength}", [], out error);
|
CommandHelper.PowerShell($"New-NetNat -Name {Name} -InternalIPInterfaceAddressPrefix {network}/{prefixLength}", [], out error);
|
||||||
|
|
||||||
string result = CommandHelper.PowerShell($"Get-NetNat", [], out string e);
|
string result = CommandHelper.PowerShell($"Get-NetNat", [], out string e);
|
||||||
@@ -222,7 +222,41 @@ namespace linker.tun
|
|||||||
error = ex.Message;
|
error = ex.Message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private void SetupNat()
|
||||||
|
{
|
||||||
|
CommandHelper.PowerShell($"start-service WinNat", [], out string error);
|
||||||
|
CommandHelper.PowerShell($"Install-WindowsFeature -Name Routing -IncludeManagementTools", [], out error);
|
||||||
|
CommandHelper.PowerShell($"Set-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\" -Name \"IPEnableRouter\" -Value 1", [], out error);
|
||||||
|
}
|
||||||
|
private void RemoveOldNat(string addressPrefix)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string netnats = CommandHelper.PowerShell($"Get-NetNat", [], out string e);
|
||||||
|
|
||||||
|
IEnumerable<string> names = netnats
|
||||||
|
.Split("\r\n\r\n")
|
||||||
|
.Where(c => string.IsNullOrWhiteSpace(c) == false)
|
||||||
|
.Select(c =>
|
||||||
|
{
|
||||||
|
return c.Split("\r\n")
|
||||||
|
.Where(c => string.IsNullOrWhiteSpace(c) == false)
|
||||||
|
.Select(c => c.Split(':')).Where(c => c.Length == 2).Select(c => { c[0] = c[0].Trim(); c[1] = c[1].Trim(); return c; })
|
||||||
|
.ToDictionary(c => c[0], c => c[1]);
|
||||||
|
})
|
||||||
|
.Where(c => (c.TryGetValue("Name", out string name) && name == Name) || (c.TryGetValue("InternalIPInterfaceAddressPrefix", out string ip) && ip == addressPrefix))
|
||||||
|
.Select(c => c["Name"]);
|
||||||
|
foreach (var name in names)
|
||||||
|
{
|
||||||
|
CommandHelper.PowerShell($"Remove-NetNat -Name {name} -Confirm:$false", [], out string error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void RemoveNat(out string error)
|
public void RemoveNat(out string error)
|
||||||
{
|
{
|
||||||
error = string.Empty;
|
error = string.Empty;
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker tun</PackageReleaseNotes>
|
<PackageReleaseNotes>linker tun</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
<PackageReleaseNotes>linker tunnel</PackageReleaseNotes>
|
<PackageReleaseNotes>linker tunnel</PackageReleaseNotes>
|
||||||
<Version>1.7.8</Version>
|
<Version>1.7.9</Version>
|
||||||
<AssemblyVersion>1.7.8</AssemblyVersion>
|
<AssemblyVersion>1.7.9</AssemblyVersion>
|
||||||
<FileVersion>1.7.8</FileVersion>
|
<FileVersion>1.7.9</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
14
src/linker.web/src/apis/firewall.js
Normal file
14
src/linker.web/src/apis/firewall.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { sendWebsocketMsg } from './request'
|
||||||
|
|
||||||
|
export const getFirewall = (data) => {
|
||||||
|
return sendWebsocketMsg('firewall/get', data);
|
||||||
|
}
|
||||||
|
export const addFirewall = (data) => {
|
||||||
|
return sendWebsocketMsg('firewall/add', data);
|
||||||
|
}
|
||||||
|
export const removeFirewall = (data) => {
|
||||||
|
return sendWebsocketMsg('firewall/remove', data);
|
||||||
|
}
|
||||||
|
export const stateFirewall = (data) => {
|
||||||
|
return sendWebsocketMsg('firewall/state', data);
|
||||||
|
}
|
||||||
@@ -35,4 +35,7 @@ export const relayCdkeyImport = (data) => {
|
|||||||
}
|
}
|
||||||
export const relayUpdateNode = (data) => {
|
export const relayUpdateNode = (data) => {
|
||||||
return sendWebsocketMsg('relay/UpdateNode', data);
|
return sendWebsocketMsg('relay/UpdateNode', data);
|
||||||
|
}
|
||||||
|
export const checkRelayKey = (key) => {
|
||||||
|
return sendWebsocketMsg('relay/checkkey',key);
|
||||||
}
|
}
|
||||||
@@ -31,4 +31,7 @@ export const startSForwardInfo = (data) => {
|
|||||||
}
|
}
|
||||||
export const stopSForwardInfo = (data) => {
|
export const stopSForwardInfo = (data) => {
|
||||||
return sendWebsocketMsg('sforward/stop', data);
|
return sendWebsocketMsg('sforward/stop', data);
|
||||||
|
}
|
||||||
|
export const checkSForwardKey = (key) => {
|
||||||
|
return sendWebsocketMsg('sforward/checkkey',key);
|
||||||
}
|
}
|
||||||
@@ -34,4 +34,7 @@ export const setSignInGroups = (data) => {
|
|||||||
|
|
||||||
export const getSignInNames = () => {
|
export const getSignInNames = () => {
|
||||||
return sendWebsocketMsg('signIn/names');
|
return sendWebsocketMsg('signIn/names');
|
||||||
|
}
|
||||||
|
export const checkSignInKey = (key) => {
|
||||||
|
return sendWebsocketMsg('signIn/checkkey',key);
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,10 @@ export const removeTuntapConnection = (id) => {
|
|||||||
return sendWebsocketMsg('tuntap/removeconnection', id);
|
return sendWebsocketMsg('tuntap/removeconnection', id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const getTuntapRoutes = (machineid) => {
|
||||||
|
return sendWebsocketMsg('tuntap/routes', machineid);
|
||||||
|
}
|
||||||
|
|
||||||
export const getTuntapInfo = (hashcode = '0') => {
|
export const getTuntapInfo = (hashcode = '0') => {
|
||||||
return sendWebsocketMsg('tuntap/get', hashcode);
|
return sendWebsocketMsg('tuntap/get', hashcode);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,4 +41,7 @@ export const subscribeUpdater = () => {
|
|||||||
}
|
}
|
||||||
export const checkUpdater = (data) => {
|
export const checkUpdater = (data) => {
|
||||||
return sendWebsocketMsg('updater/check', data);
|
return sendWebsocketMsg('updater/check', data);
|
||||||
|
}
|
||||||
|
export const checkUpdaterKey = (key) => {
|
||||||
|
return sendWebsocketMsg('updater/checkkey',key);
|
||||||
}
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1727193027445" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="105724" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512"><path d="M0 0m512 0l0 0q512 0 512 512l0 0q0 512-512 512l0 0q-512 0-512-512l0 0q0-512 512-512Z" fill="#818BA4" p-id="105725" data-spm-anchor-id="a313x.search_index.0.i18.1c553a81zI5OvT" class=""></path><path d="M800 617.472L752.128 288.8A75.936 75.936 0 0 0 677.312 224H346.72a76.096 76.096 0 0 0-74.88 64.736L224 618.144v106.112A75.68 75.68 0 0 0 299.68 800h424.576A75.936 75.936 0 0 0 800 724.256v-106.784z m-46.144-4.16H270.336l46.208-318.016a30.528 30.528 0 0 1 30.176-26.176h330.528c15.168 0 28.032 11.168 30.24 26.176l46.368 318.016zM269.12 658.432H754.88v65.92a30.592 30.592 0 0 1-30.528 30.496H299.68a30.592 30.592 0 0 1-30.528-30.528v-65.888z m442.496 25.728h-45.184v44.96h45.12V684.16h0.064z m-115.936 0h45.056v45.12h-45.184v-45.12h0.128z m-283.136 0h44.96v45.12H312.48v-45.12h0.096z m70.688 0h45.12v45.12h-45.12v-45.12z m141.568 0h45.12v45.12h-45.12v-45.12z m-70.72 0H499.2v45.12H454.08v-45.12h0.064z m158.816-276.48h-67.296l-7.456-44.928h47.68l-73.28-56-73.12 56h47.712l-8.768 44.928h-67.264v-33.696l-67.264 56.096 67.264 44.8v-33.6h67.264v67.296h-67.264l100.864 67.2 100.864-67.232h-67.232v-67.232h67.232v33.6l67.264-44.8-67.264-56.128v33.696h0.064z" fill="#FFFFFF" p-id="105726"></path></svg>
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1746858069918" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="37587" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512"><path d="M22.022887 304.77077C56.710445 137.220906 163.281886 43.858897 329.526167 15.673656c122.904033-20.863734 245.859265-21.119731 368.532901 0.563193 171.185017 30.258814 274.070106 129.047955 306.863287 299.157786 25.343677 131.479924 25.727672 264.34223-0.383995 395.694155-35.071553 166.423478-144.382159 269.154968-310.012047 297.23781-122.904033 20.863734-245.859265 21.119731-368.532901-0.563193C154.782795 977.504593 51.436912 873.774715 18.64373 703.664884c-26.623661-132.350313-24.063693-266.057408 3.404757-398.894114z" fill="#2FC25B" p-id="37588"></path><path d="M526.336457 557.925942a23.193304 23.193304 0 0 0 22.604512-22.604511 23.193304 23.193304 0 0 0-22.604512-22.630112 23.193304 23.193304 0 0 0-22.604511 22.630112c0 12.031847 10.547066 22.604512 22.604511 22.604511z m0-75.365439a23.193304 23.193304 0 0 0 22.604512-22.604511 23.193304 23.193304 0 0 0-22.604512-22.604512 23.193304 23.193304 0 0 0-22.604511 22.604512c0 12.031847 10.547066 22.604512 22.604511 22.604511z m7.526304 120.574463h-15.052608a23.193304 23.193304 0 0 0-22.604512 22.604512c0 12.057446 10.547066 22.604512 22.604512 22.604512h15.052608a23.193304 23.193304 0 0 0 22.630112-22.604512 23.193304 23.193304 0 0 0-22.630112-22.604512z m186.903217-203.466206c-10.547066-81.406962-79.870982-143.204574-164.273105-143.204574a166.26988 166.26988 0 0 0-155.262021 105.521855h-10.547065a105.08666 105.08666 0 0 0-102.475494 81.406962c-63.307993 18.07337-108.542616 76.85022-108.542616 144.663755 0 82.917343 67.839135 150.730878 150.730879 150.730878h346.670779c91.928428-4.531142 165.783486-79.870982 165.783487-173.30979 0-78.386201-51.250547-143.204574-122.084844-165.809086z m-284.873168 248.67523c0 16.588588-13.567827 30.156416-30.130815 30.156415h-15.078208c-16.562989 0-30.130816-13.567827-30.130816-30.156415V497.664311c0-16.588588 13.567827-30.156416 30.130816-30.156416h15.078208c16.588588 0 30.130816 13.567827 30.130815 30.156416v150.705278z m150.730879 0c0 16.588588-13.567827 30.156416-30.130816 30.156415h-60.287232c-16.588588 0-30.156416-13.567827-30.156415-30.156415v-210.99251c0-16.588588 13.567827-30.156416 30.156415-30.156416h60.287232c16.562989 0 30.130816 13.567827 30.130816 30.156416v210.99251z m105.521854 0c0 16.588588-13.567827 30.156416-30.156415 30.156415h-15.078208c-16.562989 0-30.130816-13.567827-30.130816-30.156415V497.664311c0-16.588588 13.567827-30.156416 30.130816-30.156416h15.078208c16.588588 0 30.156416 13.567827 30.156415 30.156416v150.705278z" fill="#FFFFFF" p-id="37589"></path></svg>
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 2.8 KiB |
1
src/linker.web/src/assets/login.svg
Normal file
1
src/linker.web/src/assets/login.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1746857930595" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="26327" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512"><path d="M0 0m512 0l0 0q512 0 512 512l0 0q0 512-512 512l0 0q-512 0-512-512l0 0q0-512 512-512Z" fill="#6F5EA9" p-id="26328"></path><path d="M717.5168 469.333333h-34.6112v-83.899733c0-78.9504-69.188267-143.1552-154.146133-143.1552-84.992 0-154.146133 64.2048-154.146134 143.1552v83.8656h-33.9968c-27.8528 0-50.4832 20.957867-50.4832 46.8992v225.348267c0 25.9072 22.6304 46.865067 50.4832 46.865066h376.900267c27.8528 0 50.4832-20.957867 50.4832-46.865066v-225.348267c0-25.941333-22.6304-46.8992-50.4832-46.8992z m-278.528-83.797333c0-46.011733 40.311467-83.421867 89.770667-83.421867 49.4592 0 89.770667 37.410133 89.770666 83.421867v83.8656h-179.541333v-83.8656z m123.118933 295.253333c0 17.8176-15.598933 32.290133-34.7136 32.290134-19.182933 0-34.679467-14.472533-34.679466-32.256v-97.5872c0-17.749333 15.598933-32.221867 34.679466-32.221867 19.217067 0 34.7136 14.4384 34.7136 32.221867v97.5872z" fill="#FFFFFF" p-id="26329"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -484,6 +484,12 @@ h3.title {
|
|||||||
.el-input__inner {
|
.el-input__inner {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
.el-input.success .el-input__wrapper{
|
||||||
|
box-shadow: 0 0 0 1px #008000 inset;
|
||||||
|
}
|
||||||
|
.el-input.error .el-input__wrapper{
|
||||||
|
box-shadow: 0 0 0 1px #ff6600 inset;
|
||||||
|
}
|
||||||
|
|
||||||
.el-dialog--center .el-dialog__body {
|
.el-dialog--center .el-dialog__body {
|
||||||
padding-top: 1rem !important;
|
padding-top: 1rem !important;
|
||||||
|
|||||||
@@ -10,11 +10,13 @@ export default {
|
|||||||
'common.access': 'No access',
|
'common.access': 'No access',
|
||||||
'common.relay': 'Relay',
|
'common.relay': 'Relay',
|
||||||
'common.p2p': 'P2P',
|
'common.p2p': 'P2P',
|
||||||
|
'common.refresh': 'Refresh',
|
||||||
|
|
||||||
'head.home': 'Home',
|
'head.home': 'Home',
|
||||||
'head.server': 'Server',
|
'head.server': 'Server',
|
||||||
'head.protocol': 'P2P Protocol',
|
'head.protocol': 'P2P Protocol',
|
||||||
'head.action': 'Action',
|
'head.action': 'Action',
|
||||||
|
'head.firewall': 'Firewall',
|
||||||
'head.logger': 'Logs',
|
'head.logger': 'Logs',
|
||||||
'head.refresh': 'Refresh',
|
'head.refresh': 'Refresh',
|
||||||
|
|
||||||
@@ -246,4 +248,26 @@ export default {
|
|||||||
'server.asyncTunnelTransports': 'Tunnel transports',
|
'server.asyncTunnelTransports': 'Tunnel transports',
|
||||||
'server.asyncSignInUserId': 'User Id',
|
'server.asyncSignInUserId': 'User Id',
|
||||||
|
|
||||||
|
'firewall.rule': 'Firewall rule',
|
||||||
|
'firewall.srcName': 'Src Device',
|
||||||
|
'firewall.dstCidr': 'IP',
|
||||||
|
'firewall.dstPort': 'Port',
|
||||||
|
'firewall.protocol': 'Protocol',
|
||||||
|
'firewall.protocolall': 'Protocol all',
|
||||||
|
'firewall.actionall': 'Action all',
|
||||||
|
'firewall.action': 'Action',
|
||||||
|
'firewall.actionAllow': 'Allow',
|
||||||
|
'firewall.actionAllowAll': 'Allow all',
|
||||||
|
'firewall.actionDeny': 'Deny',
|
||||||
|
'firewall.actionDenyAll': 'Deny all',
|
||||||
|
'firewall.orderby': 'Order',
|
||||||
|
'firewall.enabled': 'Enable',
|
||||||
|
'firewall.disabled': 'Disable',
|
||||||
|
'firewall.disabledAll': 'All state',
|
||||||
|
'firewall.del': 'Del',
|
||||||
|
'firewall.edit': 'Edit',
|
||||||
|
'firewall.delConfirm': 'Are you sure to delete this rule?',
|
||||||
|
'firewall.switch': 'Firewall switch,open or close',
|
||||||
|
'firewall.remark': 'Remark',
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -10,12 +10,14 @@ export default {
|
|||||||
'common.access': '无权限',
|
'common.access': '无权限',
|
||||||
'common.relay': '中继',
|
'common.relay': '中继',
|
||||||
'common.p2p': '打洞',
|
'common.p2p': '打洞',
|
||||||
|
'common.refresh': '刷新',
|
||||||
|
|
||||||
'head.home': '首页',
|
'head.home': '首页',
|
||||||
'head.server': '服务器',
|
'head.server': '服务器',
|
||||||
'head.group': '分组',
|
'head.group': '分组',
|
||||||
'head.protocol': '打洞协议',
|
'head.protocol': '打洞协议',
|
||||||
'head.action': '自定义验证',
|
'head.action': '验证',
|
||||||
|
'head.firewall': '防火墙',
|
||||||
'head.logger': '日志',
|
'head.logger': '日志',
|
||||||
'head.refresh': '刷新',
|
'head.refresh': '刷新',
|
||||||
|
|
||||||
@@ -341,4 +343,28 @@ export default {
|
|||||||
'server.asyncUpdaterSecretKey': '更新密钥',
|
'server.asyncUpdaterSecretKey': '更新密钥',
|
||||||
'server.asyncTunnelTransports': '打洞协议',
|
'server.asyncTunnelTransports': '打洞协议',
|
||||||
'server.asyncSignInUserId': '用户唯一标识',
|
'server.asyncSignInUserId': '用户唯一标识',
|
||||||
|
|
||||||
|
|
||||||
|
'firewall.rule': '防火墙协议',
|
||||||
|
'firewall.srcName': '源设备',
|
||||||
|
'firewall.dstCidr': 'IP',
|
||||||
|
'firewall.dstPort': '端口',
|
||||||
|
'firewall.protocolall': '全部协议',
|
||||||
|
'firewall.protocol': '协议',
|
||||||
|
'firewall.actionall': '全部操作',
|
||||||
|
'firewall.action': '操作',
|
||||||
|
'firewall.actionAllow': '允许',
|
||||||
|
'firewall.actionAllowAll': '允许全部',
|
||||||
|
'firewall.actionDeny': '阻止',
|
||||||
|
'firewall.actionDenyAll': '阻止全部',
|
||||||
|
'firewall.orderby': '顺序',
|
||||||
|
'firewall.enabled': '启用',
|
||||||
|
'firewall.disabled': '禁用',
|
||||||
|
'firewall.disabledAll': '全部状态',
|
||||||
|
'firewall.del': '删除',
|
||||||
|
'firewall.edit': '修改',
|
||||||
|
'firewall.delConfirm': '确认删除规则?',
|
||||||
|
'firewall.switch': '防火墙开关,是否开启防火墙',
|
||||||
|
'firewall.remark': '备注',
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -26,6 +26,11 @@ const routes = [
|
|||||||
name: 'FullAction',
|
name: 'FullAction',
|
||||||
component: () => import('@/views/full/action/Index.vue')
|
component: () => import('@/views/full/action/Index.vue')
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/full/firewall.html',
|
||||||
|
name: 'FullFirewall',
|
||||||
|
component: () => import('@/views/full/firewall/Index.vue')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/full/logger.html',
|
path: '/full/logger.html',
|
||||||
name: 'FullLogger',
|
name: 'FullLogger',
|
||||||
|
|||||||
@@ -18,7 +18,10 @@
|
|||||||
<router-link :to="{name:'FullTransport'}"><img src="@/assets/dadong.svg"/><span>{{$t('head.protocol')}}</span></router-link>
|
<router-link :to="{name:'FullTransport'}"><img src="@/assets/dadong.svg"/><span>{{$t('head.protocol')}}</span></router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="hasAction">
|
<li v-if="hasAction">
|
||||||
<router-link :to="{name:'FullAction'}"><img src="@/assets/anquan.svg"/><span>{{$t('head.action')}}</span></router-link>
|
<router-link :to="{name:'FullAction'}"><img src="@/assets/login.svg"/><span>{{$t('head.action')}}</span></router-link>
|
||||||
|
</li>
|
||||||
|
<li v-if="hasFirewall">
|
||||||
|
<router-link :to="{name:'FullFirewall'}"><img src="@/assets/anquan.svg"/><span>{{$t('head.firewall')}}</span></router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="hasLogger">
|
<li v-if="hasLogger">
|
||||||
<router-link :to="{name:'FullLogger'}"><img src="@/assets/rizhi.svg"/><span>{{$t('head.logger')}}</span></router-link>
|
<router-link :to="{name:'FullLogger'}"><img src="@/assets/rizhi.svg"/><span>{{$t('head.logger')}}</span></router-link>
|
||||||
@@ -35,7 +38,10 @@
|
|||||||
<router-link :to="{name:'FullTransport'}"><img src="@/assets/dadong.svg"/><span>{{$t('head.protocol')}}</span></router-link>
|
<router-link :to="{name:'FullTransport'}"><img src="@/assets/dadong.svg"/><span>{{$t('head.protocol')}}</span></router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="hasAction && route.name == 'FullAction'">
|
<li v-if="hasAction && route.name == 'FullAction'">
|
||||||
<router-link :to="{name:'FullAction'}"><img src="@/assets/anquan.svg"/><span>{{$t('head.action')}}</span></router-link>
|
<router-link :to="{name:'FullAction'}"><img src="@/assets/login.svg"/><span>{{$t('head.action')}}</span></router-link>
|
||||||
|
</li>
|
||||||
|
<li v-if="hasFirewall && route.name == 'FullFirewall'">
|
||||||
|
<router-link :to="{name:'FullFirewall'}"><img src="@/assets/anquan.svg"/><span>{{$t('head.firewall')}}</span></router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="hasLogger && route.name == 'FullLogger'">
|
<li v-if="hasLogger && route.name == 'FullLogger'">
|
||||||
<router-link :to="{name:'FullLogger'}"><img src="@/assets/rizhi.svg"/> <span>{{$t('head.logger')}}</span></router-link>
|
<router-link :to="{name:'FullLogger'}"><img src="@/assets/rizhi.svg"/> <span>{{$t('head.logger')}}</span></router-link>
|
||||||
@@ -53,16 +59,19 @@
|
|||||||
<el-dropdown-item>
|
<el-dropdown-item>
|
||||||
<router-link :to="{name:'FullIndex'}"><img src="@/assets/shouye.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.home')}}</router-link>
|
<router-link :to="{name:'FullIndex'}"><img src="@/assets/shouye.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.home')}}</router-link>
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item>
|
<el-dropdown-item v-if="hasConfig">
|
||||||
<router-link :to="{name:'FullServers'}"><img src="@/assets/fuwuqi.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.server')}}</router-link>
|
<router-link :to="{name:'FullServers'}"><img src="@/assets/fuwuqi.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.server')}}</router-link>
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item>
|
<el-dropdown-item v-if="hasTransport">
|
||||||
<router-link :to="{name:'FullTransport'}"><img src="@/assets/dadong.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.protocol')}}</router-link>
|
<router-link :to="{name:'FullTransport'}"><img src="@/assets/dadong.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.protocol')}}</router-link>
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item>
|
<el-dropdown-item v-if="hasAction">
|
||||||
<router-link :to="{name:'FullAction'}"><img src="@/assets/anquan.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.action')}}</router-link>
|
<router-link :to="{name:'FullAction'}"><img src="@/assets/login.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.action')}}</router-link>
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<el-dropdown-item>
|
<el-dropdown-item v-if="hasFirewall">
|
||||||
|
<router-link :to="{name:'FullFirewall'}"><img src="@/assets/anquan.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.action')}}</router-link>
|
||||||
|
</el-dropdown-item>
|
||||||
|
<el-dropdown-item v-if="hasLogger">
|
||||||
<router-link :to="{name:'FullLogger'}"><img src="@/assets/rizhi.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.logger')}}</router-link>
|
<router-link :to="{name:'FullLogger'}"><img src="@/assets/rizhi.svg" height="20" style="vertical-align: text-top;"/> {{$t('head.logger')}}</router-link>
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
@@ -73,8 +82,8 @@
|
|||||||
<el-dropdown>
|
<el-dropdown>
|
||||||
<span class="el-dropdown-link">
|
<span class="el-dropdown-link">
|
||||||
{{localeOptions[locale]}}
|
{{localeOptions[locale]}}
|
||||||
<el-icon class="el-icon--right">
|
<el-icon>
|
||||||
<arrow-down />
|
<ArrowDown />
|
||||||
</el-icon>
|
</el-icon>
|
||||||
</span>
|
</span>
|
||||||
<template #dropdown>
|
<template #dropdown>
|
||||||
@@ -92,7 +101,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {Operation} from '@element-plus/icons-vue'
|
import {Operation,ArrowDown} from '@element-plus/icons-vue'
|
||||||
import { injectGlobalData } from '@/provide';
|
import { injectGlobalData } from '@/provide';
|
||||||
import { computed, ref} from 'vue';
|
import { computed, ref} from 'vue';
|
||||||
import Background from './Background.vue';
|
import Background from './Background.vue';
|
||||||
@@ -100,7 +109,7 @@ import { LOCALE_OPTIONS } from '@/lang'
|
|||||||
import useLocale from '@/lang/provide'
|
import useLocale from '@/lang/provide'
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
export default {
|
export default {
|
||||||
components:{Background,Operation},
|
components:{Background,Operation,ArrowDown},
|
||||||
setup() {
|
setup() {
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
@@ -110,6 +119,8 @@ export default {
|
|||||||
const hasTransport = computed(()=>globalData.value.hasAccess('Transport'));
|
const hasTransport = computed(()=>globalData.value.hasAccess('Transport'));
|
||||||
const hasAction = computed(()=>globalData.value.hasAccess('Action'));
|
const hasAction = computed(()=>globalData.value.hasAccess('Action'));
|
||||||
const hasGroup = computed(()=>globalData.value.hasAccess('Group'));
|
const hasGroup = computed(()=>globalData.value.hasAccess('Group'));
|
||||||
|
const hasFirewall = computed(()=>globalData.value.hasAccess('FirewallSelf'));
|
||||||
|
|
||||||
|
|
||||||
const localeOptions = ref(LOCALE_OPTIONS);
|
const localeOptions = ref(LOCALE_OPTIONS);
|
||||||
const { changeLocale, currentLocale } = useLocale()
|
const { changeLocale, currentLocale } = useLocale()
|
||||||
@@ -131,7 +142,7 @@ export default {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
route,globalData,hasConfig,hasGroup,
|
route,globalData,hasConfig,hasGroup,
|
||||||
hasLogger,hasTransport,hasAction,localeOptions,locale,handleLocale,refresh
|
hasLogger,hasTransport,hasAction,hasFirewall,localeOptions,locale,handleLocale,refresh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="connect-point" @click="handleShow">
|
<div class="connect-point" @click="handleShow" v-if="state.isSelf == false">
|
||||||
<template v-if="state.connection && state.connection.Connected">
|
<template v-if="state.connection && state.connection.Connected">
|
||||||
<template v-if="state.connection.Type == 0">
|
<template v-if="state.connection.Type == 0">
|
||||||
<span class="connect-point p2p" title="打洞直连" v-loading="state.connecting"></span>
|
<span class="connect-point p2p" title="打洞直连" v-loading="state.connecting"></span>
|
||||||
@@ -30,7 +30,8 @@ export default {
|
|||||||
const state = reactive({
|
const state = reactive({
|
||||||
connection:props.data,
|
connection:props.data,
|
||||||
transitionId:props.transitionId,
|
transitionId:props.transitionId,
|
||||||
connecting:computed(()=>tunnel.value.p2pOperatings[props.row.MachineId] || tunnel.value.relayOperatings[props.row.MachineId])
|
connecting:computed(()=>tunnel.value.p2pOperatings[props.row.MachineId] || tunnel.value.relayOperatings[props.row.MachineId]),
|
||||||
|
isSelf:props.row.isSelf
|
||||||
});
|
});
|
||||||
watch(()=>props.data,()=>{
|
watch(()=>props.data,()=>{
|
||||||
state.connection = props.data
|
state.connection = props.data
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
<TunnelEdit v-if="tunnel.showEdit" v-model="tunnel.showEdit" @change="handleTunnelRefresh"></TunnelEdit>
|
<TunnelEdit v-if="tunnel.showEdit" v-model="tunnel.showEdit" @change="handleTunnelRefresh"></TunnelEdit>
|
||||||
<ConnectionsEdit v-if="connections.showEdit" v-model="connections.showEdit" ></ConnectionsEdit>
|
<ConnectionsEdit v-if="connections.showEdit" v-model="connections.showEdit" ></ConnectionsEdit>
|
||||||
<TuntapEdit v-if="tuntap.showEdit" v-model="tuntap.showEdit" @change="handleTuntapRefresh"></TuntapEdit>
|
<TuntapEdit v-if="tuntap.showEdit" v-model="tuntap.showEdit" @change="handleTuntapRefresh"></TuntapEdit>
|
||||||
|
<TuntapRoutes v-if="tuntap.showRoutes" v-model="tuntap.showRoutes" ></TuntapRoutes>
|
||||||
<Socks5Edit v-if="socks5.showEdit" v-model="socks5.showEdit" @change="handleSocks5Refresh"></Socks5Edit>
|
<Socks5Edit v-if="socks5.showEdit" v-model="socks5.showEdit" @change="handleSocks5Refresh"></Socks5Edit>
|
||||||
<TuntapLease v-if="tuntap.showLease" v-model="tuntap.showLease" @change="handleTuntapRefresh"></TuntapLease>
|
<TuntapLease v-if="tuntap.showLease" v-model="tuntap.showLease" @change="handleTuntapRefresh"></TuntapLease>
|
||||||
<ForwardEdit v-if="forward.showEdit" v-model="forward.showEdit" ></ForwardEdit>
|
<ForwardEdit v-if="forward.showEdit" v-model="forward.showEdit" ></ForwardEdit>
|
||||||
@@ -51,6 +52,7 @@ import Tuntap from './Tuntap.vue'
|
|||||||
import TuntapEdit from './TuntapEdit.vue'
|
import TuntapEdit from './TuntapEdit.vue'
|
||||||
import TuntapLease from './TuntapLease.vue'
|
import TuntapLease from './TuntapLease.vue'
|
||||||
import { provideTuntap } from './tuntap'
|
import { provideTuntap } from './tuntap'
|
||||||
|
import TuntapRoutes from './TuntapRoutes.vue'
|
||||||
|
|
||||||
import Socks5 from './Socks5.vue'
|
import Socks5 from './Socks5.vue'
|
||||||
import Socks5Edit from './Socks5Edit.vue'
|
import Socks5Edit from './Socks5Edit.vue'
|
||||||
@@ -76,13 +78,15 @@ import UpdaterConfirm from './UpdaterConfirm.vue'
|
|||||||
import { provideFlow } from './flow'
|
import { provideFlow } from './flow'
|
||||||
import Stopwatch from './Stopwatch.vue'
|
import Stopwatch from './Stopwatch.vue'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {Sort,Oper,
|
components: {Sort,Oper,
|
||||||
Device,DeviceEdit,
|
Device,DeviceEdit,
|
||||||
AccessEdit,
|
AccessEdit,
|
||||||
Tunnel,TunnelEdit,
|
Tunnel,TunnelEdit,
|
||||||
ConnectionsEdit,
|
ConnectionsEdit,
|
||||||
Tuntap,TuntapEdit,TuntapLease,
|
Tuntap,TuntapEdit,TuntapLease,TuntapRoutes,
|
||||||
Socks5, Socks5Edit,
|
Socks5, Socks5Edit,
|
||||||
Forward,ForwardEdit,
|
Forward,ForwardEdit,
|
||||||
SForwardEdit ,UpdaterConfirm,
|
SForwardEdit ,UpdaterConfirm,
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
<el-dropdown-item v-else-if="hasApiPasswordOther" @click="handleApiPassword(scope.row)"><el-icon><HelpFilled /></el-icon> 管理接口</el-dropdown-item>
|
<el-dropdown-item v-else-if="hasApiPasswordOther" @click="handleApiPassword(scope.row)"><el-icon><HelpFilled /></el-icon> 管理接口</el-dropdown-item>
|
||||||
<el-dropdown-item @click="handleStopwatch(scope.row.MachineId,scope.row.MachineName)"><el-icon><Platform /></el-icon>它的信标</el-dropdown-item>
|
<el-dropdown-item @click="handleStopwatch(scope.row.MachineId,scope.row.MachineName)"><el-icon><Platform /></el-icon>它的信标</el-dropdown-item>
|
||||||
<el-dropdown-item @click="handleStopwatch('',$t('status.messenger'))"><el-icon><Platform /></el-icon>服务器信标</el-dropdown-item>
|
<el-dropdown-item @click="handleStopwatch('',$t('status.messenger'))"><el-icon><Platform /></el-icon>服务器信标</el-dropdown-item>
|
||||||
|
<el-dropdown-item @click="handleRoutes(scope.row.MachineId,scope.row.MachineName)"><el-icon><Paperclip /></el-icon>网卡路由</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</template>
|
</template>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
@@ -29,16 +30,17 @@
|
|||||||
import { signInDel } from '@/apis/signin';
|
import { signInDel } from '@/apis/signin';
|
||||||
import { exit } from '@/apis/updater';
|
import { exit } from '@/apis/updater';
|
||||||
import { injectGlobalData } from '@/provide';
|
import { injectGlobalData } from '@/provide';
|
||||||
import { Delete,SwitchButton,ArrowDown, Flag,HelpFilled,Platform } from '@element-plus/icons-vue'
|
import { Delete,SwitchButton,ArrowDown, Flag,HelpFilled,Platform,Paperclip } from '@element-plus/icons-vue'
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useAccess } from './access';
|
import { useAccess } from './access';
|
||||||
import { setApiPassword } from '@/apis/access';
|
import { setApiPassword } from '@/apis/access';
|
||||||
import { useFlow } from './flow';
|
import { useFlow } from './flow';
|
||||||
|
import { useTuntap } from './tuntap';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
emits:['refresh','access'],
|
emits:['refresh','access'],
|
||||||
components:{Delete,SwitchButton,ArrowDown,Flag,HelpFilled,Platform},
|
components:{Delete,SwitchButton,ArrowDown,Flag,HelpFilled,Platform,Paperclip},
|
||||||
setup (props,{emit}) {
|
setup (props,{emit}) {
|
||||||
|
|
||||||
const globalData = injectGlobalData();
|
const globalData = injectGlobalData();
|
||||||
@@ -55,6 +57,7 @@ export default {
|
|||||||
const hasApiPasswordOther = computed(()=>globalData.value.hasAccess('SetApiPasswordOther'));
|
const hasApiPasswordOther = computed(()=>globalData.value.hasAccess('SetApiPasswordOther'));
|
||||||
|
|
||||||
const flow = useFlow();
|
const flow = useFlow();
|
||||||
|
const tuntap = useTuntap();
|
||||||
|
|
||||||
|
|
||||||
const handleDel = (machineId,machineName)=>{
|
const handleDel = (machineId,machineName)=>{
|
||||||
@@ -113,9 +116,14 @@ export default {
|
|||||||
flow.value.device.name = name;
|
flow.value.device.name = name;
|
||||||
flow.value.show = true;
|
flow.value.show = true;
|
||||||
}
|
}
|
||||||
|
const handleRoutes = (id,name)=>{
|
||||||
|
tuntap.value.device.id = id;
|
||||||
|
tuntap.value.device.name = name;
|
||||||
|
tuntap.value.showRoutes = true;
|
||||||
|
}
|
||||||
|
|
||||||
return {accessList,handleDel,handleExit,hasReboot,hasRemove,hasAccess,handleShowAccess,handleAccess,
|
return {accessList,handleDel,handleExit,hasReboot,hasRemove,hasAccess,handleShowAccess,handleAccess,
|
||||||
hasApiPassword,hasApiPasswordOther,handleApiPassword,handleStopwatch
|
hasApiPassword,hasApiPasswordOther,handleApiPassword,handleStopwatch,handleRoutes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
67
src/linker.web/src/views/full/devices/TuntapRoutes.vue
Normal file
67
src/linker.web/src/views/full/devices/TuntapRoutes.vue
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog v-model="state.show" append-to=".app-wrap" :title="`[${state.machineName}]上的路由`" top="1vh" >
|
||||||
|
<div>
|
||||||
|
<el-table :data="state.data" size="small" border height="500">
|
||||||
|
<el-table-column property="Ip" label="IP"></el-table-column>
|
||||||
|
<el-table-column property="Id" label="目标">
|
||||||
|
<template #default="scope">
|
||||||
|
<span>{{ state.names[scope.row.Id] }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { reactive, watch,onMounted, onUnmounted } from 'vue';
|
||||||
|
import { useTuntap } from './tuntap';
|
||||||
|
import { getSignInNames } from '@/apis/signin';
|
||||||
|
import { getTuntapRoutes } from '@/apis/tuntap';
|
||||||
|
export default {
|
||||||
|
props: ['modelValue'],
|
||||||
|
emits: ['update:modelValue'],
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const tuntap = useTuntap();
|
||||||
|
|
||||||
|
const state = reactive({
|
||||||
|
show: true,
|
||||||
|
machineId: tuntap.value.device.id,
|
||||||
|
machineName: tuntap.value.device.name,
|
||||||
|
data:[],
|
||||||
|
names: {},
|
||||||
|
timer: 0
|
||||||
|
});
|
||||||
|
watch(() => state.show, (val) => {
|
||||||
|
if (!val) {
|
||||||
|
setTimeout(() => {
|
||||||
|
emit('update:modelValue', val);
|
||||||
|
emit('change')
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
getSignInNames().then((res)=>{
|
||||||
|
state.names = res.reduce((json,value)=>{ json[value.MachineId]=value.MachineName; return json; },{});
|
||||||
|
}).catch(()=>{});
|
||||||
|
getTuntapRoutes(state.machineId).then((res)=>{
|
||||||
|
state.data = Object.keys(res).map((value)=>{
|
||||||
|
return {
|
||||||
|
Ip: value,
|
||||||
|
Id: res[value]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).catch(()=>{})
|
||||||
|
});
|
||||||
|
onUnmounted(() => {
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
state
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
<template v-if="tuntap.list[item.MachineId].Available == false">
|
<template v-if="tuntap.list[item.MachineId].Available == false">
|
||||||
<div class="flex disable" title="IP不生效,可能是设备不在线">{{ item1.IP }} / {{ item1.PrefixLength }}</div>
|
<div class="flex disable" title="IP不生效,可能是设备不在线">{{ item1.IP }} / {{ item1.PrefixLength }}</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="item1.Disabled">
|
<template v-else-if="item1.Disabled">
|
||||||
<div class="flex disable" title="已禁用">{{ item1.IP }} / {{ item1.PrefixLength }}</div>
|
<div class="flex disable" title="已禁用">{{ item1.IP }} / {{ item1.PrefixLength }}</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="item1.Exists">
|
<template v-else-if="item1.Exists">
|
||||||
@@ -125,14 +125,17 @@ export default {
|
|||||||
}
|
}
|
||||||
const handleTuntapIP = (tuntap) => {
|
const handleTuntapIP = (tuntap) => {
|
||||||
if(!props.config && machineId.value != tuntap.MachineId){
|
if(!props.config && machineId.value != tuntap.MachineId){
|
||||||
|
ElMessage.success('无权限1');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(machineId.value === tuntap.MachineId){
|
if(machineId.value === tuntap.MachineId){
|
||||||
if(!hasTuntapChangeSelf.value){
|
if(!hasTuntapChangeSelf.value){
|
||||||
|
ElMessage.success('无权限2');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
if(!hasTuntapChangeOther.value){
|
if(!hasTuntapChangeOther.value){
|
||||||
|
ElMessage.success('无权限3');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ export const provideTuntap = () => {
|
|||||||
hashcode: 0,
|
hashcode: 0,
|
||||||
|
|
||||||
showLease: false,
|
showLease: false,
|
||||||
|
|
||||||
|
device: {id:'',name:''},
|
||||||
|
showRoutes:false,
|
||||||
});
|
});
|
||||||
provide(tuntapSymbol, tuntap);
|
provide(tuntapSymbol, tuntap);
|
||||||
|
|
||||||
|
|||||||
219
src/linker.web/src/views/full/firewall/Add.vue
Normal file
219
src/linker.web/src/views/full/firewall/Add.vue
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog class="options-center" :title="$t('firewall.rule')" destroy-on-close v-model="state.show" width="50rem" top="2vh">
|
||||||
|
<div>
|
||||||
|
<el-form ref="ruleFormRef" :model="state.ruleForm.Data" :rules="state.rules" label-width="auto">
|
||||||
|
<el-form-item :label="$t('firewall.srcName')" prop="SrcId">
|
||||||
|
<el-row class="w-100">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-select v-model="state.ruleForm.Data.SrcId" @change="handleMachineChange()"
|
||||||
|
filterable remote :loading="state.loading" :remote-method="handleMachineSearch">
|
||||||
|
<template #header>
|
||||||
|
<div class="t-c">
|
||||||
|
<div class="page-wrap">
|
||||||
|
<el-pagination small background layout="prev, pager, next"
|
||||||
|
:page-size="state.machineIds.Request.Size"
|
||||||
|
:total="state.machineIds.Count"
|
||||||
|
:pager-count="5"
|
||||||
|
:current-page="state.machineIds.Request.Page" @current-change="handleMachinePageChange" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<el-option v-for="(item, index) in state.machineIds.List" :key="index" :label="item.MachineName" :value="item.MachineId">
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12"></el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item></el-form-item>
|
||||||
|
<el-form-item :label="$t('firewall.dstCidr')" prop="DstCIDR">
|
||||||
|
<el-row class="w-100">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-input v-model="state.ruleForm.Data.DstCIDR" />
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
10.18.1.1/24、10.18.1.1、0、*
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item :label="$t('firewall.dstPort')" prop="DstPort">
|
||||||
|
<el-row class="w-100">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-input v-model="state.ruleForm.Data.DstPort" />
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
80、80-88、80,443、0、*
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('firewall.protocol')" prop="Protocol">
|
||||||
|
<el-row class="w-100">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-select v-model="state.protocolChecks" multiple >
|
||||||
|
<el-option :value="item.value" :label="item.label" v-for="(item,index) in state.protocols"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12"></el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('firewall.action')" prop="Action">
|
||||||
|
<el-row class="w-100">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-select v-model="state.ruleForm.Data.Action" >
|
||||||
|
<el-option :value="item.value" :label="item.label" v-for="(item,index) in state.actions"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12"></el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item></el-form-item>
|
||||||
|
<el-form-item :label="$t('firewall.orderby')" prop="OrderBy">
|
||||||
|
<el-input-number v-model="state.ruleForm.Data.OrderBy" :min="0" :max="65535" style="width:13rem" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('firewall.disabled')" prop="Disabled">
|
||||||
|
<div class="flex">
|
||||||
|
<el-switch v-model="state.ruleForm.Data.Disabled"
|
||||||
|
active-text="😀" inactive-text="😣" inline-prompt />
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('firewall.remark')" prop="Remark">
|
||||||
|
<el-input v-model="state.ruleForm.Data.Remark" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="" prop="Btns">
|
||||||
|
<div class="t-c w-100">
|
||||||
|
<el-button @click="state.show = false">{{$t('common.cancel')}}</el-button>
|
||||||
|
<el-button type="primary" @click="handleSave">{{$t('common.confirm')}}</el-button>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { ElMessage } from 'element-plus';
|
||||||
|
import { inject, reactive, ref, watch } from 'vue'
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
import { addFirewall } from '@/apis/firewall';
|
||||||
|
import { getSignInIds } from '@/apis/signin';
|
||||||
|
export default {
|
||||||
|
props: ['modelValue'],
|
||||||
|
emits: ['update:modelValue','success'],
|
||||||
|
setup(props,{emit}) {
|
||||||
|
const {t} = useI18n();
|
||||||
|
|
||||||
|
const add = inject('add');
|
||||||
|
const state = reactive({
|
||||||
|
show:true,
|
||||||
|
loading:false,
|
||||||
|
machineIds:{
|
||||||
|
Request: {
|
||||||
|
Page: 1, Size:10, Name: ''
|
||||||
|
},
|
||||||
|
Count: 0,
|
||||||
|
List: []
|
||||||
|
},
|
||||||
|
|
||||||
|
protocolChecks:[
|
||||||
|
(add.value.Data.Protocol & 1) ,
|
||||||
|
(add.value.Data.Protocol & 2)
|
||||||
|
].filter(c=>c > 0),
|
||||||
|
ruleForm:{
|
||||||
|
MachineId:add.value.MachineId,
|
||||||
|
Data:{
|
||||||
|
Id:add.value.Data.Id,
|
||||||
|
GroupId:add.value.Data.GroupId,
|
||||||
|
SrcName:add.value.Data.SrcName,
|
||||||
|
Disabled:add.value.Data.Disabled,
|
||||||
|
OrderBy:add.value.Data.OrderBy,
|
||||||
|
|
||||||
|
SrcId:add.value.Data.SrcId,
|
||||||
|
DstCIDR:add.value.Data.DstCIDR,
|
||||||
|
DstPort:add.value.Data.DstPort,
|
||||||
|
Protocol:add.value.Data.Protocol,
|
||||||
|
Action:add.value.Data.Action,
|
||||||
|
Remark:add.value.Data.Remark,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
rules:{
|
||||||
|
SrcId: [{ required: true, message: "required", trigger: "blur" }],
|
||||||
|
DstCIDR: [{ required: true, message: "required", trigger: "blur" }],
|
||||||
|
DstPort: [{ required: true, message: "required", trigger: "blur" }]
|
||||||
|
},
|
||||||
|
protocols: [
|
||||||
|
{label:'TCP',value:1},
|
||||||
|
{label:'UDP',value:2}
|
||||||
|
],
|
||||||
|
actions: [
|
||||||
|
{label:t('firewall.actionAllow'),value:1},
|
||||||
|
{label:t('firewall.actionDeny'),value:2},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
watch(() => state.show, (val) => {
|
||||||
|
if (!val) {
|
||||||
|
setTimeout(() => {
|
||||||
|
emit('update:modelValue', val);
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const ruleFormRef = ref(null);
|
||||||
|
const handleSave = ()=>{
|
||||||
|
ruleFormRef.value.validate((valid) => {
|
||||||
|
if (!valid) return;
|
||||||
|
|
||||||
|
const json = JSON.parse(JSON.stringify(state.ruleForm));
|
||||||
|
json.Data.Protocol = state.protocolChecks.reduce((a,b)=>a|b,0);
|
||||||
|
addFirewall(json).then(()=>{
|
||||||
|
ElMessage.success(t('common.oper'));
|
||||||
|
state.show = false;
|
||||||
|
emit('success');
|
||||||
|
}).catch(()=>{
|
||||||
|
ElMessage.error(t('common.operFail'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleMachineChange = () => {
|
||||||
|
const machine = state.machineIds.List.find(c=>c.MachineId == state.ruleForm.Data.SrcId);
|
||||||
|
if(machine){
|
||||||
|
state.ruleForm.Data.SrcName = machine.MachineName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const handleMachinePageChange = (page)=>{
|
||||||
|
state.machineIds.Request.Page = page;
|
||||||
|
_getMachineIds();
|
||||||
|
}
|
||||||
|
const handleMachineSearch = (name)=>{
|
||||||
|
state.machineIds.Request.Name = name;
|
||||||
|
_getMachineIds();
|
||||||
|
}
|
||||||
|
const _getMachineIds = ()=>{
|
||||||
|
state.loading = true;
|
||||||
|
getSignInIds(state.machineIds.Request).then((res)=>{
|
||||||
|
state.loading = false;
|
||||||
|
state.machineIds.Request = res.Request;
|
||||||
|
state.machineIds.Count = res.Count;
|
||||||
|
res.List.splice(0,0,{MachineId:'*',MachineName:'*'});
|
||||||
|
|
||||||
|
if(state.ruleForm.Data.SrcId){
|
||||||
|
if(res.List.filter(c=>c.MachineId == state.ruleForm.Data.SrcId).length == 0){
|
||||||
|
res.List.splice(1,0,{MachineId:state.ruleForm.Data.SrcId,MachineName:state.ruleForm.Data.SrcName});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state.machineIds.List = res.List;
|
||||||
|
}).catch((e)=>{
|
||||||
|
state.loading = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {state,ruleFormRef,handleSave,handleMachineSearch,handleMachinePageChange,handleMachineChange}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.el-form-item{margin-bottom:1rem}
|
||||||
|
.el-input-number--small{width:10rem !important}
|
||||||
|
</style>
|
||||||
261
src/linker.web/src/views/full/firewall/Index.vue
Normal file
261
src/linker.web/src/views/full/firewall/Index.vue
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
<template>
|
||||||
|
<div class="firewall-setting-wrap flex flex-column h-100">
|
||||||
|
<div class="inner">
|
||||||
|
<div class="head">
|
||||||
|
<div class="flex">
|
||||||
|
<div>
|
||||||
|
<el-select v-model="state.search.Data.Action" @change="loadData" size="small" class="mgr-1" style="width: 9rem;">
|
||||||
|
<el-option :value="item.value" :label="item.label" v-for="(item,index) in state.actions"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<el-select v-model="state.search.Data.Protocol" @change="loadData" size="small" class="mgr-1" style="width: 9rem;">
|
||||||
|
<el-option :value="item.value" :label="item.label" v-for="(item,index) in state.protocols"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<el-select v-model="state.search.Data.Disabled" @change="loadData" size="small" class="mgr-1" style="width: 9rem;">
|
||||||
|
<el-option :value="item.value" :label="item.label" v-for="(item,index) in state.states"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span>{{$t('firewall.srcName')}}/{{$t('firewall.dstCidr')}}/{{$t('firewall.dstPort')}}/{{$t('firewall.remark')}}</span>
|
||||||
|
<el-input v-model="state.search.Data.Str" @change="loadData" size="small" style="width:7rem"></el-input>
|
||||||
|
</div>
|
||||||
|
<div class="mgl-1">
|
||||||
|
<el-button size="small" :loading="state.loading" @click="loadData">{{$t('common.refresh')}}</el-button>
|
||||||
|
</div>
|
||||||
|
<div class="mgl-1">
|
||||||
|
<el-button type="success" size="small" :loading="state.loading" @click="handleAdd()">+</el-button>
|
||||||
|
</div>
|
||||||
|
<div class="flex-1"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="body flex-1 relative">
|
||||||
|
<el-table stripe border :data="state.data" size="small" :height="`${state.height}px`" width="100%" :row-class-name="tableRowClassName">
|
||||||
|
<el-table-column prop="SrcName" :label="$t('firewall.srcName')" >
|
||||||
|
<template v-slot="scope">
|
||||||
|
<div class="ellipsis" :title="scope.row.SrcName">{{ scope.row.SrcName }}</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="DstCIDR" :label="$t('firewall.dstCidr')" width="130"></el-table-column>
|
||||||
|
<el-table-column prop="DstPort" :label="$t('firewall.dstPort')"></el-table-column>
|
||||||
|
<el-table-column prop="Protocol" :label="$t('firewall.protocol')" width="70">
|
||||||
|
<template v-slot="scope">{{handleShowProtocol(scope.row.Protocol)}}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="Action" :label="$t('firewall.action')" width="50">
|
||||||
|
<template v-slot="scope">{{handleShowAction(scope.row.Action)}}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="OrderBy" :label="$t('firewall.orderby')" width="60"></el-table-column>
|
||||||
|
<el-table-column prop="Disabled" :label="$t('firewall.disabled')" width="70">
|
||||||
|
<template v-slot="scope">
|
||||||
|
<div>
|
||||||
|
<el-switch v-model="scope.row.Disabled" size="small"
|
||||||
|
active-text="😀" inactive-text="😣" inline-prompt @change="handleDsiabled(scope.row)"
|
||||||
|
style="--el-switch-on-color: red;" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="Remark" :label="$t('firewall.remark')" >
|
||||||
|
<template v-slot="scope">
|
||||||
|
<div class="ellipsis" :title="scope.row.Remark">{{ scope.row.Remark }}</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column width="80" fixed="right">
|
||||||
|
<template #header>
|
||||||
|
<div class="flex">
|
||||||
|
<el-switch v-model="state.state" size="small" :title="$t('firewall.switch')"
|
||||||
|
:active-value="0" :inactive-value="1"
|
||||||
|
active-text="😀" inactive-text="😣" inline-prompt @change="handleSetState" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #default="scope">
|
||||||
|
<div>
|
||||||
|
<a href="javascript:void(0);" class="a-line mgr-1" @click="handleAdd(scope.row)">{{$t('firewall.edit')}}</a>
|
||||||
|
<el-popconfirm
|
||||||
|
:confirm-button-text="$t('common.confirm')" :cancel-button-text="$t('common.cancel')"
|
||||||
|
:title="$t('firewall.delConfirm')" @confirm="handleDel(scope.row)">
|
||||||
|
<template #reference>
|
||||||
|
<a href="javascript:void(0);" class="a-line">{{$t('firewall.del')}}</a>
|
||||||
|
</template>
|
||||||
|
</el-popconfirm>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Add v-if="state.showAdd" v-model="state.showAdd" @success="loadData"></Add>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { reactive,computed, ref } from '@vue/reactivity'
|
||||||
|
import { onMounted, provide } from '@vue/runtime-core'
|
||||||
|
import { injectGlobalData } from '@/provide'
|
||||||
|
import { addFirewall, getFirewall, removeFirewall, stateFirewall } from '@/apis/firewall';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
import { ElMessage } from 'element-plus';
|
||||||
|
import Add from './Add.vue';
|
||||||
|
export default {
|
||||||
|
props: ['machineId','machineName'],
|
||||||
|
components:{Add},
|
||||||
|
setup(props,{emit}) {
|
||||||
|
|
||||||
|
const {t} = useI18n();
|
||||||
|
|
||||||
|
const globalData = injectGlobalData();
|
||||||
|
const state = reactive({
|
||||||
|
loading: true,
|
||||||
|
search:{
|
||||||
|
MachineId:props.machineId || globalData.value.config.Client.Id,
|
||||||
|
Data:{
|
||||||
|
Str:'',
|
||||||
|
Disabled:-1,
|
||||||
|
Protocol: 3,
|
||||||
|
Action:3,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
protocols: [
|
||||||
|
{label:t('firewall.protocolall'),value:3},
|
||||||
|
{label:'TCP',value:1},
|
||||||
|
{label:'UDP',value:2}
|
||||||
|
],
|
||||||
|
actions: [
|
||||||
|
{label:t('firewall.actionall'),value:3},
|
||||||
|
{label:t('firewall.actionAllow'),value:1},
|
||||||
|
{label:t('firewall.actionDeny'),value:2},
|
||||||
|
],
|
||||||
|
states: [
|
||||||
|
{label:t('firewall.disabledAll'),value:-1},
|
||||||
|
{label:t('firewall.enabled'),value:0},
|
||||||
|
{label:t('firewall.disabled'),value:1},
|
||||||
|
],
|
||||||
|
|
||||||
|
data:[],
|
||||||
|
state:1,
|
||||||
|
height:computed(()=>globalData.value.height - 120),
|
||||||
|
showAdd:false
|
||||||
|
})
|
||||||
|
const loadData = () => {
|
||||||
|
state.loading = true;
|
||||||
|
getFirewall(state.search).then((res) => {
|
||||||
|
state.loading = false;
|
||||||
|
state.data = res.List;
|
||||||
|
state.state = res.State;
|
||||||
|
}).catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
state.loading = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSetState = ()=>{
|
||||||
|
state.loading = true;
|
||||||
|
stateFirewall({
|
||||||
|
MachineId:state.search.MachineId,
|
||||||
|
State:state.state
|
||||||
|
}).then(()=>{
|
||||||
|
state.loading = false;
|
||||||
|
ElMessage.success(t('common.oper'));
|
||||||
|
}).catch((err)=>{
|
||||||
|
state.loading = false;
|
||||||
|
console.log(err);
|
||||||
|
ElMessage.error(t('common.operFail'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const handleDel = (row) => {
|
||||||
|
state.loading = true;
|
||||||
|
removeFirewall({
|
||||||
|
MachineId:state.search.MachineId,
|
||||||
|
Id:row.Id
|
||||||
|
}).then(()=>{loadData(); state.loading = false;}).catch(()=>{state.loading = false;});
|
||||||
|
}
|
||||||
|
const handleDsiabled = (row)=>{
|
||||||
|
state.loading = true;
|
||||||
|
addFirewall({
|
||||||
|
MachineId:state.search.MachineId,
|
||||||
|
Data:row,
|
||||||
|
}).then(()=>{loadData(); state.loading = false;}).catch(()=>{state.loading = false;});
|
||||||
|
}
|
||||||
|
|
||||||
|
const addState = ref({});
|
||||||
|
provide('add',addState);
|
||||||
|
const handleAdd = (row)=>{
|
||||||
|
addState.value = {
|
||||||
|
MachineId:state.search.MachineId,
|
||||||
|
Data: row || {
|
||||||
|
Id:'',
|
||||||
|
GroupId:globalData.value.config.Client.Group.Id,
|
||||||
|
SrcName:'',
|
||||||
|
Disabled:false,
|
||||||
|
OrderBy:0,
|
||||||
|
|
||||||
|
SrcId:'',
|
||||||
|
DstCIDR:'0.0.0.0/0',
|
||||||
|
DstPort:'0',
|
||||||
|
Protocol:3,
|
||||||
|
Action:1,
|
||||||
|
Remark:t('firewall.actionAllowAll')
|
||||||
|
}
|
||||||
|
};
|
||||||
|
state.showAdd = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const protocolArr = ['','TCP','UDP'];
|
||||||
|
const handleShowProtocol = (protocol)=>{
|
||||||
|
return [
|
||||||
|
protocolArr[(protocol & 1)] ,
|
||||||
|
protocolArr[(protocol & 2)]
|
||||||
|
].filter(c=>!!c).join('/');
|
||||||
|
}
|
||||||
|
const actionArr = ['','✔','✘'];
|
||||||
|
const handleShowAction = (action)=>{
|
||||||
|
return actionArr[action];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const tableRowClassName = ({ row, rowIndex }) => {
|
||||||
|
return `action-${row.Action}`;
|
||||||
|
}
|
||||||
|
onMounted(()=>{
|
||||||
|
loadData();
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
state, loadData, tableRowClassName,handleSetState,handleAdd,handleDel,
|
||||||
|
handleShowProtocol,handleShowAction,handleDsiabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.firewall-setting-wrap {
|
||||||
|
padding: 1rem;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size:1.3rem
|
||||||
|
|
||||||
|
.inner {
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
.head {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
color:#555;
|
||||||
|
border:1px solid #eee;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="stylus">
|
||||||
|
.firewall-setting-wrap {
|
||||||
|
.el-table {
|
||||||
|
.action-1 {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-2 {
|
||||||
|
color: #c83f08;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
<el-form-item :label="$t('server.relaySecretKey')">
|
<el-form-item :label="$t('server.relaySecretKey')">
|
||||||
<div >
|
<div >
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<el-input class="flex-1" type="password" show-password v-model="state.list.SecretKey" maxlength="36" @change="handleSave" />
|
<el-input :class="{success:state.keyState,error:state.keyState==false}" class="flex-1" type="password" show-password v-model="state.list.SecretKey" maxlength="36" @change="handleSave" />
|
||||||
<Sync class="mgl-1" name="RelaySecretKey"></Sync>
|
<Sync class="mgl-1" name="RelaySecretKey"></Sync>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
<EditNode v-if="state.showEdit" v-model="state.showEdit" :data="state.current"></EditNode>
|
<EditNode v-if="state.showEdit" v-model="state.showEdit" :data="state.current"></EditNode>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { relayCdkeyAccess, setRelayServers, setRelaySubscribe } from '@/apis/relay';
|
import { checkRelayKey, relayCdkeyAccess, setRelayServers, setRelaySubscribe } from '@/apis/relay';
|
||||||
import { injectGlobalData } from '@/provide';
|
import { injectGlobalData } from '@/provide';
|
||||||
import { ElMessage } from 'element-plus';
|
import { ElMessage } from 'element-plus';
|
||||||
import { onMounted, onUnmounted, reactive, watch } from 'vue'
|
import { onMounted, onUnmounted, reactive, watch } from 'vue'
|
||||||
@@ -100,7 +100,8 @@ export default {
|
|||||||
timer:0,
|
timer:0,
|
||||||
showEdit:false,
|
showEdit:false,
|
||||||
current:{},
|
current:{},
|
||||||
hasRelayCdkey:false
|
hasRelayCdkey:false,
|
||||||
|
keyState:false,
|
||||||
});
|
});
|
||||||
watch(()=>globalData.value.config.Client.Relay.Server,()=>{
|
watch(()=>globalData.value.config.Client.Relay.Server,()=>{
|
||||||
state.list.Delay = globalData.value.config.Client.Relay.Server.Delay;
|
state.list.Delay = globalData.value.config.Client.Relay.Server.Delay;
|
||||||
@@ -117,7 +118,8 @@ export default {
|
|||||||
}).catch((err)=>{
|
}).catch((err)=>{
|
||||||
console.log(err);
|
console.log(err);
|
||||||
ElMessage.error(t('common.operFail'));
|
ElMessage.error(t('common.operFail'));
|
||||||
});;
|
});
|
||||||
|
handleCheckKey();
|
||||||
}
|
}
|
||||||
const _setRelaySubscribe = ()=>{
|
const _setRelaySubscribe = ()=>{
|
||||||
clearTimeout(state.timer);
|
clearTimeout(state.timer);
|
||||||
@@ -128,15 +130,22 @@ export default {
|
|||||||
state.timer = setTimeout(_setRelaySubscribe,1000);
|
state.timer = setTimeout(_setRelaySubscribe,1000);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
const handleCheckKey = ()=>{
|
||||||
|
checkRelayKey(state.list.SecretKey).then((res)=>{
|
||||||
|
state.keyState = res;
|
||||||
|
}).catch(()=>{});
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(()=>{
|
onMounted(()=>{
|
||||||
_setRelaySubscribe();
|
_setRelaySubscribe();
|
||||||
relayCdkeyAccess().then(res=>{
|
relayCdkeyAccess().then(res=>{
|
||||||
state.hasRelayCdkey = res;
|
state.hasRelayCdkey = res;
|
||||||
}).catch(()=>{})
|
}).catch(()=>{});
|
||||||
|
handleCheckKey();
|
||||||
});
|
});
|
||||||
onUnmounted(()=>{
|
onUnmounted(()=>{
|
||||||
clearTimeout(state.timer);
|
clearTimeout(state.timer);
|
||||||
})
|
});
|
||||||
|
|
||||||
return {globalData,state,handleSave,handleEdit}
|
return {globalData,state,handleSave,handleEdit}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-form-item :label="$t('server.sforwardSecretKey')">
|
<el-form-item :label="$t('server.sforwardSecretKey')">
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<el-input class="flex-1" type="password" show-password v-model="state.SForwardSecretKey" maxlength="36" @blur="handleChange" />
|
<el-input :class="{success:state.keyState,error:state.keyState==false}" class="flex-1" type="password" show-password v-model="state.SForwardSecretKey" maxlength="36" @blur="handleChange" />
|
||||||
<Sync class="mgl-1" name="SForwardSecretKey"></Sync>
|
<Sync class="mgl-1" name="SForwardSecretKey"></Sync>
|
||||||
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.sforwardText')}}</span>
|
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.sforwardText')}}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getSForwardSecretKey,setSForwardSecretKey } from '@/apis/sforward';
|
import { checkSForwardKey, getSForwardSecretKey,setSForwardSecretKey } from '@/apis/sforward';
|
||||||
import { ElMessage } from 'element-plus';
|
import { ElMessage } from 'element-plus';
|
||||||
import {onMounted, reactive } from 'vue'
|
import {onMounted, reactive } from 'vue'
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
@@ -21,12 +21,14 @@ export default {
|
|||||||
const {t} = useI18n();
|
const {t} = useI18n();
|
||||||
const globalData = injectGlobalData();
|
const globalData = injectGlobalData();
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
SForwardSecretKey:''
|
SForwardSecretKey:'',
|
||||||
|
keyState:false
|
||||||
});
|
});
|
||||||
|
|
||||||
const _getSForwardSecretKey = ()=>{
|
const _getSForwardSecretKey = ()=>{
|
||||||
getSForwardSecretKey().then((res)=>{
|
getSForwardSecretKey().then((res)=>{
|
||||||
state.SForwardSecretKey = res;
|
state.SForwardSecretKey = res;
|
||||||
|
handleCheckKey();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,11 +43,18 @@ export default {
|
|||||||
}
|
}
|
||||||
const handleChange = ()=>{
|
const handleChange = ()=>{
|
||||||
_setSForwardSecretKey();
|
_setSForwardSecretKey();
|
||||||
|
handleCheckKey();
|
||||||
|
}
|
||||||
|
const handleCheckKey = ()=>{
|
||||||
|
checkSForwardKey(state.SForwardSecretKey).then((res)=>{
|
||||||
|
state.keyState = res;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(()=>{
|
onMounted(()=>{
|
||||||
_getSForwardSecretKey();
|
_getSForwardSecretKey();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
return {globalData,state,handleChange}
|
return {globalData,state,handleChange}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user