cdkey独立,可作用于中继和内网穿透

This commit is contained in:
snltty
2025-06-10 17:28:54 +08:00
parent 322098e472
commit ae4da940d0
143 changed files with 2200 additions and 1770 deletions

View File

@@ -6,6 +6,7 @@ dotnet_diagnostic.CA1416.severity = none
[*.cs]
#### 命名样式 ####
# 命名规则
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
@@ -127,6 +128,7 @@ dotnet_naming_style.帕斯卡拼写法.word_separator =
dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case
[*.{cs,vb}]
dotnet_diagnostic.CA1838.severity = none
dotnet_style_qualification_for_field = false:silent
dotnet_style_qualification_for_property = false:silent
dotnet_style_qualification_for_method = false:silent

View File

@@ -57,9 +57,9 @@ jobs:
docker tag snltty/linker-musl-x64:latest 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:v1.8.2 snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
docker manifest create snltty/linker-musl:v1.8.3 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:v1.8.2 && \
docker manifest push snltty/linker-musl:v1.8.3 && \
docker pull --platform linux/arm/v7 snltty/linker-debian-arm:latest && \
docker tag snltty/linker-debian-arm:latest snltty/linker-debian:arm && \
docker push snltty/linker-debian:arm && \
@@ -70,9 +70,9 @@ jobs:
docker tag snltty/linker-debian-x64:latest 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:v1.8.2 snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
docker manifest create snltty/linker-debian:v1.8.3 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:v1.8.2 && \
docker manifest push snltty/linker-debian:v1.8.3 && \
docker pull --platform linux/arm/v7 snltty/linker-kvm-arm:latest && \
docker tag snltty/linker-kvm-arm:latest snltty/linker-kvm:arm && \
docker push snltty/linker-kvm:arm && \
@@ -83,6 +83,6 @@ jobs:
docker tag snltty/linker-kvm-x64:latest snltty/linker-kvm:amd64 && \
docker push snltty/linker-kvm:amd64 && \
docker manifest create snltty/linker-kvm:latest snltty/linker-kvm:amd64 snltty/linker-kvm:arm64 snltty/linker-kvm:arm && \
docker manifest create snltty/linker-kvm:v1.8.2 snltty/linker-kvm:amd64 snltty/linker-kvm:arm64 snltty/linker-kvm:arm && \
docker manifest create snltty/linker-kvm:v1.8.3 snltty/linker-kvm:amd64 snltty/linker-kvm:arm64 snltty/linker-kvm:arm && \
docker manifest push snltty/linker-kvm:latest && \
docker manifest push snltty/linker-kvm:v1.8.2
docker manifest push snltty/linker-kvm:v1.8.3

View File

@@ -33,11 +33,11 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.ACTIONS_TOKEN }}
with:
tag_name: v1.8.2
release_name: v1.8.2.${{ steps.date.outputs.today }}
tag_name: v1.8.3
release_name: v1.8.3.${{ steps.date.outputs.today }}
draft: false
prerelease: false
body: "1. 一些累计更新\r\n2. 重建权限存储ulong改为BitArray同组所有客户端需保持版本一致\r\n3. 增加唤醒功能支持WOLCOM继电器HID继电器\r\n4. 基于One-KVM包装docker镜像集成linker\r\n5. 管理端口改为1804一个端口托管Web+Websocket"
body: "1. 一些累计更新\r\n2. 修复socks5解决CPU爆满问题增加域名解析和HTTP代理\r\n3. 优化唤醒模块\r\n5. 管理端口改为1804一个端口托管Web+Websocket"
- name: publish projects
run: ./publish.bat "C:\\Android\\android-sdk"
- name: upload-win-x86-oss
@@ -49,7 +49,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-win-x86.zip
target-path: /downloads/linker/v1.8.2/linker-win-x86.zip
target-path: /downloads/linker/v1.8.3/linker-win-x86.zip
- name: upload-win-x86
id: upload-win-x86
uses: actions/upload-release-asset@master
@@ -69,7 +69,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-win-x64.zip
target-path: /downloads/linker/v1.8.2/linker-win-x64.zip
target-path: /downloads/linker/v1.8.3/linker-win-x64.zip
- name: upload-win-x64
id: upload-win-x64
uses: actions/upload-release-asset@master
@@ -89,7 +89,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-win-arm64.zip
target-path: /downloads/linker/v1.8.2/linker-win-arm64.zip
target-path: /downloads/linker/v1.8.3/linker-win-arm64.zip
- name: upload-win-arm64
id: upload-win-arm64
uses: actions/upload-release-asset@master
@@ -109,7 +109,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-x64.zip
target-path: /downloads/linker/v1.8.2/linker-linux-x64.zip
target-path: /downloads/linker/v1.8.3/linker-linux-x64.zip
- name: upload-linux-x64
id: upload-linux-x64
uses: actions/upload-release-asset@master
@@ -129,7 +129,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-arm.zip
target-path: /downloads/linker/v1.8.2/linker-linux-arm.zip
target-path: /downloads/linker/v1.8.3/linker-linux-arm.zip
- name: upload-linux-arm
id: upload-linux-arm
uses: actions/upload-release-asset@master
@@ -149,7 +149,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-arm64.zip
target-path: /downloads/linker/v1.8.2/linker-linux-arm64.zip
target-path: /downloads/linker/v1.8.3/linker-linux-arm64.zip
- name: upload-linux-arm64
id: upload-linux-arm64
uses: actions/upload-release-asset@master
@@ -169,7 +169,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-musl-x64.zip
target-path: /downloads/linker/v1.8.2/linker-linux-musl-x64.zip
target-path: /downloads/linker/v1.8.3/linker-linux-musl-x64.zip
- name: upload-linux-musl-x64
id: upload-linux-musl-x64
uses: actions/upload-release-asset@master
@@ -189,7 +189,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-musl-arm.zip
target-path: /downloads/linker/v1.8.2/linker-linux-musl-arm.zip
target-path: /downloads/linker/v1.8.3/linker-linux-musl-arm.zip
- name: upload-linux-musl-arm
id: upload-linux-musl-arm
uses: actions/upload-release-asset@master
@@ -209,7 +209,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-musl-arm64.zip
target-path: /downloads/linker/v1.8.2/linker-linux-musl-arm64.zip
target-path: /downloads/linker/v1.8.3/linker-linux-musl-arm64.zip
- name: upload-linux-musl-arm64
id: upload-linux-musl-arm64
uses: actions/upload-release-asset@master
@@ -259,7 +259,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker.apk
target-path: /downloads/linker/v1.8.2/linker.apk
target-path: /downloads/linker/v1.8.3/linker.apk
- name: upload-apk
id: upload-apk
uses: actions/upload-release-asset@master

View File

@@ -44,7 +44,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-ipk/x64/linker-x64.ipk
target-path: /downloads/linker/v1.8.2/linker-x64.ipk
target-path: /downloads/linker/v1.8.3/linker-x64.ipk
- name: upload-x64
id: upload-x64
uses: actions/upload-release-asset@master
@@ -64,7 +64,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-ipk/arm/linker-arm.ipk
target-path: /downloads/linker/v1.8.2/linker-arm.ipk
target-path: /downloads/linker/v1.8.3/linker-arm.ipk
- name: upload-arm
id: upload-arm
uses: actions/upload-release-asset@master
@@ -84,7 +84,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-ipk/arm64/linker-arm64.ipk
target-path: /downloads/linker/v1.8.2/linker-arm64.ipk
target-path: /downloads/linker/v1.8.3/linker-arm64.ipk
- name: upload-arm64
id: upload-arm64
uses: actions/upload-release-asset@master

View File

@@ -37,6 +37,7 @@ jobs:
dotnet build ./src/linker.messenger.pcp -c release
dotnet build ./src/linker.messenger.plan -c release
dotnet build ./src/linker.messenger.relay -c release
dotnet build ./src/linker.messenger.cdkey -c release
dotnet build ./src/linker.messenger.serializer.memorypack -c release
dotnet build ./src/linker.messenger.sforward -c release
dotnet build ./src/linker.messenger.signin -c release
@@ -70,6 +71,7 @@ jobs:
dotnet pack ./src/linker.messenger.pcp -c release
dotnet pack ./src/linker.messenger.plan -c release
dotnet pack ./src/linker.messenger.relay -c release
dotnet pack ./src/linker.messenger.cdkey -c release
dotnet pack ./src/linker.messenger.serializer.memorypack -c release
dotnet pack ./src/linker.messenger.sforward -c release
dotnet pack ./src/linker.messenger.signin -c release
@@ -87,33 +89,34 @@ jobs:
- name: Push
run: |
dotnet nuget push ./src/linker.libs/bin/release/linker.libs.1.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.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.8.2.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
dotnet nuget push ./src/linker.messenger.firewall/bin/release/linker.messenger.firewall.1.8.2.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
dotnet nuget push ./src/linker.messenger.wakeup/bin/release/linker.messenger.wakeup.1.8.2.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.8.2.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.8.2.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.8.2.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
dotnet nuget push ./src/linker.messenger.cdkey/bin/release/linker.messenger.cdkey.1.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.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.8.3.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
dotnet nuget push ./src/linker.messenger.firewall/bin/release/linker.messenger.firewall.1.8.3.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
dotnet nuget push ./src/linker.messenger.wakeup/bin/release/linker.messenger.wakeup.1.8.3.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.8.3.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.8.3.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.8.3.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols

View File

