A lightweight Universal Windows proxy app based on https://github.com/eycorsican/leaf

Overview

Maple

A lightweight Universal Windows proxy app based on https://github.com/eycorsican/leaf

Features

  • Configuration management
  • Outbound network adapter selection
  • UWP VPN Platform as TUN provider

TODO

  • Log collection (currently logs are sent to Visual Studio Output window for debugging only)
  • external entries
  • VPN On Demand
  • Configurable routing entries

Screenshots

Settings Page

Build

To build Leaf and Maple, a Rust nightly-x86_64-pc-windows-msvc toolchain, Windows 10 SDK 10.0.19041 and Visual Studio 2019 with C++ Development Workflow are required. C++/WinRT Visual Studio extension must be installed to generate Windows Metadata.

  1. Recursively clone this repository.
  2. Open an x64 Native Tools Command Prompt for VS 2019.
  3. Change working directory to leaf/leaf-mobile.
  4. cargo build -Z build-std=std,panic_abort --target x86_64-uwp-windows-msvc.
    For Release builds, use --release.
    See also https://github.com/eycorsican/leaf#build .
  5. Open Maple.sln in Visual Studio.
  6. Build Solution.
Issues
  • 【配置文件书写】用 v2ray 客户端做代理

    【配置文件书写】用 v2ray 客户端做代理

    我目前在用一个 v2ray 客户端 v2rayN,但是 v2rayN 不支持全局透明代理,于是我尝试使用 Maple 实现全局透明代理,我应该怎样配置 Maple 才能让全局的流量都走 v2ray 代理呢?说得更具体一点,我想做到 https://github.com/mellow-io/mellow/issues/283 所说的事情,不同之处是我用的代理客户端是 v2rayN 而那里用的代理客户端是 Clash,我应该如何配置 Maple?

    leaf 的配置文档我没看明白,不知道如何修改配置,也没搜到 Maple 配置相关的教程,在此恳请方家赐教。我想知道用 Maple 能不能达到我想要的效果,如果能,请给出一个 working example。

    下面是我的 v2ray 配置

    {
      "log": {
        "access": "D:\\v2rayN-Core-315\\Vaccess.log",
        "error": "D:\\v2rayN-Core-315\\Verror.log",
        "loglevel": "warning"
      },
      "inbounds": [
        {
          "tag": "socks",
          "port": 10808,
          "listen": "127.0.0.1",
          "protocol": "socks",
          "sniffing": {
            "enabled": true,
            "destOverride": [
              "http",
              "tls"
            ]
          },
          "settings": {
            "auth": "noauth",
            "udp": true,
            "allowTransparent": false
          }
        },
        {
          "tag": "http",
          "port": 10809,
          "listen": "127.0.0.1",
          "protocol": "http",
          "sniffing": {
            "enabled": true,
            "destOverride": [
              "http",
              "tls"
            ]
          },
          "settings": {
            "udp": false,
            "allowTransparent": false
          }
        }
      ],
      "outbounds": [
        {
          "tag": "proxy",
          "protocol": "vmess",
          "settings": {
            "vnext": [
              {
                "address": "blah.blah",
                "port": 26012,
                "users": [
                  {
                    "id": "blah-blah-blah",
                    "alterId": 1,
                    "email": "[email protected]",
                    "security": "auto"
                  }
                ]
              }
            ]
          },
          "streamSettings": {
            "network": "ws",
            "wsSettings": {
              "path": "/v2ray",
              "headers": {
                "Host": "www.bing.com"
              }
            }
          },
          "mux": {
            "enabled": true,
            "concurrency": 8
          }
        },
        {
          "tag": "direct",
          "protocol": "freedom",
          "settings": {}
        },
        {
          "tag": "block",
          "protocol": "blackhole",
          "settings": {
            "response": {
              "type": "http"
            }
          }
        }
      ],
      "routing": {
        "domainStrategy": "IPIfNonMatch",
        "rules": [
          {
            "type": "field",
            "inboundTag": [
              "api"
            ],
            "outboundTag": "api"
          },
          {
            "type": "field",
            "outboundTag": "proxy",
            "domain": [
              "geosite:google",
              "scratch.mit.edu",
              "bintray.com",
              "cloudfront.net",
              "discord.com",
              "discordapp.net"
            ]
          },
          {
            "type": "field",
            "outboundTag": "proxy",
            "ip": [
              "31.13.86.16"
            ]
          },
          {
            "type": "field",
            "outboundTag": "direct",
            "domain": [
              "geosite:cn",
              "codeforces.com",
              "workflowy.com",
              "live.com",
              "office365.com",
              "office.com",
              "onedrive.com"
            ]
          },
          {
            "type": "field",
            "outboundTag": "direct",
            "ip": [
              "geoip:private",
              "geoip:cn"
            ]
          },
          {
            "type": "field",
            "outboundTag": "block",
            "domain": [
              "geosite:category-ads-all"
            ]
          }
        ]
      }
    }
    
    configuration 
    opened by GoBigorGoHome 7
  • Build leaf error

    Build leaf error

    error[E0599]: no method named raw found for struct Handle in the current scope --> C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\windows\fs.rs:360:29 | 360 | self.handle.raw(), | ^^^ method not found in Handle | ::: C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\windows\handle.rs:17:1 | 17 | pub struct Handle(OwnedHandle); | ------------------------------- method raw not found for this

    error[E0599]: no method named raw found for struct Handle in the current scope --> C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\windows\fs.rs:388:29 | 388 | self.handle.raw(), | ^^^ method not found in Handle | ::: C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\windows\handle.rs:17:1 | 17 | pub struct Handle(OwnedHandle); | ------------------------------- method raw not found for this

    error[E0599]: no function or associated item named new found for struct Handle in the current scope --> C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\windows\stdio_uwp.rs:28:26 | 28 | let handle = Handle::new(handle); | ^^^ function or associated item not found in Handle | ::: C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\windows\handle.rs:17:1 | 17 | pub struct Handle(OwnedHandle); | ------------------------------- function or associated item new not found for this

    error[E0599]: no method named write found for struct ManuallyDrop<_> in the current scope --> C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\windows\stdio_uwp.rs:29:31 | 29 | ManuallyDrop::new(handle).write(data) | ^^^^^ method not found in ManuallyDrop<_> | = note: ManuallyDrop::new(handle) is a function, perhaps you wish to call it = help: items from traits can only be used if the trait is implemented and in scope note: io::Write defines an item write, perhaps you need to implement it --> C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\io\mod.rs:1368:1 | 1368 | pub trait Write { | ^^^^^^^^^^^^^^^

    error[E0599]: no function or associated item named new found for struct Handle in the current scope --> C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\windows\stdio_uwp.rs:41:30 | 41 | let handle = Handle::new(handle); | ^^^ function or associated item not found in Handle | ::: C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\windows\handle.rs:17:1 | 17 | pub struct Handle(OwnedHandle); | ------------------------------- function or associated item new not found for this

    error[E0599]: no method named read found for struct ManuallyDrop<_> in the current scope --> C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\sys\windows\stdio_uwp.rs:42:35 | 42 | ManuallyDrop::new(handle).read(buf) | ^^^^ method not found in ManuallyDrop<_> | = note: ManuallyDrop::new(handle) is a function, perhaps you wish to call it = help: items from traits can only be used if the trait is implemented and in scope note: io::Read defines an item read, perhaps you need to implement it --> C:\Users\zenlayer.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\std\src\io\mod.rs:520:1 | 520 | pub trait Read { | ^^^^^^^^^^^^^^

    For more information about this error, try rustc --explain E0599. error: could not compile std due to 6 previous errors

    bug 
    opened by mikexxma 4
  • 很抱歉打扰,一点疑问,希望解惑

    很抱歉打扰,一点疑问,希望解惑

    请问UWP提供的tun时,客户端和服务端建立TCP/UDP链接时是否无视 UWP VPN设定的路由规则 例如0.0.0.0/1 128.0.0.1/1 还是类似安卓 的vpnservice 需要protect一下fd

    https://docs.microsoft.com/en-us/uwp/api/windows.networking.vpn.vpnchannel.associatetransport?view=winrt-22000

    另外这个API的作用是?

    question 
    opened by hinego 3
  • [Feature Request]Support EXTERNAL rules

    [Feature Request]Support EXTERNAL rules

    See this issue for the context.

    In a nutshell, Maple could ask the user for the *.dat/*.site files, and make Leaf be able to find them by modifying the ASSET_LOCATION env var.

    enhancement 
    opened by perqin 3
  • [Feature Request] 'Hot reloading' after configuration saved

    [Feature Request] 'Hot reloading' after configuration saved

    I don't know if it's possible, but if it is, it will be better just hot reloading the new configuration after a saving action happened.

    For now, Maple just won't respect the new configuration, which requires reconnecting to the vpn to make the new configuration take effect.

    It could be like:

    1. User edit and save configuration;
    2. If configuration is valid, hot reloading to make the new configuration take effect immediately;
    3. If not valid, alert user to take further action to correct the configuration;
    4. If not valid, switching to another configuration will alert user the current draft configuration won't be saved;
    5. If not valid, close Maple will alert user Maple will drop the draft configuration, which means all editing will be lost;
    enhancement help wanted 
    opened by shunia 3
  • DNS leaks

    DNS leaks

    The way Leaf deals with DNS poisoning issues is the use of a combination of FakeDNS and DomainSniffing features.

    For FakeDNS to function as expected, plain text UDP DNS traffic from the host must be routed through the TUN interface, consequently handled by Leaf to make a fake DNS response. But on Windows, DNS queries could easily bypass the TUN interface, thus disabling FakeDNS.

    It's unclear to me what's the difference between UWP VPN plugin and a third-party TUN/TAP driver such as tap-windows6, I don't observe a change in the routing table when starting Maple, but FakeDNS is not working when some of my network adapters have DNS servers pointed to the default gateway, DNS queries are bypassing FakeDNS.

    As a note, here's how Mellow deals with this kind of issues, and the code.

    bug good first issue 
    opened by eycorsican 3
  • Syntax

    Syntax "PROCESS-NAME" in configuration file

    Hi,

    I am using Mellow previously and was used to use syntax PROCESS-NAME like

    PROCESS-NAME, trojan.exe, Direct
    PROCESS-NAME, putty.exe, Direct
    

    Just want to confirm whether it is supported in Maple as well.

    Thanks

    question configuration 
    opened by jiashun0011 2
  • Unable to establish UDP connections

    Unable to establish UDP connections

    Steps to reproduce:

    1. Start Maple VPN
    2. Try to join a Minecraft: Bedrock Edition server (all servers listed in the "Featured servers" section result exact same behavior)
    3. Attempt failed, got error: "Unable to connect to world"

    Configuration:

    [General]
    loglevel = error
    tun-fd = 233
    dns-server = 1.0.0.1, 1.1.1.1
    
    [Proxy]
    Direct = direct
    Reject = reject
    
    Shadowsocks = ss, 1.2.3.4, 1234, encrypt-method=chacha20-ietf-poly1305, password=Pa55vv0rd1234
    
    [Proxy Group]
    Default = fallback, Shadowsocks
    
    [Rule]
    IP-CIDR, 10.0.0.0/8, Direct
    IP-CIDR, 172.16.0.0/12, Direct
    IP-CIDR, 192.168.0.0/16, Direct
    
    FINAL, Default
    

    Additional context:

    • NatTypeTester reports "UdpBlocked" as the NAT type
    • With the same proxy server, it's possible to join these MCBE servers on Android using SagerNet
    bug 
    opened by Fei1Yang 2
  • Fallback 连接报错 handler not found

    Fallback 连接报错 handler not found

    升级到0.5.0,已经无法正常使用VMessWSS,测试过0.4.0也不行,之前一直正常使用0.3.0(现在证书过期也装不上去了) 问题如下:

    • 直连正常
    • 需要通过代理的全部被断开,VS跟踪结果附在最后

    配置文件如下:

    [General]
    # Log are for debug only
    loglevel = trace
    # Do not remove tun-fd option
    tun-fd = 233
    dns-server = 223.5.5.5, 114.114.114.114
    
    [Proxy]
    Direct = direct
    Reject = reject
    
    VMessWSS = vmess, ..., 443, username=..., ws=true, tls=true, ws-path=/...
    
    [Proxy Group]
    Fallback = fallback, VMessWSS, interval=600, timeout=5
    
    [Rule]
    
    EXTERNAL, site:category-ads-all, Reject
    
    IP-CIDR, 8.8.8.8/32, Fallback
    DOMAIN, www.google.com, Fallback
    DOMAIN-SUFFIX, google.com, Fallback
    DOMAIN-KEYWORD, google, Fallback
    
    # 等效于 EXTERNAL, mmdb:us, Fallback
    GEOIP, us, Fallback
    
    EXTERNAL, site:geolocation-!cn, Fallback
    
    FINAL, Direct
    

    VS调试输出(Fallback部分):

    [2021-09-06 15:55:02][DEBUG] www.google.com matches domain [www.google.com]
    [2021-09-06 15:55:02][DEBUG] picked route [Fallback] for 192.168.3.1:52243 -> www.google.com:443
    [2021-09-06 15:55:02][DEBUG] handler not found
    [2021-09-06 15:55:02][TRACE] netstack tcp shutdown 192.168.3.1:52243
    [2021-09-06 15:55:02][TRACE] netstack tcp drop 192.168.3.1:52243
    [2021-09-06 15:55:02][TRACE] netstack tcp new 192.168.3.1:50704
    [2021-09-06 15:55:02][DEBUG] www.google.com matches domain [www.google.com]
    [2021-09-06 15:55:02][DEBUG] picked route [Fallback] for 192.168.3.1:50704 -> www.google.com:443
    [2021-09-06 15:55:02][DEBUG] handler not found
    [2021-09-06 15:55:02][TRACE] netstack tcp shutdown 192.168.3.1:50704
    [2021-09-06 15:55:02][TRACE] netstack tcp drop 192.168.3.1:50704
    [2021-09-06 15:55:02][TRACE] netstack tcp new 192.168.3.1:60754
    [2021-09-06 15:55:02][DEBUG] www.google.com matches domain [www.google.com]
    [2021-09-06 15:55:02][DEBUG] picked route [Fallback] for 192.168.3.1:60754 -> www.google.com:443
    [2021-09-06 15:55:02][DEBUG] handler not found
    [2021-09-06 15:55:02][TRACE] netstack tcp shutdown 192.168.3.1:60754
    [2021-09-06 15:55:02][TRACE] netstack tcp drop 192.168.3.1:60754
    [2021-09-06 15:55:02][TRACE] netstack tcp new 192.168.3.1:60596
    [2021-09-06 15:55:02][TRACE] netstack tcp new 192.168.3.1:58264
    [2021-09-06 15:55:02][DEBUG] [www.gstatic.com] matches domain suffix [gstatic.com]
    [2021-09-06 15:55:02][DEBUG] picked route [Fallback] for 192.168.3.1:58264 -> www.gstatic.com:443
    [2021-09-06 15:55:02][DEBUG] handler not found
    

    看起来是没有找到Fallback,不知道为啥

    bug 
    opened by wgjas2 2
  • [Feature Request] A BIG and noticeable start vpn button or clear guidence

    [Feature Request] A BIG and noticeable start vpn button or clear guidence

    Though Maple can not control vpn flow to connect or disconnect for now, I think it's really useful to make the Open VPN Settings button much much more noticeable when opening Maple, it should be in the main screen to tell people to do this.

    Or it can be improved to make a clear guidence as How To Use in README.

    I feel frustrate when I open Maple every time for 10 seconds and then I remembered that I should jump into the vpn settings to connect. And it's worse when I first use Maple, which I think I'm lucky to find how to use it.

    documentation enhancement 
    opened by shunia 2
  • Windows store can't access internet

    Windows store can't access internet

    When Maple is enabled the Windows Store loses connection to internet. If I create the VPN connection profile manually (not using "Generate Profile" in the app) it works, and connection is working for UWP store.

    What is the difference? Any workarounds to make Generate profile work within the app?

    bug 
    opened by lam4o 1
  • 请问如何连接到本地socks服务

    请问如何连接到本地socks服务

    我使用$$-windows作为本地socks服务器。【Windows的通用应用的loopback限制已使用Enable AppContainer Loopback解除】。 maple版本:0.5.0/0.4.0 在maple中,配置.conf文件,配置如下:

    [General]
    # Log are for debug only
    loglevel = error
    # Do not remove tun-fd option
    tun-fd = 233
    dns-server = 223.5.5.5, 114.114.114.114
    
    [Proxy]
    Direct = direct
    Reject = reject
    
    Sock_local_1080 = sock, 127.0.0.1, 1080
    
    [Proxy Group]
    # fallback 等效于 failover
    Fallback = fallback, Sock_local_1080, interval=600, timeout=5
    
    # url-test 等效于 failover=false 的 failover
    UrlTest = url-test, Sock_local_1080, interval=600, timeout=5
    
    Failover = failover, Sock_local_1080, health-check=true, check-interval=600, fail-timeout=5, failover=true
    Tryall = tryall, Sock_local_1080, delay-base=0
    Random = random, Sock_local_1080
    
    [Rule]
    # 代理服务器
    DOMAIN-SUFFIX, my.proxy.server.domain, Direct
    # 执行文件目录当中必需有 `site.dat` 文件
    EXTERNAL, site:category-ads-all, Reject
    
    # Arbitrary file access is forbidden within an app container.
    # Make sure `geosite.dat` exists in the config folder.
    # 也可以指定 `dat` 文件所在路径
    EXTERNAL, site:geosite.dat:category-ads-all, Reject
    
    IP-CIDR, 8.8.8.8/32, Fallback
    DOMAIN, www.google.com, Fallback
    DOMAIN-SUFFIX, google.com, Fallback
    DOMAIN-KEYWORD, google, Fallback
    
    # 等效于 EXTERNAL, mmdb:cn, Direct
    GEOIP, cn, Direct
    
    EXTERNAL, site:geolocation-cn, Direct
    
    FINAL, Fallback
    
    [Host]
    # 对指定域名返回一个或多个静态 IP
    example.com = 192.168.0.1, 192.168.0.2
    

    也使用过json,但是似乎也无法使用。.json配置文件如下:

    {
        "log": {
          "level": "error"
        },
        "dns": {
          "servers": [
            "223.5.5.5",
            "8.8.8.8",
            "8.8.4.4"
          ],
          "hosts": {
            "localhost": [
              "127.0.0.1"
            ]
          }
        },
        "inbounds": [
          {
            "protocol": "tun",
            "settings": {
              "name": "utun8",
              "address": "10.10.0.2",
              "netmask": "255.255.255.0",
              "gateway": "10.10.0.1",
              "mtu": 1500,
              "fakeDnsInclude": [
                "google"
              ]
            },
            "tag": "tun_in"
          }
        ],
        "outbounds": [
          {
            "protocol": "failover",
            "settings": {
              "actors": [
                "my.proxy.server.domain:12345_out",
                "localhost:1080_out"
              ],
              "failTimeout": 4,
              "healthCheck": true,
              "checkInterval": 300,
              "failover": true,
              "fallbackCache": false,
              "cacheSize": 256,
              "cacheTimeout": 60
            },
            "tag": "failover_out"
          },
          {
            "protocol": "chain",
            "settings": {
              "actors": [
                "ss_tls",
                "ss_ws",
                "my.proxy.server.domain:12345"
              ]
            },
            "tag": "my.proxy.server.domain:123456_out"
          },
          {
            "protocol": "tls",
            "tag": "ss_tls"
          },
          {
            "protocol": "ws",
            "settings": {
              "path": "/"
            },
            "tag": "ss_ws"
          },
          {
            "protocol": "shadowsocks",
            "settings": {
              "address": "my.proxy.server.domain",
              "method": "aes-128-gcm",
              "password": "passwd",
              "port": 12345
            },
            "tag": "my.proxy.server.domain:12345"
          },
          {
            "protocol": "socks",
            "settings": {
              "address": "127.0.0.1",
              "port": 1080
            },
            "tag": "localhost:1080_out"
          },
          {
            "protocol": "direct",
            "tag": "direct_out"
          },
          {
            "protocol": "drop",
            "tag": "drop_out"
          }
        ],
        "rules": [
          {
            "ip": [
              "8.8.8.8",
              "8.8.4.4"
            ],
            "target": "failover_out"
          },
          {
            "domain": [
              "www.google.com"
            ],
            "target": "failover_out"
          },
          {
            "domainSuffix": [
              "my.proxy.server.domain"
            ],
            "target": "direct_out"
          },
          {
            "domainSuffix": [
              "google.com",
              "goo.gl",
              "goo.gle",
              "cloudflare.com"
            ],
            "target": "failover_out"
          },
          {
            "domainKeyword": [
              "metax"
            ],
            "target": "direct_out"
          },
          {
            "domainKeyword": [
              "google",
              "github"
            ],
            "target": "failover_out"
          },
          {
            "geoip": [
              "cn"
            ],
            "target": "direct_out"
          },
          {
            "geoip": [
              "us",
              "jp"
            ],
            "target": "failover_out"
          },
          {
            "external": [
              "site:cn"
            ],
            "target": "direct_out"
          },
          {
            "external": [
              "site:us",
              "site:jp"
            ],
            "target": "failover_out"
          },
          {
            "external": [
              "mmdb:cn"
            ],
            "target": "direct_out"
          },
          {
            "external": [
              "mmdb:us"
            ],
            "target": "failover_out"
          }
        ]
      }
    
    bug 
    opened by IriKaQ 6
  • 安装失败

    安装失败

    应用安装失败,错误消息: 从 (Maple.App_0.3.0.0_x64.appxbundle) 使用程序包 56263bdbai.Maple_0.3.0.0_neutral_~_5wvpqmt3a9dj6 中的目标卷 C: 执行的部署 Add 操作失败,错误为 0x8000FFFF。有关诊断应用部署问题的帮助,请参阅 http://go.microsoft.com/fwlink/?LinkId=235160。 (0x8000ffff)

    opened by coolf 3
  • "Proxy Group" is not working in version 0.3.0

    The following config is working:

    [General]
    # Log are for debug only
    loglevel = error
    # Do not remove tun-fd option
    tun-fd = 233
    dns-server = 223.5.5.5, 114.114.114.114
    
    [Proxy]
    VMess = vmess, 1xx.xx.xx.xx0, xx4, username=blahblah-blahblah-blah
    
    [Proxy Group]
    Fallback = VMess, interval=600, timeout=5
    
    [Rule]
    FINAL, Fallback
    

    But the following not:

    [General]
    # Log are for debug only
    loglevel = error
    # Do not remove tun-fd option
    tun-fd = 233
    dns-server = 223.5.5.5, 114.114.114.114
    
    [Proxy]
    SS = ss, 107.173.xx.xx, xx, encrypt-method=aes-256-gcm, password=xxxxxxx
    VMess = vmess, 107.173.xx.xx, xx, username=xxxxxxxxxxxxx
    
    [Proxy Group]
    Fallback = VMess, interval=600, timeout=5
    
    [Rule]
    FINAL, Fallback
    

    Note that in the second configuration, SS is an invalid configuration. In version 0.2.0, using the second configuration is working, but now it's not.

    bug 
    opened by ghost 5
  • Configuration editor improvements

    Configuration editor improvements

    Currently the editor is somehow hard to use because of these reasons:

    1. BUG - Paste(ctrl+v) action often outputs duplicate content;
    2. BUG - Selection not accurate sometimes if symbols in selection area;
    3. BUG(?) - Copied content from the editor, but then not able to paste in other app like SublimeText;
    4. Improvements - Context menu not useful and sometimes anoying;
    5. Improvements - Feels glitch when editing;

    Can not provide my windows version for now but if it's helpful I'll post it later after work.

    enhancement good first issue 
    opened by shunia 3
Releases(v0.6.0)
  • v0.6.0(May 16, 2022)

    Changelog

    • You can now connect/disconnect VPN inside the app! A toggle switch button was added on the title bar.
    • Updated Leaf core to v0.6.0 (https://github.com/eycorsican/leaf/commit/517172d2b18c6aca77e65a51dfeacb52c444c526 .. https://github.com/eycorsican/leaf/commit/897ea054f0f6691bc817d2dcb2e08d7633cfcde6)

    Only x64 build is available at this moment. Minimum required OS version is Windows 10, version 1703 (Creators Update).

    Before installing the appxbundle, remember to import the security certificate first:

    1. Open Maple.App_0.6.0.0_x64.cer, and select Install Certificate.
    2. On the Certificate Import Wizard, select Local Machine.
    3. Import the certificate to the Trusted Root Certification Authorities folder.

    Note: the code signing certificate in this release has been updated (fingerprint: ef6ab9d1e77a752154dcead1d6ee4efef471ab48). You may need to install the new certificate and untrust the old one.

    Source code(tar.gz)
    Source code(zip)
    Maple.App_0.6.0.0_x64_Test.with.debug.symbol.for.dev.7z(33.72 MB)
    Maple.App_0.6.0.0_x64_Test.zip(8.70 MB)
  • v0.5.1(Sep 6, 2021)

    Changelog

    • Reverted plugin system in Leaf core
    • Fixed issues related to VMess

    Only x64 build is available at this moment. Minimum required OS version is Windows 10, version 1703 (Creators Update).

    Before installing the appxbundle, remember to import the security certificate first:

    1. Open Maple.App_0.5.1.0_x64.cer, and select Install Certificate.
    2. On the Certificate Import Wizard, select Local Machine.
    3. Import the certificate to the Trusted Root Certification Authorities folder.
    Source code(tar.gz)
    Source code(zip)
    Maple.App_0.5.1.0_x64_Test.with.debug.symbol.for.dev.7z(31.72 MB)
    Maple.App_0.5.1.0_x64_Test.zip(7.54 MB)
  • v0.5.0(Aug 30, 2021)

    Changelog

    • Updated Leaf core (https://github.com/eycorsican/leaf/commit/fbe3a5a01e9a5600b9660c7c7edc925ab78c47ff .. https://github.com/eycorsican/leaf/commit/3773a029e8b55a0efca8d129f8dcbdfdafcf02f6)
    • Added support for custom TLS certificates

    Only x64 build is available at this moment. Minimum required OS version is Windows 10, version 1703 (Creators Update).

    Before installing the appxbundle, remember to import the security certificate first:

    1. Open Maple.App_0.5.0.0_x64.cer, and select Install Certificate.
    2. On the Certificate Import Wizard, select Local Machine.
    3. Import the certificate to the Trusted Root Certification Authorities folder.

    Note: the code signing certificate in this release has been updated (fingerprint: 6890b24de38b664dfcd2cab4587ed55e2a47fe46). You may need to install the new certificate and untrust the old one.

    Source code(tar.gz)
    Source code(zip)
    Maple.App_0.5.0.0_x64_Test.with.debug.symbol.for.dev.7z(31.76 MB)
    Maple.App_0.5.0.0_x64_Test.zip(7.50 MB)
  • v0.4.0(Aug 14, 2021)

    Changelog

    • Updated Leaf core (https://github.com/eycorsican/leaf/commit/8c7e442f071d084c6a7461323fd181d66a8e279f .. https://github.com/eycorsican/leaf/commit/b0779107921683204a65bb1d41edc07a52688613)
    • Fixed an issue where loopback addresses were not accessible even when loopback exemption was applied

    Only x64 build is available at this moment. Minimum required OS version is Windows 10, version 1703 (Creators Update).

    Before installing the appxbundle, remember to import the security certificate first:

    1. Open Maple.App_0.4.0.0_x64.cer, and select Install Certificate.
    2. On the Certificate Import Wizard, select Local Machine.
    3. Import the certificate to the Trusted Root Certification Authorities folder.
    Source code(tar.gz)
    Source code(zip)
    Maple.App_0.4.0.0_x64_Test.with.debug.symbol.for.dev.7z(31.59 MB)
    Maple.App_0.4.0.0_x64_Test.zip(7.48 MB)
  • v0.3.0(May 18, 2021)

    Changelog

    • Updated Leaf core (https://github.com/eycorsican/leaf/commit/01fb4d64fa41d0402f3a5ae3d8539e754b91a7a4 .. https://github.com/eycorsican/leaf/commit/9afcc27fc2585aafc44417d7caf8a3873f134880)
    • External entries are supported! Now you can drag in your favourite geo.mmdb and site.dat databases for rule matching.

    Only x64 build is available at this moment. Minimum required OS version is Windows 10, version 1703 (Creators Update).

    Before installing the appxbundle, remember to import the security certificate first:

    1. Open Maple.App_0.3.0.0_x64.cer, and select Install Certificate.
    2. On the Certificate Import Wizard, select Local Machine.
    3. Import the certificate to the Trusted Root Certification Authorities folder.
    Source code(tar.gz)
    Source code(zip)
    Maple.App_0.3.0.0_x64_Test.with.debug.symbol.for.dev.7z(31.90 MB)
    Maple.App_0.3.0.0_x64_Test.zip(8.07 MB)
  • v0.2.0(Mar 14, 2021)

    Changelog

    • Fix DNS requests bypassing VPN interface (#1)
    • Add drag and drop support for configuration files

    Only x64 build is available at this moment. Minimum required OS version is Windows 10, version 1703 (Creators Update).

    Before installing the appxbundle, remember to import the security certificate first:

    1. Open Maple.App_0.2.0.0_x64.cer, and select Install Certificate.
    2. On the Certificate Import Wizard, select Local Machine.
    3. Import the certificate to the Trusted Root Certification Authorities folder.
    Source code(tar.gz)
    Source code(zip)
    Maple.App_0.2.0.0_x64_Test.with.debug.symbol.for.dev.7z(28.57 MB)
    Maple.App_0.2.0.0_x64_Test.zip(6.06 MB)
  • v0.1.0(Mar 13, 2021)

    This is the initial release of Maple. Feel free to try it out and report issues (if any).

    Only x64 build is available at this moment. Minimum required OS version is Windows 10, version 1703 (Creators Update).

    Before installing the appxbundle, remember to import the security certificate first:

    1. Open Maple.App_0.1.0.0_x64.cer, and select Install Certificate.
    2. On the Certificate Import Wizard, select Local Machine.
    3. Import the certificate to the Trusted Root Certification Authorities folder.
    Source code(tar.gz)
    Source code(zip)
    Maple.App_0.1.0.0_x64_Test.with.debug.symbol.for.dev.7z(28.17 MB)
    Maple.App_0.1.0.0_x64_Test.zip(6.05 MB)
Owner
YtFlow
An experiment project using UWP VPN Platform
YtFlow
WARFOX is a software-based HTTPS beaconing Windows implant that uses a multi-layered proxy network for C2 communications.

An HTTPS beaconing Windows implant and multi-layered proxy C2 network designed for covert APT emulation focused offensive operations

null 92 Jul 6, 2022
An HTTPS beaconing Windows implant and multi-layered proxy C2 network designed for covert APT emulation focused offensive operations

WARFOX is a software-based HTTPS beaconing Windows implant that uses a multi-layered proxy network for C2 communications. This kit was designed to emulate covert APT offensive operations. This kit includes WARFOX (Windows implant), HIGHTOWER (Listening Post), and other tools to build configs and set up a proxy network.

null 93 Jun 30, 2022
A simple SIP server (proxy) for handling VoIP calls based on SIP using C++

Sip Server A simple sip server for handling VoIP calls based on sip protocol. Features Registration Of Users The server supports registration process.

null 7 May 27, 2022
Pipy is a tiny, high performance, highly stable, programmable proxy written in C++

Pipy is a tiny, high performance, highly stable, programmable proxy. Written in C++, built on top of Asio asynchronous I/O library, Pipy is extremely lightweight and fast, making it one of the best choices for service mesh sidecars.

null 454 Jun 29, 2022
Phorklift is an HTTP server and proxy daemon, with clear, powerful and dynamic configuration.

Phorklift is an HTTP server and proxy daemon, with clear, powerful and dynamic configuration.

null 43 Mar 1, 2022
zrp is a nat-passthrough reverse proxy written in modern c++.

zrp is a nat-passthrough reverse proxy written in modern c++. A major use case is to expose a local server via a remote server with public IP.

Coleman 11 Nov 23, 2021
Pushpin is a reverse proxy server written in C++ that makes it easy to implement WebSocket, HTTP streaming, and HTTP long-polling services.

Pushpin is a reverse proxy server written in C++ that makes it easy to implement WebSocket, HTTP streaming, and HTTP long-polling services. The project is unique among realtime push solutions in that it is designed to address the needs of API creators. Pushpin is transparent to clients and integrates easily into an API stack.

Fanout 3.1k Jul 4, 2022
A Nginx module which tries to implement proxy wasm ABI in Nginx.

Status This library is under construction. Description A Nginx module which tries to implement proxy wasm ABI in Nginx. Install dependencies Download

API7 71 Jun 28, 2022
A proxy service of incremental log of OceanBase

OceanBase Migration Serivce LogProxy OceanBase增量日志代理服务,是 OMS 的一部分。基于 liboblog, 以服务的形式,提供实时增量链路接入和管理能力,方便应用接入OceanBase增量日志;能够解决网络隔离的情况下,订阅增量日志的需求;并提供多种

OceanBase 19 Apr 21, 2022
reverse proxy with web server and preview page

Reverse Proxy Dependencies Go Make Suport Termux (android/afsd kernel) linux (kernel) Install: Termux: 1 step: Install Go-lang, Git and Make pkg insta

AlbâniaSecurity-RT 7 Feb 19, 2022
A forward proxy module for CONNECT request handling

name This module provides support for the CONNECT method request. This method is mainly used to tunnel SSL requests through proxy servers. Table of Co

Xiaochen Wang 1.1k Jun 27, 2022
A flexible tool for redirecting a given program's TCP traffic to SOCKS5 or HTTP proxy.

graftcp English | 简体中文 Introduction graftcp can redirect the TCP connection made by the given program [application, script, shell, etc.] to SOCKS5 or

mingang.he 1.2k Jul 3, 2022
Proxy that can be used in GTPS to crash and others. All commands are already in

Credit to ama6nen Real Repo This proxy can be used and modified by everyone. This proxy already has several command exploits for gtps Features: /proxy

Sersinals 15 May 25, 2022
We use Clash as the backend proxy, which supports Shadowsocks(R), V2Ray, and Trojan protocols.

We use Clash as the backend proxy, which supports Shadowsocks(R), V2Ray, and Trojan protocols.

Dr. Incognito 1.2k Jul 5, 2022
WinINet wrapper - tiny windows HTTPS library, no dependencies.

WNetWrap A tiny, dependency-free wrapper around WinINet for developers targeting Windows only, who need a lightweight native solution. Inspired by the

hack-tramp 24 Apr 6, 2022
Graphical small-internet client for windows, linux, MacOS X and BSDs. Supports gemini, http, https, gopher, finger.

Graphical small-internet client for windows, linux, MacOS X and BSDs. Supports gemini, http, https, gopher, finger.

Felix Queißner 536 Jun 24, 2022
Rust bindings for Pixar's Universal Scene Description (USD)

Getting started Make sure you have cppmm built/working. https://github.com/vfx-rs/cppmm Build usd 21.11 Then run bash bind.sh. You need to make sure a

null 24 May 20, 2022
A universal C++20 wrapper for cross-platform sockets.

NetSockets A fast and clean, universal C++20 wrapper for cross-platform sockets. This wrapper uses ENet by lsalzman (https://github.com/lsalzman/enet)

null 3 Apr 17, 2022
:hocho: Strictly RFC 3986 compliant URI parsing and handling library written in C89; moved from SourceForge to GitHub

uriparser uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C89 ("ANSI C"). uriparser is cross-platform, fast, su

uriparser 243 Jun 26, 2022