Release 2.7.3.3: dark theme and Amnezia vpn:// import fixes.
This commit is contained in:
@@ -35,7 +35,7 @@ type Conf struct {
|
||||
|
||||
// Detect reports whether raw looks like an AWG/WireGuard config or share link.
|
||||
func Detect(raw string) bool {
|
||||
raw = strings.TrimSpace(raw)
|
||||
raw = sanitizeShare(raw)
|
||||
if raw == "" {
|
||||
return false
|
||||
}
|
||||
@@ -58,7 +58,7 @@ func Detect(raw string) bool {
|
||||
|
||||
// Parse accepts a WireGuard/AWG .conf body, awg:// URI, vpn:// blob, or Amnezia JSON.
|
||||
func Parse(raw string) (Conf, error) {
|
||||
raw = strings.TrimSpace(raw)
|
||||
raw = sanitizeShare(raw)
|
||||
if raw == "" {
|
||||
return Conf{}, fmt.Errorf("пустой AWG конфиг")
|
||||
}
|
||||
@@ -83,6 +83,26 @@ func Parse(raw string) (Conf, error) {
|
||||
}
|
||||
}
|
||||
|
||||
func sanitizeShare(raw string) string {
|
||||
raw = strings.TrimPrefix(raw, "\ufeff")
|
||||
var b strings.Builder
|
||||
b.Grow(len(raw))
|
||||
for _, r := range raw {
|
||||
switch r {
|
||||
case '\u200b', '\u200c', '\u200d', '\u2060', '\ufeff',
|
||||
'\u2066', '\u2067', '\u2068', '\u2069',
|
||||
'\u200e', '\u200f',
|
||||
'\u202a', '\u202b', '\u202c', '\u202d', '\u202e':
|
||||
continue
|
||||
}
|
||||
if r < 0x20 && r != '\n' && r != '\r' && r != '\t' {
|
||||
continue
|
||||
}
|
||||
b.WriteRune(r)
|
||||
}
|
||||
return strings.TrimSpace(b.String())
|
||||
}
|
||||
|
||||
func parseINI(raw string) (Conf, error) {
|
||||
var c Conf
|
||||
section := "interface" // treat leading keys before [Interface] as Interface
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package awg
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestParseUserVPNLink(t *testing.T) {
|
||||
raw := `vpn://W0ludGVyZmFjZV0KQWRkcmVzcyA9IDEwLjguMS4xMy8zMgpETlMgPSAxNzIuMjkuMTcyLjI1NCwgMS4wLjAuMQpQcml2YXRlS2V5ID0gYUpKUmFBRWNUYnVnSWIwdnphSXFuTEJGSUNHajZUZHF6NUQvODlNd09IWT0KTVRVID0gMTI4MApKYyA9IDYKSm1pbiA9IDEwCkptYXggPSA1MApTMSA9IDc0ClMyID0gNDcKUzMgPSA1NgpTNCA9IDMKSDEgPSA1OTA2OTcyNzktMTg4ODc3NDc4NApIMiA9IDIxMDk1MTkwNDctMjEyNDM5NTA2OQpIMyA9IDIxMzY3MjM2NDAtMjE0MTI1MTI4MwpINCA9IDIxNDcyNDg5MzYtMjE0NzM5ODY2MQoKW1BlZXJdClB1YmxpY0tleSA9IE5ROEkxWk9xS3FaaEZReXFxcG5qRFZzWmhZemRSTXVCb21VcHM1Zk9NM3M9ClByZXNoYXJlZEtleSA9IGxTVS9vd1hoNHIvU09UVndTaU5FM1BCZGVPbDdBUUpreUZlTGdMc1Q4ekk9CkFsbG93ZWRJUHMgPSAwLjAuMC4wLzAsIDo6LzAKRW5kcG9pbnQgPSBydS5kZTRpbWEudWs6NDE0MjEKUGVyc2lzdGVudEtlZXBhbGl2ZSA9IDI1`
|
||||
c, err := Parse(raw)
|
||||
if err != nil {
|
||||
t.Fatalf("Parse: %v", err)
|
||||
}
|
||||
if c.Endpoint != "ru.de4ima.uk:41421" {
|
||||
t.Fatalf("endpoint %q", c.Endpoint)
|
||||
}
|
||||
if !strings.Contains(c.H1, "-") {
|
||||
t.Fatalf("expected range H1, got %q", c.H1)
|
||||
}
|
||||
u, rem, err := NormalizeShareLink(raw)
|
||||
if err != nil {
|
||||
t.Fatalf("Normalize: %v", err)
|
||||
}
|
||||
t.Logf("remark=%q normalized_len=%d h1=%q", rem, len(u), c.H1)
|
||||
|
||||
// invisible unicode wrappers often come from mobile share / chat paste
|
||||
dirty := "\u2068" + raw + "\u2069\u2005"
|
||||
if !Detect(dirty) {
|
||||
t.Fatal("Detect should accept dirty bidi-wrapped vpn://")
|
||||
}
|
||||
_, _, err = NormalizeShareLink(dirty)
|
||||
if err != nil {
|
||||
t.Fatalf("dirty NormalizeShareLink: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user