@@ -67,7 +67,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.snat", "src\linker.s
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.firewall", "src\linker.messenger.firewall\linker.messenger.firewall.csproj", "{F97DB5A9-3807-4441-A520-7B1211C1CE8A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "linker.messenger.wakeup", "src\linker.messenger.wakeup\linker.messenger.wakeup.csproj", "{FF0F6D11-6FD5-4CB1-9121-14623B226319}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.wakeup", "src\linker.messenger.wakeup\linker.messenger.wakeup.csproj", "{FF0F6D11-6FD5-4CB1-9121-14623B226319}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "linker.messenger.cdkey", "src\linker.messenger.cdkey\linker.messenger.cdkey.csproj", "{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -481,6 +483,18 @@ Global
{FF0F6D11-6FD5-4CB1-9121-14623B226319}.Release|x64.Build.0 = Release|Any CPU
{FF0F6D11-6FD5-4CB1-9121-14623B226319}.Release|x86.ActiveCfg = Release|Any CPU
{FF0F6D11-6FD5-4CB1-9121-14623B226319}.Release|x86.Build.0 = Release|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Debug|x64.ActiveCfg = Debug|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Debug|x64.Build.0 = Debug|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Debug|x86.ActiveCfg = Debug|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Debug|x86.Build.0 = Debug|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Release|Any CPU.Build.0 = Release|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Release|x64.ActiveCfg = Release|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Release|x64.Build.0 = Release|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Release|x86.ActiveCfg = Release|Any CPU
{B03C0E46-1C0F-46C2-B026-8F02F5C643D4}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -41,16 +41,16 @@ do
fi
done
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.8.2" . --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.8.3" . --push
cd ../../../../../
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.8.2" . --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.8.3" . --push
cd ../../../../../
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.8.2" . --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.8.3" . --push
cd ../../../../../
done
done

View File

@@ -22,7 +22,7 @@ do
mkdir -p 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.8.2|g" public/publish-ipk/${r}/control/control
sed -i "s|{version}|1.8.3|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}/control/control
sed -i 's/\r$//' public/publish-ipk/${r}/control/postinst

View File

@@ -189,7 +189,7 @@ namespace linker.app
private void RunLinker()
{
Helper.currentDirectory = FileSystem.Current.AppDataDirectory;
Helper.SetCurrentDirectory(FileSystem.Current.AppDataDirectory);
InitLogger();

View File

@@ -28,7 +28,7 @@
<ApplicationId>com.snltty.linker.app</ApplicationId>
<Title>linker.app</Title>
<Version>1.8.2</Version>
<Version>1.8.3</Version>
<Authors>snltty</Authors>
<Company>snltty</Company>
<Copyright>snltty</Copyright>
@@ -38,7 +38,7 @@
<PackageReleaseNotes>linker</PackageReleaseNotes>
<!-- Versions -->
<ApplicationDisplayVersion>1.8.2</ApplicationDisplayVersion>
<ApplicationDisplayVersion>1.8.3</ApplicationDisplayVersion>
<ApplicationVersion>1</ApplicationVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>

View File

@@ -58,7 +58,7 @@ namespace linker.libs
public static string Execute(string fileName, string arg, string[] commands, out string error)
{
using Process proc = new Process();
proc.StartInfo.WorkingDirectory = Path.GetFullPath(Path.Join(Helper.currentDirectory,"./"));
proc.StartInfo.WorkingDirectory = Path.GetFullPath(Path.Join(Helper.CurrentDirectory, "./"));
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.FileName = fileName;
proc.StartInfo.UseShellExecute = false;

View File

@@ -70,13 +70,11 @@ namespace linker.libs
encryptoTransform.Dispose();
decryptoTransform.Dispose();
}
private (byte[] Key, byte[] IV) GenerateKeyAndIV(string password)
private static (byte[] Key, byte[] IV) GenerateKeyAndIV(string password)
{
byte[] key = new byte[16];
byte[] iv = new byte[16];
using SHA384 sha = SHA384.Create();
byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(password));
byte[] hash = SHA384.HashData(Encoding.UTF8.GetBytes(password));
Array.Copy(hash, 0, key, 0, key.Length);
Array.Copy(hash, key.Length, iv, 0, iv.Length);

View File

@@ -24,7 +24,9 @@ namespace linker.libs
GC.Collect();
GC.Collect(2, GCCollectionMode.Aggressive);
#pragma warning disable CA1816 // Dispose 方法应调用 SuppressFinalize
GC.SuppressFinalize(true);
#pragma warning restore CA1816 // Dispose 方法应调用 SuppressFinalize
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{

View File

@@ -6,16 +6,26 @@ namespace linker.libs
{
public static class Helper
{
public static byte[] EmptyArray = Array.Empty<byte>();
public static byte[] TrueArray = new byte[] { 1 };
public static byte[] FalseArray = new byte[] { 0 };
static byte[] emptyArray = [];
public static byte[] EmptyArray => emptyArray;
static byte[] trueArray => [1];
public static byte[] TrueArray => trueArray;
static byte[] falseArray => [0];
public static byte[] FalseArray => falseArray;
public const string GlobalString = "snltty";
public static string currentDirectory = "./";
private static string currentDirectory = "./";
public static string CurrentDirectory => currentDirectory;
public static void SetCurrentDirectory(string path)
{
currentDirectory = path;
}
public static event EventHandler OnAppExit;
public static CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
static CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
public static void AppExit(int code)
{
OnAppExit?.Invoke(null, EventArgs.Empty);

View File

@@ -26,7 +26,7 @@ namespace linker.libs
{
while (true)
{
while (queue.Count > 0)
while (queue.IsEmpty == false)
{
if (queue.TryDequeue(out LoggerModel model))
{
@@ -39,7 +39,7 @@ namespace linker.libs
}
public int lockNum = 0;
public int lockNum;
public void Lock()
{
Interlocked.Increment(ref lockNum);

View File

@@ -40,7 +40,7 @@ namespace linker.libs
}
}
public static class NetworkHelper
public static partial class NetworkHelper
{
public static IPEndPoint TransEndpointFamily(IPEndPoint ep)
{
@@ -132,8 +132,7 @@ namespace linker.libs
return null;
}
static List<string> starts = new() { "10.", "100.", "192.168.", "172." };
private readonly static List<string> starts = ["10.", "100.", "192.168.", "172."];
public static ushort GetRouteLevel(string server, out List<IPAddress> result)
{
result = new List<IPAddress>();
@@ -159,7 +158,7 @@ namespace linker.libs
string str = CommandHelper.Linux(string.Empty, new string[] { $"traceroute {server} -4 -m 5 -w 1" });
string[] lines = str.Split(Environment.NewLine);
Regex regex = new Regex(@"(\d+\.\d+\.\d+\.\d+)");
Regex regex = MyRegex();
for (ushort i = 1; i < lines.Length; i++)
{
string ip = regex.Match(lines[i]).Groups[1].Value;
@@ -186,7 +185,7 @@ namespace linker.libs
{
using Ping pinger = new();
PingReply reply = pinger.Send(target, 100, Encoding.ASCII.GetBytes(Helper.GlobalString), new PingOptions { Ttl = i, DontFragment = true });
if(reply.Status != IPStatus.Success)
if (reply.Status != IPStatus.Success)
{
continue;
}
@@ -208,7 +207,7 @@ namespace linker.libs
}
private static byte[] ipv6LocalBytes = new byte[] { 254, 128, 0, 0, 0, 0, 0, 0 };
private readonly static byte[] ipv6LocalBytes = [254, 128, 0, 0, 0, 0, 0, 0];
private static IPAddress[] GetIP()
{
@@ -223,7 +222,7 @@ namespace linker.libs
{
}
}
try
{
return NetworkInterface.GetAllNetworkInterfaces()
@@ -245,9 +244,9 @@ namespace linker.libs
.Where(c => c.Equals(IPAddress.IPv6Loopback) == false)
.Where(c =>
{
byte[] addressBytes = c.GetAddressBytes();
byte[] addressBytes = c.GetAddressBytes();
return (
addressBytes[0] == 0xFD
addressBytes[0] == 0xFD
|| (addressBytes[0] == 0xFE && (addressBytes[1] == 0x80 || addressBytes[1] == 0xC0))
) == false;
})
@@ -359,7 +358,10 @@ namespace linker.libs
#pragma warning restore 618
#else
public static bool IPv6Support = Socket.OSSupportsIPv6;
public static bool IPv6Support => Socket.OSSupportsIPv6;
[GeneratedRegex(@"(\d+\.\d+\.\d+\.\d+)")]
private static partial Regex MyRegex();
#endif
}
}

View File

@@ -21,7 +21,7 @@ namespace linker.libs
public sealed class NumberSpaceUInt32
{
private uint num = 0;
private uint num;
public NumberSpaceUInt32(uint defaultVal = 0)
{

View File

@@ -5,7 +5,7 @@ namespace linker.libs
{
public sealed class OperatingManager
{
private uint operating = 0;
private uint operating;
public bool Operating => operating == 1;
public bool StartOperation()

View File

@@ -5,7 +5,7 @@ namespace linker.libs
public sealed class ReceiveDataBuffer
{
private Memory<byte> items { get; set; }
private int size = 0;
private int size ;
public int Size
{
get

View File

@@ -17,7 +17,7 @@ namespace linker.libs
private static string GetSystemIdAndroid()
{
string localAppDataPath = Path.Join(Helper.currentDirectory, "machine-id.txt");
string localAppDataPath = Path.Join(Helper.CurrentDirectory, "machine-id.txt");
if (Directory.Exists(Path.GetDirectoryName(localAppDataPath)) == false)
{
Directory.CreateDirectory(Path.GetDirectoryName(localAppDataPath));

View File

@@ -6,7 +6,8 @@ namespace linker.libs
{
public static class VersionHelper
{
public static string version = $"v{string.Join(".", Assembly.GetExecutingAssembly().GetName().Version.ToString().Split('.').Take(3))}";
static string version = $"v{string.Join(".", Assembly.GetExecutingAssembly().GetName().Version.ToString().Split('.').Take(3))}";
public static string Version => version;
/// <summary>
/// 比较版本,相差多少
@@ -24,7 +25,7 @@ namespace linker.libs
if (v2Span[0] == 'v') v2Span = v2Span.Slice(1);
return Compare(Version.Parse(v1Span), Version.Parse(v2Span), abs);
return Compare(System.Version.Parse(v1Span), System.Version.Parse(v2Span), abs);
}
/// <summary>
/// 比较版本,相差多少

View File

@@ -6,7 +6,7 @@ namespace linker.libs
{
public sealed class VersionManager
{
private ulong version = 0;
private ulong version;
public ulong Value => version;

View File

@@ -47,8 +47,7 @@ namespace linker.libs.extends
/// <returns></returns>
public static string Md5(this string input)
{
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
byte[] data = SHA256.HashData(Encoding.Default.GetBytes(input));
StringBuilder sBuilder = new();
for (int i = 0; i < data.Length; i++)
{
@@ -361,7 +360,7 @@ namespace linker.libs.extends
public static string GetUTF16String(this Memory<byte> memory, int strLength)
{
if (memory.Length == 0)
return string.Empty;
return string.Empty;
return ReadUtf16(memory.Span, strLength);
}
/// <summary>

View File

@@ -14,9 +14,9 @@
<Copyright>snltty</Copyright>
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>full</DebugType>

View File

@@ -58,7 +58,7 @@ namespace linker.libs.timer
private /*volatile*/ long _startTime;
private long _pendingTimeouts = 0;
private long _pendingTimeouts;
private long GetCurrentMs() { return DateTime.UtcNow.Ticks / 10000 - _base; }
@@ -186,10 +186,7 @@ namespace linker.libs.timer
/// <returns>a handle which is associated with the specified task</returns>
public Timeout NewTimeout(TimerTask task, TimeSpan span)
{
if (task == null)
{
throw new ArgumentNullException(nameof(task));
}
ArgumentNullException.ThrowIfNull(task);
if (_workerState == WORKER_STATE_SHUTDOWN)
return null;
@@ -247,7 +244,7 @@ namespace linker.libs.timer
private readonly ISet<Timeout> _unprocessedTimeouts = new HashSet<Timeout>();
private readonly HashSet<Timeout> _unprocessedTimeouts = [];
private long _tick;
private void Run()

View File

@@ -22,7 +22,7 @@ namespace linker.libs.web
/// <summary>
/// 请求id
/// </summary>
public long RequestId { get; set; } = 0;
public long RequestId { get; set; }
/// <summary>
/// 状态码
/// </summary>
@@ -47,7 +47,7 @@ namespace linker.libs.web
/// <summary>
/// 请求id
/// </summary>
public uint RequestId { get; set; } = 0;
public uint RequestId { get; set; }
/// <summary>
/// 数据
/// </summary>
@@ -63,7 +63,7 @@ namespace linker.libs.web
/// <summary>
/// 请求id
/// </summary>
public uint RequestId { get; set; } = 0;
public uint RequestId { get; set; }
/// <summary>
/// 数据
/// </summary>

View File

@@ -141,9 +141,9 @@ namespace linker.libs.web
private string GetContentType(string path)
{
string ext = Path.GetExtension(path);
if (types.ContainsKey(ext))
if (types.TryGetValue(ext,out string value))
{
return types[ext];
return value;
}
return "application/octet-stream";
}

View File

@@ -13,8 +13,8 @@ namespace linker.libs.websocket
{
private int bufferSize = 4 * 1024;
private SocketAsyncEventArgs readEventArgs;
private bool connected = false;
private bool connecSuccess = false;
private bool connected ;
private bool connecSuccess;
/// <summary>
@@ -93,7 +93,7 @@ namespace linker.libs.websocket
{
if (connected)
{
throw new Exception("connected");
return;
}
var socket = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
@@ -457,11 +457,11 @@ namespace linker.libs.websocket
/// <summary>
/// 当前帧数据
/// </summary>
public WebSocketFrameInfo FrameInfo = null;
public WebSocketFrameInfo FrameInfo;
/// <summary>
/// 当前帧的数据下标
/// </summary>
public int FrameIndex { get; set; } = 0;
public int FrameIndex { get; set; }
/// <summary>
/// 数据帧缓存
/// </summary>

View File

@@ -13,7 +13,6 @@ namespace linker.libs.websocket
/// </summary>
public static class WebSocketParser
{
private readonly static SHA1 sha1 = SHA1.Create();
private readonly static Memory<byte> magicCode = Encoding.UTF8.GetBytes("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
/// <summary>
/// 构建连接数据
@@ -124,7 +123,7 @@ namespace linker.libs.websocket
Encoding.UTF8.GetBytes(key).AsMemory().CopyTo(acceptBytes);
magicCode.CopyTo(acceptBytes.AsMemory(key.Length));
string acceptStr = Convert.ToBase64String(sha1.ComputeHash(acceptBytes, 0, keyLength));
string acceptStr = Convert.ToBase64String(SHA256.HashData(acceptBytes.AsSpan(0, keyLength)));
return acceptStr;
}
@@ -174,7 +173,7 @@ namespace linker.libs.websocket
{
if (remark.Mask > 0 && remark.MaskData.Length != 4)
{
throw new Exception("mask data just 4byte");
throw new ArgumentException("mask data just 4byte");
}
length = 1 + 1 + remark.Data.Length;
@@ -634,13 +633,13 @@ namespace linker.libs.websocket
}
public sealed class WebsocketHeaderKey
{
public static string Connection = "connection";
public static string Upgrade = "upgrade";
public static string Origin = "origin";
public static string SecWebSocketVersion = "sec-websocket-version";
public static string SecWebSocketKey = "sec-websocket-key";
public static string SecWebSocketExtensions = "sec-websocket-extensions";
public static string SecWebSocketProtocol = "sec-websocket-protocol";
public static string SecWebSocketAccept = "sec-websocket-accept";
public const string Connection = "connection";
public const string Upgrade = "upgrade";
public const string Origin = "origin";
public const string SecWebSocketVersion = "sec-websocket-version";
public const string SecWebSocketKey = "sec-websocket-key";
public const string SecWebSocketExtensions = "sec-websocket-extensions";
public const string SecWebSocketProtocol = "sec-websocket-protocol";
public const string SecWebSocketAccept = "sec-websocket-accept";
}
}

View File

@@ -385,10 +385,10 @@ namespace linker.libs.websocket
{
public uint Id { get; set; }
public Socket Socket { get; init; }
public bool Connected { get; set; } = false;
public bool Connected { get; set; }
public bool SocketConnected => Socket != null && Socket.Connected;
private bool Closed = false;
private bool Closed;
public int ConnectResponse(WebsocketHeaderInfo header)
{
var data = WebSocketParser.BuildConnectResponseData(header);
@@ -466,11 +466,11 @@ namespace linker.libs.websocket
/// <summary>
/// 当前帧数据
/// </summary>
public WebSocketFrameInfo FrameInfo = null;
public WebSocketFrameInfo FrameInfo;
/// <summary>
/// 当前帧的数据下标
/// </summary>
public int FrameIndex { get; set; } = 0;
public int FrameIndex { get; set; }
/// <summary>
/// 数据帧缓存
/// </summary>
@@ -480,7 +480,7 @@ namespace linker.libs.websocket
/// </summary>
public WebSocketFrameInfo.EnumOpcode Opcode { get; set; }
public byte[] PoolBuffer { get; set; }
public bool Disposabled { get; private set; } = false;
public bool Disposabled { get; private set; }
public void Clear()
{
Disposabled = true;

View File

@@ -27,9 +27,9 @@ public static unsafe class ADVAPI32
}
public class USEROBJECTFLAGS
{
public int fInherit = 0;
public int fReserved = 0;
public int dwFlags = 0;
public int fInherit ;
public int fReserved;
public int dwFlags;
}
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES

View File

@@ -3,7 +3,7 @@ using static linker.libs.winapis.User32;
namespace linker.libs.winapis
{
internal class MouseHelper
internal sealed class MouseHelper
{
public static bool MouseMove(int x, int y)
{

View File

@@ -3,7 +3,7 @@ using System.Runtime.InteropServices;
namespace linker.libs.winapis
{
internal class Powrprof
internal sealed class Powrprof
{
[DllImport("powrprof.dll")]

View File

@@ -1,12 +1,11 @@
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace linker.libs.winapis;
public static class WTSAPI32
{
public static nint WTS_CURRENT_SERVER_HANDLE = nint.Zero;
public static nint WTS_CURRENT_SERVER_HANDLE => nint.Zero;
public enum WTS_CONNECTSTATE_CLASS
{

View File

@@ -358,7 +358,7 @@ namespace linker.libs.winapis
{
users.Add(new WindowUserInfo { LastLogon = info.LastLogon, Sid = stringSid });
}
NetApiBufferFree(bufptr);
int value = NetApiBufferFree(bufptr);
}
}
catch (Exception)
@@ -366,7 +366,7 @@ namespace linker.libs.winapis
}
finally
{
NetApiBufferFree(bufPtr);
int _ = NetApiBufferFree(bufPtr);
}
}

View File

@@ -133,7 +133,7 @@ namespace linker.libs.winapis
}
MIB_TCPTABLE_OWNER_PID tcpTable = (MIB_TCPTABLE_OWNER_PID)Marshal.PtrToStructure(tcpTablePtr, typeof(MIB_TCPTABLE_OWNER_PID));
IntPtr rowPtr = (IntPtr)((long)tcpTablePtr + Marshal.SizeOf(tcpTable.dwNumEntries));
IntPtr rowPtr = (nint)((long)tcpTablePtr + Marshal.SizeOf(tcpTable.dwNumEntries));
for (int i = 0; i < tcpTable.dwNumEntries; i++)
{
MIB_TCPROW_OWNER_PID row = (MIB_TCPROW_OWNER_PID)Marshal.PtrToStructure(rowPtr, typeof(MIB_TCPROW_OWNER_PID));
@@ -148,7 +148,7 @@ namespace linker.libs.winapis
connections.Add(new ConnectionInfo { LocalEndPoint = localEndPoint, RemoteEndPoint = remoteEndPoint, Pid = row.owningPid });
rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(row));
rowPtr = (nint)((long)rowPtr + Marshal.SizeOf(row));
}
}
finally
@@ -165,7 +165,7 @@ namespace linker.libs.winapis
MIB_UDPTABLE_OWNER_PID udpTable;
uint udpTableSize = 0;
// 获取 UDP 表格大小
GetExtendedUdpTable(IntPtr.Zero, ref udpTableSize, true, AF_INET, 5, 0);
uint value = GetExtendedUdpTable(IntPtr.Zero, ref udpTableSize, true, AF_INET, 5, 0);
// 分配内存
IntPtr udpTablePtr = Marshal.AllocHGlobal((int)udpTableSize);

View File

@@ -21,13 +21,13 @@ namespace linker.messenger.access
{
AccessUpdateInfo info = serializer.Deserialize<AccessUpdateInfo>(connection.ReceiveRequestWrap.Payload.Span);
info.FromMachineId = connection.Id;
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) && signCaching.TryGet(info.ToMachineId, out SignCacheInfo cache1) && cache1.GroupId == cache.GroupId)
if (signCaching.TryGet(connection.Id, info.ToMachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requiestid = connection.ReceiveRequestWrap.RequestId;
sender.SendReply(new MessageRequestWrap
{
Connection = cache1.Connection,
Connection = to.Connection,
MessengerId = (ushort)AccessMessengerIds.AccessUpdate,
Payload = serializer.Serialize(info),
Timeout = 3000,
@@ -47,13 +47,13 @@ namespace linker.messenger.access
{
AccessBitsUpdateInfo info = serializer.Deserialize<AccessBitsUpdateInfo>(connection.ReceiveRequestWrap.Payload.Span);
info.FromMachineId = connection.Id;
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) && signCaching.TryGet(info.ToMachineId, out SignCacheInfo cache1) && cache1.GroupId == cache.GroupId)
if (signCaching.TryGet(connection.Id, info.ToMachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requiestid = connection.ReceiveRequestWrap.RequestId;
sender.SendReply(new MessageRequestWrap
{
Connection = cache1.Connection,
Connection = to.Connection,
MessengerId = (ushort)AccessMessengerIds.AccessStrUpdate,
Payload = serializer.Serialize(info),
Timeout = 3000,
@@ -73,11 +73,11 @@ namespace linker.messenger.access
public void SetApiPasswordForward(IConnection connection)
{
ApiPasswordUpdateInfo info = serializer.Deserialize<ApiPasswordUpdateInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) && signCaching.TryGet(info.MachineId, out SignCacheInfo cache1) && cache1.GroupId == cache.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
sender.SendOnly(new MessageRequestWrap
{
Connection = cache1.Connection,
Connection = to.Connection,
MessengerId = (ushort)AccessMessengerIds.SetApiPassword,
Payload = serializer.Serialize(info.Password)
});

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger api access</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger api action</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -137,8 +137,8 @@ namespace linker.messenger.api
[AccessDisplay("重置所有接口密码")]
SetApiPasswordOther = 42,
[AccessDisplay("管理中继CDKEY")]
RelayCdkey = 43,
[AccessDisplay("管理CDKEY")]
Cdkey = 43,
[AccessDisplay("管理本机防火墙")]
FirewallSelf = 44,

View File

@@ -17,9 +17,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger api</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -0,0 +1,27 @@
using linker.libs;
using linker.messenger.sync;
namespace linker.messenger.cdkey
{
public sealed class CdkeyConfigSyncSecretKey : ISync
{
public string Name => "CdkeySecretKey";
private readonly ISerializer serializer;
private readonly ICdkeyClientStore cdkeyClientStore;
public CdkeyConfigSyncSecretKey( ISerializer serializer, ICdkeyClientStore cdkeyClientStore)
{
this.serializer = serializer;
this.cdkeyClientStore = cdkeyClientStore;
}
public Memory<byte> GetData()
{
return serializer.Serialize(cdkeyClientStore.SecretKey);
}
public void SetData(Memory<byte> data)
{
cdkeyClientStore.SetSecretKey(serializer.Deserialize<string>(data.Span));
}
}
}

View File

@@ -0,0 +1,16 @@
namespace linker.messenger.cdkey
{
public enum CdkeyMessengerIds : ushort
{
Min = 3500,
AddCdkey = 3501,
PageCdkey = 3502,
DelCdkey = 3503,
AccessCdkey = 3504,
TestCdkey = 3505,
ImportCdkey = 3506,
Max = 3599
}
}

View File

@@ -0,0 +1,41 @@
using linker.libs.web;
using linker.messenger.sync;
using Microsoft.Extensions.DependencyInjection;
namespace linker.messenger.cdkey
{
public static class Entry
{
public static ServiceCollection AddCdkeyClient(this ServiceCollection serviceCollection)
{
serviceCollection.AddSingleton<CdkeyApiController>();
serviceCollection.AddSingleton<CdkeyConfigSyncSecretKey>();
return serviceCollection;
}
public static ServiceProvider UseCdkeyClient(this ServiceProvider serviceProvider)
{
SyncTreansfer syncTransfer = serviceProvider.GetService<SyncTreansfer>();
syncTransfer.AddSyncs(new List<ISync> { serviceProvider.GetService<CdkeyConfigSyncSecretKey>() });
linker.messenger.api.IWebServer apiServer = serviceProvider.GetService<linker.messenger.api.IWebServer>();
apiServer.AddPlugins(new List<IApiController> { serviceProvider.GetService<CdkeyApiController>() });
return serviceProvider;
}
public static ServiceCollection AddCdkeyServer(this ServiceCollection serviceCollection)
{
serviceCollection.AddSingleton<CdkeyServerMessenger>();
return serviceCollection;
}
public static ServiceProvider UseCdkeyServer(this ServiceProvider serviceProvider)
{
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<CdkeyServerMessenger>() });
return serviceProvider;
}
}
}

View File

@@ -0,0 +1,15 @@
namespace linker.messenger.cdkey
{
public interface ICdkeyClientStore
{
public string SecretKey { get; }
/// <summary>
/// 设置密钥
/// </summary>
/// <param name="secretKey"></param>
/// <returns></returns>
public bool SetSecretKey(string secretKey);
}
}

View File

@@ -1,16 +1,21 @@
using linker.libs;
using System.Net;
namespace linker.messenger.relay.server
namespace linker.messenger.cdkey
{
public interface IRelayServerCdkeyStore
public interface ICdkeyServerStore
{
/// <summary>
/// 验证密钥
/// </summary>
/// <param name="secretKey"></param>
/// <returns></returns>
public bool ValidateSecretKey(string secretKey);
/// <summary>
/// 添加
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public Task<bool> Add(RelayServerCdkeyStoreInfo info);
public Task<bool> Add(CdkeyStoreInfo info);
/// <summary>
/// 删除
/// </summary>
@@ -30,26 +35,26 @@ namespace linker.messenger.relay.server
/// </summary>
/// <param name="base64"></param>
/// <returns></returns>
public Task<RelayServerCdkeyTestResultInfo> Test(RelayServerCdkeyImportInfo info);
public Task<CdkeyTestResultInfo> Test(CdkeyImportInfo info);
/// <summary>
/// 导入卡密
/// </summary>
/// <param name="base64"></param>
/// <returns></returns>
public Task<string> Import(RelayServerCdkeyImportInfo info);
public Task<string> Import(CdkeyImportInfo info);
/// <summary>
/// 获取有效的CDKEY
/// </summary>
/// <param name="userid"></param>
/// <returns></returns>
public Task<List<RelayServerCdkeyStoreInfo>> GetAvailable(string userid);
public Task<List<CdkeyStoreInfo>> GetAvailable(string userid, string type);
/// <summary>
/// 获取CDKEY列表
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public Task<List<RelayServerCdkeyStoreInfo>> Get(List<int> ids);
public Task<List<CdkeyStoreInfo>> Get(List<int> ids);
/// <summary>
/// 消耗流量
/// </summary>
@@ -65,12 +70,12 @@ namespace linker.messenger.relay.server
/// <summary>
/// 分页
/// </summary>
/// <param name="relayServerCdkeyPageRequestInfo"></param>
/// <param name="info"></param>
/// <returns></returns>
public Task<RelayServerCdkeyPageResultInfo> Page(RelayServerCdkeyPageRequestInfo relayServerCdkeyPageRequestInfo);
public Task<CdkeyPageResultInfo> Page(CdkeyPageRequestInfo info);
}
public sealed class RelayServerCdkeyConfigInfo
public sealed class CdkeyConfigInfo
{
/// <summary>
/// 加解密密钥
@@ -82,7 +87,10 @@ namespace linker.messenger.relay.server
#endif
}
public sealed partial class RelayServerCdkeyPageRequestInfo
/// <summary>
/// 搜索CDKEY分页请求信息
/// </summary>
public sealed partial class CdkeyPageRequestInfo
{
public int Page { get; set; }
public int Size { get; set; }
@@ -93,10 +101,11 @@ namespace linker.messenger.relay.server
public string OrderId { get; set; }
public string Contact { get; set; }
public string SecretKey { get; set; }
public RelayServerCdkeyPageRequestFlag Flag { get; set; }
public string Type { get; set; }
public CdkeyPageRequestFlag Flag { get; set; }
}
[Flags]
public enum RelayServerCdkeyPageRequestFlag
public enum CdkeyPageRequestFlag
{
All = 0,
TimeIn = 1,
@@ -107,21 +116,29 @@ namespace linker.messenger.relay.server
Deleted = 32,
}
public sealed partial class RelayServerCdkeyPageResultInfo
/// <summary>
/// 搜索结果
/// </summary>
public sealed partial class CdkeyPageResultInfo
{
public int Page { get; set; }
public int Size { get; set; }
public int Count { get; set; }
public List<RelayServerCdkeyStoreInfo> List { get; set; }
public List<CdkeyStoreInfo> List { get; set; }
}
public sealed partial class RelayServerCdkeyAddInfo
/// <summary>
/// 添加cdkey
/// </summary>
public sealed partial class CdkeyAddInfo
{
public string SecretKey { get; set; }
public RelayServerCdkeyStoreInfo Data { get; set; }
public CdkeyStoreInfo Data { get; set; }
}
public sealed partial class RelayServerCdkeyDelInfo
/// <summary>
/// 删除cdkey
/// </summary>
public sealed partial class CdkeyDelInfo
{
public string SecretKey { get; set; }
public string UserId { get; set; }
@@ -129,10 +146,29 @@ namespace linker.messenger.relay.server
}
/// <summary>
/// 中继CDKEY存储
/// cdkey
/// </summary>
public sealed partial class RelayServerCdkeyStoreInfo : RelayServerCdkeyInfo
public partial class CdkeyInfo
{
public int Id { get; set; }
/// <summary>
/// 带宽Mbps
/// </summary>
public double Bandwidth { get; set; }
/// <summary>
/// 剩余流量
/// </summary>
public long LastBytes { get; set; }
}
/// <summary>
/// CDKEY存储
/// </summary>
public sealed partial class CdkeyStoreInfo : CdkeyInfo
{
/// <summary>
/// 类别
/// </summary>
public string Type { get; set; }
/// <summary>
/// 用户标识
/// </summary>
@@ -194,25 +230,28 @@ namespace linker.messenger.relay.server
public bool Deleted { get; set; }
}
public sealed partial class RelayServerCdkeyTestResultInfo
/// <summary>
/// cdkey测试结果
/// </summary>
public sealed partial class CdkeyTestResultInfo
{
public RelayServerCdkeyOrderInfo Order { get; set; }
public CdkeyOrderInfo Order { get; set; }
public string Cdkey { get; set; }
public List<string> Field { get; set; } = new List<string>();
}
/// <summary>
/// 导入中继cdkey
/// 导入cdkey
/// </summary>
public sealed partial class RelayServerCdkeyImportInfo
public sealed partial class CdkeyImportInfo
{
public string SecretKey { get; set; }
public string UserId { get; set; }
public string Base64 { get; set; }
}
/// <summary>
/// 导入中继cdkey
/// cdkey订单
/// </summary>
public sealed partial class RelayServerCdkeyOrderInfo
public sealed partial class CdkeyOrderInfo
{
/// <summary>
/// 总流量

View File

@@ -0,0 +1,160 @@
using linker.libs;
using linker.libs.extends;
using linker.libs.web;
using linker.messenger.api;
using linker.messenger.signin;
namespace linker.messenger.cdkey
{
/// <summary>
/// 中继管理接口
/// </summary>
public sealed class CdkeyApiController : IApiController
{
private readonly SignInClientState signInClientState;
private readonly IMessengerSender messengerSender;
private readonly ISerializer serializer;
private readonly ISignInClientStore signInClientStore;
private readonly ICdkeyClientStore cdkeyClientStore;
public CdkeyApiController(SignInClientState signInClientState, IMessengerSender messengerSender, ISerializer serializer, ISignInClientStore signInClientStore, ICdkeyClientStore cdkeyClientStore)
{
this.signInClientState = signInClientState;
this.messengerSender = messengerSender;
this.serializer = serializer;
this.signInClientStore = signInClientStore;
this.cdkeyClientStore = cdkeyClientStore;
}
public string GetSecretKey(ApiControllerParamsInfo param)
{
return cdkeyClientStore.SecretKey;
}
public void SetSecretKey(ApiControllerParamsInfo param)
{
cdkeyClientStore.SetSecretKey(param.Content);
}
public async Task<bool> AccessCdkey(ApiControllerParamsInfo param)
{
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)CdkeyMessengerIds.AccessCdkey,
Payload = serializer.Serialize(cdkeyClientStore.SecretKey)
}).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
}
[Access(AccessValue.Cdkey)]
public async Task<bool> AddCdkey(ApiControllerParamsInfo param)
{
CdkeyStoreInfo info = param.Content.DeJson<CdkeyStoreInfo>();
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)CdkeyMessengerIds.AddCdkey,
Payload = serializer.Serialize(new CdkeyAddInfo
{
Data = info,
SecretKey = cdkeyClientStore.SecretKey
})
}).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
}
[Access(AccessValue.Cdkey)]
public async Task<bool> DelCdkey(ApiControllerParamsInfo param)
{
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)CdkeyMessengerIds.DelCdkey,
Payload = serializer.Serialize(new CdkeyDelInfo
{
Id = int.Parse(param.Content),
UserId = signInClientStore.Server.UserId,
SecretKey = cdkeyClientStore.SecretKey
})
}).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
}
[Access(AccessValue.Cdkey)]
public async Task<CdkeyPageResultInfo> PageCdkey(ApiControllerParamsInfo param)
{
CdkeyPageRequestInfo info = param.Content.DeJson<CdkeyPageRequestInfo>();
info.SecretKey = cdkeyClientStore.SecretKey;
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)CdkeyMessengerIds.PageCdkey,
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK)
{
return serializer.Deserialize<CdkeyPageResultInfo>(resp.Data.Span);
}
return new CdkeyPageResultInfo();
}
public async Task<CdkeyPageResultInfo> MyCdkey(ApiControllerParamsInfo param)
{
CdkeyPageRequestInfo info = param.Content.DeJson<CdkeyPageRequestInfo>();
info.SecretKey = cdkeyClientStore.SecretKey;
info.UserId = signInClientStore.Server.UserId;
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)CdkeyMessengerIds.PageCdkey,
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK)
{
return serializer.Deserialize<CdkeyPageResultInfo>(resp.Data.Span);
}
return new CdkeyPageResultInfo();
}
public async Task<CdkeyTestResultInfo> TestCdkey(ApiControllerParamsInfo param)
{
CdkeyImportInfo info = param.Content.DeJson<CdkeyImportInfo>();
info.SecretKey = cdkeyClientStore.SecretKey;
info.UserId = signInClientStore.Server.UserId;
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)CdkeyMessengerIds.TestCdkey,
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK)
{
return serializer.Deserialize<CdkeyTestResultInfo>(resp.Data.Span);
}
return new CdkeyTestResultInfo();
}
public async Task<string> ImportCdkey(ApiControllerParamsInfo param)
{
CdkeyImportInfo info = param.Content.DeJson<CdkeyImportInfo>();
info.SecretKey = cdkeyClientStore.SecretKey;
info.UserId = signInClientStore.Server.UserId;
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)CdkeyMessengerIds.ImportCdkey,
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK)
{
return serializer.Deserialize<string>(resp.Data.Span);
}
return "Network";
}
}
}

View File

@@ -0,0 +1,146 @@
using linker.libs;
using linker.messenger.signin;
namespace linker.messenger.cdkey
{
/// <summary>
/// 中继服务端
/// </summary>
public class CdkeyServerMessenger : IMessenger
{
private readonly IMessengerSender messengerSender;
private readonly SignInServerCaching signCaching;
private readonly ISerializer serializer;
private readonly ICdkeyServerStore cdkeyStore;
public CdkeyServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer, ICdkeyServerStore cdkeyStore)
{
this.messengerSender = messengerSender;
this.signCaching = signCaching;
this.serializer = serializer;
this.cdkeyStore = cdkeyStore;
}
/// <summary>
/// 添加CDKEY
/// </summary>
/// <param name="connection"></param>
[MessengerId((ushort)CdkeyMessengerIds.AddCdkey)]
public async Task AddCdkey(IConnection connection)
{
CdkeyAddInfo info = serializer.Deserialize<CdkeyAddInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{
connection.Write(Helper.FalseArray);
return;
}
if (cdkeyStore.ValidateSecretKey(info.SecretKey) == false)
{
connection.Write(Helper.FalseArray);
return;
}
await cdkeyStore.Add(info.Data).ConfigureAwait(false);
connection.Write(Helper.TrueArray);
}
/// <summary>
/// 删除Cdkey
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
[MessengerId((ushort)CdkeyMessengerIds.DelCdkey)]
public async Task DelCdkey(IConnection connection)
{
CdkeyDelInfo info = serializer.Deserialize<CdkeyDelInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{
connection.Write(Helper.FalseArray);
return;
}
if (cdkeyStore.ValidateSecretKey(info.SecretKey))
{
await cdkeyStore.Del(info.Id).ConfigureAwait(false);
}
else
{
await cdkeyStore.Del(info.Id, info.UserId).ConfigureAwait(false);
}
connection.Write(Helper.TrueArray);
}
/// <summary>
/// 查询CDKEY
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
[MessengerId((ushort)CdkeyMessengerIds.PageCdkey)]
public async Task PageCdkey(IConnection connection)
{
CdkeyPageRequestInfo info = serializer.Deserialize<CdkeyPageRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{
connection.Write(serializer.Serialize(new CdkeyPageResultInfo { }));
return;
}
if (cdkeyStore.ValidateSecretKey(info.SecretKey) == false && string.IsNullOrWhiteSpace(info.UserId))
{
connection.Write(serializer.Serialize(new CdkeyPageResultInfo { }));
return;
}
var page = await cdkeyStore.Page(info).ConfigureAwait(false);
connection.Write(serializer.Serialize(page));
}
/// <summary>
/// 测试cdkey
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
[MessengerId((ushort)CdkeyMessengerIds.TestCdkey)]
public async Task TestCdkey(IConnection connection)
{
CdkeyImportInfo info = serializer.Deserialize<CdkeyImportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{
connection.Write(serializer.Serialize(new CdkeyTestResultInfo { }));
return;
}
if (cdkeyStore.ValidateSecretKey(info.SecretKey) == false)
{
connection.Write(serializer.Serialize(new CdkeyTestResultInfo { }));
return;
}
CdkeyTestResultInfo test = await cdkeyStore.Test(info).ConfigureAwait(false);
connection.Write(serializer.Serialize(test));
}
/// <summary>
/// 导入cdkey
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
[MessengerId((ushort)CdkeyMessengerIds.ImportCdkey)]
public async Task ImportCdkey(IConnection connection)
{
CdkeyImportInfo info = serializer.Deserialize<CdkeyImportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{
connection.Write(Helper.FalseArray);
return;
}
string result = await cdkeyStore.Import(info).ConfigureAwait(false);
connection.Write(serializer.Serialize(result));
}
[MessengerId((ushort)CdkeyMessengerIds.AccessCdkey)]
public void AccessCdkey(IConnection connection)
{
string key = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
connection.Write(cdkeyStore.ValidateSecretKey(key) ? Helper.TrueArray : Helper.FalseArray);
}
}
}

View File

@@ -0,0 +1,47 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<PublishAot>false</PublishAot>
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
<EnablePreviewFeatures>True</EnablePreviewFeatures>
<Title>linker messenger cdkey</Title>
<Authors>snltty</Authors>
<Company>snltty</Company>
<Description>linker messenger cdkey</Description>
<Copyright>snltty</Copyright>
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger cdkey</PackageReleaseNotes>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>full</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DebugType>full</DebugType>
<DebugSymbols>true</DebugSymbols>
<Optimize>True</Optimize>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0|AnyCPU'">
<DebugType>embedded</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0|AnyCPU'">
<DebugType>embedded</DebugType>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
<ProjectReference Include="..\linker.messenger.sync\linker.messenger.sync.csproj" />
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
</ItemGroup>
</Project>

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger channel</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger decenter</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -48,7 +48,7 @@ namespace linker.messenger.decenter
}
Memory<byte> memory = serializer.Serialize(info);
List<SignCacheInfo> caches = signCaching.Get(signin.GroupId).Where(c => c.MachineId != connection.Id && c.Connected).ToList();
List<SignCacheInfo> caches = signCaching.Get(signin).Where(c => c.MachineId != connection.Id && c.Connected).ToList();
List<Task<bool>> tasks = caches.Select(c => sender.SendOnly(new MessageRequestWrap
{
Connection = c.Connection,
@@ -69,7 +69,7 @@ namespace linker.messenger.decenter
return;
}
IEnumerable<Memory<byte>> data = dic.Where(c => c.Key != connection.Id && c.Value.SignIn.GroupId == signin.GroupId).Select(c => c.Value.Data);
IEnumerable<Memory<byte>> data = dic.Where(c => c.Key != connection.Id && c.Value.SignIn.SameGroup(signin)).Select(c => c.Value.Data);
connection.Write(serializer.Serialize(data));
}
@@ -85,7 +85,7 @@ namespace linker.messenger.decenter
return;
}
IEnumerable<Memory<byte>> data = dic.Where(c => c.Key != connection.Id && c.Value.SignIn.GroupId == signin.GroupId).Select(c => c.Value.Data);
IEnumerable<Memory<byte>> data = dic.Where(c => c.Key != connection.Id && c.Value.SignIn.SameGroup(signin)).Select(c => c.Value.Data);
connection.Write(serializer.Serialize(new DecenterPullPageResultInfo
{
Count = data.Count(),
@@ -103,7 +103,7 @@ namespace linker.messenger.decenter
{
uint requiestid = connection.ReceiveRequestWrap.RequestId;
List<SignCacheInfo> caches = signCaching.Get(cache.GroupId).Where(c => c.MachineId != connection.Id && c.Connected).ToList();
List<SignCacheInfo> caches = signCaching.Get(cache).Where(c => c.MachineId != connection.Id && c.Connected).ToList();
List<Task<MessageResponeInfo>> tasks = new List<Task<MessageResponeInfo>>();
foreach (SignCacheInfo item in caches)
{

View File

@@ -22,6 +22,7 @@ using linker.messenger.plan;
using System.Text.Json;
using linker.messenger.firewall;
using linker.messenger.wakeup;
using linker.messenger.cdkey;
namespace linker.messenger.entry
{
@@ -67,6 +68,8 @@ namespace linker.messenger.entry
.AddPcpClient().AddPcpServer()
//中继
.AddRelayClient().AddRelayServer()
//cdkey
.AddCdkeyClient().AddCdkeyServer()
//服务器穿透
.AddSForwardClient().AddSForwardServer()
//登录
@@ -97,11 +100,11 @@ namespace linker.messenger.entry
//防火墙
.AddFirewallClient().AddFirewallServer()
//唤醒
.AddWakeupClient().AddWakeupServer();
}
/// <summary>
/// 注入
@@ -182,7 +185,8 @@ namespace linker.messenger.entry
if ((modules & ExcludeModule.Wakeup) != ExcludeModule.Wakeup)
serviceProvider.UseWakeupServer();
serviceProvider.UseAccessServer().UseDecenterServer().UsePcpServer().UseRelayServer()
serviceProvider.UseAccessServer().UseDecenterServer().UsePcpServer()
.UseRelayServer().UseCdkeyServer()
.UseSignInServer().UseSyncServer().UseTunnelServer().UseFlowServer();
serviceProvider.UseListen();
@@ -214,7 +218,9 @@ namespace linker.messenger.entry
serviceProvider.UseWakeupClient();
serviceProvider.UseExRoute().UseAccessClient().UseDecenterClient().UsePcpClient().UseRelayClient().UseSyncClient().UseTunnelClient().UseFlowClient();
serviceProvider.UseExRoute().UseAccessClient().UseDecenterClient().UsePcpClient()
.UseRelayClient().UseCdkeyClient()
.UseSyncClient().UseTunnelClient().UseFlowClient();
serviceProvider.UseSignInClient();

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger entry</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -40,6 +40,7 @@
<ProjectReference Include="..\linker.messenger.access\linker.messenger.access.csproj" />
<ProjectReference Include="..\linker.messenger.action\linker.messenger.action.csproj" />
<ProjectReference Include="..\linker.messenger.api\linker.messenger.api.csproj" />
<ProjectReference Include="..\linker.messenger.cdkey\linker.messenger.cdkey.csproj" />
<ProjectReference Include="..\linker.messenger.channel\linker.messenger.channel.csproj" />
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
<ProjectReference Include="..\linker.messenger.exroute\linker.messenger.exroute.csproj" />

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger exroute</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -25,12 +25,12 @@ namespace linker.messenger.firewall
public void GetForward(IConnection connection)
{
FirewallSearchForwardInfo info = serializer.Deserialize<FirewallSearchForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
sender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)FirewallMessengerIds.Get,
Payload = serializer.Serialize(info.Data)
}).ContinueWith(async (result) =>
@@ -60,12 +60,12 @@ namespace linker.messenger.firewall
public async Task AddForward(IConnection connection)
{
FirewallAddForwardInfo info = serializer.Deserialize<FirewallAddForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await sender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)FirewallMessengerIds.Add,
Payload = serializer.Serialize(info.Data)
}).ConfigureAwait(false);
@@ -79,12 +79,12 @@ namespace linker.messenger.firewall
public async Task RemoveForward(IConnection connection)
{
FirewallRemoveForwardInfo info = serializer.Deserialize<FirewallRemoveForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await sender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)FirewallMessengerIds.Remove,
Payload = serializer.Serialize(info.Id)
}).ConfigureAwait(false);
@@ -100,12 +100,12 @@ namespace linker.messenger.firewall
public async Task StateForward(IConnection connection)
{
FirewallStateForwardInfo info = serializer.Deserialize<FirewallStateForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await sender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)FirewallMessengerIds.State,
Payload = serializer.Serialize(info.State)
}).ConfigureAwait(false);

View File

@@ -17,9 +17,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger firewall</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -17,9 +17,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger flow</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -121,12 +121,12 @@ namespace linker.messenger.flow.messenger
public void StopwatchForward(IConnection connection)
{
string machineid = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(machineid, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheTo.GroupId == cacheFrom.GroupId)
if (signCaching.TryGet(connection.Id,machineid, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
_ = messengerSender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)FlowMessengerIds.Stopwatch
}).ContinueWith(async (result) =>
{

View File

@@ -24,12 +24,12 @@ namespace linker.messenger.forward
public void GetForward(IConnection connection)
{
string machineId = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(machineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id,machineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
sender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)ForwardMessengerIds.Get,
Payload = connection.ReceiveRequestWrap.Payload
}).ContinueWith(async (result) =>
@@ -55,12 +55,12 @@ namespace linker.messenger.forward
public async Task AddForward(IConnection connection)
{
ForwardAddForwardInfo info = serializer.Deserialize<ForwardAddForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await sender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)ForwardMessengerIds.Add,
Payload = serializer.Serialize(info.Data)
}).ConfigureAwait(false);
@@ -74,12 +74,12 @@ namespace linker.messenger.forward
public async Task RemoveForward(IConnection connection)
{
ForwardRemoveForwardInfo info = serializer.Deserialize<ForwardRemoveForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await sender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)ForwardMessengerIds.Remove,
Payload = serializer.Serialize(info.Id)
}).ConfigureAwait(false);
@@ -91,11 +91,11 @@ namespace linker.messenger.forward
public async Task SubTestForward(IConnection connection)
{
string machineid = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(machineid, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id,machineid, out SignCacheInfo from, out SignCacheInfo to))
{
await sender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)ForwardMessengerIds.SubTest
}).ConfigureAwait(false);
}
@@ -106,20 +106,23 @@ namespace linker.messenger.forward
{
Dictionary<string, List<ForwardTestInfo>> tests = serializer.Deserialize<Dictionary<string, List<ForwardTestInfo>>>(connection.ReceiveRequestWrap.Payload.Span);
var from = signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom);
if(signCaching.TryGet(connection.Id, out SignCacheInfo from) == false)
{
return;
}
uint requiestid = connection.ReceiveRequestWrap.RequestId;
var tasks = new List<TaskInfo>();
foreach (var item in tests)
{
if (signCaching.TryGet(item.Key, out SignCacheInfo cacheTo) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(item.Key, out SignCacheInfo to) && from.SameGroup(to))
{
tasks.Add(new TaskInfo
{
MachineId = item.Key,
Task = sender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)ForwardMessengerIds.Test,
Payload = serializer.Serialize(item.Value),
Timeout = 3000

View File

@@ -17,9 +17,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger forward</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -17,9 +17,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger listen</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -43,9 +43,9 @@ namespace linker.messenger.logger
private static void LoggerConsole()
{
if (Directory.Exists(Path.Join(Helper.currentDirectory, "logs")) == false)
if (Directory.Exists(Path.Join(Helper.CurrentDirectory, "logs")) == false)
{
Directory.CreateDirectory(Path.Join(Helper.currentDirectory, "logs"));
Directory.CreateDirectory(Path.Join(Helper.CurrentDirectory, "logs"));
}
LoggerHelper.Instance.OnLogger += (model) =>
{
@@ -72,7 +72,7 @@ namespace linker.messenger.logger
Console.ForegroundColor = currentForeColor;
try
{
using StreamWriter sw = File.AppendText(Path.Join(Helper.currentDirectory, "logs", $"{DateTime.Now:yyyy-MM-dd}.log"));
using StreamWriter sw = File.AppendText(Path.Join(Helper.CurrentDirectory, "logs", $"{DateTime.Now:yyyy-MM-dd}.log"));
sw.WriteLine(line);
sw.Flush();
sw.Close();
@@ -84,7 +84,7 @@ namespace linker.messenger.logger
};
TimerHelper.SetIntervalLong(() =>
{
string[] files = Directory.GetFiles(Path.Combine(Helper.currentDirectory, "logs")).OrderBy(c => c).ToArray();
string[] files = Directory.GetFiles(Path.Combine(Helper.CurrentDirectory, "logs")).OrderBy(c => c).ToArray();
for (int i = 0; i < files.Length - 180; i++)
{
try

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger logger</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -50,18 +50,18 @@ namespace linker.messenger.pcp
[MessengerId((ushort)PcpMessengerIds.BeginForward)]
public async Task BeginForward(IConnection connection)
{
TunnelTransportInfo tunnelTransportInfo = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
TunnelTransportInfo info = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.Remote.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
tunnelTransportInfo.Local.MachineName = cacheFrom.MachineName;
tunnelTransportInfo.Remote.MachineName = cacheTo.MachineName;
info.Local.MachineName = from.MachineName;
info.Remote.MachineName = to.MachineName;
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)PcpMessengerIds.Begin,
Payload = serializer.Serialize(tunnelTransportInfo)
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
connection.Write(Helper.TrueArray);
}
@@ -71,16 +71,16 @@ namespace linker.messenger.pcp
[MessengerId((ushort)PcpMessengerIds.FailForward)]
public async Task FailForward(IConnection connection)
{
TunnelTransportInfo tunnelTransportInfo = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
TunnelTransportInfo info = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, info.Remote.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
tunnelTransportInfo.Local.MachineName = cache1.MachineName;
tunnelTransportInfo.Remote.MachineName = cache.MachineName;
info.Local.MachineName = from.MachineName;
info.Remote.MachineName = to.MachineName;
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cache.Connection,
Connection = to.Connection,
MessengerId = (ushort)PcpMessengerIds.Fail,
Payload = serializer.Serialize(tunnelTransportInfo)
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
}
}
@@ -89,16 +89,16 @@ namespace linker.messenger.pcp
[MessengerId((ushort)PcpMessengerIds.SuccessForward)]
public async Task SuccessForward(IConnection connection)
{
TunnelTransportInfo tunnelTransportInfo = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
TunnelTransportInfo info = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, info.Remote.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
tunnelTransportInfo.Local.MachineName = cache1.MachineName;
tunnelTransportInfo.Remote.MachineName = cache.MachineName;
info.Local.MachineName = from.MachineName;
info.Remote.MachineName = to.MachineName;
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cache.Connection,
Connection = to.Connection,
MessengerId = (ushort)PcpMessengerIds.Success,
Payload = serializer.Serialize(tunnelTransportInfo)
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
}
}

View File

@@ -17,9 +17,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger pcp</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -70,12 +70,12 @@ namespace linker.messenger.plan
public async Task GetForward(IConnection connection)
{
PlanGetInfo info = serializer.Deserialize<PlanGetInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
{
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await messengerSender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)PlanMessengerIds.Get,
Payload = connection.ReceiveRequestWrap.Payload
}).ContinueWith(async (result) =>
@@ -97,12 +97,12 @@ namespace linker.messenger.plan
public async Task AddForward(IConnection connection)
{
PlanAddInfo info = serializer.Deserialize<PlanAddInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await messengerSender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)PlanMessengerIds.Add,
Payload = connection.ReceiveRequestWrap.Payload
}).ContinueWith(async (result) =>
@@ -124,12 +124,12 @@ namespace linker.messenger.plan
public async Task RemoveForward(IConnection connection)
{
PlanRemoveInfo info = serializer.Deserialize<PlanRemoveInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await messengerSender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)PlanMessengerIds.Remove,
Payload = connection.ReceiveRequestWrap.Payload
}).ContinueWith(async (result) =>

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger plan</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -77,126 +77,6 @@ namespace linker.messenger.relay
return true;
}
public async Task<bool> AccessCdkey(ApiControllerParamsInfo param)
{
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.AccessCdkey,
Payload = serializer.Serialize(relayClientStore.Server.SecretKey)
}).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
}
[Access(AccessValue.RelayCdkey)]
public async Task<bool> AddCdkey(ApiControllerParamsInfo param)
{
RelayServerCdkeyStoreInfo info = param.Content.DeJson<RelayServerCdkeyStoreInfo>();
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.AddCdkey,
Payload = serializer.Serialize(new RelayServerCdkeyAddInfo
{
Data = info,
SecretKey = relayClientStore.Server.SecretKey
})
}).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
}
[Access(AccessValue.RelayCdkey)]
public async Task<bool> DelCdkey(ApiControllerParamsInfo param)
{
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.DelCdkey,
Payload = serializer.Serialize(new RelayServerCdkeyDelInfo
{
Id = int.Parse(param.Content),
UserId = signInClientStore.Server.UserId,
SecretKey = relayClientStore.Server.SecretKey
})
}).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
}
[Access(AccessValue.RelayCdkey)]
public async Task<RelayServerCdkeyPageResultInfo> PageCdkey(ApiControllerParamsInfo param)
{
RelayServerCdkeyPageRequestInfo info = param.Content.DeJson<RelayServerCdkeyPageRequestInfo>();
info.SecretKey = relayClientStore.Server.SecretKey;
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.PageCdkey,
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK)
{
return serializer.Deserialize<RelayServerCdkeyPageResultInfo>(resp.Data.Span);
}
return new RelayServerCdkeyPageResultInfo();
}
public async Task<RelayServerCdkeyPageResultInfo> MyCdkey(ApiControllerParamsInfo param)
{
RelayServerCdkeyPageRequestInfo info = param.Content.DeJson<RelayServerCdkeyPageRequestInfo>();
info.SecretKey = relayClientStore.Server.SecretKey;
info.UserId = signInClientStore.Server.UserId;
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.PageCdkey,
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK)
{
return serializer.Deserialize<RelayServerCdkeyPageResultInfo>(resp.Data.Span);
}
return new RelayServerCdkeyPageResultInfo();
}
public async Task<RelayServerCdkeyTestResultInfo> TestCdkey(ApiControllerParamsInfo param)
{
RelayServerCdkeyImportInfo info = param.Content.DeJson<RelayServerCdkeyImportInfo>();
info.SecretKey = relayClientStore.Server.SecretKey;
info.UserId = signInClientStore.Server.UserId;
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.TestCdkey,
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK)
{
return serializer.Deserialize<RelayServerCdkeyTestResultInfo>(resp.Data.Span);
}
return new RelayServerCdkeyTestResultInfo();
}
public async Task<string> ImportCdkey(ApiControllerParamsInfo param)
{
RelayServerCdkeyImportInfo info = param.Content.DeJson<RelayServerCdkeyImportInfo>();
info.SecretKey = relayClientStore.Server.SecretKey;
info.UserId = signInClientStore.Server.UserId;
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.ImportCdkey,
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
if (resp.Code == MessageResponeCodes.OK)
{
return serializer.Deserialize<string>(resp.Data.Span);
}
return "Network";
}
public async Task<bool> UpdateNode(ApiControllerParamsInfo param)
{
RelayServerNodeUpdateInfo info = param.Content.DeJson<RelayServerNodeUpdateInfo>();

View File

@@ -18,9 +18,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger relay</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -43,6 +43,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
<ProjectReference Include="..\linker.messenger.cdkey\linker.messenger.cdkey.csproj" />
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
<ProjectReference Include="..\linker.messenger.sync\linker.messenger.sync.csproj" />
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />

View File

@@ -5,7 +5,7 @@ using linker.messenger.relay.client;
using linker.messenger.relay.server;
using linker.messenger.signin;
using linker.messenger.relay.server.validator;
using System.Reflection;
using linker.messenger.cdkey;
namespace linker.messenger.relay.messenger
{
@@ -46,18 +46,18 @@ namespace linker.messenger.relay.messenger
private readonly RelayServerMasterTransfer relayServerTransfer;
private readonly RelayServerValidatorTransfer relayValidatorTransfer;
private readonly ISerializer serializer;
private readonly IRelayServerCdkeyStore relayServerCdkeyStore;
private readonly ICdkeyServerStore cdkeyStore;
private readonly IRelayServerStore relayServerStore;
private readonly RelayServerNodeTransfer relayServerNodeTransfer;
public RelayServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer, RelayServerMasterTransfer relayServerTransfer, RelayServerValidatorTransfer relayValidatorTransfer, IRelayServerCdkeyStore relayServerCdkeyStore, IRelayServerStore relayServerStore, RelayServerNodeTransfer relayServerNodeTransfer)
public RelayServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer, RelayServerMasterTransfer relayServerTransfer, RelayServerValidatorTransfer relayValidatorTransfer, ICdkeyServerStore cdkeyStore, IRelayServerStore relayServerStore, RelayServerNodeTransfer relayServerNodeTransfer)
{
this.messengerSender = messengerSender;
this.signCaching = signCaching;
this.relayServerTransfer = relayServerTransfer;
this.relayValidatorTransfer = relayValidatorTransfer;
this.serializer = serializer;
this.relayServerCdkeyStore = relayServerCdkeyStore;
this.cdkeyStore = cdkeyStore;
this.relayServerStore = relayServerStore;
this.relayServerNodeTransfer = relayServerNodeTransfer;
}
@@ -113,25 +113,25 @@ namespace linker.messenger.relay.messenger
public async Task RelayAsk(IConnection connection)
{
RelayInfo info = serializer.Deserialize<RelayInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) == false || signCaching.TryGet(info.RemoteMachineId, out SignCacheInfo cacheTo) == false || cacheFrom.GroupId != cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.RemoteMachineId, out SignCacheInfo from, out SignCacheInfo to))
{
connection.Write(serializer.Serialize(new RelayAskResultInfo { }));
return;
}
info.RemoteMachineId = cacheTo.MachineId;
info.FromMachineId = cacheFrom.MachineId;
info.RemoteMachineName = cacheTo.MachineName;
info.FromMachineName = cacheFrom.MachineName;
info.RemoteMachineId = to.MachineId;
info.FromMachineId = from.MachineId;
info.RemoteMachineName = to.MachineName;
info.FromMachineName = from.MachineName;
RelayAskResultInfo result = new RelayAskResultInfo();
string error = await relayValidatorTransfer.Validate(info, cacheFrom, cacheTo).ConfigureAwait(false);
string error = await relayValidatorTransfer.Validate(info, from, to).ConfigureAwait(false);
bool validated = string.IsNullOrWhiteSpace(error);
result.Nodes = relayServerTransfer.GetNodes(validated).Select(c => (RelayServerNodeReportInfo)c).ToList();
if (result.Nodes.Count > 0)
{
result.FlowingId = relayServerTransfer.AddRelay(cacheFrom.MachineId, cacheFrom.MachineName, cacheTo.MachineId, cacheTo.MachineName, cacheFrom.GroupId, validated, new List<RelayServerCdkeyInfo>());
result.FlowingId = relayServerTransfer.AddRelay(from.MachineId, from.MachineName, to.MachineId, to.MachineName, from.GroupId, validated, []);
}
connection.Write(serializer.Serialize(result));
@@ -140,29 +140,29 @@ namespace linker.messenger.relay.messenger
public async Task RelayAsk170(IConnection connection)
{
RelayInfo170 info = serializer.Deserialize<RelayInfo170>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) == false || signCaching.TryGet(info.RemoteMachineId, out SignCacheInfo cacheTo) == false || cacheFrom.GroupId != cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.RemoteMachineId, out SignCacheInfo from, out SignCacheInfo to))
{
connection.Write(serializer.Serialize(new RelayAskResultInfo170 { }));
return;
}
info.RemoteMachineId = cacheTo.MachineId;
info.FromMachineId = cacheFrom.MachineId;
info.RemoteMachineName = cacheTo.MachineName;
info.FromMachineName = cacheFrom.MachineName;
info.RemoteMachineId = to.MachineId;
info.FromMachineId = from.MachineId;
info.RemoteMachineName = to.MachineName;
info.FromMachineName = from.MachineName;
RelayAskResultInfo170 result = new RelayAskResultInfo170();
string error = await relayValidatorTransfer.Validate(info, cacheFrom, cacheTo).ConfigureAwait(false);
string error = await relayValidatorTransfer.Validate(info, from, to).ConfigureAwait(false);
bool validated = string.IsNullOrWhiteSpace(error);
result.Nodes = relayServerTransfer.GetNodes(validated);
if (result.Nodes.Count > 0)
{
List<RelayServerCdkeyInfo> cdkeys = info.UseCdkey
? (await relayServerCdkeyStore.GetAvailable(info.UserId).ConfigureAwait(false)).Select(c => new RelayServerCdkeyInfo { Bandwidth = c.Bandwidth, Id = c.Id, LastBytes = c.LastBytes }).ToList()
: new List<RelayServerCdkeyInfo>();
List<CdkeyInfo> cdkeys = info.UseCdkey
? (await cdkeyStore.GetAvailable(info.UserId, "Relay").ConfigureAwait(false)).Select(c => new CdkeyInfo { Bandwidth = c.Bandwidth, Id = c.Id, LastBytes = c.LastBytes }).ToList()
: [];
result.FlowingId = relayServerTransfer.AddRelay(cacheFrom.MachineId, cacheFrom.MachineName, cacheTo.MachineId, cacheTo.MachineName, cacheFrom.GroupId, validated, cdkeys);
result.FlowingId = relayServerTransfer.AddRelay(from.MachineId, from.MachineName, to.MachineId, to.MachineName, from.GroupId, validated, cdkeys);
}
connection.Write(serializer.Serialize(result));
@@ -193,7 +193,7 @@ namespace linker.messenger.relay.messenger
}
public async Task RelayForward(IConnection connection, RelayInfo info, ushort id, Func<byte[]> data)
{
if (signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) == false || signCaching.TryGet(info.RemoteMachineId, out SignCacheInfo cacheTo) == false || cacheFrom.GroupId != cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.RemoteMachineId, out SignCacheInfo from, out SignCacheInfo to))
{
connection.Write(Helper.FalseArray);
return;
@@ -202,11 +202,11 @@ namespace linker.messenger.relay.messenger
//需要验证
if (relayServerTransfer.NodeValidate(info.NodeId))
{
info.RemoteMachineId = cacheTo.MachineId;
info.FromMachineId = cacheFrom.MachineId;
info.RemoteMachineName = cacheTo.MachineName;
info.FromMachineName = cacheFrom.MachineName;
string result = await relayValidatorTransfer.Validate(info, cacheFrom, cacheTo).ConfigureAwait(false);
info.RemoteMachineId = to.MachineId;
info.FromMachineId = from.MachineId;
info.RemoteMachineName = to.MachineName;
info.FromMachineName = from.MachineName;
string result = await relayValidatorTransfer.Validate(info, from, to).ConfigureAwait(false);
if (string.IsNullOrWhiteSpace(result) == false)
{
connection.Write(Helper.FalseArray);
@@ -214,16 +214,16 @@ namespace linker.messenger.relay.messenger
}
}
info.RemoteMachineId = cacheFrom.MachineId;
info.FromMachineId = cacheTo.MachineId;
info.RemoteMachineName = cacheFrom.MachineName;
info.FromMachineName = cacheTo.MachineName;
info.RemoteMachineId = from.MachineId;
info.FromMachineId = to.MachineId;
info.RemoteMachineName = from.MachineName;
info.FromMachineName = to.MachineName;
try
{
uint requiestid = connection.ReceiveRequestWrap.RequestId;
_ = messengerSender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)RelayMessengerIds.Relay,
Payload = data()
}).ContinueWith(async (result) =>
@@ -326,135 +326,6 @@ namespace linker.messenger.relay.messenger
relayServerNodeTransfer.UpdateLastBytes(info);
}
/// <summary>
/// 检查权限
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
[MessengerId((ushort)RelayMessengerIds.AccessCdkey)]
public void AccessCdkey(IConnection connection)
{
string secretKey = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
connection.Write(relayServerStore.ValidateSecretKey(secretKey) ? Helper.TrueArray : Helper.FalseArray);
}
/// <summary>
/// 添加CDKEY
/// </summary>
/// <param name="connection"></param>
[MessengerId((ushort)RelayMessengerIds.AddCdkey)]
public async Task AddCdkey(IConnection connection)
{
RelayServerCdkeyAddInfo info = serializer.Deserialize<RelayServerCdkeyAddInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{
connection.Write(Helper.FalseArray);
return;
}
if (relayServerStore.ValidateSecretKey(info.SecretKey)==false)
{
connection.Write(Helper.FalseArray);
return;
}
await relayServerCdkeyStore.Add(info.Data).ConfigureAwait(false);
connection.Write(Helper.TrueArray);
}
/// <summary>
/// 删除Cdkey
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
[MessengerId((ushort)RelayMessengerIds.DelCdkey)]
public async Task DelCdkey(IConnection connection)
{
RelayServerCdkeyDelInfo info = serializer.Deserialize<RelayServerCdkeyDelInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{
connection.Write(Helper.FalseArray);
return;
}
if (relayServerStore.ValidateSecretKey(info.SecretKey))
{
await relayServerCdkeyStore.Del(info.Id).ConfigureAwait(false);
}
else
{
await relayServerCdkeyStore.Del(info.Id, info.UserId).ConfigureAwait(false);
}
connection.Write(Helper.TrueArray);
}
/// <summary>
/// 查询CDKEY
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
[MessengerId((ushort)RelayMessengerIds.PageCdkey)]
public async Task PageCdkey(IConnection connection)
{
RelayServerCdkeyPageRequestInfo info = serializer.Deserialize<RelayServerCdkeyPageRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{
connection.Write(serializer.Serialize(new RelayServerCdkeyPageResultInfo { }));
return;
}
if (relayServerStore.ValidateSecretKey(info.SecretKey)==false && string.IsNullOrWhiteSpace(info.UserId))
{
connection.Write(serializer.Serialize(new RelayServerCdkeyPageResultInfo { }));
return;
}
var page = await relayServerCdkeyStore.Page(info).ConfigureAwait(false);
connection.Write(serializer.Serialize(page));
}
/// <summary>
/// 测试cdkey
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
[MessengerId((ushort)RelayMessengerIds.TestCdkey)]
public async Task TestCdkey(IConnection connection)
{
RelayServerCdkeyImportInfo info = serializer.Deserialize<RelayServerCdkeyImportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{
connection.Write(serializer.Serialize(new RelayServerCdkeyTestResultInfo { }));
return;
}
if (relayServerStore.ValidateSecretKey(info.SecretKey) == false)
{
connection.Write(serializer.Serialize(new RelayServerCdkeyTestResultInfo { }));
return;
}
RelayServerCdkeyTestResultInfo test = await relayServerCdkeyStore.Test(info).ConfigureAwait(false);
connection.Write(serializer.Serialize(test));
}
/// <summary>
/// 导入cdkey
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
[MessengerId((ushort)RelayMessengerIds.ImportCdkey)]
public async Task ImportCdkey(IConnection connection)
{
RelayServerCdkeyImportInfo info = serializer.Deserialize<RelayServerCdkeyImportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
{
connection.Write(Helper.FalseArray);
return;
}
string result = await relayServerCdkeyStore.Import(info).ConfigureAwait(false);
connection.Write(serializer.Serialize(result));
}
[MessengerId((ushort)RelayMessengerIds.CheckKey)]
public void CheckKey(IConnection connection)
{

View File

@@ -15,19 +15,11 @@
NodeDelay = 2106,
NodeDelayForward = 2107,
AddCdkey = 2108,
PageCdkey = 2109,
DelCdkey = 2110,
AccessCdkey = 2111,
NodeGetCache = 2112,
NodeReport = 2113,
TrafficReport = 2114,
TestCdkey = 2115,
ImportCdkey = 2116,
UpdateNode = 2117,
UpdateNodeForward = 2118,

View File

@@ -1,6 +1,6 @@
using linker.libs;
using linker.libs.extends;
using linker.libs.timer;
using linker.messenger.cdkey;
using linker.messenger.relay.messenger;
using linker.messenger.relay.server.caching;
using System.Collections.Concurrent;
@@ -22,11 +22,11 @@ namespace linker.messenger.relay.server
private readonly IRelayServerCaching relayCaching;
private readonly ISerializer serializer;
private readonly IRelayServerMasterStore relayServerMasterStore;
private readonly IRelayServerCdkeyStore relayServerCdkeyStore;
private readonly ICdkeyServerStore relayServerCdkeyStore;
private readonly IMessengerSender messengerSender;
public RelayServerMasterTransfer(IRelayServerCaching relayCaching, ISerializer serializer, IRelayServerMasterStore relayServerMasterStore, IRelayServerCdkeyStore relayServerCdkeyStore, IMessengerSender messengerSender)
public RelayServerMasterTransfer(IRelayServerCaching relayCaching, ISerializer serializer, IRelayServerMasterStore relayServerMasterStore, ICdkeyServerStore relayServerCdkeyStore, IMessengerSender messengerSender)
{
this.relayCaching = relayCaching;
this.serializer = serializer;
@@ -37,7 +37,7 @@ namespace linker.messenger.relay.server
}
public ulong AddRelay(string fromid, string fromName, string toid, string toName, string groupid, bool validated, List<RelayServerCdkeyInfo> cdkeys)
public ulong AddRelay(string fromid, string fromName, string toid, string toName, string groupid, bool validated, List<CdkeyInfo> cdkeys)
{
ulong flowingId = Interlocked.Increment(ref relayFlowingId);

View File

@@ -1,6 +1,7 @@
using linker.libs;
using linker.libs.extends;
using linker.libs.timer;
using linker.messenger.cdkey;
using linker.messenger.relay.messenger;
using linker.tunnel.connection;
using System.Buffers;
@@ -239,7 +240,7 @@ namespace linker.messenger.relay.server
return;
}
RelayServerCdkeyInfo currentCdkey = relayCache.Cache.Cdkey.Where(c => c.LastBytes > 0).OrderByDescending(c => c.Bandwidth).FirstOrDefault();
CdkeyInfo currentCdkey = relayCache.Cache.Cdkey.Where(c => c.LastBytes > 0).OrderByDescending(c => c.Bandwidth).FirstOrDefault();
//有cdkey且带宽大于节点带宽就用cdkey的带宽
if (currentCdkey != null && (currentCdkey.Bandwidth == 0 || currentCdkey.Bandwidth >= node.MaxBandwidth || node.MaxGbTotalLastBytes == 0))
{
@@ -259,11 +260,11 @@ namespace linker.messenger.relay.server
{
if (dic.Count == 0) return;
Dictionary<int, RelayServerCdkeyInfo> cdkeys = trafficDict.Values.SelectMany(c => c.Cache.Cdkey).ToDictionary(c => c.Id, c => c);
Dictionary<int, CdkeyInfo> cdkeys = trafficDict.Values.SelectMany(c => c.Cache.Cdkey).ToDictionary(c => c.Id, c => c);
//更新剩余流量
foreach (KeyValuePair<int, long> item in dic)
{
if (cdkeys.TryGetValue(item.Key, out RelayServerCdkeyInfo info))
if (cdkeys.TryGetValue(item.Key, out CdkeyInfo info))
{
info.LastBytes = item.Value;
}

View File

@@ -7,6 +7,7 @@ using linker.libs;
using System;
using System.Text;
using linker.libs.timer;
using linker.messenger.cdkey;
namespace linker.messenger.relay.server
{
@@ -207,7 +208,7 @@ namespace linker.messenger.relay.server
{
await socket.SendAsync(new byte[] { 0 }).ConfigureAwait(false);
relayDic.TryAdd(relayCache.FlowId, tcs);
Socket answerSocket = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(15000)).ConfigureAwait(false);
@@ -418,7 +419,7 @@ namespace linker.messenger.relay.server
public string GroupId { get; set; }
public bool Validated { get; set; }
public List<RelayServerCdkeyInfo> Cdkey { get; set; }
public List<CdkeyInfo> Cdkey { get; set; }
}
public sealed class RelayTrafficCacheInfo
{
@@ -426,19 +427,7 @@ namespace linker.messenger.relay.server
public long SendtCache;
public RelaySpeedLimit Limit { get; set; }
public RelayCacheInfo Cache { get; set; }
public RelayServerCdkeyInfo CurrentCdkey { get; set; }
}
public partial class RelayServerCdkeyInfo
{
public int Id { get; set; }
/// <summary>
/// 带宽Mbps
/// </summary>
public double Bandwidth { get; set; }
/// <summary>
/// 剩余流量
/// </summary>
public long LastBytes { get; set; }
public CdkeyInfo CurrentCdkey { get; set; }
}
public sealed partial class RelayMessageInfo

View File

@@ -0,0 +1,635 @@
using linker.messenger.cdkey;
using MemoryPack;
namespace linker.messenger.serializer.memorypack
{
[MemoryPackable]
public readonly partial struct SerializableCdkeyInfo
{
[MemoryPackIgnore]
public readonly CdkeyInfo info;
[MemoryPackInclude]
int Id => info.Id;
[MemoryPackInclude]
double Bandwidth => info.Bandwidth;
[MemoryPackInclude]
long LastBytes => info.LastBytes;
[MemoryPackConstructor]
SerializableCdkeyInfo(int id, double bandwidth, long lastBytes)
{
var info = new CdkeyInfo
{
Id = id,
Bandwidth = bandwidth,
LastBytes = lastBytes
};
this.info = info;
}
public SerializableCdkeyInfo(CdkeyInfo info)
{
this.info = info;
}
}
public class CdkeyInfoFormatter : MemoryPackFormatter<CdkeyInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref CdkeyInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableCdkeyInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref CdkeyInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableCdkeyInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableCdkeyStoreInfo
{
[MemoryPackIgnore]
public readonly CdkeyStoreInfo info;
[MemoryPackInclude]
double Bandwidth => info.Bandwidth;
[MemoryPackInclude]
long LastBytes => info.LastBytes;
[MemoryPackInclude]
int Id => info.Id;
[MemoryPackInclude]
string UserId => info.UserId;
[MemoryPackInclude]
DateTime AddTime => info.AddTime;
[MemoryPackInclude]
DateTime StartTime => info.StartTime;
[MemoryPackInclude]
DateTime EndTime => info.EndTime;
[MemoryPackInclude]
DateTime UseTime => info.UseTime;
[MemoryPackInclude]
long MaxBytes => info.MaxBytes;
[MemoryPackInclude]
double CostPrice => info.CostPrice;
[MemoryPackInclude]
double Price => info.Price;
[MemoryPackInclude]
double UserPrice => info.UserPrice;
[MemoryPackInclude]
double PayPrice => info.PayPrice;
[MemoryPackInclude]
string Remark => info.Remark;
[MemoryPackInclude]
string OrderId => info.OrderId;
[MemoryPackInclude]
string Contact => info.Contact;
[MemoryPackInclude]
bool Deleted => info.Deleted;
[MemoryPackInclude]
string Type => info.Type;
[MemoryPackConstructor]
SerializableCdkeyStoreInfo(double bandwidth, long lastBytes, int id, string userid, DateTime addTime, DateTime startTime, DateTime endTime, DateTime useTime, long maxBytes, double costPrice, double price, double userPrice, double payPrice, string remark, string orderId, string contact, bool deleted, string type)
{
var info = new CdkeyStoreInfo
{
Bandwidth = bandwidth,
LastBytes = lastBytes,
Id = id,
UserId = userid,
AddTime = addTime,
StartTime = startTime,
EndTime = endTime,
UseTime = useTime,
MaxBytes = maxBytes,
CostPrice = costPrice,
Price = price,
UserPrice = userPrice,
PayPrice = payPrice,
Remark = remark,
OrderId = orderId,
Contact = contact,
Deleted = deleted,
Type = type
};
this.info = info;
}
public SerializableCdkeyStoreInfo(CdkeyStoreInfo info)
{
this.info = info;
}
}
public class CdkeyStoreInfoFormatter : MemoryPackFormatter<CdkeyStoreInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref CdkeyStoreInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableCdkeyStoreInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref CdkeyStoreInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableCdkeyStoreInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableCdkeyAddInfo
{
[MemoryPackIgnore]
public readonly CdkeyAddInfo info;
[MemoryPackInclude]
string SecretKey => info.SecretKey;
[MemoryPackInclude, MemoryPackAllowSerialize]
CdkeyStoreInfo Data => info.Data;
[MemoryPackConstructor]
SerializableCdkeyAddInfo(string secretKey, CdkeyStoreInfo data)
{
var info = new CdkeyAddInfo
{
SecretKey = secretKey,
Data = data
};
this.info = info;
}
public SerializableCdkeyAddInfo(CdkeyAddInfo info)
{
this.info = info;
}
}
public class CdkeyAddInfoFormatter : MemoryPackFormatter<CdkeyAddInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref CdkeyAddInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableCdkeyAddInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref CdkeyAddInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableCdkeyAddInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableCdkeyDelInfo
{
[MemoryPackIgnore]
public readonly CdkeyDelInfo info;
[MemoryPackInclude]
string SecretKey => info.SecretKey;
[MemoryPackInclude]
string UserId => info.UserId;
[MemoryPackInclude]
int Id => info.Id;
[MemoryPackConstructor]
SerializableCdkeyDelInfo(string secretKey, string userid, int id)
{
var info = new CdkeyDelInfo
{
SecretKey = secretKey,
UserId = userid,
Id = id
};
this.info = info;
}
public SerializableCdkeyDelInfo(CdkeyDelInfo info)
{
this.info = info;
}
}
public class CdkeyDelInfoFormatter : MemoryPackFormatter<CdkeyDelInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref CdkeyDelInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableCdkeyDelInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref CdkeyDelInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableCdkeyDelInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableCdkeyPageRequestInfo
{
[MemoryPackIgnore]
public readonly CdkeyPageRequestInfo info;
[MemoryPackInclude]
int Page => info.Page;
[MemoryPackInclude]
int Size => info.Size;
[MemoryPackInclude]
string Order => info.Order;
[MemoryPackInclude]
string Sort => info.Sort;
[MemoryPackInclude]
string UserId => info.UserId;
[MemoryPackInclude]
string Remark => info.Remark;
[MemoryPackInclude]
string OrderId => info.OrderId;
[MemoryPackInclude]
string Contact => info.Contact;
[MemoryPackInclude]
string SecretKey => info.SecretKey;
[MemoryPackInclude]
CdkeyPageRequestFlag Flag => info.Flag;
[MemoryPackInclude]
string Type => info.Type;
[MemoryPackConstructor]
SerializableCdkeyPageRequestInfo(int page, int size, string order, string sort, string userid, string remark, string orderid, string contact, string secretKey, CdkeyPageRequestFlag flag, string type)
{
var info = new CdkeyPageRequestInfo
{
Sort = sort,
Order = order,
Size = size,
Page = page,
UserId = userid,
Remark = remark,
OrderId = orderid,
Contact = contact,
SecretKey = secretKey,
Flag = flag,
Type = type
};
this.info = info;
}
public SerializableCdkeyPageRequestInfo(CdkeyPageRequestInfo info)
{
this.info = info;
}
}
public class CdkeyPageRequestInfoFormatter : MemoryPackFormatter<CdkeyPageRequestInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref CdkeyPageRequestInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableCdkeyPageRequestInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref CdkeyPageRequestInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableCdkeyPageRequestInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableCdkeyPageResultInfo
{
[MemoryPackIgnore]
public readonly CdkeyPageResultInfo info;
[MemoryPackInclude]
int Page => info.Page;
[MemoryPackInclude]
int Size => info.Size;
[MemoryPackInclude]
int Count => info.Count;
[MemoryPackInclude]
List<CdkeyStoreInfo> List => info.List;
[MemoryPackConstructor]
SerializableCdkeyPageResultInfo(int page, int size, int count, List<CdkeyStoreInfo> list)
{
var info = new CdkeyPageResultInfo
{
Count = count,
List = list,
Size = size,
Page = page
};
this.info = info;
}
public SerializableCdkeyPageResultInfo(CdkeyPageResultInfo info)
{
this.info = info;
}
}
public class CdkeyPageResultInfoFormatter : MemoryPackFormatter<CdkeyPageResultInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref CdkeyPageResultInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableCdkeyPageResultInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref CdkeyPageResultInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableCdkeyPageResultInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableCdkeyImportInfo
{
[MemoryPackIgnore]
public readonly CdkeyImportInfo info;
[MemoryPackInclude]
string SecretKey => info.SecretKey;
[MemoryPackInclude]
string UserId => info.UserId;
[MemoryPackInclude]
string Base64 => info.Base64;
[MemoryPackConstructor]
SerializableCdkeyImportInfo(string secretKey, string userid, string base64)
{
var info = new CdkeyImportInfo
{
SecretKey = secretKey,
UserId = userid,
Base64 = base64
};
this.info = info;
}
public SerializableCdkeyImportInfo(CdkeyImportInfo info)
{
this.info = info;
}
}
public class CdkeyImportInfoFormatter : MemoryPackFormatter<CdkeyImportInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref CdkeyImportInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableCdkeyImportInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref CdkeyImportInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableCdkeyImportInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableCdkeyTestResultInfo
{
[MemoryPackIgnore]
public readonly CdkeyTestResultInfo info;
[MemoryPackInclude, MemoryPackAllowSerialize]
CdkeyOrderInfo Order => info.Order;
[MemoryPackInclude]
string Cdkey => info.Cdkey;
[MemoryPackInclude]
List<string> Field => info.Field;
[MemoryPackConstructor]
SerializableCdkeyTestResultInfo(CdkeyOrderInfo order, string cdkey, List<string> field)
{
var info = new CdkeyTestResultInfo
{
Order = order,
Cdkey = cdkey,
Field = field
};
this.info = info;
}
public SerializableCdkeyTestResultInfo(CdkeyTestResultInfo info)
{
this.info = info;
}
}
public class CdkeyTestResultInfoFormatter : MemoryPackFormatter<CdkeyTestResultInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref CdkeyTestResultInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableCdkeyTestResultInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref CdkeyTestResultInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableCdkeyTestResultInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableCdkeyOrderInfo
{
[MemoryPackIgnore]
public readonly CdkeyOrderInfo info;
[MemoryPackInclude]
int GB => info.GB;
[MemoryPackInclude]
int Speed => info.Speed;
[MemoryPackInclude]
string Time => info.Time;
[MemoryPackInclude]
string WidgetUserId => info.WidgetUserId;
[MemoryPackInclude]
string OrderId => info.OrderId;
[MemoryPackInclude]
string Contact => info.Contact;
[MemoryPackInclude]
double CostPrice => info.CostPrice;
[MemoryPackInclude]
double Price => info.Price;
[MemoryPackInclude]
double UserPrice => info.UserPrice;
[MemoryPackInclude]
double PayPrice => info.PayPrice;
[MemoryPackInclude]
int Count => info.Count;
[MemoryPackInclude]
string Type => info.Type;
[MemoryPackConstructor]
SerializableCdkeyOrderInfo(int gb, int speed, string time, string widgetUserId, string orderId, string contact, double costPrice, double price, double userPrice, double payPrice, int count, string type)
{
var info = new CdkeyOrderInfo
{
GB = gb,
Speed = speed,
Time = time,
WidgetUserId = widgetUserId,
OrderId = orderId,
Contact = contact,
CostPrice = costPrice,
Price = price,
UserPrice = userPrice,
PayPrice = payPrice,
Count = count,
Type = type
};
this.info = info;
}
public SerializableCdkeyOrderInfo(CdkeyOrderInfo info)
{
this.info = info;
}
}
public class CdkeyOrderInfoFormatter : MemoryPackFormatter<CdkeyOrderInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref CdkeyOrderInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableCdkeyOrderInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref CdkeyOrderInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableCdkeyOrderInfo>();
value = wrapped.info;
}
}
}

View File

@@ -66,20 +66,21 @@ namespace linker.messenger.serializer.memorypack
MemoryPackFormatterProvider.Register(new RelayAskResultInfo170Formatter());
MemoryPackFormatterProvider.Register(new RelayCacheInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayMessageInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerCdkeyInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerCdkeyStoreInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerCdkeyPageRequestInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerCdkeyPageResultInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerCdkeyAddInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerCdkeyDelInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayTrafficUpdateInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerCdkeyImportInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerCdkeyTestResultInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerCdkeyOrderInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerNodeUpdateInfoFormatter());
MemoryPackFormatterProvider.Register(new RelayServerNodeUpdateWrapInfoFormatter());
MemoryPackFormatterProvider.Register(new CdkeyInfoFormatter());
MemoryPackFormatterProvider.Register(new CdkeyStoreInfoFormatter());
MemoryPackFormatterProvider.Register(new CdkeyPageRequestInfoFormatter());
MemoryPackFormatterProvider.Register(new CdkeyPageResultInfoFormatter());
MemoryPackFormatterProvider.Register(new CdkeyAddInfoFormatter());
MemoryPackFormatterProvider.Register(new CdkeyDelInfoFormatter());
MemoryPackFormatterProvider.Register(new CdkeyImportInfoFormatter());
MemoryPackFormatterProvider.Register(new CdkeyTestResultInfoFormatter());
MemoryPackFormatterProvider.Register(new CdkeyOrderInfoFormatter());
MemoryPackFormatterProvider.Register(new AccessUpdateInfoFormatter());
MemoryPackFormatterProvider.Register(new AccessBitsUpdateInfoFormatter());

View File

@@ -1,9 +1,9 @@
using linker.messenger.relay.client.transport;
using linker.messenger.cdkey;
using linker.messenger.relay.client.transport;
using linker.messenger.relay.server;
using linker.tunnel.connection;
using MemoryPack;
using System.Net;
using System.Xml.Linq;
namespace linker.messenger.serializer.memorypack
{
@@ -761,10 +761,10 @@ namespace linker.messenger.serializer.memorypack
[MemoryPackInclude, MemoryPackAllowSerialize]
List<RelayServerCdkeyInfo> Cdkey => info.Cdkey;
List<CdkeyInfo> Cdkey => info.Cdkey;
[MemoryPackConstructor]
SerializableRelayCacheInfo(ulong flowId, string fromId, string fromName, string toId, string toName, string groupId, bool validated, List<RelayServerCdkeyInfo> cdkey)
SerializableRelayCacheInfo(ulong flowId, string fromId, string fromName, string toId, string toName, string groupId, bool validated, List<CdkeyInfo> cdkey)
{
var info = new RelayCacheInfo
{
@@ -878,424 +878,6 @@ namespace linker.messenger.serializer.memorypack
}
}
[MemoryPackable]
public readonly partial struct SerializableRelayServerCdkeyInfo
{
[MemoryPackIgnore]
public readonly RelayServerCdkeyInfo info;
[MemoryPackInclude]
int Id => info.Id;
[MemoryPackInclude]
double Bandwidth => info.Bandwidth;
[MemoryPackInclude]
long LastBytes => info.LastBytes;
[MemoryPackConstructor]
SerializableRelayServerCdkeyInfo(int id, double bandwidth, long lastBytes)
{
var info = new RelayServerCdkeyInfo
{
Id = id,
Bandwidth = bandwidth,
LastBytes = lastBytes
};
this.info = info;
}
public SerializableRelayServerCdkeyInfo(RelayServerCdkeyInfo info)
{
this.info = info;
}
}
public class RelayServerCdkeyInfoFormatter : MemoryPackFormatter<RelayServerCdkeyInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayServerCdkeyInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableRelayServerCdkeyInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerCdkeyInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableRelayServerCdkeyInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableRelayServerCdkeyStoreInfo
{
[MemoryPackIgnore]
public readonly RelayServerCdkeyStoreInfo info;
[MemoryPackInclude]
double Bandwidth => info.Bandwidth;
[MemoryPackInclude]
long LastBytes => info.LastBytes;
[MemoryPackInclude]
int Id => info.Id;
[MemoryPackInclude]
string UserId => info.UserId;
[MemoryPackInclude]
DateTime AddTime => info.AddTime;
[MemoryPackInclude]
DateTime StartTime => info.StartTime;
[MemoryPackInclude]
DateTime EndTime => info.EndTime;
[MemoryPackInclude]
DateTime UseTime => info.UseTime;
[MemoryPackInclude]
long MaxBytes => info.MaxBytes;
[MemoryPackInclude]
double CostPrice => info.CostPrice;
[MemoryPackInclude]
double Price => info.Price;
[MemoryPackInclude]
double UserPrice => info.UserPrice;
[MemoryPackInclude]
double PayPrice => info.PayPrice;
[MemoryPackInclude]
string Remark => info.Remark;
[MemoryPackInclude]
string OrderId => info.OrderId;
[MemoryPackInclude]
string Contact => info.Contact;
[MemoryPackInclude]
bool Deleted => info.Deleted;
[MemoryPackConstructor]
SerializableRelayServerCdkeyStoreInfo(double bandwidth, long lastBytes, int id, string userid, DateTime addTime, DateTime startTime, DateTime endTime, DateTime useTime, long maxBytes, double costPrice, double price, double userPrice, double payPrice, string remark, string orderId, string contact, bool deleted)
{
var info = new RelayServerCdkeyStoreInfo
{
Bandwidth = bandwidth,
LastBytes = lastBytes,
Id = id,
UserId = userid,
AddTime = addTime,
StartTime = startTime,
EndTime = endTime,
UseTime = useTime,
MaxBytes = maxBytes,
CostPrice = costPrice,
Price = price,
UserPrice = userPrice,
PayPrice = payPrice,
Remark = remark,
OrderId = orderId,
Contact = contact,
Deleted = deleted
};
this.info = info;
}
public SerializableRelayServerCdkeyStoreInfo(RelayServerCdkeyStoreInfo info)
{
this.info = info;
}
}
public class RelayServerCdkeyStoreInfoFormatter : MemoryPackFormatter<RelayServerCdkeyStoreInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayServerCdkeyStoreInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableRelayServerCdkeyStoreInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerCdkeyStoreInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableRelayServerCdkeyStoreInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableRelayServerCdkeyAddInfo
{
[MemoryPackIgnore]
public readonly RelayServerCdkeyAddInfo info;
[MemoryPackInclude]
string SecretKey => info.SecretKey;
[MemoryPackInclude, MemoryPackAllowSerialize]
RelayServerCdkeyStoreInfo Data => info.Data;
[MemoryPackConstructor]
SerializableRelayServerCdkeyAddInfo(string secretKey, RelayServerCdkeyStoreInfo data)
{
var info = new RelayServerCdkeyAddInfo
{
SecretKey = secretKey,
Data = data
};
this.info = info;
}
public SerializableRelayServerCdkeyAddInfo(RelayServerCdkeyAddInfo info)
{
this.info = info;
}
}
public class RelayServerCdkeyAddInfoFormatter : MemoryPackFormatter<RelayServerCdkeyAddInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayServerCdkeyAddInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableRelayServerCdkeyAddInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerCdkeyAddInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableRelayServerCdkeyAddInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableRelayServerCdkeyDelInfo
{
[MemoryPackIgnore]
public readonly RelayServerCdkeyDelInfo info;
[MemoryPackInclude]
string SecretKey => info.SecretKey;
[MemoryPackInclude]
string UserId => info.UserId;
[MemoryPackInclude]
int Id => info.Id;
[MemoryPackConstructor]
SerializableRelayServerCdkeyDelInfo(string secretKey, string userid, int id)
{
var info = new RelayServerCdkeyDelInfo
{
SecretKey = secretKey,
UserId = userid,
Id = id
};
this.info = info;
}
public SerializableRelayServerCdkeyDelInfo(RelayServerCdkeyDelInfo info)
{
this.info = info;
}
}
public class RelayServerCdkeyDelInfoFormatter : MemoryPackFormatter<RelayServerCdkeyDelInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayServerCdkeyDelInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableRelayServerCdkeyDelInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerCdkeyDelInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableRelayServerCdkeyDelInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableRelayServerCdkeyPageRequestInfo
{
[MemoryPackIgnore]
public readonly RelayServerCdkeyPageRequestInfo info;
[MemoryPackInclude]
int Page => info.Page;
[MemoryPackInclude]
int Size => info.Size;
[MemoryPackInclude]
string Order => info.Order;
[MemoryPackInclude]
string Sort => info.Sort;
[MemoryPackInclude]
string UserId => info.UserId;
[MemoryPackInclude]
string Remark => info.Remark;
[MemoryPackInclude]
string OrderId => info.OrderId;
[MemoryPackInclude]
string Contact => info.Contact;
[MemoryPackInclude]
string SecretKey => info.SecretKey;
[MemoryPackInclude]
RelayServerCdkeyPageRequestFlag Flag => info.Flag;
[MemoryPackConstructor]
SerializableRelayServerCdkeyPageRequestInfo(int page, int size, string order, string sort, string userid, string remark, string orderid, string contact, string secretKey, RelayServerCdkeyPageRequestFlag flag)
{
var info = new RelayServerCdkeyPageRequestInfo
{
Sort = sort,
Order = order,
Size = size,
Page = page,
UserId = userid,
Remark = remark,
OrderId = orderid,
Contact = contact,
SecretKey = secretKey,
Flag = flag
};
this.info = info;
}
public SerializableRelayServerCdkeyPageRequestInfo(RelayServerCdkeyPageRequestInfo info)
{
this.info = info;
}
}
public class RelayServerCdkeyPageRequestInfoFormatter : MemoryPackFormatter<RelayServerCdkeyPageRequestInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayServerCdkeyPageRequestInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableRelayServerCdkeyPageRequestInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerCdkeyPageRequestInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableRelayServerCdkeyPageRequestInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableRelayServerCdkeyPageResultInfo
{
[MemoryPackIgnore]
public readonly RelayServerCdkeyPageResultInfo info;
[MemoryPackInclude]
int Page => info.Page;
[MemoryPackInclude]
int Size => info.Size;
[MemoryPackInclude]
int Count => info.Count;
[MemoryPackInclude]
List<RelayServerCdkeyStoreInfo> List => info.List;
[MemoryPackConstructor]
SerializableRelayServerCdkeyPageResultInfo(int page, int size, int count, List<RelayServerCdkeyStoreInfo> list)
{
var info = new RelayServerCdkeyPageResultInfo
{
Count = count,
List = list,
Size = size,
Page = page
};
this.info = info;
}
public SerializableRelayServerCdkeyPageResultInfo(RelayServerCdkeyPageResultInfo info)
{
this.info = info;
}
}
public class RelayServerCdkeyPageResultInfoFormatter : MemoryPackFormatter<RelayServerCdkeyPageResultInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayServerCdkeyPageResultInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableRelayServerCdkeyPageResultInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerCdkeyPageResultInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableRelayServerCdkeyPageResultInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
@@ -1352,206 +934,4 @@ namespace linker.messenger.serializer.memorypack
}
}
[MemoryPackable]
public readonly partial struct SerializableRelayServerCdkeyImportInfo
{
[MemoryPackIgnore]
public readonly RelayServerCdkeyImportInfo info;
[MemoryPackInclude]
string SecretKey => info.SecretKey;
[MemoryPackInclude]
string UserId => info.UserId;
[MemoryPackInclude]
string Base64 => info.Base64;
[MemoryPackConstructor]
SerializableRelayServerCdkeyImportInfo(string secretKey, string userid, string base64)
{
var info = new RelayServerCdkeyImportInfo
{
SecretKey = secretKey,
UserId = userid,
Base64 = base64
};
this.info = info;
}
public SerializableRelayServerCdkeyImportInfo(RelayServerCdkeyImportInfo info)
{
this.info = info;
}
}
public class RelayServerCdkeyImportInfoFormatter : MemoryPackFormatter<RelayServerCdkeyImportInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayServerCdkeyImportInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableRelayServerCdkeyImportInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerCdkeyImportInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableRelayServerCdkeyImportInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableRelayServerCdkeyTestResultInfo
{
[MemoryPackIgnore]
public readonly RelayServerCdkeyTestResultInfo info;
[MemoryPackInclude, MemoryPackAllowSerialize]
RelayServerCdkeyOrderInfo Order => info.Order;
[MemoryPackInclude]
string Cdkey => info.Cdkey;
[MemoryPackInclude]
List<string> Field => info.Field;
[MemoryPackConstructor]
SerializableRelayServerCdkeyTestResultInfo(RelayServerCdkeyOrderInfo order, string cdkey, List<string> field)
{
var info = new RelayServerCdkeyTestResultInfo
{
Order = order,
Cdkey = cdkey,
Field = field
};
this.info = info;
}
public SerializableRelayServerCdkeyTestResultInfo(RelayServerCdkeyTestResultInfo info)
{
this.info = info;
}
}
public class RelayServerCdkeyTestResultInfoFormatter : MemoryPackFormatter<RelayServerCdkeyTestResultInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayServerCdkeyTestResultInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableRelayServerCdkeyTestResultInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerCdkeyTestResultInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableRelayServerCdkeyTestResultInfo>();
value = wrapped.info;
}
}
[MemoryPackable]
public readonly partial struct SerializableRelayServerCdkeyOrderInfo
{
[MemoryPackIgnore]
public readonly RelayServerCdkeyOrderInfo info;
[MemoryPackInclude]
int GB => info.GB;
[MemoryPackInclude]
int Speed => info.Speed;
[MemoryPackInclude]
string Time => info.Time;
[MemoryPackInclude]
string WidgetUserId => info.WidgetUserId;
[MemoryPackInclude]
string OrderId => info.OrderId;
[MemoryPackInclude]
string Contact => info.Contact;
[MemoryPackInclude]
double CostPrice => info.CostPrice;
[MemoryPackInclude]
double Price => info.Price;
[MemoryPackInclude]
double UserPrice => info.UserPrice;
[MemoryPackInclude]
double PayPrice => info.PayPrice;
[MemoryPackInclude]
int Count => info.Count;
[MemoryPackInclude]
string Type => info.Type;
[MemoryPackConstructor]
SerializableRelayServerCdkeyOrderInfo(int gb, int speed, string time, string widgetUserId, string orderId, string contact, double costPrice, double price, double userPrice, double payPrice, int count, string type)
{
var info = new RelayServerCdkeyOrderInfo
{
GB = gb,
Speed = speed,
Time = time,
WidgetUserId = widgetUserId,
OrderId = orderId,
Contact = contact,
CostPrice = costPrice,
Price = price,
UserPrice = userPrice,
PayPrice = payPrice,
Count = count,
Type = type
};
this.info = info;
}
public SerializableRelayServerCdkeyOrderInfo(RelayServerCdkeyOrderInfo info)
{
this.info = info;
}
}
public class RelayServerCdkeyOrderInfoFormatter : MemoryPackFormatter<RelayServerCdkeyOrderInfo>
{
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayServerCdkeyOrderInfo value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WritePackable(new SerializableRelayServerCdkeyOrderInfo(value));
}
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayServerCdkeyOrderInfo value)
{
if (reader.PeekIsNull())
{
reader.Advance(1); // skip null block
value = null;
return;
}
var wrapped = reader.ReadPackable<SerializableRelayServerCdkeyOrderInfo>();
value = wrapped.info;
}
}
}

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger serializer memorypack</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -42,6 +42,7 @@
<ItemGroup>
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
<ProjectReference Include="..\linker.messenger.access\linker.messenger.access.csproj" />
<ProjectReference Include="..\linker.messenger.cdkey\linker.messenger.cdkey.csproj" />
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
<ProjectReference Include="..\linker.messenger.firewall\linker.messenger.firewall.csproj" />
<ProjectReference Include="..\linker.messenger.flow\linker.messenger.flow.csproj" />

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger sforward</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -217,12 +217,12 @@ namespace linker.plugins.sforward.messenger
public void GetForward(IConnection connection)
{
string machineId = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(machineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id,machineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
sender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)SForwardMessengerIds.Get,
Payload = connection.ReceiveRequestWrap.Payload
}).ContinueWith(async (result) =>
@@ -248,12 +248,12 @@ namespace linker.plugins.sforward.messenger
public async Task AddClientForward(IConnection connection)
{
SForwardAddForwardInfo info = serializer.Deserialize<SForwardAddForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await sender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)SForwardMessengerIds.AddClient,
Payload = serializer.Serialize(info.Data)
}).ContinueWith(async (result) =>
@@ -279,12 +279,12 @@ namespace linker.plugins.sforward.messenger
public async Task RemoveClientForward(IConnection connection)
{
SForwardRemoveForwardInfo info = serializer.Deserialize<SForwardRemoveForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await sender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)SForwardMessengerIds.RemoveClient,
Payload = serializer.Serialize(info.Id)
}).ContinueWith(async (result) =>
@@ -307,11 +307,11 @@ namespace linker.plugins.sforward.messenger
public async Task StartClientForward(IConnection connection)
{
SForwardRemoveForwardInfo info = serializer.Deserialize<SForwardRemoveForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
await sender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)SForwardMessengerIds.StartClient,
Payload = serializer.Serialize(info.Id)
}).ConfigureAwait(false);
@@ -321,11 +321,11 @@ namespace linker.plugins.sforward.messenger
public async Task StopClientForward(IConnection connection)
{
SForwardRemoveForwardInfo info = serializer.Deserialize<SForwardRemoveForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
await sender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)SForwardMessengerIds.StopClient,
Payload = serializer.Serialize(info.Id)
}).ConfigureAwait(false);
@@ -340,12 +340,12 @@ namespace linker.plugins.sforward.messenger
public async Task TestClientForward(IConnection connection)
{
string machineid = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(machineid, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, machineid, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
await sender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)SForwardMessengerIds.TestClient
}).ConfigureAwait(false);
}

