This commit is contained in:
snltty
2024-12-08 15:03:00 +08:00
parent 436eb5a85e
commit 3548e71560
18 changed files with 88 additions and 18 deletions

View File

@@ -246,7 +246,6 @@ namespace linker.libs
return ip | ~prefixIP;
}
public static IPAddress ToGatewayIP(IPAddress ip, byte prefixLength)
{
uint network = BinaryPrimitives.ReadUInt32BigEndian(NetworkIP2IP(ip, NetworkHelper.PrefixLength2Value(prefixLength)).GetAddressBytes());

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.181" ProductVersion="0.0.0.181" publishDir="/dist/" dstrip="false" local="false" ignored="false">
<project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.183" ProductVersion="0.0.0.183" publishDir="/dist/" dstrip="false" local="false" ignored="false">
<file name="main.aardio" path="main.aardio" comment="main.aardio"/>
<folder name="资源文件" path="res" embed="true" local="false" ignored="false">
<file name="favicon.ico" path="res\favicon.ico" comment="res\favicon.ico"/>

Binary file not shown.

View File

@@ -1 +1 @@
.table-sort th[data-v-4b2df38c]{border-bottom:0}.dropdown[data-v-6638f97d]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-6638f97d]{vertical-align:middle}.dropdown .badge[data-v-6638f97d]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}a[data-v-6653ef00]{color:#666;text-decoration:underline}a.green[data-v-6653ef00]{color:green;font-weight:700}a.download[data-v-6653ef00]{margin-left:.6rem}a.download .el-icon[data-v-6653ef00]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6653ef00]{animation:loading-6653ef00 1s linear infinite}a.download+a.download[data-v-6653ef00]{margin-left:.2rem}@keyframes loading-6653ef00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-ffd0d512]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.self[data-v-ffd0d512]{color:#d400ff}.self .el-icon[data-v-ffd0d512]{vertical-align:text-bottom}.ipaddress span[data-v-5db71b03]{vertical-align:middle}.el-input[data-v-5db71b03]{width:12rem;margin-right:.6rem}.el-col[data-v-5d52ca48]{text-align:left}.el-icon.loading[data-v-7edec26e],a.loading[data-v-7edec26e]{vertical-align:middle;font-weight:700;animation:loading-7edec26e 1s linear infinite}.el-switch.is-disabled[data-v-7edec26e]{opacity:1}.el-input[data-v-7edec26e]{width:8rem}.delay[data-v-7edec26e]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-7edec26e]{font-size:1.5rem}@keyframes loading-7edec26e{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.wrap[data-v-71a71fe4]{padding-right:1rem}.remark[data-v-71a71fe4]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wrap[data-v-4abaaeaf]{padding-right:1rem}.el-switch.is-disabled[data-v-34275839]{opacity:1}.upgrade-wrap[data-v-34275839]{border:1px solid #ddd;margin-bottom:2rem;padding:0 0 1rem 0}.el-switch.is-disabled[data-v-6ee2406c]{opacity:1}.el-icon.loading[data-v-c1ea089c],a.loading[data-v-c1ea089c]{vertical-align:middle;font-weight:700;animation:loading-c1ea089c 1s linear infinite}.el-switch.is-disabled[data-v-c1ea089c]{opacity:1}.el-input[data-v-c1ea089c]{width:8rem}.switch-btn[data-v-c1ea089c]{font-size:1.5rem}@keyframes loading-c1ea089c{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-switch.is-disabled[data-v-022e3781]{opacity:1}.upgrade-wrap[data-v-022e3781]{border:1px solid #ddd;margin-bottom:2rem;padding:1rem 0 1rem 0}.lan-item[data-v-022e3781]{margin-bottom:0}.el-switch.is-disabled[data-v-49e16cac]{opacity:1}.green[data-v-49e16cac]{font-weight:700}.el-switch.is-disabled[data-v-6ea047f9]{opacity:1}a[data-v-26b3f87e]{text-decoration:underline}a+a[data-v-26b3f87e]{margin-left:1rem}a.green[data-v-26b3f87e]{font-weight:700}.head[data-v-15b05a01]{padding-bottom:1rem}.green[data-v-15b05a01]{color:green;font-weight:700}.error[data-v-15b05a01]{font-weight:700}.error .el-icon[data-v-15b05a01]{vertical-align:text-bottom}.head[data-v-219c690c]{padding-bottom:1rem}.error[data-v-219c690c]{font-weight:700}.error .el-icon[data-v-219c690c]{vertical-align:text-bottom}.head[data-v-7891b902]{padding-bottom:1rem}.table-sort.el-table th.el-table__cell.is-leaf{border-bottom:0}.table-sort.el-table .el-table__inner-wrapper:before{height:0}.home-list-wrap[data-v-3d1c480c]{padding:1rem}.home-list-wrap .page[data-v-3d1c480c]{padding-top:1rem}.home-list-wrap .page-wrap[data-v-3d1c480c]{display:inline-block}
.table-sort th[data-v-4b2df38c]{border-bottom:0}.dropdown[data-v-6638f97d]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-6638f97d]{vertical-align:middle}.dropdown .badge[data-v-6638f97d]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}a[data-v-6653ef00]{color:#666;text-decoration:underline}a.green[data-v-6653ef00]{color:green;font-weight:700}a.download[data-v-6653ef00]{margin-left:.6rem}a.download .el-icon[data-v-6653ef00]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6653ef00]{animation:loading-6653ef00 1s linear infinite}a.download+a.download[data-v-6653ef00]{margin-left:.2rem}@keyframes loading-6653ef00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-ffd0d512]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.self[data-v-ffd0d512]{color:#d400ff}.self .el-icon[data-v-ffd0d512]{vertical-align:text-bottom}.ipaddress span[data-v-5db71b03]{vertical-align:middle}.el-input[data-v-5db71b03]{width:12rem;margin-right:.6rem}.el-col[data-v-5d52ca48]{text-align:left}.el-icon.loading[data-v-7edec26e],a.loading[data-v-7edec26e]{vertical-align:middle;font-weight:700;animation:loading-7edec26e 1s linear infinite}.el-switch.is-disabled[data-v-7edec26e]{opacity:1}.el-input[data-v-7edec26e]{width:8rem}.delay[data-v-7edec26e]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-7edec26e]{font-size:1.5rem}@keyframes loading-7edec26e{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.wrap[data-v-71a71fe4]{padding-right:1rem}.remark[data-v-71a71fe4]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wrap[data-v-4abaaeaf]{padding-right:1rem}.el-switch.is-disabled[data-v-34275839]{opacity:1}.upgrade-wrap[data-v-34275839]{border:1px solid #ddd;margin-bottom:2rem;padding:0 0 1rem 0}.el-switch.is-disabled[data-v-4a28804a]{opacity:1}.calc span[data-v-4a28804a]{display:inline-block}.calc span.label[data-v-4a28804a]{width:6rem}.el-icon.loading[data-v-c1ea089c],a.loading[data-v-c1ea089c]{vertical-align:middle;font-weight:700;animation:loading-c1ea089c 1s linear infinite}.el-switch.is-disabled[data-v-c1ea089c]{opacity:1}.el-input[data-v-c1ea089c]{width:8rem}.switch-btn[data-v-c1ea089c]{font-size:1.5rem}@keyframes loading-c1ea089c{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-switch.is-disabled[data-v-022e3781]{opacity:1}.upgrade-wrap[data-v-022e3781]{border:1px solid #ddd;margin-bottom:2rem;padding:1rem 0 1rem 0}.lan-item[data-v-022e3781]{margin-bottom:0}.el-switch.is-disabled[data-v-49e16cac]{opacity:1}.green[data-v-49e16cac]{font-weight:700}.el-switch.is-disabled[data-v-6ea047f9]{opacity:1}a[data-v-26b3f87e]{text-decoration:underline}a+a[data-v-26b3f87e]{margin-left:1rem}a.green[data-v-26b3f87e]{font-weight:700}.head[data-v-15b05a01]{padding-bottom:1rem}.green[data-v-15b05a01]{color:green;font-weight:700}.error[data-v-15b05a01]{font-weight:700}.error .el-icon[data-v-15b05a01]{vertical-align:text-bottom}.head[data-v-7eb8e7cc]{padding-bottom:1rem}.error[data-v-7eb8e7cc]{font-weight:700}.error .el-icon[data-v-7eb8e7cc]{vertical-align:text-bottom}.head[data-v-7891b902]{padding-bottom:1rem}.table-sort.el-table th.el-table__cell.is-leaf{border-bottom:0}.table-sort.el-table .el-table__inner-wrapper:before{height:0}.home-list-wrap[data-v-3d1c480c]{padding:1rem}.home-list-wrap .page[data-v-3d1c480c]{padding-top:1rem}.home-list-wrap .page-wrap[data-v-3d1c480c]{display:inline-block}

View File

@@ -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><script defer="defer" src="js/chunk-vendors.7b81ea90.js"></script><script defer="defer" src="js/app.1eab79d1.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.e2cbd3ed.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><script defer="defer" src="js/chunk-vendors.7b81ea90.js"></script><script defer="defer" src="js/app.8e82ca5d.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.e2cbd3ed.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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -30,6 +30,10 @@ export const subscribeForwardTest = (machineid) => {
return sendWebsocketMsg('tuntapclient/SubscribeForwardTest', machineid);
}
export const calcNetwork = (data) => {
return sendWebsocketMsg('tuntapclient/CalcNetwork', data);
}
export const getNetwork = () => {
return sendWebsocketMsg('tuntapclient/GetNetwork');
}

View File

@@ -185,7 +185,10 @@ export default {
row.Domain = row.Temp;
}
addSForwardInfo({machineid:sforward.value.machineid,data:row}).then(() => {
addSForwardInfo({machineid:sforward.value.machineid,data:row}).then((res) => {
if(res == false){
ElMessage.error('操作失败,可能存在相同值');
}
setTimeout(()=>{
_getSForwardInfo();
},100)

View File

@@ -6,12 +6,22 @@
<p>网络租期30天IP租期7天</p>
</el-form-item>
<el-form-item label="网络和掩码" prop="IP">
<el-input v-model="state.ruleForm.IP" style="width:14rem" />
<el-input v-model="state.ruleForm.IP" style="width:14rem" @change="handlePrefixLengthChange" />
<span>/</span>
<el-input @change="handlePrefixLengthChange" v-model="state.ruleForm.PrefixLength" style="width:4rem" />
<span style="width: 1rem;"></span>
<el-button @click="handleClear">清除</el-button>
</el-form-item>
<el-form-item label="" prop="IP1">
<div class="calc">
<p><span class="label">网络号</span><span class="value">{{ state.values.Network }}</span></p>
<p><span class="label">网关</span><span class="value">{{ state.values.Gateway }}</span></p>
<p><span class="label">开始IP</span><span class="value">{{ state.values.Start }}</span></p>
<p><span class="label">结束IP</span><span class="value">{{ state.values.End }}</span></p>
<p><span class="label">广播号</span><span class="value">{{ state.values.Broadcast }}</span></p>
<p><span class="label">IP数量</span><span class="value">{{ state.values.Count }}</span></p>
</div>
</el-form-item>
<el-form-item label="" prop="Btns" v-if="hasLease">
<div>
<el-button @click="state.show = false">取消</el-button>
@@ -23,7 +33,7 @@
</el-dialog>
</template>
<script>
import {getNetwork,addNetwork } from '@/apis/tuntap';
import {getNetwork,addNetwork,calcNetwork } from '@/apis/tuntap';
import { injectGlobalData } from '@/provide';
import { ElMessage } from 'element-plus';
import { computed, onMounted, reactive, ref, watch } from 'vue';
@@ -44,7 +54,8 @@ export default {
IP:'0.0.0.0',
PrefixLength:24
},
rules: {}
rules: {},
values:{}
});
watch(() => state.show, (val) => {
if (!val) {
@@ -54,10 +65,16 @@ export default {
}
});
const _calcNetwork = ()=>{
calcNetwork(state.ruleForm).then((res)=>{
state.values = res;
});
}
const _getNetwork = ()=>{
getNetwork().then((res)=>{
state.ruleForm.IP = res.IP;
state.ruleForm.PrefixLength = res.PrefixLength;
_calcNetwork();
});
}
const handlePrefixLengthChange = ()=>{
@@ -66,6 +83,7 @@ export default {
value = 24;
}
state.ruleForm.PrefixLength = value;
_calcNetwork();
}
const handleSave = () => {
addNetwork(state.ruleForm).then(()=>{
@@ -98,4 +116,11 @@ export default {
</script>
<style lang="stylus" scoped>
.el-switch.is-disabled{opacity :1;}
.calc{
span{
display: inline-block;
&.label{width:6rem;}
}
}
</style>

View File

@@ -68,7 +68,7 @@ namespace linker.plugins.relay.client
await TaskRelay();
}
return true;
}, () => lastTicksManager.DiffLessEqual(3000) ? 3000 : 30000);
}, () => 3000);
}
}

View File

@@ -70,7 +70,6 @@ namespace linker.plugins.sforward
return countDic;
}
public string GetSecretKey()
{
return fileConfig.Data.Client.SForward.SecretKey;
@@ -256,14 +255,13 @@ namespace linker.plugins.sforward
}
bool testing = false;
private readonly OperatingManager operatingManager = new OperatingManager();
/// <summary>
/// 测试本机服务
/// </summary>
public void TestLocal()
{
if (testing) return;
testing = true;
if (operatingManager.StartOperation() == false) return;
TimerHelper.Async(async () =>
{
@@ -285,7 +283,7 @@ namespace linker.plugins.sforward
catch (Exception)
{
}
testing = false;
operatingManager.StopOperation();
});
async Task<(IPEndPoint, string)> ConnectAsync(IPEndPoint ep)

View File

@@ -11,6 +11,8 @@ using linker.plugins.messenger;
using linker.plugins.tuntap.config;
using linker.client.config;
using linker.plugins.tuntap.lease;
using System.Net;
using linker.libs;
namespace linker.plugins.tuntap
{
@@ -170,6 +172,30 @@ namespace linker.plugins.tuntap
return true;
}
/// <summary>
/// 计算网络
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public NetworkInfo CalcNetwork(ApiControllerParamsInfo param)
{
NetworkParamInfo info = param.Content.DeJson<NetworkParamInfo>();
uint ip = NetworkHelper.IP2Value(info.IP);
uint prefixValue = NetworkHelper.PrefixLength2Value(info.PrefixLength);
uint network = NetworkHelper.NetworkValue2Value(ip, prefixValue);
uint broadcast = NetworkHelper.BroadcastValue2Value(ip, prefixValue);
return new NetworkInfo
{
Network = NetworkHelper.Value2IP(network),
Broadcast = NetworkHelper.Value2IP(broadcast),
Gateway = NetworkHelper.ToGatewayIP(ip, prefixValue),
Start = NetworkHelper.Value2IP(network + 2),
End = NetworkHelper.Value2IP(broadcast - 1),
Count = (int)(broadcast - network - 2),
};
}
/// <summary>
/// 添加网络
/// </summary>
@@ -240,4 +266,19 @@ namespace linker.plugins.tuntap
public ConcurrentDictionary<string, ITunnelConnection> List { get; set; }
public ulong HashCode { get; set; }
}
public sealed class NetworkParamInfo
{
public IPAddress IP { get; set; }
public byte PrefixLength { get; set; }
}
public sealed class NetworkInfo
{
public IPAddress Network { get; set; }
public IPAddress Gateway { get; set; }
public IPAddress Start { get; set; }
public IPAddress End { get; set; }
public IPAddress Broadcast { get; set; }
public int Count { get; set; }
}
}

View File

@@ -1,5 +1,5 @@
v1.6.2
2024-12-08 13:05:55
2024-12-08 15:03:00
1. 修复UI
2. 修复服务端重启无法关闭内网穿透的问题
3. 修复网络掩码计算错误