mirror of
https://github.com/snltty/linker.git
synced 2025-09-26 21:15:57 +08:00
172
This commit is contained in:
6
.github/workflows/dotnet.yml
vendored
6
.github/workflows/dotnet.yml
vendored
@@ -22,6 +22,8 @@ jobs:
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
with:
|
||||
msbuild-architecture: x64
|
||||
- name: install dotnet maui
|
||||
run: dotnet workload install maui
|
||||
- name: get current date
|
||||
id: date
|
||||
run: echo "::set-output name=today::$(date +'%Y-%m-%d')"
|
||||
@@ -35,9 +37,9 @@ jobs:
|
||||
release_name: v1.7.2.${{ steps.date.outputs.today }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
body: "1. 内网穿透的计划任务\r\n2. 一些修复和优化"
|
||||
body: "1. 内网穿透的计划任务\r\n2. 一些修复和优化\r\n3. 优化自动分配IP\r\n4. 优化网卡,排除不明数据包\r\n5. 优化管理UI,适配移动端"
|
||||
- name: publish projects
|
||||
run: ./publish.bat
|
||||
run: ./publish.bat "C:\\Android\\android-sdk"
|
||||
- name: upload-win-x86-oss
|
||||
id: upload-win-x86-oss
|
||||
uses: tvrcgo/oss-action@v0.1.1
|
||||
|
29
gen/index.js
29
gen/index.js
@@ -128,6 +128,35 @@ function writeUpload(data, tagName) {
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
data.jobs.build.steps.push({
|
||||
name: `upload-apk-oss`,
|
||||
id: `upload-apk-oss`,
|
||||
uses: 'tvrcgo/oss-action@v0.1.1',
|
||||
with: {
|
||||
'region': 'oss-cn-shenzhen',
|
||||
'key-id': '${{ secrets.ALIYUN_OSS_ID }}',
|
||||
'key-secret': '${{ secrets.ALIYUN_OSS_SECRET }}',
|
||||
'bucket': 'ide-qbcode',
|
||||
'asset-path': `./public/publish-zip/linker.apk`,
|
||||
'target-path': `/downloads/linker/${tagName}/linker.apk`
|
||||
}
|
||||
});
|
||||
data.jobs.build.steps.push({
|
||||
name: `upload-apk`,
|
||||
id: `upload-apk`,
|
||||
uses: 'actions/upload-release-asset@master',
|
||||
env: {
|
||||
'GITHUB_TOKEN': '${{ secrets.ACTIONS_TOKEN }}'
|
||||
},
|
||||
with: {
|
||||
'upload_url': '${{ steps.create_release.outputs.upload_url }}',
|
||||
'asset_path': `./public/publish-zip/linker.apk`,
|
||||
'asset_name': `linker.apk`,
|
||||
'asset_content_type': 'application/apk'
|
||||
}
|
||||
});
|
||||
*/
|
||||
}
|
||||
function writeUploadIpk(data, tagName) {
|
||||
const platforms = ['x64', 'arm', 'arm64'];
|
||||
|
@@ -1,5 +1,8 @@
|
||||
@echo off
|
||||
|
||||
SET sdkpath=%1
|
||||
if "%sdkpath%"=="" (SET sdkpath="D:\\Android\\android-sdk")
|
||||
|
||||
rd /s /q public\\extends
|
||||
rd /s /q public\\publish
|
||||
rd /s /q public\\publish-zip
|
||||
@@ -14,6 +17,10 @@ cd ../../
|
||||
|
||||
echo F|xcopy "version.txt" "public\\version.txt" /f /h /y
|
||||
|
||||
echo F|xcopy "public\\extends\\any\\web\\*" "src\\linker.app\\public\\web\\*" /s /f /h /y
|
||||
dotnet publish ./src/linker.app -c:Release -f:net8.0-android /p:AndroidSigningKeyPass=123321 /p:AndroidSdkDirectory=%sdkpath%
|
||||
echo F|xcopy "src\\linker.app\\bin\\Release\\net8.0-android\\publish\\com.snltty.linker.app-Signed.apk" "public\\publish-zip\\linker.apk" /s /f /h /y
|
||||
|
||||
for %%r in (win-x86,win-x64,win-arm64) do (
|
||||
echo F|xcopy "src\\linker.tray.win\\dist\\*" "public\\extends\\%%r\\linker-%%r\\*" /s /f /h /y
|
||||
echo F|xcopy "src\\linker.route.win\\dist\\*" "public\\extends\\%%r\\linker-%%r\\*" /s /f /h /y
|
||||
|
@@ -1 +1 @@
|
||||
.el-radio-group[data-v-7061404c]{margin-right:.6rem}.wrap[data-v-7061404c]{padding-bottom:1rem}.el-form-item[data-v-2bef0d8e]{margin-bottom:1rem}.el-input-number--small[data-v-2bef0d8e]{width:10rem!important}.el-form-item[data-v-3d96703d]{margin-bottom:1rem}.el-input-number--small[data-v-3d96703d]{width:10rem!important}.head .search>div[data-v-5d11d068]{margin-right:1rem}.page[data-v-5d11d068]{padding:2rem 0;display:inline-block}.el-form-item[data-v-5d11d068]{margin-bottom:1rem}.el-input-number--small[data-v-5d11d068]{width:10rem!important}.head .search>div[data-v-22d5523e]{margin-right:1rem}.page[data-v-22d5523e]{padding:2rem 0;display:inline-block}.el-form-item[data-v-22d5523e]{margin-bottom:1rem}.el-input-number--small[data-v-22d5523e]{width:10rem!important}.el-form-item[data-v-c2557c92]{margin-bottom:1rem}.el-input-number--small[data-v-c2557c92]{width:10rem!important}.blue[data-v-5b81e49d]{color:#409eff}a.a-edit[data-v-5b81e49d]{margin-left:1rem}a.a-edit .el-icon[data-v-5b81e49d]{vertical-align:middle}.servers-wrap[data-v-597f32d0]{padding:1rem;font-size:1.3rem;color:#555}.servers-wrap a[data-v-597f32d0]{color:#333}
|
||||
.el-radio-group[data-v-7061404c]{margin-right:.6rem}.wrap[data-v-7061404c]{padding-bottom:1rem}.el-form-item[data-v-2bef0d8e]{margin-bottom:1rem}.el-input-number--small[data-v-2bef0d8e]{width:10rem!important}.el-form-item[data-v-3d96703d]{margin-bottom:1rem}.el-input-number--small[data-v-3d96703d]{width:10rem!important}.head .search>div[data-v-5d11d068]{margin-right:1rem}.page[data-v-5d11d068]{padding:2rem 0;display:inline-block}.el-form-item[data-v-5d11d068]{margin-bottom:1rem}.el-input-number--small[data-v-5d11d068]{width:10rem!important}.head .search>div[data-v-22d5523e]{margin-right:1rem}.page[data-v-22d5523e]{padding:2rem 0;display:inline-block}.el-form-item[data-v-22d5523e]{margin-bottom:1rem}.el-input-number--small[data-v-22d5523e]{width:10rem!important}.el-form-item[data-v-c2557c92]{margin-bottom:1rem}.el-input-number--small[data-v-c2557c92]{width:10rem!important}.blue[data-v-21fcf68e]{color:#409eff}a.a-edit[data-v-21fcf68e]{margin-left:1rem}a.a-edit .el-icon[data-v-21fcf68e]{vertical-align:middle}.servers-wrap[data-v-597f32d0]{padding:1rem;font-size:1.3rem;color:#555}.servers-wrap a[data-v-597f32d0]{color:#333}
|
@@ -1 +1 @@
|
||||
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>linker.web</title><link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/><script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script><script defer="defer" src="js/chunk-vendors.cfba5739.js"></script><script defer="defer" src="js/app.70d76e49.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.3aab4747.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but linker.web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>linker.web</title><link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/><script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script><script defer="defer" src="js/chunk-vendors.cfba5739.js"></script><script defer="defer" src="js/app.42e28509.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.3aab4747.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but linker.web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -81,6 +81,7 @@ namespace linker.messenger.tuntap.lease
|
||||
|
||||
private void LeaseExpTask()
|
||||
{
|
||||
/*
|
||||
signInClientState.OnSignInSuccess += async (times) =>
|
||||
{
|
||||
try
|
||||
@@ -99,6 +100,7 @@ namespace linker.messenger.tuntap.lease
|
||||
}
|
||||
}
|
||||
};
|
||||
*/
|
||||
TimerHelper.SetIntervalLong(async () =>
|
||||
{
|
||||
await messengerSender.SendReply(new MessageRequestWrap
|
||||
|
@@ -112,7 +112,8 @@ namespace linker.messenger.tuntap.lease
|
||||
if (NetworkHelper.ToValue(info.IP) == self.IP || info.IP.Equals(IPAddress.Any))
|
||||
{
|
||||
self.LastTime = DateTime.Now;
|
||||
info.IP = NetworkHelper.ToIP(self.IP);
|
||||
uint networkValue = NetworkHelper.ToNetworkValue(cache.IP, cache.PrefixValue);
|
||||
info.IP = NetworkHelper.ToIP(self.IP & ~cache.PrefixValue | networkValue);
|
||||
return info;
|
||||
}
|
||||
cache.Users.Remove(self);
|
||||
@@ -124,6 +125,10 @@ namespace linker.messenger.tuntap.lease
|
||||
//分配失败,怎么来的怎么回去
|
||||
if (newIPValue == 0)
|
||||
{
|
||||
//万一网络号已经不一样了,更新一下
|
||||
uint value = NetworkHelper.ToValue(info.IP);
|
||||
uint networkValue = NetworkHelper.ToNetworkValue(cache.IP, cache.PrefixValue);
|
||||
info.IP = NetworkHelper.ToIP(value & ~cache.PrefixValue | networkValue);
|
||||
return info;
|
||||
}
|
||||
|
||||
|
@@ -232,16 +232,7 @@ namespace linker.tun
|
||||
packet.Unpacket(buffer, 0, length);
|
||||
if (packet.DistIPAddress.Length == 0) continue;
|
||||
|
||||
try
|
||||
{
|
||||
await linkerTunDeviceCallback.Callback(packet).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Warning($"tuntap callback Exception {ex}");
|
||||
setupError = ex.Message;
|
||||
}
|
||||
await linkerTunDeviceCallback.Callback(packet).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
@@ -9,12 +9,10 @@
|
||||
<div class="mgr-1">
|
||||
<el-checkbox class="mgr-1" v-model="state.list.SSL" :label="$t('server.relaySSL')" @change="handleSave" />
|
||||
<el-checkbox v-model="state.list.Disabled" :label="$t('server.relayDisable')" @change="handleSave" />
|
||||
|
||||
</div>
|
||||
<a href="javascript:;" @click="state.show=true" class="mgl-1 delay a-line" :class="{red:state.nodes.length==0,green:state.nodes.length>0}">
|
||||
{{$t('server.relayNodes')}} : {{state.nodes.length}}
|
||||
</a>
|
||||
|
||||
<div class="mgl-1" :title="$t('server.relayUseCdkeyTitle')">
|
||||
<el-checkbox v-model="state.list.UseCdkey" :label="$t('server.relayUseCdkey')" @change="handleSave" />
|
||||
</div>
|
||||
@@ -140,7 +138,7 @@ export default {
|
||||
clearTimeout(state.timer);
|
||||
})
|
||||
|
||||
return {state,handleSave,handleEdit}
|
||||
return {globalData,state,handleSave,handleEdit}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
@@ -3,8 +3,9 @@
|
||||
<div class="flex">
|
||||
<el-input class="flex-1" type="password" show-password v-model="state.SForwardSecretKey" maxlength="36" @blur="handleChange" />
|
||||
<Sync class="mgl-1" name="SForwardSecretKey"></Sync>
|
||||
<span class="mgl-1">{{$t('server.sforwardText')}}</span>
|
||||
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.sforwardText')}}</span>
|
||||
</div>
|
||||
|
||||
</el-form-item>
|
||||
</template>
|
||||
<script>
|
||||
@@ -13,10 +14,12 @@ import { ElMessage } from 'element-plus';
|
||||
import {onMounted, reactive } from 'vue'
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import Sync from '../sync/Index.vue'
|
||||
import { injectGlobalData } from '@/provide';
|
||||
export default {
|
||||
components:{Sync},
|
||||
setup(props) {
|
||||
const {t} = useI18n();
|
||||
const globalData = injectGlobalData();
|
||||
const state = reactive({
|
||||
SForwardSecretKey:''
|
||||
});
|
||||
@@ -44,7 +47,7 @@ export default {
|
||||
_getSForwardSecretKey();
|
||||
});
|
||||
|
||||
return {state,handleChange}
|
||||
return {globalData,state,handleChange}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
@@ -3,26 +3,26 @@
|
||||
<el-card shadow="never">
|
||||
<template #header>{{$t('server.messenger')}}</template>
|
||||
<div>
|
||||
<el-form label-width="auto">
|
||||
<el-form label-width="auto" :label-position="state.position">
|
||||
<el-form-item :label="$t('server.messengerAddr')">
|
||||
<div class="flex">
|
||||
<el-input class="flex-1" v-model="state.list.Host" @change="handleSave" />
|
||||
<Sync class="mgl-1" name="SignInServer"></Sync>
|
||||
<span class="mgl-1">{{$t('server.messengerText')}}</span>
|
||||
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.messengerText')}}</span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('server.messengerSecretKey')">
|
||||
<div class="flex">
|
||||
<el-input class="flex-1" type="password" show-password maxlength="36" v-model="state.list.SecretKey" @change="handleSave" />
|
||||
<Sync class="mgl-1" name="SignInSecretKey"></Sync>
|
||||
<span class="mgl-1">{{$t('server.messengerSecretKeyText')}}</span>
|
||||
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.messengerSecretKeyText')}}</span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('server.messengerUserId')">
|
||||
<div class="flex">
|
||||
<el-input class="flex-1" type="password" show-password maxlength="36" v-model="state.list.UserId" @change="handleSave" />
|
||||
<Sync class="mgl-1" name="SignInUserId"></Sync>
|
||||
<span class="mgl-1">{{$t('server.messengerUserIdText')}}</span>
|
||||
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.messengerUserIdText')}}</span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<RelayServers class="mgt-2"></RelayServers>
|
||||
@@ -56,6 +56,7 @@ export default {
|
||||
const state = reactive({
|
||||
list:globalData.value.config.Client.Server,
|
||||
height: computed(()=>globalData.value.height-90),
|
||||
position: computed(()=>globalData.value.isPhone ? 'top':'right'),
|
||||
});
|
||||
|
||||
const handleSave = ()=>{
|
||||
@@ -67,7 +68,7 @@ export default {
|
||||
});
|
||||
}
|
||||
|
||||
return {state,handleSave}
|
||||
return {globalData,state,handleSave}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
@@ -3,7 +3,7 @@
|
||||
<div class="flex">
|
||||
<el-input class="flex-1" type="password" show-password v-model="state.secretKey" maxlength="36" @blur="handleChange"/>
|
||||
<Sync class="mgl-1" name="UpdaterSecretKey"></Sync>
|
||||
<span class="mgl-1">{{$t('server.updaterText')}}</span>
|
||||
<span class="mgl-1" v-if="globalData.isPc">{{$t('server.updaterText')}}</span>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item :label="$t('server.updaterRate')">
|
||||
@@ -96,7 +96,7 @@ export default {
|
||||
state.sec = seconds;
|
||||
});
|
||||
|
||||
return {state,handleChange,handleSecChange}
|
||||
return {globalData,state,handleChange,handleSecChange}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
@@ -21,7 +21,10 @@
|
||||
<Authors>snltty</Authors>
|
||||
<Company>snltty</Company>
|
||||
<Description>1. 内网穿透的计划任务
|
||||
2. 一些修复和优化</Description>
|
||||
2. 一些修复和优化
|
||||
3. 优化自动分配IP
|
||||
4. 优化网卡,排除不明数据包
|
||||
5. 优化管理UI,适配移动端</Description>
|
||||
<Copyright>snltty</Copyright>
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
|
@@ -1,4 +1,7 @@
|
||||
v1.7.2
|
||||
2025-04-11 00:39:51
|
||||
2025-04-11 16:54:42
|
||||
1. 内网穿透的计划任务
|
||||
2. 一些修复和优化
|
||||
2. 一些修复和优化
|
||||
3. 优化自动分配IP
|
||||
4. 优化网卡,排除不明数据包
|
||||
5. 优化管理UI,适配移动端
|
@@ -22,6 +22,9 @@ jobs:
|
||||
uses: microsoft/setup-msbuild@v2
|
||||
with:
|
||||
msbuild-architecture: x64
|
||||
- name: install dotnet maui
|
||||
run: dotnet workload install maui
|
||||
|
||||
- name: get current date
|
||||
id: date
|
||||
run: echo "::set-output name=today::$(date +'%Y-%m-%d')"
|
||||
@@ -37,4 +40,4 @@ jobs:
|
||||
prerelease: false
|
||||
body: ""
|
||||
- name: publish projects
|
||||
run: ./publish.bat
|
||||
run: ./publish.bat "C:\\Android\\android-sdk"
|
Reference in New Issue
Block a user