View File

@@ -181,7 +181,7 @@ namespace linker.messenger.signin
{
MachineName = signInClientStore.Name,
MachineId = signInClientStore.Id,
Version = VersionHelper.version,
Version = VersionHelper.Version,
Args = args,
GroupId = signInClientStore.Group.Id,
})

View File

@@ -48,7 +48,9 @@ namespace linker.messenger.signin
}
[MessengerId((ushort)SignInMessengerIds.SignIn)]
#pragma warning disable CA1822 // 将成员标记为 static
public void SignIn(IConnection connection)
#pragma warning restore CA1822 // 将成员标记为 static
{
connection.Disponse();
return;
@@ -87,7 +89,7 @@ namespace linker.messenger.signin
string[] ids = serializer.Deserialize<string[]>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache))
{
IEnumerable<SignCacheInfo> list = signCaching.Get(cache.GroupId);
IEnumerable<SignCacheInfo> list = signCaching.Get(cache);
foreach (var item in list)
{
item.Order = uint.MaxValue;
@@ -111,7 +113,7 @@ namespace linker.messenger.signin
SignInListRequestInfo request = serializer.Deserialize<SignInListRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache))
{
IEnumerable<SignCacheInfo> list = signCaching.Get(cache.GroupId).Where(c => c.MachineId != cache.MachineId);
IEnumerable<SignCacheInfo> list = signCaching.Get(cache).Where(c => c.MachineId != cache.MachineId);
if (string.IsNullOrWhiteSpace(request.Name) == false)
{
list = list.Where(c => c.Version.Contains(request.Name) || c.IP.ToString().Contains(request.Name) || c.MachineName.Contains(request.Name) || request.Ids.Contains(c.MachineId));
@@ -164,17 +166,17 @@ namespace linker.messenger.signin
[MessengerId((ushort)SignInMessengerIds.Delete)]
public void Delete(IConnection connection)
{
string name = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(name, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
string machineid = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, machineid, out SignCacheInfo from, out SignCacheInfo to))
{
signCaching.TryRemove(name, out _);
signCaching.TryRemove(machineid, out _);
}
}
[MessengerId((ushort)SignInMessengerIds.Version)]
public void Version(IConnection connection)
{
connection.Write(serializer.Serialize(VersionHelper.version));
connection.Write(serializer.Serialize(VersionHelper.Version));
}
@@ -184,7 +186,7 @@ namespace linker.messenger.signin
SignInIdsRequestInfo request = serializer.Deserialize<SignInIdsRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache))
{
IEnumerable<SignCacheInfo> list = signCaching.Get(cache.GroupId).OrderByDescending(c => c.MachineName).OrderByDescending(c => c.LastSignIn).OrderByDescending(c => c.Version).ToList();
IEnumerable<SignCacheInfo> list = signCaching.Get(cache).OrderByDescending(c => c.MachineName).OrderByDescending(c => c.LastSignIn).OrderByDescending(c => c.Version).ToList();
if (string.IsNullOrWhiteSpace(request.Name) == false)
{
list = list.Where(c => c.MachineName.Contains(request.Name));
@@ -208,7 +210,7 @@ namespace linker.messenger.signin
{
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache))
{
List<SignInNamesResponseItemInfo> list = signCaching.Get(cache.GroupId).Select(c => new SignInNamesResponseItemInfo { MachineId = c.MachineId, MachineName = c.MachineName, Online = c.Connected }).ToList();
List<SignInNamesResponseItemInfo> list = signCaching.Get(cache).Select(c => new SignInNamesResponseItemInfo { MachineId = c.MachineId, MachineName = c.MachineName, Online = c.Connected }).ToList();
connection.Write(serializer.Serialize(list));
}
@@ -220,7 +222,7 @@ namespace linker.messenger.signin
{
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache))
{
IEnumerable<string> list = signCaching.Get(cache.GroupId).Select(c => c.MachineId);
IEnumerable<string> list = signCaching.Get(cache).Select(c => c.MachineId);
connection.Write(serializer.Serialize(list));
}
}
@@ -230,7 +232,7 @@ namespace linker.messenger.signin
{
string machineId = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) && signCaching.TryGet(machineId, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId && cache1.Connected)
if (signCaching.TryGet(connection.Id, machineId, out SignCacheInfo from, out SignCacheInfo to) && to.Connected)
{
connection.Write(Helper.TrueArray);
}
@@ -250,13 +252,13 @@ namespace linker.messenger.signin
public async Task SetNameForward(IConnection connection)
{
SignInConfigSetNameInfo info = serializer.Deserialize<SignInConfigSetNameInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.Id, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
if (signCaching.TryGet(connection.Id, info.Id, out SignCacheInfo from, out SignCacheInfo to))
{
if (info.Id != connection.Id)
{
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cache.Connection,
Connection = to.Connection,
MessengerId = (ushort)SignInMessengerIds.SetName,
Payload = connection.ReceiveRequestWrap.Payload,
}).ConfigureAwait(false);
@@ -281,7 +283,7 @@ namespace linker.messenger.signin
List<string> machineIds = serializer.Deserialize<List<string>>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache))
{
List<string> offlines = signCaching.Get(cache.GroupId).Where(c => c.Connected == false).Select(c => c.MachineId).Intersect(machineIds).ToList();
List<string> offlines = signCaching.Get(cache).Where(c => c.Connected == false).Select(c => c.MachineId).Intersect(machineIds).ToList();
connection.Write(serializer.Serialize(offlines));
return;
}

