MelonVPN base commit
This commit is contained in:
commit
e572273de9
373
.gitignore
vendored
Normal file
373
.gitignore
vendored
Normal file
@ -0,0 +1,373 @@
|
|||||||
|
# Just throw the Visual Studio and Mono Develop gitignores in the same file and hope for the best
|
||||||
|
|
||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
##
|
||||||
|
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.rsuser
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
# Mono auto generated files
|
||||||
|
mono_crash.*
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
[Ll]og/
|
||||||
|
[Ll]ogs/
|
||||||
|
|
||||||
|
# Visual Studio 2015/2017 cache/options directory
|
||||||
|
.vs/
|
||||||
|
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||||
|
#wwwroot/
|
||||||
|
|
||||||
|
# Visual Studio 2017 auto generated files
|
||||||
|
Generated\ Files/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
# Benchmark Results
|
||||||
|
BenchmarkDotNet.Artifacts/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# StyleCop
|
||||||
|
StyleCopReport.xml
|
||||||
|
|
||||||
|
# Files built by Visual Studio
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_h.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Chutzpah Test files
|
||||||
|
_Chutzpah*
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
*.sap
|
||||||
|
|
||||||
|
# Visual Studio Trace Files
|
||||||
|
*.e2e
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# AxoCover is a Code Coverage Tool
|
||||||
|
.axoCover/*
|
||||||
|
!.axoCover/settings.json
|
||||||
|
|
||||||
|
# Coverlet is a free, cross platform Code Coverage Tool
|
||||||
|
coverage*.json
|
||||||
|
coverage*.xml
|
||||||
|
coverage*.info
|
||||||
|
|
||||||
|
# Visual Studio code coverage results
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
nCrunchTemp_*
|
||||||
|
|
||||||
|
# MightyMoose
|
||||||
|
*.mm.*
|
||||||
|
AutoTest.Net/
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||||
|
# but database connection strings (with potential passwords) will be unencrypted
|
||||||
|
*.pubxml
|
||||||
|
*.publishproj
|
||||||
|
|
||||||
|
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||||
|
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||||
|
# in these scripts will be unencrypted
|
||||||
|
PublishScripts/
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
# The packages folder can be ignored because of Package Restore
|
||||||
|
**/[Pp]ackages/*
|
||||||
|
# except build/, which is used as an MSBuild target.
|
||||||
|
!**/[Pp]ackages/build/
|
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed
|
||||||
|
#!**/[Pp]ackages/repositories.config
|
||||||
|
# NuGet v3's project.json files produces more ignorable files
|
||||||
|
*.nuget.props
|
||||||
|
*.nuget.targets
|
||||||
|
|
||||||
|
# Microsoft Azure Build Output
|
||||||
|
csx/
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Microsoft Azure Emulator
|
||||||
|
ecf/
|
||||||
|
rcf/
|
||||||
|
|
||||||
|
# Windows Store app package directories and files
|
||||||
|
AppPackages/
|
||||||
|
BundleArtifacts/
|
||||||
|
Package.StoreAssociation.xml
|
||||||
|
_pkginfo.txt
|
||||||
|
*.appx
|
||||||
|
*.appxbundle
|
||||||
|
*.appxupload
|
||||||
|
|
||||||
|
# Visual Studio cache files
|
||||||
|
# files ending in .cache can be ignored
|
||||||
|
*.[Cc]ache
|
||||||
|
# but keep track of directories ending in .cache
|
||||||
|
!?*.[Cc]ache/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
ClientBin/
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.dbproj.schemaview
|
||||||
|
*.jfm
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
orleans.codegen.cs
|
||||||
|
|
||||||
|
# Including strong name files can present a security risk
|
||||||
|
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||||
|
#*.snk
|
||||||
|
|
||||||
|
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||||
|
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||||
|
#bower_components/
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file
|
||||||
|
# to a newer Visual Studio version. Backup files are not needed,
|
||||||
|
# because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
ServiceFabricBackup/
|
||||||
|
*.rptproj.bak
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
*.mdf
|
||||||
|
*.ldf
|
||||||
|
*.ndf
|
||||||
|
|
||||||
|
# Business Intelligence projects
|
||||||
|
*.rdl.data
|
||||||
|
*.bim.layout
|
||||||
|
*.bim_*.settings
|
||||||
|
*.rptproj.rsuser
|
||||||
|
*- [Bb]ackup.rdl
|
||||||
|
*- [Bb]ackup ([0-9]).rdl
|
||||||
|
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||||
|
|
||||||
|
# Microsoft Fakes
|
||||||
|
FakesAssemblies/
|
||||||
|
|
||||||
|
# GhostDoc plugin setting file
|
||||||
|
*.GhostDoc.xml
|
||||||
|
|
||||||
|
# Node.js Tools for Visual Studio
|
||||||
|
.ntvs_analysis.dat
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Visual Studio 6 build log
|
||||||
|
*.plg
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace options file
|
||||||
|
*.opt
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||||
|
*.vbw
|
||||||
|
|
||||||
|
# Visual Studio LightSwitch build output
|
||||||
|
**/*.HTMLClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/ModelManifest.xml
|
||||||
|
**/*.Server/GeneratedArtifacts
|
||||||
|
**/*.Server/ModelManifest.xml
|
||||||
|
_Pvt_Extensions
|
||||||
|
|
||||||
|
# Paket dependency manager
|
||||||
|
.paket/paket.exe
|
||||||
|
paket-files/
|
||||||
|
|
||||||
|
# FAKE - F# Make
|
||||||
|
.fake/
|
||||||
|
|
||||||
|
# CodeRush personal settings
|
||||||
|
.cr/personal
|
||||||
|
|
||||||
|
# Python Tools for Visual Studio (PTVS)
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Cake - Uncomment if you are using it
|
||||||
|
# tools/**
|
||||||
|
# !tools/packages.config
|
||||||
|
|
||||||
|
# Tabs Studio
|
||||||
|
*.tss
|
||||||
|
|
||||||
|
# Telerik's JustMock configuration file
|
||||||
|
*.jmconfig
|
||||||
|
|
||||||
|
# BizTalk build output
|
||||||
|
*.btp.cs
|
||||||
|
*.btm.cs
|
||||||
|
*.odx.cs
|
||||||
|
*.xsd.cs
|
||||||
|
|
||||||
|
# OpenCover UI analysis results
|
||||||
|
OpenCover/
|
||||||
|
|
||||||
|
# Azure Stream Analytics local run output
|
||||||
|
ASALocalRun/
|
||||||
|
|
||||||
|
# MSBuild Binary and Structured Log
|
||||||
|
*.binlog
|
||||||
|
|
||||||
|
# NVidia Nsight GPU debugger configuration file
|
||||||
|
*.nvuser
|
||||||
|
|
||||||
|
# MFractors (Xamarin productivity tool) working folder
|
||||||
|
.mfractor/
|
||||||
|
|
||||||
|
# Local History for Visual Studio
|
||||||
|
.localhistory/
|
||||||
|
|
||||||
|
# BeatPulse healthcheck temp database
|
||||||
|
healthchecksdb
|
||||||
|
|
||||||
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
|
MigrationBackup/
|
||||||
|
|
||||||
|
# Ionide (cross platform F# VS Code tools) working folder
|
||||||
|
.ionide/
|
||||||
|
|
||||||
|
# Fody - auto-generated XML schema
|
||||||
|
FodyWeavers.xsd
|
||||||
|
|
||||||
|
#User Specific
|
||||||
|
*.userprefs
|
||||||
|
*.usertasks
|
||||||
|
|
||||||
|
#Mono Project Files
|
||||||
|
*.pidb
|
||||||
|
*.resources
|
||||||
|
test-results/
|
42
MelonVPN.sln
Normal file
42
MelonVPN.sln
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 15
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MelonVPNClient", "MelonVPNClient\MelonVPNClient.csproj", "{071B91A9-6C1D-4A80-98EA-5077E4F66468}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MelonVPNDaemon", "MelonVPNDaemon\MelonVPNDaemon.csproj", "{AFF161B8-AF8E-4A16-9AA4-B692EB0D838E}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MelonVPNCore", "MelonVPNCore\MelonVPNCore.csproj", "{B2F2F96C-3E5D-4176-9D66-479F357BC078}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MelonVPNConnectedClientUpdate", "MelonVPNConnectedClientUpdate\MelonVPNConnectedClientUpdate.csproj", "{B318A58E-028B-43A2-A753-2D7FBCA4EE40}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{071B91A9-6C1D-4A80-98EA-5077E4F66468}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{071B91A9-6C1D-4A80-98EA-5077E4F66468}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{071B91A9-6C1D-4A80-98EA-5077E4F66468}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{071B91A9-6C1D-4A80-98EA-5077E4F66468}.Release|x86.Build.0 = Release|x86
|
||||||
|
{AFF161B8-AF8E-4A16-9AA4-B692EB0D838E}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{AFF161B8-AF8E-4A16-9AA4-B692EB0D838E}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{AFF161B8-AF8E-4A16-9AA4-B692EB0D838E}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{AFF161B8-AF8E-4A16-9AA4-B692EB0D838E}.Release|x86.Build.0 = Release|x86
|
||||||
|
{B2F2F96C-3E5D-4176-9D66-479F357BC078}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{B2F2F96C-3E5D-4176-9D66-479F357BC078}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{B2F2F96C-3E5D-4176-9D66-479F357BC078}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{B2F2F96C-3E5D-4176-9D66-479F357BC078}.Release|x86.Build.0 = Release|x86
|
||||||
|
{B318A58E-028B-43A2-A753-2D7FBCA4EE40}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{B318A58E-028B-43A2-A753-2D7FBCA4EE40}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{B318A58E-028B-43A2-A753-2D7FBCA4EE40}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{B318A58E-028B-43A2-A753-2D7FBCA4EE40}.Release|x86.Build.0 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(MonoDevelopProperties) = preSolution
|
||||||
|
Policies = $0
|
||||||
|
$0.DotNetNamingPolicy = $1
|
||||||
|
$1.DirectoryNamespaceAssociation = PrefixedHierarchical
|
||||||
|
$0.StandardHeader = $2
|
||||||
|
version = 1.0
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
230
MelonVPNClient/MainWindow.cs
Normal file
230
MelonVPNClient/MainWindow.cs
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
using System;
|
||||||
|
using System.Net.NetworkInformation;
|
||||||
|
using System.Threading;
|
||||||
|
using Gtk;
|
||||||
|
using MelonVPNCore;
|
||||||
|
|
||||||
|
public partial class MainWindow : Window
|
||||||
|
{
|
||||||
|
private Label statusLabel;
|
||||||
|
private Button startBtn;
|
||||||
|
private Button stopBtn;
|
||||||
|
private Button refreshBtn;
|
||||||
|
private Button viewClientsBtn;
|
||||||
|
private Thread startupCheckThread;
|
||||||
|
private ThreadWrapper wrapper;
|
||||||
|
|
||||||
|
public MainWindow() : base(WindowType.Toplevel)
|
||||||
|
{
|
||||||
|
Build();
|
||||||
|
|
||||||
|
Title = "Melon VPN";
|
||||||
|
SetSizeRequest(300, 300);
|
||||||
|
SetDefaultSize(300, 300);
|
||||||
|
SetPosition(WindowPosition.Center);
|
||||||
|
|
||||||
|
Resizable = false;
|
||||||
|
TypeHint = Gdk.WindowTypeHint.Normal;
|
||||||
|
Present();
|
||||||
|
|
||||||
|
statusLabel = new Label
|
||||||
|
{
|
||||||
|
Visible = true,
|
||||||
|
Text = "Loading..."
|
||||||
|
};
|
||||||
|
fixed1.Put(statusLabel, 10, 10);
|
||||||
|
|
||||||
|
startBtn = new Button
|
||||||
|
{
|
||||||
|
Visible = true,
|
||||||
|
Label = "Start"
|
||||||
|
};
|
||||||
|
startBtn.SetSizeRequest(80, 30);
|
||||||
|
startBtn.Clicked += OnStartClicked;
|
||||||
|
fixed1.Put(startBtn, 10, 40);
|
||||||
|
|
||||||
|
stopBtn = new Button
|
||||||
|
{
|
||||||
|
Visible = true,
|
||||||
|
Label = "Stop"
|
||||||
|
};
|
||||||
|
stopBtn.SetSizeRequest(80, 30);
|
||||||
|
stopBtn.Clicked += OnStopClicked;
|
||||||
|
fixed1.Put(stopBtn, 100, 40);
|
||||||
|
|
||||||
|
refreshBtn = new Button
|
||||||
|
{
|
||||||
|
Visible = true,
|
||||||
|
Label = "Refresh"
|
||||||
|
};
|
||||||
|
refreshBtn.SetSizeRequest(80, 30);
|
||||||
|
refreshBtn.Clicked += OnRefreshClicked;
|
||||||
|
fixed1.Put(refreshBtn, 190, 40);
|
||||||
|
|
||||||
|
viewClientsBtn = new Button
|
||||||
|
{
|
||||||
|
Visible = true,
|
||||||
|
Label = "View Clients"
|
||||||
|
};
|
||||||
|
viewClientsBtn.SetSizeRequest(100, 30);
|
||||||
|
viewClientsBtn.Clicked += OnViewClientsClicked;
|
||||||
|
fixed1.Put(viewClientsBtn, 10, 80);
|
||||||
|
|
||||||
|
GUISocketServer.Receive += delegate (object sender, ClientResponseState s)
|
||||||
|
{
|
||||||
|
Console.WriteLine(s);
|
||||||
|
Application.Invoke(delegate
|
||||||
|
{
|
||||||
|
UpdateStatus(s);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
GUISocketServer.ClientListUpdate += delegate (object sender, ConnectedClient[] clients)
|
||||||
|
{
|
||||||
|
Console.WriteLine(clients.Length);
|
||||||
|
foreach (ConnectedClient c in clients)
|
||||||
|
{
|
||||||
|
Console.WriteLine(c.name + "--" + c.ip);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
wrapper = new ThreadWrapper(GUISocketServer.StartServer);
|
||||||
|
|
||||||
|
startupCheckThread = new Thread(StartupCheckMethod)
|
||||||
|
{
|
||||||
|
IsBackground = true
|
||||||
|
};
|
||||||
|
startupCheckThread.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetVpnInternalIp()
|
||||||
|
{
|
||||||
|
if (NetworkInterface.GetIsNetworkAvailable())
|
||||||
|
{
|
||||||
|
foreach (NetworkInterface f in NetworkInterface.GetAllNetworkInterfaces())
|
||||||
|
{
|
||||||
|
IPInterfaceProperties p = f.GetIPProperties();
|
||||||
|
IPAddressInformationCollection addressesColl = p.AnycastAddresses;
|
||||||
|
foreach (IPAddressInformation ip in addressesColl)
|
||||||
|
{
|
||||||
|
if (ip.Address.ToString().StartsWith("10.137.248.", StringComparison.CurrentCulture))
|
||||||
|
{
|
||||||
|
return ip.Address.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartupCheckMethod()
|
||||||
|
{
|
||||||
|
ClientResponseState s = Client.SendDataMessage(DataMessage.Status);
|
||||||
|
Console.WriteLine(s);
|
||||||
|
Application.Invoke(delegate
|
||||||
|
{
|
||||||
|
UpdateStatus(s);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Refresh()
|
||||||
|
{
|
||||||
|
ClientResponseState s = Client.SendDataMessage(DataMessage.Status);
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case ClientResponseState.Error:
|
||||||
|
case ClientResponseState.ServerError:
|
||||||
|
UpdateStatus(s);
|
||||||
|
MessageDialog md = new MessageDialog(this,
|
||||||
|
DialogFlags.DestroyWithParent, MessageType.Error,
|
||||||
|
ButtonsType.Ok, "Error stopping VPN. Is the daemon running?");
|
||||||
|
md.Run();
|
||||||
|
md.Destroy();
|
||||||
|
break;
|
||||||
|
case ClientResponseState.Online:
|
||||||
|
case ClientResponseState.Offline:
|
||||||
|
UpdateStatus(s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateStatus(ClientResponseState s)
|
||||||
|
{
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case ClientResponseState.Error:
|
||||||
|
statusLabel.Text = "Client Error";
|
||||||
|
break;
|
||||||
|
case ClientResponseState.ServerError:
|
||||||
|
statusLabel.Text = "Server Error";
|
||||||
|
break;
|
||||||
|
case ClientResponseState.Blank:
|
||||||
|
statusLabel.Text = "No reply";
|
||||||
|
break;
|
||||||
|
case ClientResponseState.Online:
|
||||||
|
statusLabel.Text = "Online - " + GetVpnInternalIp();
|
||||||
|
break;
|
||||||
|
case ClientResponseState.Offline:
|
||||||
|
statusLabel.Text = "Offline";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
statusLabel.Text = "Unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void OnDeleteEvent(object sender, DeleteEventArgs a)
|
||||||
|
{
|
||||||
|
if (wrapper != null)
|
||||||
|
{
|
||||||
|
wrapper.Kill();
|
||||||
|
wrapper.Join();
|
||||||
|
}
|
||||||
|
Application.Quit();
|
||||||
|
a.RetVal = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnStartClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ClientResponseState s = Client.SendDataMessage(DataMessage.Start);
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case ClientResponseState.Error:
|
||||||
|
case ClientResponseState.ServerError:
|
||||||
|
case ClientResponseState.Offline:
|
||||||
|
UpdateStatus(s);
|
||||||
|
MessageDialog md = new MessageDialog(this,
|
||||||
|
DialogFlags.DestroyWithParent, MessageType.Error,
|
||||||
|
ButtonsType.Ok, "Error starting VPN. Is the daemon running?");
|
||||||
|
md.Run();
|
||||||
|
md.Destroy();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnStopClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ClientResponseState s = Client.SendDataMessage(DataMessage.Stop);
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case ClientResponseState.Error:
|
||||||
|
case ClientResponseState.ServerError:
|
||||||
|
case ClientResponseState.Online:
|
||||||
|
UpdateStatus(s);
|
||||||
|
MessageDialog md = new MessageDialog(this,
|
||||||
|
DialogFlags.DestroyWithParent, MessageType.Error,
|
||||||
|
ButtonsType.Ok, "Error stopping VPN. Is the daemon running?");
|
||||||
|
md.Run();
|
||||||
|
md.Destroy();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnRefreshClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnViewClientsClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
}
|
90
MelonVPNClient/MelonVPNClient.csproj
Normal file
90
MelonVPNClient/MelonVPNClient.csproj
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||||
|
<ProjectGuid>{071B91A9-6C1D-4A80-98EA-5077E4F66468}</ProjectGuid>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<RootNamespace>MelonVPNClient</RootNamespace>
|
||||||
|
<AssemblyName>MelonVPNClient</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||||
|
<ReleaseVersion>1.0</ReleaseVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release</OutputPath>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="gtk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<Package>gtk-sharp-2.0</Package>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="gdk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<Package>gtk-sharp-2.0</Package>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="glib-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<Package>glib-sharp-3.0</Package>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="glade-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<Package>glade-sharp-2.0</Package>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="pango-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<Package>gtk-sharp-3.0</Package>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="atk-sharp, Version=2.4.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<Package>gtk-sharp-2.0</Package>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Mono.Posix" />
|
||||||
|
<Reference Include="gio-sharp, Version=3.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
|
||||||
|
<Package>gio-sharp-3.0</Package>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="gtk-gui\gui.stetic">
|
||||||
|
<LogicalName>gui.stetic</LogicalName>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="gtk-gui\generated.cs" />
|
||||||
|
<Compile Include="MainWindow.cs" />
|
||||||
|
<Compile Include="gtk-gui\MainWindow.cs" />
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\MelonVPNCore\MelonVPNCore.csproj">
|
||||||
|
<Project>{B2F2F96C-3E5D-4176-9D66-479F357BC078}</Project>
|
||||||
|
<Name>MelonVPNCore</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="melonvpnclient">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="melonvpn.desktop">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
15
MelonVPNClient/Program.cs
Normal file
15
MelonVPNClient/Program.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using Gtk;
|
||||||
|
|
||||||
|
namespace MelonVPNClient
|
||||||
|
{
|
||||||
|
class MainClass
|
||||||
|
{
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Application.Init();
|
||||||
|
MainWindow win = new MainWindow();
|
||||||
|
win.Show();
|
||||||
|
Application.Run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
MelonVPNClient/Properties/AssemblyInfo.cs
Normal file
26
MelonVPNClient/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following attributes.
|
||||||
|
// Change them to the values specific to your project.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("MelonVPNClient")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("")]
|
||||||
|
[assembly: AssemblyCopyright("${AuthorCopyright}")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
||||||
|
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
||||||
|
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
||||||
|
|
||||||
|
// The following attributes are used to specify the signing key for the assembly,
|
||||||
|
// if desired. See the Mono documentation for more information about signing.
|
||||||
|
|
||||||
|
//[assembly: AssemblyDelaySign(false)]
|
||||||
|
//[assembly: AssemblyKeyFile("")]
|
29
MelonVPNClient/gtk-gui/MainWindow.cs
Normal file
29
MelonVPNClient/gtk-gui/MainWindow.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
// This file has been generated by the GUI designer. Do not modify.
|
||||||
|
|
||||||
|
public partial class MainWindow
|
||||||
|
{
|
||||||
|
private global::Gtk.Fixed fixed1;
|
||||||
|
|
||||||
|
protected virtual void Build()
|
||||||
|
{
|
||||||
|
global::Stetic.Gui.Initialize(this);
|
||||||
|
// Widget MainWindow
|
||||||
|
this.Name = "MainWindow";
|
||||||
|
this.Title = global::Mono.Unix.Catalog.GetString("MainWindow");
|
||||||
|
this.WindowPosition = ((global::Gtk.WindowPosition)(4));
|
||||||
|
// Container child MainWindow.Gtk.Container+ContainerChild
|
||||||
|
this.fixed1 = new global::Gtk.Fixed();
|
||||||
|
this.fixed1.Name = "fixed1";
|
||||||
|
this.fixed1.HasWindow = false;
|
||||||
|
this.Add(this.fixed1);
|
||||||
|
if ((this.Child != null))
|
||||||
|
{
|
||||||
|
this.Child.ShowAll();
|
||||||
|
}
|
||||||
|
this.DefaultWidth = 204;
|
||||||
|
this.DefaultHeight = 86;
|
||||||
|
this.Show();
|
||||||
|
this.DeleteEvent += new global::Gtk.DeleteEventHandler(this.OnDeleteEvent);
|
||||||
|
}
|
||||||
|
}
|
30
MelonVPNClient/gtk-gui/generated.cs
Normal file
30
MelonVPNClient/gtk-gui/generated.cs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
// This file has been generated by the GUI designer. Do not modify.
|
||||||
|
namespace Stetic
|
||||||
|
{
|
||||||
|
internal class Gui
|
||||||
|
{
|
||||||
|
private static bool initialized;
|
||||||
|
|
||||||
|
internal static void Initialize(Gtk.Widget iconRenderer)
|
||||||
|
{
|
||||||
|
if ((Stetic.Gui.initialized == false))
|
||||||
|
{
|
||||||
|
Stetic.Gui.initialized = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class ActionGroups
|
||||||
|
{
|
||||||
|
public static Gtk.ActionGroup GetActionGroup(System.Type type)
|
||||||
|
{
|
||||||
|
return Stetic.ActionGroups.GetActionGroup(type.FullName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Gtk.ActionGroup GetActionGroup(string name)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
22
MelonVPNClient/gtk-gui/gui.stetic
Normal file
22
MelonVPNClient/gtk-gui/gui.stetic
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<stetic-interface>
|
||||||
|
<configuration>
|
||||||
|
<images-root-path>..</images-root-path>
|
||||||
|
</configuration>
|
||||||
|
<import>
|
||||||
|
<widget-library name="glade-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
|
||||||
|
<widget-library name="../bin/Release/MelonVPNClient.exe" internal="true" />
|
||||||
|
</import>
|
||||||
|
<widget class="Gtk.Window" id="MainWindow" design-size="204 86">
|
||||||
|
<property name="MemberName" />
|
||||||
|
<property name="Title" translatable="yes">MainWindow</property>
|
||||||
|
<property name="WindowPosition">CenterOnParent</property>
|
||||||
|
<signal name="DeleteEvent" handler="OnDeleteEvent" />
|
||||||
|
<child>
|
||||||
|
<widget class="Gtk.Fixed" id="fixed1">
|
||||||
|
<property name="MemberName" />
|
||||||
|
<property name="HasWindow">False</property>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
</stetic-interface>
|
8
MelonVPNClient/melonvpn.desktop
Executable file
8
MelonVPNClient/melonvpn.desktop
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Network;
|
||||||
|
Icon=
|
||||||
|
Name=Melon VPN
|
||||||
|
Path=
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
Exec=/usr/bin/melonvpnclient
|
1
MelonVPNClient/melonvpnclient
Executable file
1
MelonVPNClient/melonvpnclient
Executable file
@ -0,0 +1 @@
|
|||||||
|
mono /usr/lib/melon-vpn/MelonVPNClient.exe
|
@ -0,0 +1,46 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||||
|
<ProjectGuid>{B318A58E-028B-43A2-A753-2D7FBCA4EE40}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<RootNamespace>MelonVPNConnectedClientUpdate</RootNamespace>
|
||||||
|
<AssemblyName>MelonVPNConnectedClientUpdate</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||||
|
<ReleaseVersion>1.0</ReleaseVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<ExternalConsole>true</ExternalConsole>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release</OutputPath>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<ExternalConsole>true</ExternalConsole>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\MelonVPNCore\MelonVPNCore.csproj">
|
||||||
|
<Project>{B2F2F96C-3E5D-4176-9D66-479F357BC078}</Project>
|
||||||
|
<Name>MelonVPNCore</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
13
MelonVPNConnectedClientUpdate/Program.cs
Normal file
13
MelonVPNConnectedClientUpdate/Program.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using MelonVPNCore;
|
||||||
|
|
||||||
|
namespace MelonVPNConnectedClientUpdate
|
||||||
|
{
|
||||||
|
class MainClass
|
||||||
|
{
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Client.SendCustomMessage(Messages.GetClientListMessage(Console.ReadLine()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
MelonVPNConnectedClientUpdate/Properties/AssemblyInfo.cs
Normal file
26
MelonVPNConnectedClientUpdate/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following attributes.
|
||||||
|
// Change them to the values specific to your project.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("MelonVPNConnectedClientUpdate")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("")]
|
||||||
|
[assembly: AssemblyCopyright("${AuthorCopyright}")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
||||||
|
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
||||||
|
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
||||||
|
|
||||||
|
// The following attributes are used to specify the signing key for the assembly,
|
||||||
|
// if desired. See the Mono documentation for more information about signing.
|
||||||
|
|
||||||
|
//[assembly: AssemblyDelaySign(false)]
|
||||||
|
//[assembly: AssemblyKeyFile("")]
|
41
MelonVPNCore/Client.cs
Normal file
41
MelonVPNCore/Client.cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public static class Client
|
||||||
|
{
|
||||||
|
public static ClientResponseState SendDataMessage(DataMessage msg) => SendDataMessage(msg, false);
|
||||||
|
public static ClientResponseState SendDataMessage(DataMessage msg, bool IsSendingFromDaemon) => SendCustomMessage(Messages.GetMessage(msg), IsSendingFromDaemon);
|
||||||
|
public static ClientResponseState SendCustomMessage(string msg) => SendCustomMessage(msg, false);
|
||||||
|
public static ClientResponseState SendCustomMessage(string msg, bool IsSendingFromDaemon)
|
||||||
|
{
|
||||||
|
IPHostEntry host = Dns.GetHostEntry("localhost");
|
||||||
|
IPAddress ipAddress = host.AddressList[0];
|
||||||
|
IPEndPoint remoteEndPoint = new IPEndPoint(ipAddress, IsSendingFromDaemon ? 22036 : 22035);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (msg == Messages.EOF || msg == "") return ClientResponseState.Blank;
|
||||||
|
|
||||||
|
Socket client = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
client.Connect(remoteEndPoint);
|
||||||
|
client.ReceiveTimeout = 5000;
|
||||||
|
client.SendTimeout = 5000;
|
||||||
|
|
||||||
|
byte[] bytes = Encoding.ASCII.GetBytes(msg);
|
||||||
|
|
||||||
|
client.Send(bytes);
|
||||||
|
client.Close();
|
||||||
|
return ClientResponseState.Sent;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
return ClientResponseState.Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
20
MelonVPNCore/ClientListParser.cs
Normal file
20
MelonVPNCore/ClientListParser.cs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public static class ClientListParser
|
||||||
|
{
|
||||||
|
public static ConnectedClient[] Parse(string json)
|
||||||
|
{
|
||||||
|
List<ConnectedClient> clients = new List<ConnectedClient>();
|
||||||
|
JArray a = JArray.Parse(json);
|
||||||
|
|
||||||
|
foreach (JObject o in a.Children<JObject>())
|
||||||
|
{
|
||||||
|
clients.Add(new ConnectedClient(o.GetValue("Name").ToString(), o.GetValue("IP").ToString()));
|
||||||
|
}
|
||||||
|
return clients.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
13
MelonVPNCore/ClientResponseState.cs
Normal file
13
MelonVPNCore/ClientResponseState.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public enum ClientResponseState
|
||||||
|
{
|
||||||
|
Online,
|
||||||
|
Offline,
|
||||||
|
Error,
|
||||||
|
ServerError,
|
||||||
|
None,
|
||||||
|
Blank,
|
||||||
|
Sent
|
||||||
|
}
|
||||||
|
}
|
14
MelonVPNCore/ConnectedClient.cs
Normal file
14
MelonVPNCore/ConnectedClient.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public class ConnectedClient
|
||||||
|
{
|
||||||
|
public readonly string name;
|
||||||
|
public readonly string ip;
|
||||||
|
|
||||||
|
public ConnectedClient(string name, string ip)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.ip = ip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
136
MelonVPNCore/DaemonSocketServer.cs
Normal file
136
MelonVPNCore/DaemonSocketServer.cs
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public static class DaemonSocketServer
|
||||||
|
{
|
||||||
|
public static void StartServer()
|
||||||
|
{
|
||||||
|
IPHostEntry host = Dns.GetHostEntry("localhost");
|
||||||
|
IPAddress ipAddress = host.AddressList[0];
|
||||||
|
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 22035);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
listener.Bind(localEndPoint);
|
||||||
|
listener.Listen(10);
|
||||||
|
|
||||||
|
Process currentVpnProcess = null;
|
||||||
|
string lastClientUpdate = Messages.EOF;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
Socket handler = listener.Accept();
|
||||||
|
|
||||||
|
string data = null;
|
||||||
|
byte[] bytes = null;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
bytes = new byte[1024];
|
||||||
|
int bytesRec = handler.Receive(bytes);
|
||||||
|
data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
|
||||||
|
if (data.IndexOf(Messages.EOF, StringComparison.CurrentCulture) > -1) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.StartsWith(Messages.ClientListStartMsg, StringComparison.CurrentCulture))
|
||||||
|
{
|
||||||
|
lastClientUpdate = data;
|
||||||
|
Client.SendCustomMessage(lastClientUpdate, true);
|
||||||
|
}
|
||||||
|
else if (data == Messages.StatusMsg)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Status requested");
|
||||||
|
if (currentVpnProcess != null && !currentVpnProcess.HasExited)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Sending response: online");
|
||||||
|
Client.SendDataMessage(DataMessage.Online, true);
|
||||||
|
Client.SendCustomMessage(lastClientUpdate, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Sending response: offline");
|
||||||
|
Client.SendDataMessage(DataMessage.Offline, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (data == Messages.StartMsg)
|
||||||
|
{
|
||||||
|
if (currentVpnProcess == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Starting VPN");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Console.WriteLine("Starting embedded process");
|
||||||
|
currentVpnProcess = new Process
|
||||||
|
{
|
||||||
|
StartInfo = new ProcessStartInfo("simple-vpn", "client /etc/melon-vpn/client.cfg")
|
||||||
|
};
|
||||||
|
currentVpnProcess.Exited += delegate
|
||||||
|
{
|
||||||
|
Client.SendDataMessage(DataMessage.Offline, true);
|
||||||
|
currentVpnProcess = null;
|
||||||
|
};
|
||||||
|
currentVpnProcess.Start();
|
||||||
|
Console.WriteLine("Sending online reply");
|
||||||
|
Thread.Sleep(1500);
|
||||||
|
Client.SendDataMessage(DataMessage.Online, true);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("There was an error. But I fixed it.");
|
||||||
|
Console.WriteLine("It looked like this: " + e);
|
||||||
|
currentVpnProcess = null;
|
||||||
|
Client.SendDataMessage(DataMessage.Error, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("VPN already started");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (data == Messages.StopMsg)
|
||||||
|
{
|
||||||
|
if (currentVpnProcess != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Stopping VPN");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Console.WriteLine("Stopping embedded process");
|
||||||
|
currentVpnProcess.Kill();
|
||||||
|
currentVpnProcess = null;
|
||||||
|
Console.WriteLine("Sending offline reply");
|
||||||
|
Client.SendDataMessage(DataMessage.Offline, true);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("There was an error. But I fixed it.");
|
||||||
|
Console.WriteLine("It looked like this: " + e);
|
||||||
|
currentVpnProcess = null;
|
||||||
|
Client.SendDataMessage(DataMessage.Error, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("VPN already stopped");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Client.SendDataMessage(DataMessage.Blank, true);
|
||||||
|
|
||||||
|
handler.Shutdown(SocketShutdown.Both);
|
||||||
|
handler.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
13
MelonVPNCore/DataMessage.cs
Normal file
13
MelonVPNCore/DataMessage.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public enum DataMessage
|
||||||
|
{
|
||||||
|
Status,
|
||||||
|
Online,
|
||||||
|
Offline,
|
||||||
|
Start,
|
||||||
|
Stop,
|
||||||
|
Blank,
|
||||||
|
Error
|
||||||
|
}
|
||||||
|
}
|
68
MelonVPNCore/GUISocketServer.cs
Normal file
68
MelonVPNCore/GUISocketServer.cs
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
using System;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public static class GUISocketServer
|
||||||
|
{
|
||||||
|
public static event EventHandler<ClientResponseState> Receive;
|
||||||
|
public static event EventHandler<ConnectedClient[]> ClientListUpdate;
|
||||||
|
|
||||||
|
public static void StartServer()
|
||||||
|
{
|
||||||
|
IPHostEntry host = Dns.GetHostEntry("localhost");
|
||||||
|
IPAddress ipAddress = host.AddressList[0];
|
||||||
|
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 22036);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
listener.Bind(localEndPoint);
|
||||||
|
listener.Listen(10);
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
Socket handler = listener.Accept();
|
||||||
|
|
||||||
|
string data = "";
|
||||||
|
byte[] bytes = null;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
bytes = new byte[1024];
|
||||||
|
int bytesRec = handler.Receive(bytes);
|
||||||
|
data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
|
||||||
|
if (data.IndexOf(Messages.EOF, StringComparison.CurrentCulture) > -1) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClientResponseState ret = ClientResponseState.None;
|
||||||
|
if (data == Messages.OnlineMsg) ret = ClientResponseState.Online;
|
||||||
|
if (data == Messages.OfflineMsg) ret = ClientResponseState.Offline;
|
||||||
|
if (data == Messages.ErrorMsg) ret = ClientResponseState.ServerError;
|
||||||
|
Console.WriteLine(data);
|
||||||
|
if (data.StartsWith(Messages.ClientListStartMsg, StringComparison.CurrentCulture))
|
||||||
|
{
|
||||||
|
string jsonWithEof = data.Substring(Messages.ClientListStartMsg.Length);
|
||||||
|
string jsonData = data.Substring(0, jsonWithEof.Length - Messages.EOF.Length);
|
||||||
|
Console.WriteLine("clients: " + jsonData);
|
||||||
|
//ClientListParser.Parse(jsonData);
|
||||||
|
ConnectedClient[] clients = new ConnectedClient[0];
|
||||||
|
ClientListUpdate?.Invoke(null, clients);
|
||||||
|
}
|
||||||
|
|
||||||
|
handler.Shutdown(SocketShutdown.Both);
|
||||||
|
handler.Close();
|
||||||
|
|
||||||
|
Receive?.Invoke(null, ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
Console.WriteLine("GUI socket server reathed the end");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
49
MelonVPNCore/MelonVPNCore.csproj
Normal file
49
MelonVPNCore/MelonVPNCore.csproj
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ProjectGuid>{B2F2F96C-3E5D-4176-9D66-479F357BC078}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>MelonVPNCore</RootNamespace>
|
||||||
|
<AssemblyName>MelonVPNCore</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||||
|
<ReleaseVersion>1.0</ReleaseVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release</OutputPath>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="DaemonSocketServer.cs" />
|
||||||
|
<Compile Include="ThreadWrapper.cs" />
|
||||||
|
<Compile Include="Messages.cs" />
|
||||||
|
<Compile Include="Client.cs" />
|
||||||
|
<Compile Include="DataMessage.cs" />
|
||||||
|
<Compile Include="ClientResponseState.cs" />
|
||||||
|
<Compile Include="GUISocketServer.cs" />
|
||||||
|
<Compile Include="ClientListParser.cs" />
|
||||||
|
<Compile Include="ConnectedClient.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="Newtonsoft.Json">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
29
MelonVPNCore/Messages.cs
Normal file
29
MelonVPNCore/Messages.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public static class Messages
|
||||||
|
{
|
||||||
|
public static string EOF = "<EOF>";
|
||||||
|
public static string Code = "80d168e76f6bd40efe897881f35bcd895459e42a";
|
||||||
|
public static string StatusMsg = "STATUS::" + Code + EOF;
|
||||||
|
public static string OnlineMsg = "ONLINE::" + Code + EOF;
|
||||||
|
public static string OfflineMsg = "OFFLINE::" + Code + EOF;
|
||||||
|
public static string StartMsg = "START::" + Code + EOF;
|
||||||
|
public static string StopMsg = "STOP::" + Code + EOF;
|
||||||
|
public static string ErrorMsg = "ERROR::" + Code + EOF;
|
||||||
|
public static string ClientListStartMsg = "CLIENTLIST::" + Code + "::";
|
||||||
|
|
||||||
|
public static string GetMessage(DataMessage a)
|
||||||
|
{
|
||||||
|
if (a == DataMessage.Status) return StatusMsg;
|
||||||
|
if (a == DataMessage.Online) return OnlineMsg;
|
||||||
|
if (a == DataMessage.Offline) return OfflineMsg;
|
||||||
|
if (a == DataMessage.Start) return StartMsg;
|
||||||
|
if (a == DataMessage.Stop) return StopMsg;
|
||||||
|
if (a == DataMessage.Error) return ErrorMsg;
|
||||||
|
if (a == DataMessage.Blank) return EOF;
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetClientListMessage(string a) => ClientListStartMsg + a + EOF;
|
||||||
|
}
|
||||||
|
}
|
140
MelonVPNCore/SocketClient.cs
Normal file
140
MelonVPNCore/SocketClient.cs
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
using System;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public class AsynchronousClient
|
||||||
|
{
|
||||||
|
private const int port = 22035;
|
||||||
|
|
||||||
|
private ManualResetEvent connectDone = new ManualResetEvent(false);
|
||||||
|
private ManualResetEvent receiveDone = new ManualResetEvent(false);
|
||||||
|
|
||||||
|
private string response = "";
|
||||||
|
private Socket client;
|
||||||
|
|
||||||
|
private void StartClient()
|
||||||
|
{
|
||||||
|
// Connect to a remote device.
|
||||||
|
try
|
||||||
|
{
|
||||||
|
IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1");
|
||||||
|
IPAddress ipAddress = ipHostInfo.AddressList[0];
|
||||||
|
IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
|
||||||
|
|
||||||
|
client = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);
|
||||||
|
connectDone.WaitOne();
|
||||||
|
|
||||||
|
// Receive the response from the remote device.
|
||||||
|
Receive(client);
|
||||||
|
receiveDone.WaitOne();
|
||||||
|
|
||||||
|
// Write the response to the console.
|
||||||
|
Console.WriteLine("Response received : {0}", response);
|
||||||
|
|
||||||
|
// Release the socket.
|
||||||
|
client.Shutdown(SocketShutdown.Both);
|
||||||
|
client.Close();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Send(string msg)
|
||||||
|
{
|
||||||
|
Send(client, msg + "<EOF>");
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Receive()
|
||||||
|
{
|
||||||
|
if (client == null) return null;
|
||||||
|
Receive(client);
|
||||||
|
receiveDone.WaitOne();
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ConnectCallback(IAsyncResult ar)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Socket client = (Socket)ar.AsyncState;
|
||||||
|
client.EndConnect(ar);
|
||||||
|
Console.WriteLine("Socket connected to {0}", client.RemoteEndPoint.ToString());
|
||||||
|
|
||||||
|
connectDone.Set();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Receive()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
StateObject state = new StateObject
|
||||||
|
{
|
||||||
|
workSocket = client
|
||||||
|
};
|
||||||
|
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
receiveDone.WaitOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ReceiveCallback(IAsyncResult ar)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
StateObject state = (StateObject)ar.AsyncState;
|
||||||
|
Socket client = state.workSocket;
|
||||||
|
int bytesRead = client.EndReceive(ar);
|
||||||
|
if (bytesRead > 0)
|
||||||
|
{
|
||||||
|
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
|
||||||
|
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (state.sb.Length > 1) response = state.sb.ToString();
|
||||||
|
if (receiveDone != null) receiveDone.Set();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Send(Socket client, string data)
|
||||||
|
{
|
||||||
|
byte[] byteData = Encoding.ASCII.GetBytes(data);
|
||||||
|
client.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), client);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SendCallback(IAsyncResult ar)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Socket client = (Socket)ar.AsyncState;
|
||||||
|
int bytesSent = client.EndSend(ar);
|
||||||
|
Console.WriteLine("Sent {0} bytes to server.", bytesSent);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
MelonVPNCore/SocketServer.cs
Normal file
10
MelonVPNCore/SocketServer.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
using System;
|
||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public class SocketServer
|
||||||
|
{
|
||||||
|
public SocketServer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
21
MelonVPNCore/ThreadWrapper.cs
Normal file
21
MelonVPNCore/ThreadWrapper.cs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace MelonVPNCore
|
||||||
|
{
|
||||||
|
public class ThreadWrapper
|
||||||
|
{
|
||||||
|
private Thread wrapper;
|
||||||
|
|
||||||
|
public ThreadWrapper(ThreadStart action)
|
||||||
|
{
|
||||||
|
wrapper = new Thread(action)
|
||||||
|
{
|
||||||
|
IsBackground = true
|
||||||
|
};
|
||||||
|
wrapper.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Join() => wrapper.Join();
|
||||||
|
public void Kill() => wrapper.Abort();
|
||||||
|
}
|
||||||
|
}
|
4
MelonVPNCore/packages.config
Normal file
4
MelonVPNCore/packages.config
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net48" />
|
||||||
|
</packages>
|
54
MelonVPNDaemon/MelonVPNDaemon.csproj
Normal file
54
MelonVPNDaemon/MelonVPNDaemon.csproj
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||||
|
<ProjectGuid>{AFF161B8-AF8E-4A16-9AA4-B692EB0D838E}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<RootNamespace>MelonVPNDaemon</RootNamespace>
|
||||||
|
<AssemblyName>MelonVPNDaemon</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||||
|
<ReleaseVersion>1.0</ReleaseVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<ExternalConsole>true</ExternalConsole>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release</OutputPath>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<ExternalConsole>true</ExternalConsole>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\MelonVPNCore\MelonVPNCore.csproj">
|
||||||
|
<Project>{B2F2F96C-3E5D-4176-9D66-479F357BC078}</Project>
|
||||||
|
<Name>MelonVPNCore</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="melonvpndaemon.service">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="client.cfg">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
14
MelonVPNDaemon/Program.cs
Normal file
14
MelonVPNDaemon/Program.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using MelonVPNCore;
|
||||||
|
|
||||||
|
namespace MelonVPNDaemon
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
public static int Main(string[] args)
|
||||||
|
{
|
||||||
|
ThreadWrapper wrapper = new ThreadWrapper(DaemonSocketServer.StartServer);
|
||||||
|
wrapper.Join();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
MelonVPNDaemon/Properties/AssemblyInfo.cs
Normal file
26
MelonVPNDaemon/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following attributes.
|
||||||
|
// Change them to the values specific to your project.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("MelonVPNDaemon")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("")]
|
||||||
|
[assembly: AssemblyCopyright("${AuthorCopyright}")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
||||||
|
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
||||||
|
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
||||||
|
|
||||||
|
// The following attributes are used to specify the signing key for the assembly,
|
||||||
|
// if desired. See the Mono documentation for more information about signing.
|
||||||
|
|
||||||
|
//[assembly: AssemblyDelaySign(false)]
|
||||||
|
//[assembly: AssemblyKeyFile("")]
|
155
MelonVPNDaemon/Server.cs
Normal file
155
MelonVPNDaemon/Server.cs
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
using System;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace MelonVPNDaemon {
|
||||||
|
|
||||||
|
|
||||||
|
public class AsynchronousSocketListener
|
||||||
|
{
|
||||||
|
// Thread signal.
|
||||||
|
public static ManualResetEvent allDone = new ManualResetEvent(false);
|
||||||
|
|
||||||
|
public AsynchronousSocketListener()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void StartListening()
|
||||||
|
{
|
||||||
|
// Establish the local endpoint for the socket.
|
||||||
|
// The DNS name of the computer
|
||||||
|
// running the listener is "host.contoso.com".
|
||||||
|
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
|
||||||
|
IPAddress ipAddress = ipHostInfo.AddressList[0];
|
||||||
|
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
|
||||||
|
|
||||||
|
// Create a TCP/IP socket.
|
||||||
|
Socket listener = new Socket(ipAddress.AddressFamily,
|
||||||
|
SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
|
||||||
|
// Bind the socket to the local endpoint and listen for incoming connections.
|
||||||
|
try
|
||||||
|
{
|
||||||
|
listener.Bind(localEndPoint);
|
||||||
|
listener.Listen(100);
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
// Set the event to nonsignaled state.
|
||||||
|
allDone.Reset();
|
||||||
|
|
||||||
|
// Start an asynchronous socket to listen for connections.
|
||||||
|
Console.WriteLine("Waiting for a connection...");
|
||||||
|
listener.BeginAccept(
|
||||||
|
new AsyncCallback(AcceptCallback),
|
||||||
|
listener);
|
||||||
|
|
||||||
|
// Wait until a connection is made before continuing.
|
||||||
|
allDone.WaitOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("\nPress ENTER to continue...");
|
||||||
|
Console.Read();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AcceptCallback(IAsyncResult ar)
|
||||||
|
{
|
||||||
|
// Signal the main thread to continue.
|
||||||
|
allDone.Set();
|
||||||
|
|
||||||
|
// Get the socket that handles the client request.
|
||||||
|
Socket listener = (Socket)ar.AsyncState;
|
||||||
|
Socket handler = listener.EndAccept(ar);
|
||||||
|
|
||||||
|
// Create the state object.
|
||||||
|
StateObject state = new StateObject();
|
||||||
|
state.workSocket = handler;
|
||||||
|
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
|
||||||
|
new AsyncCallback(ReadCallback), state);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ReadCallback(IAsyncResult ar)
|
||||||
|
{
|
||||||
|
String content = String.Empty;
|
||||||
|
|
||||||
|
// Retrieve the state object and the handler socket
|
||||||
|
// from the asynchronous state object.
|
||||||
|
StateObject state = (StateObject)ar.AsyncState;
|
||||||
|
Socket handler = state.workSocket;
|
||||||
|
|
||||||
|
// Read data from the client socket.
|
||||||
|
int bytesRead = handler.EndReceive(ar);
|
||||||
|
|
||||||
|
if (bytesRead > 0)
|
||||||
|
{
|
||||||
|
// There might be more data, so store the data received so far.
|
||||||
|
state.sb.Append(Encoding.ASCII.GetString(
|
||||||
|
state.buffer, 0, bytesRead));
|
||||||
|
|
||||||
|
// Check for end-of-file tag. If it is not there, read
|
||||||
|
// more data.
|
||||||
|
content = state.sb.ToString();
|
||||||
|
if (content.IndexOf("<EOF>") > -1)
|
||||||
|
{
|
||||||
|
// All the data has been read from the
|
||||||
|
// client. Display it on the console.
|
||||||
|
Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
|
||||||
|
content.Length, content);
|
||||||
|
// Echo the data back to the client.
|
||||||
|
Send(handler, content);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Not all data received. Get more.
|
||||||
|
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
|
||||||
|
new AsyncCallback(ReadCallback), state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Send(Socket handler, String data)
|
||||||
|
{
|
||||||
|
// Convert the string data to byte data using ASCII encoding.
|
||||||
|
byte[] byteData = Encoding.ASCII.GetBytes(data);
|
||||||
|
|
||||||
|
// Begin sending the data to the remote device.
|
||||||
|
handler.BeginSend(byteData, 0, byteData.Length, 0,
|
||||||
|
new AsyncCallback(SendCallback), handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SendCallback(IAsyncResult ar)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Retrieve the socket from the state object.
|
||||||
|
Socket handler = (Socket)ar.AsyncState;
|
||||||
|
|
||||||
|
// Complete sending the data to the remote device.
|
||||||
|
int bytesSent = handler.EndSend(ar);
|
||||||
|
Console.WriteLine("Sent {0} bytes to client.", bytesSent);
|
||||||
|
|
||||||
|
handler.Shutdown(SocketShutdown.Both);
|
||||||
|
handler.Close();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int Main(String[] args)
|
||||||
|
{
|
||||||
|
StartListening();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
4
MelonVPNDaemon/client.cfg
Normal file
4
MelonVPNDaemon/client.cfg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
vpn = wss://example.com
|
||||||
|
key = 1234
|
||||||
|
name = temp
|
||||||
|
peers = mono /usr/lib/melon-vpn/MelonVPNConnectedClientUpdate.exe
|
16
MelonVPNDaemon/melonvpndaemon.service
Normal file
16
MelonVPNDaemon/melonvpndaemon.service
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Melon VPN Daemon
|
||||||
|
[Unit]
|
||||||
|
Description=Manage Melon VPN Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/
|
||||||
|
ExecStart=mono /usr/lib/melon-vpn/MelonVPNDaemon.exe
|
||||||
|
User=root
|
||||||
|
Group=root
|
||||||
|
Type=simple
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
8
build
Executable file
8
build
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "[info] Preparing to setup dependencies"
|
||||||
|
./install-dependencies
|
||||||
|
echo "[info] Preparing to build projects from source"
|
||||||
|
./build-source
|
||||||
|
echo "[info] Preparing to install components"
|
||||||
|
./install-components
|
||||||
|
echo "[info] Build process finished"
|
4
build-source
Executable file
4
build-source
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "Preparing to build MelonVPN"
|
||||||
|
msbuild MelonVPN.sln -m /t:MelonVPNCore /t:MelonVPNConnectedClientUpdate /t:MelonVPNDaemon /t:MelonVPNClient /p:Configuration=Release /p:Platform=x86
|
||||||
|
echo "Run \"./install\" to install all the components for MelonVPN"
|
33
install-components
Executable file
33
install-components
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
sudo mkdir -p /usr/lib/melon-vpn/
|
||||||
|
sudo cp MelonVPNCore/bin/Release/MelonVPNCore.dll /usr/lib/melon-vpn/
|
||||||
|
sudo cp MelonVPNConnectedClientUpdate/bin/Release/MelonVPNConnectedClientUpdate.exe /usr/lib/melon-vpn/
|
||||||
|
sudo cp MelonVPNDaemon/bin/Release/MelonVPNDaemon.exe /usr/lib/melon-vpn/
|
||||||
|
if [ -f /etc/systemd/system/melonvpndaemon.service ]; then
|
||||||
|
echo "[info] Found daemon service at \"/etc/systemd/system/melonvpndaemon.service\" delete this to reinstall the default service"
|
||||||
|
else
|
||||||
|
sudo cp MelonVPNDaemon/bin/Release/melonvpndaemon.service /etc/systemd/system/
|
||||||
|
fi
|
||||||
|
sudo mkdir -p /etc/melon-vpn/
|
||||||
|
if [ -f /etc/melon-vpn/client.cfg ]; then
|
||||||
|
echo "[info] Found config at \"/etc/melon-vpn/client.cfg\" delete this to reinstall the default config"
|
||||||
|
else
|
||||||
|
sudo cp MelonVPNDaemon/bin/Release/client.cfg /etc/melon-vpn/
|
||||||
|
fi
|
||||||
|
if [ -f /usr/share/applications/melonvpn.desktop ]; then
|
||||||
|
echo "[info] Found desktop file at \"/usr/share/applications/melonvpn.desktop\" delete this to reinstall the default one"
|
||||||
|
else
|
||||||
|
sudo cp MelonVPNClient/bin/Release/melonvpn.desktop /usr/share/applications/
|
||||||
|
fi
|
||||||
|
sudo chown root:root /etc/melon-vpn/client.cfg
|
||||||
|
sudo cp MelonVPNClient/bin/Release/MelonVPNClient.exe /usr/lib/melon-vpn/
|
||||||
|
sudo cp MelonVPNClient/bin/Release/MelonVPNClient.exe.config /usr/lib/melon-vpn/
|
||||||
|
sudo cp MelonVPNClient/bin/Release/melonvpnclient /usr/bin/
|
||||||
|
sudo chmod +x /usr/bin/melonvpnclient
|
||||||
|
echo "[info] Restarting daemon"
|
||||||
|
sudo systemctl stop melonvpndaemon
|
||||||
|
sudo systemctl disable melonvpndaemon
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable melonvpndaemon
|
||||||
|
sudo systemctl start melonvpndaemon
|
||||||
|
echo "[info] Remember to setup \"/etc/melon-vpn/client.cfg\""
|
22
install-dependencies
Executable file
22
install-dependencies
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
if [ "$(go version | head -c 13)" == "go version go" ]; then
|
||||||
|
echo "Assuming go is installed"
|
||||||
|
if [ -f /usr/bin/simple-vpn ]; then
|
||||||
|
echo "Found \"/usr/bin/simple-vpn\" assuming it is installed correctly"
|
||||||
|
else
|
||||||
|
echo "Cloning simple-vpn"
|
||||||
|
git clone https://github.com/skx/simple-vpn
|
||||||
|
cd simple-vpn
|
||||||
|
echo "Installing simple-vpn"
|
||||||
|
go build
|
||||||
|
sudo cp ./simple-vpn /usr/bin/ -i
|
||||||
|
cd ..
|
||||||
|
echo "Cleaning up"
|
||||||
|
rm simple-vpn -rf
|
||||||
|
echo "Components installed..."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Please install golang before continuing"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
echo "Run \"./build\" to continue with installing MelonVPN"
|
Loading…
Reference in New Issue
Block a user