View File

@@ -3,7 +3,6 @@ using linker.libs.timer;
using linker.messenger.signin.args;
using System.Collections.Concurrent;
using System.Net;
using System.Text.RegularExpressions;
namespace linker.messenger.signin
{
@@ -86,20 +85,25 @@ namespace linker.messenger.signin
}
return Clients.TryGetValue(machineId, out cache);
}
public bool TryGet(string from, string to, out SignCacheInfo fromValue, out SignCacheInfo toValue)
{
fromValue = null;
toValue = null;
if (from == null || to == null)
{
return false;
}
return Clients.TryGetValue(from, out fromValue) && Clients.TryGetValue(to, out toValue) && fromValue.SameGroup(toValue);
}
public List<SignCacheInfo> Get()
{
return Clients.Values.ToList();
}
public List<SignCacheInfo> Get(string groupId)
public List<SignCacheInfo> Get(SignCacheInfo other)
{
return Clients.Values.Where(c => c.GroupId == groupId).ToList();
return Clients.Values.Where(c => c.GroupId == other.GroupId).ToList();
}
public IEnumerable<string> GetOnlines()
{
return Clients.Values.Where(c => c.Connected == true).Select(c => c.Id);
}
public bool GetOnline(string machineId)
{
@@ -120,13 +124,11 @@ namespace linker.messenger.signin
}
return true;
}
public string NewId()
{
return signInStore.NewId();
}
public bool Exp(string machineId)
{
return signInStore.Exp(machineId);
@@ -218,7 +220,7 @@ namespace linker.messenger.signin
}
}
private bool connected = false;
private bool connected;
public bool Connected
{
get
@@ -241,6 +243,11 @@ namespace linker.messenger.signin
public IConnection Connection { get; set; }
public uint Order { get; set; } = int.MaxValue;
public bool SameGroup(SignCacheInfo other)
{
return this.GroupId == other.GroupId;
}
}
/// <summary>

View File

@@ -10,7 +10,7 @@ namespace linker.messenger.signin.args
public string Name => "version";
public async Task<string> Invoke(string host, Dictionary<string, string> args)
{
args.TryAdd("version", VersionHelper.version);
args.TryAdd("version", VersionHelper.Version);
await Task.CompletedTask.ConfigureAwait(false);

View File

@@ -17,9 +17,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger signin</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -69,12 +69,12 @@ namespace linker.messenger.socks5
[MessengerId((ushort)Socks5MessengerIds.RunForward)]
public async Task RunForward(IConnection connection)
{
string name = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(name, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
string machineid = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, machineid, out SignCacheInfo from, out SignCacheInfo to))
{
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cache.Connection,
Connection = to.Connection,
Timeout = 3000,
MessengerId = (ushort)Socks5MessengerIds.Run
}).ConfigureAwait(false);
@@ -89,12 +89,12 @@ namespace linker.messenger.socks5
[MessengerId((ushort)Socks5MessengerIds.StopForward)]
public async Task StopForward(IConnection connection)
{
string name = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(name, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
string machineid = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id,machineid, out SignCacheInfo from, out SignCacheInfo to))
{
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cache.Connection,
Connection = to.Connection,
Timeout = 3000,
MessengerId = (ushort)Socks5MessengerIds.Stop
}).ConfigureAwait(false);
@@ -110,11 +110,11 @@ namespace linker.messenger.socks5
public async Task UpdateForward(IConnection connection)
{
Socks5Info info = serializer.Deserialize<Socks5Info>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cache.Connection,
Connection = to.Connection,
Timeout = 3000,
MessengerId = (ushort)Socks5MessengerIds.Update,
Payload = connection.ReceiveRequestWrap.Payload

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger socks5</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -2,6 +2,7 @@
using linker.libs.web;
using linker.messenger.action;
using linker.messenger.api;
using linker.messenger.cdkey;
using linker.messenger.firewall;
using linker.messenger.forward;
using linker.messenger.listen;
@@ -16,6 +17,7 @@ using linker.messenger.signin;
using linker.messenger.socks5;
using linker.messenger.store.file.action;
using linker.messenger.store.file.api;
using linker.messenger.store.file.cekey;
using linker.messenger.store.file.common;
using linker.messenger.store.file.firewall;
using linker.messenger.store.file.forward;
@@ -68,7 +70,9 @@ namespace linker.messenger.store.file
serviceCollection.AddSingleton<IRelayServerStore, RelayServerStore>();
serviceCollection.AddSingleton<IRelayServerNodeStore, RelayServerNodeStore>();
serviceCollection.AddSingleton<IRelayServerMasterStore, RelayServerMasterStore>();
serviceCollection.AddSingleton<IRelayServerCdkeyStore, RelayServerCdkeyStore>();
serviceCollection.AddSingleton<ICdkeyServerStore, CdkeyServerStore>();
serviceCollection.AddSingleton<ICdkeyClientStore, CdkeyClientStore>();
serviceCollection.AddSingleton<ITunnelClientStore, TunnelClientStore>();
@@ -114,7 +118,7 @@ namespace linker.messenger.store.file
serviceCollection.AddSingleton<IWakeupClientStore, WakeupClientStore>();
return serviceCollection;
}

View File

@@ -74,9 +74,9 @@ namespace linker.messenger.store.file
}
}
}
if (Directory.Exists(Path.Combine(Helper.currentDirectory, configPath)) == false)
if (Directory.Exists(Path.Combine(Helper.CurrentDirectory, configPath)) == false)
{
Directory.CreateDirectory(Path.Combine(Helper.currentDirectory, configPath));
Directory.CreateDirectory(Path.Combine(Helper.CurrentDirectory, configPath));
}
Type type = Data.GetType();
@@ -86,7 +86,7 @@ namespace linker.messenger.store.file
object property = item.GetValue(Data);
fsDic.Add(item.Name.ToLower(), new FileReadWrite
{
Path = Path.Combine(Helper.currentDirectory, configPath, $"{item.Name.ToLower()}.json"),
Path = Path.Combine(Helper.CurrentDirectory, configPath, $"{item.Name.ToLower()}.json"),
Property = item,
PropertyObject = property,
PropertyMethod = (IConfig)property,

View File

@@ -30,7 +30,7 @@ namespace linker.messenger.store.file
bsonMapper.RegisterType<ITunnelConnection>(serialize: (a) => string.Empty, deserialize: (a) => null);
bsonMapper.RegisterType<IConnection>(serialize: (a) => string.Empty, deserialize: (a) => null);
string db = Path.Join(Helper.currentDirectory, "./configs/db.db");
string db = Path.Join(Helper.CurrentDirectory, "./configs/db.db");
if (Directory.Exists(Path.GetDirectoryName(db)) == false)
{
Directory.CreateDirectory(Path.GetDirectoryName(db));

View File

@@ -0,0 +1,22 @@
using linker.messenger.cdkey;
namespace linker.messenger.store.file.cekey
{
public sealed class CdkeyClientStore : ICdkeyClientStore
{
public string SecretKey => fileConfig.Data.Client.Cdkey.SecretKey;
private readonly FileConfig fileConfig;
public CdkeyClientStore(FileConfig fileConfig)
{
this.fileConfig = fileConfig;
}
public bool SetSecretKey(string secretKey)
{
fileConfig.Data.Client.Cdkey.SecretKey = secretKey;
fileConfig.Data.Update();
return true;
}
}
}

View File

@@ -1,28 +1,35 @@
using linker.libs;
using linker.libs.extends;
using linker.messenger.relay.server;
using linker.messenger.cdkey;
using LiteDB;
using System.Text;
using System.Text.RegularExpressions;
namespace linker.messenger.store.file.relay
{
public sealed class RelayServerCdkeyStore : IRelayServerCdkeyStore
public sealed class CdkeyServerStore : ICdkeyServerStore
{
private string regex = @"([0-9]+|\?)-([0-9]+|\?)-([0-9]+|\?)\s+([0-9]+|\?):([0-9]+|\?):([0-9]+|\?)";
private int index = 0;
private readonly Storefactory dBfactory;
private readonly ILiteCollection<RelayServerCdkeyStoreInfo> liteCollection;
private readonly ILiteCollection<CdkeyStoreInfo> liteCollection;
private readonly ICrypto crypto;
public RelayServerCdkeyStore(Storefactory dBfactory, FileConfig fileConfig)
private readonly FileConfig fileConfig;
public CdkeyServerStore(Storefactory dBfactory, FileConfig fileConfig)
{
this.dBfactory = dBfactory;
liteCollection = dBfactory.GetCollection<RelayServerCdkeyStoreInfo>("relayCdkey");
liteCollection = dBfactory.GetCollection<CdkeyStoreInfo>("relayCdkey");
this.crypto = CryptoFactory.CreateSymmetric(fileConfig.Data.Server.Relay.Cdkey.SecretKey, System.Security.Cryptography.PaddingMode.PKCS7);
this.fileConfig = fileConfig;
}
public async Task<bool> Add(RelayServerCdkeyStoreInfo info)
public bool ValidateSecretKey(string secretKey)
{
return secretKey == fileConfig.Data.Server.Cdkey.SecretKey;
}
public async Task<bool> Add(CdkeyStoreInfo info)
{
if (info.Id == 0)
{
@@ -44,27 +51,27 @@ namespace linker.messenger.store.file.relay
}
public async Task<bool> Del(int id)
{
return await Task.FromResult(liteCollection.UpdateMany(c => new RelayServerCdkeyStoreInfo { Deleted = true }, c => c.Id == id) > 0).ConfigureAwait(false);
return await Task.FromResult(liteCollection.UpdateMany(c => new CdkeyStoreInfo { Deleted = true }, c => c.Id == id) > 0).ConfigureAwait(false);
}
public async Task<bool> Del(int id, string userid)
{
return await Task.FromResult(liteCollection.UpdateMany(c => new RelayServerCdkeyStoreInfo { Deleted = true }, c => c.Id == id && c.UserId == userid) > 0).ConfigureAwait(false);
return await Task.FromResult(liteCollection.UpdateMany(c => new CdkeyStoreInfo { Deleted = true }, c => c.Id == id && c.UserId == userid) > 0).ConfigureAwait(false);
}
public async Task<RelayServerCdkeyTestResultInfo> Test(RelayServerCdkeyImportInfo info)
public async Task<CdkeyTestResultInfo> Test(CdkeyImportInfo info)
{
List<string> error = new List<string>();
RelayServerCdkeyTestResultInfo result = new RelayServerCdkeyTestResultInfo();
CdkeyTestResultInfo result = new CdkeyTestResultInfo();
try
{
result.Cdkey = Encoding.UTF8.GetString(crypto.Decode(Convert.FromBase64String(info.Base64)).Span);
RelayServerCdkeyOrderInfo order = result.Cdkey.DeJson<RelayServerCdkeyOrderInfo>();
CdkeyOrderInfo order = result.Cdkey.DeJson<CdkeyOrderInfo>();
result.Order = order;
if(order.Type != "Relay" || string.IsNullOrWhiteSpace(order.Type))
if (string.IsNullOrWhiteSpace(order.Type))
{
error.Add("Relay");
error.Add("Type");
}
if (order.WidgetUserId != info.UserId || string.IsNullOrWhiteSpace(order.WidgetUserId))
@@ -104,9 +111,9 @@ namespace linker.messenger.store.file.relay
return await Task.FromResult(result).ConfigureAwait(false);
}
public async Task<string> Import(RelayServerCdkeyImportInfo info)
public async Task<string> Import(CdkeyImportInfo info)
{
RelayServerCdkeyTestResultInfo test = await Test(info).ConfigureAwait(false);
CdkeyTestResultInfo test = await Test(info).ConfigureAwait(false);
if (test.Field.Count > 0)
{
@@ -124,10 +131,11 @@ namespace linker.messenger.store.file.relay
return "OrderId";
}
RelayServerCdkeyOrderInfo order = test.Order;
CdkeyOrderInfo order = test.Order;
var time = Regex.Match(order.Time, regex).Groups;
RelayServerCdkeyStoreInfo store = new RelayServerCdkeyStoreInfo
CdkeyStoreInfo store = new CdkeyStoreInfo
{
Type = order.Type,
UseTime = DateTime.Now,
AddTime = DateTime.Now,
Bandwidth = order.Speed,
@@ -162,7 +170,7 @@ namespace linker.messenger.store.file.relay
if (info != null)
{
long bytes = info.LastBytes >= item.Value ? info.LastBytes - item.Value : 0;
liteCollection.UpdateMany(x => new RelayServerCdkeyStoreInfo { LastBytes = bytes, UseTime = DateTime.Now }, c => c.Id == item.Key);
liteCollection.UpdateMany(x => new CdkeyStoreInfo { LastBytes = bytes, UseTime = DateTime.Now }, c => c.Id == item.Key);
}
}
return await Task.FromResult(true).ConfigureAwait(false);
@@ -172,44 +180,48 @@ namespace linker.messenger.store.file.relay
return await Task.FromResult(liteCollection.Find(c => ids.Contains(c.Id)).ToDictionary(c => c.Id, c => c.LastBytes)).ConfigureAwait(false);
}
public async Task<List<RelayServerCdkeyStoreInfo>> GetAvailable(string userid)
public async Task<List<CdkeyStoreInfo>> GetAvailable(string userid, string type)
{
return await Task.FromResult(liteCollection.Find(x => x.UserId == userid && x.LastBytes > 0 && x.StartTime <= DateTime.Now && x.EndTime >= DateTime.Now && x.Deleted == false).ToList()).ConfigureAwait(false);
return await Task.FromResult(liteCollection.Find(x => x.UserId == userid && x.Type == type && x.LastBytes > 0 && x.StartTime <= DateTime.Now && x.EndTime >= DateTime.Now && x.Deleted == false).ToList()).ConfigureAwait(false);
}
public async Task<List<RelayServerCdkeyStoreInfo>> Get(List<int> ids)
public async Task<List<CdkeyStoreInfo>> Get(List<int> ids)
{
return await Task.FromResult(liteCollection.Find(x => ids.Contains(x.Id)).ToList()).ConfigureAwait(false);
}
public async Task<RelayServerCdkeyPageResultInfo> Page(RelayServerCdkeyPageRequestInfo info)
public async Task<CdkeyPageResultInfo> Page(CdkeyPageRequestInfo info)
{
ILiteQueryable<RelayServerCdkeyStoreInfo> query = liteCollection.Query();
ILiteQueryable<CdkeyStoreInfo> query = liteCollection.Query();
if (info.Flag.HasFlag(RelayServerCdkeyPageRequestFlag.TimeIn))
if (info.Flag.HasFlag(CdkeyPageRequestFlag.TimeIn))
{
query = query.Where(x => x.StartTime <= DateTime.Now && x.EndTime >= DateTime.Now);
}
if (info.Flag.HasFlag(RelayServerCdkeyPageRequestFlag.TimeOut))
if (info.Flag.HasFlag(CdkeyPageRequestFlag.TimeOut))
{
query = query.Where(x =>x.StartTime > DateTime.Now || x.EndTime < DateTime.Now);
query = query.Where(x => x.StartTime > DateTime.Now || x.EndTime < DateTime.Now);
}
if (info.Flag.HasFlag(RelayServerCdkeyPageRequestFlag.BytesIn))
if (info.Flag.HasFlag(CdkeyPageRequestFlag.BytesIn))
{
query = query.Where(x => x.LastBytes > 0);
}
if (info.Flag.HasFlag(RelayServerCdkeyPageRequestFlag.BytesOut))
if (info.Flag.HasFlag(CdkeyPageRequestFlag.BytesOut))
{
query = query.Where(x => x.LastBytes <= 0);
}
if (info.Flag.HasFlag(RelayServerCdkeyPageRequestFlag.Deleted))
if (info.Flag.HasFlag(CdkeyPageRequestFlag.Deleted))
{
query = query.Where(x => x.Deleted == true);
}
if (info.Flag.HasFlag(RelayServerCdkeyPageRequestFlag.UnDeleted))
if (info.Flag.HasFlag(CdkeyPageRequestFlag.UnDeleted))
{
query = query.Where(x => x.Deleted == false);
}
if (string.IsNullOrWhiteSpace(info.Type) == false)
{
query = query.Where(x => x.Type == info.Type);
}
if (string.IsNullOrWhiteSpace(info.UserId) == false)
{
query = query.Where(x => x.UserId == info.UserId);
@@ -235,7 +247,7 @@ namespace linker.messenger.store.file.relay
query = query.OrderBy(c => c.Id, Query.Descending);
}
return await Task.FromResult(new RelayServerCdkeyPageResultInfo
return await Task.FromResult(new CdkeyPageResultInfo
{
Page = info.Page,
Size = info.Size,

View File

@@ -0,0 +1,19 @@
using linker.messenger.cdkey;
namespace linker.messenger.store.file
{
public sealed partial class ConfigClientInfo
{
/// <summary>
/// cdkey配置
/// </summary>
public CdkeyConfigInfo Cdkey { get; set; } = new CdkeyConfigInfo();
}
public partial class ConfigServerInfo
{
/// <summary>
/// cdkey配置
/// </summary>
public CdkeyConfigInfo Cdkey { get; set; } = new CdkeyConfigInfo();
}
}

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger store file</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -52,6 +52,7 @@
<ProjectReference Include="..\linker.messenger.access\linker.messenger.access.csproj" />
<ProjectReference Include="..\linker.messenger.action\linker.messenger.action.csproj" />
<ProjectReference Include="..\linker.messenger.api\linker.messenger.api.csproj" />
<ProjectReference Include="..\linker.messenger.cdkey\linker.messenger.cdkey.csproj" />
<ProjectReference Include="..\linker.messenger.firewall\linker.messenger.firewall.csproj" />
<ProjectReference Include="..\linker.messenger.forward\linker.messenger.forward.csproj" />
<ProjectReference Include="..\linker.messenger.listen\linker.messenger.listen.csproj" />

View File

@@ -1,4 +1,5 @@
using linker.libs;
using linker.messenger.cdkey;
using linker.messenger.relay.client.transport;
using linker.messenger.relay.server;
using linker.tunnel.connection;
@@ -48,7 +49,7 @@ namespace linker.messenger.store.file
#else
public string SecretKey { get; set; } = Guid.NewGuid().ToString().ToUpper();
#endif
public RelayServerCdkeyConfigInfo Cdkey { get; set; } = new RelayServerCdkeyConfigInfo();
public CdkeyConfigInfo Cdkey { get; set; } = new CdkeyConfigInfo();
public DistributedInfo Distributed { get; set; } = new DistributedInfo { };
}

View File

@@ -23,7 +23,7 @@ namespace linker.messenger.sync
SyncInfo info = serializer.Deserialize<SyncInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache))
{
List<SignCacheInfo> caches = signCaching.Get(cache.GroupId);
List<SignCacheInfo> caches = signCaching.Get(cache);
List<Task> tasks = new List<Task>();
foreach (SignCacheInfo item in caches.Where(c => c.MachineId != connection.Id && c.Connected))
{

View File

@@ -18,9 +18,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger sync</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -126,12 +126,12 @@ namespace linker.messenger.tunnel
public void InfoForward(IConnection connection)
{
TunnelWanPortProtocolInfo info = serializer.Deserialize<TunnelWanPortProtocolInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
_ = messengerSender.SendReply(new MessageRequestWrap
{
Connection = cache.Connection,
Connection = to.Connection,
MessengerId = (ushort)TunnelMessengerIds.Info,
Payload = connection.ReceiveRequestWrap.Payload,
}).ContinueWith(async (result) =>
@@ -153,18 +153,18 @@ namespace linker.messenger.tunnel
[MessengerId((ushort)TunnelMessengerIds.BeginForward)]
public async Task BeginForward(IConnection connection)
{
TunnelTransportInfo tunnelTransportInfo = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
TunnelTransportInfo info = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
if (signCaching.TryGet(connection.Id, info.Remote.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
tunnelTransportInfo.Local.MachineName = cacheFrom.MachineName;
tunnelTransportInfo.Remote.MachineName = cacheTo.MachineName;
info.Local.MachineName = from.MachineName;
info.Remote.MachineName = to.MachineName;
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)TunnelMessengerIds.Begin,
Payload = serializer.Serialize(tunnelTransportInfo)
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
connection.Write(Helper.TrueArray);
}
@@ -174,16 +174,16 @@ namespace linker.messenger.tunnel
[MessengerId((ushort)TunnelMessengerIds.FailForward)]
public async Task FailForward(IConnection connection)
{
TunnelTransportInfo tunnelTransportInfo = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
TunnelTransportInfo info = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, info.Remote.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
tunnelTransportInfo.Local.MachineName = cache1.MachineName;
tunnelTransportInfo.Remote.MachineName = cache.MachineName;
info.Local.MachineName = from.MachineName;
info.Remote.MachineName = to.MachineName;
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cache.Connection,
Connection = to.Connection,
MessengerId = (ushort)TunnelMessengerIds.Fail,
Payload = serializer.Serialize(tunnelTransportInfo)
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
}
}
@@ -192,16 +192,16 @@ namespace linker.messenger.tunnel
[MessengerId((ushort)TunnelMessengerIds.SuccessForward)]
public async Task SuccessForward(IConnection connection)
{
TunnelTransportInfo tunnelTransportInfo = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
TunnelTransportInfo info = serializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, info.Remote.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
tunnelTransportInfo.Local.MachineName = cache1.MachineName;
tunnelTransportInfo.Remote.MachineName = cache.MachineName;
info.Local.MachineName = from.MachineName;
info.Remote.MachineName = to.MachineName;
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cache.Connection,
Connection = to.Connection,
MessengerId = (ushort)TunnelMessengerIds.Success,
Payload = serializer.Serialize(tunnelTransportInfo)
Payload = serializer.Serialize(info)
}).ConfigureAwait(false);
}
}
@@ -210,12 +210,12 @@ namespace linker.messenger.tunnel
[MessengerId((ushort)TunnelMessengerIds.RouteLevelForward)]
public async Task RouteLevelForward(IConnection connection)
{
TunnelSetRouteLevelInfo tunnelTransportInfo = serializer.Deserialize<TunnelSetRouteLevelInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(tunnelTransportInfo.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
TunnelSetRouteLevelInfo info = serializer.Deserialize<TunnelSetRouteLevelInfo>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(connection.Id, info.MachineId, out SignCacheInfo from, out SignCacheInfo to))
{
await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = cache.Connection,
Connection = to.Connection,
MessengerId = (ushort)TunnelMessengerIds.RouteLevel,
Payload = connection.ReceiveRequestWrap.Payload
}).ConfigureAwait(false);
@@ -226,12 +226,12 @@ namespace linker.messenger.tunnel
public void NetworkForward(IConnection connection)
{
string machineid = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(machineid, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheTo.GroupId == cacheFrom.GroupId)
if (signCaching.TryGet(connection.Id, machineid, out SignCacheInfo from, out SignCacheInfo to))
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
_ = messengerSender.SendReply(new MessageRequestWrap
{
Connection = cacheTo.Connection,
Connection = to.Connection,
MessengerId = (ushort)TunnelMessengerIds.Network
}).ContinueWith(async (result) =>
{

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker messenger tunnel</PackageReleaseNotes>
<Version>1.8.2</Version>
<AssemblyVersion>1.8.2</AssemblyVersion>
<FileVersion>1.8.2</FileVersion>
<Version>1.8.3</Version>
<AssemblyVersion>1.8.3</AssemblyVersion>
<FileVersion>1.8.3</FileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

Some files were not shown because too many files have changed in this diff Show More